diff --git a/app/dataviz/city-roads/assets/index.c4b0dabc.js b/app/dataviz/city-roads/assets/index.c4b0dabc.js new file mode 100644 index 00000000..f38ae887 --- /dev/null +++ b/app/dataviz/city-roads/assets/index.c4b0dabc.js @@ -0,0 +1,468 @@ +var Xl=Object.defineProperty;var Zl=(e,t,n)=>t in e?Xl(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;var Ql=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var en=(e,t,n)=>(Zl(e,typeof t!="symbol"?t+"":t,n),n);var em=Ql((nm,vr)=>{const Jl=function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const i of document.querySelectorAll('link[rel="modulepreload"]'))r(i);new MutationObserver(i=>{for(const o of i)if(o.type==="childList")for(const s of o.addedNodes)s.tagName==="LINK"&&s.rel==="modulepreload"&&r(s)}).observe(document,{childList:!0,subtree:!0});function n(i){const o={};return i.integrity&&(o.integrity=i.integrity),i.referrerpolicy&&(o.referrerPolicy=i.referrerpolicy),i.crossorigin==="use-credentials"?o.credentials="include":i.crossorigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function r(i){if(i.ep)return;i.ep=!0;const o=n(i);fetch(i.href,o)}};Jl();function Ji(e,t){const n=Object.create(null),r=e.split(",");for(let i=0;i!!n[i.toLowerCase()]:i=>!!n[i]}const eu="itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly",tu=Ji(eu);function fa(e){return!!e||e===""}function je(e){if(ae(e)){const t={};for(let n=0;n{if(n){const r=n.split(ru);r.length>1&&(t[r[0].trim()]=r[1].trim())}}),t}function Qt(e){let t="";if(Oe(e))t=e;else if(ae(e))for(let n=0;nOe(e)?e:e==null?"":ae(e)||ze(e)&&(e.toString===pa||!ce(e.toString))?JSON.stringify(e,ca,2):String(e),ca=(e,t)=>t&&t.__v_isRef?ca(e,t.value):un(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[r,i])=>(n[`${r} =>`]=i,n),{})}:da(t)?{[`Set(${t.size})`]:[...t.values()]}:ze(t)&&!ae(t)&&!va(t)?String(t):t,_e={},ln=[],gt=()=>{},ou=()=>!1,su=/^on[^a-z]/,Lr=e=>su.test(e),eo=e=>e.startsWith("onUpdate:"),We=Object.assign,to=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},au=Object.prototype.hasOwnProperty,ge=(e,t)=>au.call(e,t),ae=Array.isArray,un=e=>kr(e)==="[object Map]",da=e=>kr(e)==="[object Set]",ce=e=>typeof e=="function",Oe=e=>typeof e=="string",no=e=>typeof e=="symbol",ze=e=>e!==null&&typeof e=="object",ha=e=>ze(e)&&ce(e.then)&&ce(e.catch),pa=Object.prototype.toString,kr=e=>pa.call(e),lu=e=>kr(e).slice(8,-1),va=e=>kr(e)==="[object Object]",ro=e=>Oe(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,lr=Ji(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),Rr=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},uu=/-(\w)/g,Et=Rr(e=>e.replace(uu,(t,n)=>n?n.toUpperCase():"")),fu=/\B([A-Z])/g,mn=Rr(e=>e.replace(fu,"-$1").toLowerCase()),Br=Rr(e=>e.charAt(0).toUpperCase()+e.slice(1)),ei=Rr(e=>e?`on${Br(e)}`:""),gr=(e,t)=>!Object.is(e,t),ur=(e,t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,value:n})},_i=e=>{const t=parseFloat(e);return isNaN(t)?e:t};let Vo;const cu=()=>Vo||(Vo=typeof globalThis!="undefined"?globalThis:typeof self!="undefined"?self:typeof window!="undefined"?window:typeof global!="undefined"?global:{});let bt;class du{constructor(t=!1){this.active=!0,this.effects=[],this.cleanups=[],!t&&bt&&(this.parent=bt,this.index=(bt.scopes||(bt.scopes=[])).push(this)-1)}run(t){if(this.active){const n=bt;try{return bt=this,t()}finally{bt=n}}}on(){bt=this}off(){bt=this.parent}stop(t){if(this.active){let n,r;for(n=0,r=this.effects.length;n{const t=new Set(e);return t.w=0,t.n=0,t},ga=e=>(e.w&Ut)>0,ma=e=>(e.n&Ut)>0,pu=({deps:e})=>{if(e.length)for(let t=0;t{const{deps:t}=e;if(t.length){let n=0;for(let r=0;r{(u==="length"||u>=r)&&a.push(l)});else switch(n!==void 0&&a.push(s.get(n)),t){case"add":ae(e)?ro(n)&&a.push(s.get("length")):(a.push(s.get(Xt)),un(e)&&a.push(s.get(Ai)));break;case"delete":ae(e)||(a.push(s.get(Xt)),un(e)&&a.push(s.get(Ai)));break;case"set":un(e)&&a.push(s.get(Xt));break}if(a.length===1)a[0]&&Ti(a[0]);else{const l=[];for(const u of a)u&&l.push(...u);Ti(io(l))}}function Ti(e,t){const n=ae(e)?e:[...e];for(const r of n)r.computed&&zo(r);for(const r of n)r.computed||zo(r)}function zo(e,t){(e!==ht||e.allowRecurse)&&(e.scheduler?e.scheduler():e.run())}const gu=Ji("__proto__,__v_isRef,__isVue"),ba=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(no)),mu=so(),yu=so(!1,!0),wu=so(!0),Ho=bu();function bu(){const e={};return["includes","indexOf","lastIndexOf"].forEach(t=>{e[t]=function(...n){const r=xe(this);for(let o=0,s=this.length;o{e[t]=function(...n){yn();const r=xe(this)[t].apply(this,n);return wn(),r}}),e}function so(e=!1,t=!1){return function(r,i,o){if(i==="__v_isReactive")return!e;if(i==="__v_isReadonly")return e;if(i==="__v_isShallow")return t;if(i==="__v_raw"&&o===(e?t?Du:Aa:t?Ca:Ea).get(r))return r;const s=ae(r);if(!e&&s&&ge(Ho,i))return Reflect.get(Ho,i,o);const a=Reflect.get(r,i,o);return(no(i)?ba.has(i):gu(i))||(e||nt(r,"get",i),t)?a:Ye(a)?s&&ro(i)?a:a.value:ze(a)?e?Ta(a):uo(a):a}}const xu=xa(),_u=xa(!0);function xa(e=!1){return function(n,r,i,o){let s=n[r];if(kn(s)&&Ye(s)&&!Ye(i))return!1;if(!e&&!kn(i)&&(Si(i)||(i=xe(i),s=xe(s)),!ae(n)&&Ye(s)&&!Ye(i)))return s.value=i,!0;const a=ae(n)&&ro(r)?Number(r)e,Ir=e=>Reflect.getPrototypeOf(e);function Wn(e,t,n=!1,r=!1){e=e.__v_raw;const i=xe(e),o=xe(t);n||(t!==o&&nt(i,"get",t),nt(i,"get",o));const{has:s}=Ir(i),a=r?ao:n?ho:co;if(s.call(i,t))return a(e.get(t));if(s.call(i,o))return a(e.get(o));e!==i&&e.get(t)}function qn(e,t=!1){const n=this.__v_raw,r=xe(n),i=xe(e);return t||(e!==i&&nt(r,"has",e),nt(r,"has",i)),e===i?n.has(e):n.has(e)||n.has(i)}function Gn(e,t=!1){return e=e.__v_raw,!t&&nt(xe(e),"iterate",Xt),Reflect.get(e,"size",e)}function $o(e){e=xe(e);const t=xe(this);return Ir(t).has.call(t,e)||(t.add(e),Lt(t,"add",e,e)),this}function jo(e,t){t=xe(t);const n=xe(this),{has:r,get:i}=Ir(n);let o=r.call(n,e);o||(e=xe(e),o=r.call(n,e));const s=i.call(n,e);return n.set(e,t),o?gr(t,s)&&Lt(n,"set",e,t):Lt(n,"add",e,t),this}function Wo(e){const t=xe(this),{has:n,get:r}=Ir(t);let i=n.call(t,e);i||(e=xe(e),i=n.call(t,e)),r&&r.call(t,e);const o=t.delete(e);return i&&Lt(t,"delete",e,void 0),o}function qo(){const e=xe(this),t=e.size!==0,n=e.clear();return t&&Lt(e,"clear",void 0,void 0),n}function Yn(e,t){return function(r,i){const o=this,s=o.__v_raw,a=xe(s),l=t?ao:e?ho:co;return!e&&nt(a,"iterate",Xt),s.forEach((u,f)=>r.call(i,l(u),l(f),o))}}function Kn(e,t,n){return function(...r){const i=this.__v_raw,o=xe(i),s=un(o),a=e==="entries"||e===Symbol.iterator&&s,l=e==="keys"&&s,u=i[e](...r),f=n?ao:t?ho:co;return!t&&nt(o,"iterate",l?Ai:Xt),{next(){const{value:d,done:h}=u.next();return h?{value:d,done:h}:{value:a?[f(d[0]),f(d[1])]:f(d),done:h}},[Symbol.iterator](){return this}}}}function Rt(e){return function(...t){return e==="delete"?!1:this}}function Mu(){const e={get(o){return Wn(this,o)},get size(){return Gn(this)},has:qn,add:$o,set:jo,delete:Wo,clear:qo,forEach:Yn(!1,!1)},t={get(o){return Wn(this,o,!1,!0)},get size(){return Gn(this)},has:qn,add:$o,set:jo,delete:Wo,clear:qo,forEach:Yn(!1,!0)},n={get(o){return Wn(this,o,!0)},get size(){return Gn(this,!0)},has(o){return qn.call(this,o,!0)},add:Rt("add"),set:Rt("set"),delete:Rt("delete"),clear:Rt("clear"),forEach:Yn(!0,!1)},r={get(o){return Wn(this,o,!0,!0)},get size(){return Gn(this,!0)},has(o){return qn.call(this,o,!0)},add:Rt("add"),set:Rt("set"),delete:Rt("delete"),clear:Rt("clear"),forEach:Yn(!0,!0)};return["keys","values","entries",Symbol.iterator].forEach(o=>{e[o]=Kn(o,!1,!1),n[o]=Kn(o,!0,!1),t[o]=Kn(o,!1,!0),r[o]=Kn(o,!0,!0)}),[e,n,t,r]}const[Pu,Fu,Lu,ku]=Mu();function lo(e,t){const n=t?e?ku:Lu:e?Fu:Pu;return(r,i,o)=>i==="__v_isReactive"?!e:i==="__v_isReadonly"?e:i==="__v_raw"?r:Reflect.get(ge(n,i)&&i in r?n:r,i,o)}const Ru={get:lo(!1,!1)},Bu={get:lo(!1,!0)},Iu={get:lo(!0,!1)},Ea=new WeakMap,Ca=new WeakMap,Aa=new WeakMap,Du=new WeakMap;function Ou(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function Nu(e){return e.__v_skip||!Object.isExtensible(e)?0:Ou(lu(e))}function uo(e){return kn(e)?e:fo(e,!1,_a,Ru,Ea)}function Vu(e){return fo(e,!1,Su,Bu,Ca)}function Ta(e){return fo(e,!0,Tu,Iu,Aa)}function fo(e,t,n,r,i){if(!ze(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const o=i.get(e);if(o)return o;const s=Nu(e);if(s===0)return e;const a=new Proxy(e,s===2?r:n);return i.set(e,a),a}function fn(e){return kn(e)?fn(e.__v_raw):!!(e&&e.__v_isReactive)}function kn(e){return!!(e&&e.__v_isReadonly)}function Si(e){return!!(e&&e.__v_isShallow)}function Sa(e){return fn(e)||kn(e)}function xe(e){const t=e&&e.__v_raw;return t?xe(t):e}function Ma(e){return mr(e,"__v_skip",!0),e}const co=e=>ze(e)?uo(e):e,ho=e=>ze(e)?Ta(e):e;function Uu(e){Nt&&ht&&(e=xe(e),wa(e.dep||(e.dep=io())))}function zu(e,t){e=xe(e),e.dep&&Ti(e.dep)}function Ye(e){return!!(e&&e.__v_isRef===!0)}function Hu(e){return Ye(e)?e.value:e}const $u={get:(e,t,n)=>Hu(Reflect.get(e,t,n)),set:(e,t,n,r)=>{const i=e[t];return Ye(i)&&!Ye(n)?(i.value=n,!0):Reflect.set(e,t,n,r)}};function Pa(e){return fn(e)?e:new Proxy(e,$u)}class ju{constructor(t,n,r,i){this._setter=n,this.dep=void 0,this.__v_isRef=!0,this._dirty=!0,this.effect=new oo(t,()=>{this._dirty||(this._dirty=!0,zu(this))}),this.effect.computed=this,this.effect.active=this._cacheable=!i,this.__v_isReadonly=r}get value(){const t=xe(this);return Uu(t),(t._dirty||!t._cacheable)&&(t._dirty=!1,t._value=t.effect.run()),t._value}set value(t){this._setter(t)}}function Wu(e,t,n=!1){let r,i;const o=ce(e);return o?(r=e,i=gt):(r=e.get,i=e.set),new ju(r,i,o||!i,n)}function Vt(e,t,n,r){let i;try{i=r?e(...r):e()}catch(o){Dr(o,t,n)}return i}function st(e,t,n,r){if(ce(e)){const o=Vt(e,t,n,r);return o&&ha(o)&&o.catch(s=>{Dr(s,t,n)}),o}const i=[];for(let o=0;o>>1;Rn(tt[r])Mt&&tt.splice(t,1)}function Ra(e,t,n,r){ae(e)?n.push(...e):(!t||!t.includes(e,e.allowRecurse?r+1:r))&&n.push(e),ka()}function Xu(e){Ra(e,En,Sn,rn)}function Zu(e){Ra(e,Bt,Mn,on)}function Or(e,t=null){if(Sn.length){for(Pi=t,En=[...new Set(Sn)],Sn.length=0,rn=0;rnRn(n)-Rn(r)),on=0;one.id==null?1/0:e.id;function Ia(e){Mi=!1,yr=!0,Or(e),tt.sort((n,r)=>Rn(n)-Rn(r));const t=gt;try{for(Mt=0;Mtg.trim())),d&&(i=n.map(_i))}let a,l=r[a=ei(t)]||r[a=ei(Et(t))];!l&&o&&(l=r[a=ei(mn(t))]),l&&st(l,e,6,i);const u=r[a+"Once"];if(u){if(!e.emitted)e.emitted={};else if(e.emitted[a])return;e.emitted[a]=!0,st(u,e,6,i)}}function Da(e,t,n=!1){const r=t.emitsCache,i=r.get(e);if(i!==void 0)return i;const o=e.emits;let s={},a=!1;if(!ce(e)){const l=u=>{const f=Da(u,t,!0);f&&(a=!0,We(s,f))};!n&&t.mixins.length&&t.mixins.forEach(l),e.extends&&l(e.extends),e.mixins&&e.mixins.forEach(l)}return!o&&!a?(r.set(e,null),null):(ae(o)?o.forEach(l=>s[l]=null):We(s,o),r.set(e,s),s)}function Nr(e,t){return!e||!Lr(t)?!1:(t=t.slice(2).replace(/Once$/,""),ge(e,t[0].toLowerCase()+t.slice(1))||ge(e,mn(t))||ge(e,t))}let ot=null,Vr=null;function wr(e){const t=ot;return ot=e,Vr=e&&e.type.__scopeId||null,t}function Ju(e){Vr=e}function ef(){Vr=null}function tf(e,t=ot,n){if(!t||e._n)return e;const r=(...i)=>{r._d&&rs(-1);const o=wr(t),s=e(...i);return wr(o),r._d&&rs(1),s};return r._n=!0,r._c=!0,r._d=!0,r}function ti(e){const{type:t,vnode:n,proxy:r,withProxy:i,props:o,propsOptions:[s],slots:a,attrs:l,emit:u,render:f,renderCache:d,data:h,setupState:g,ctx:y,inheritAttrs:w}=e;let b,S;const C=wr(e);try{if(n.shapeFlag&4){const E=i||r;b=xt(f.call(E,E,d,o,g,h,y)),S=l}else{const E=t;b=xt(E.length>1?E(o,{attrs:l,slots:a,emit:u}):E(o,null)),S=t.props?l:nf(l)}}catch(E){Pn.length=0,Dr(E,e,1),b=Se(mt)}let A=b;if(S&&w!==!1){const E=Object.keys(S),{shapeFlag:T}=A;E.length&&T&7&&(s&&E.some(eo)&&(S=rf(S,s)),A=zt(A,S))}return n.dirs&&(A=zt(A),A.dirs=A.dirs?A.dirs.concat(n.dirs):n.dirs),n.transition&&(A.transition=n.transition),b=A,wr(C),b}const nf=e=>{let t;for(const n in e)(n==="class"||n==="style"||Lr(n))&&((t||(t={}))[n]=e[n]);return t},rf=(e,t)=>{const n={};for(const r in e)(!eo(r)||!(r.slice(9)in t))&&(n[r]=e[r]);return n};function of(e,t,n){const{props:r,children:i,component:o}=e,{props:s,children:a,patchFlag:l}=t,u=o.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&l>=0){if(l&1024)return!0;if(l&16)return r?Go(r,s,u):!!s;if(l&8){const f=t.dynamicProps;for(let d=0;de.__isSuspense;function lf(e,t){t&&t.pendingBranch?ae(e)?t.effects.push(...e):t.effects.push(e):Zu(e)}function uf(e,t){if(Ue){let n=Ue.provides;const r=Ue.parent&&Ue.parent.provides;r===n&&(n=Ue.provides=Object.create(r)),n[e]=t}}function ni(e,t,n=!1){const r=Ue||ot;if(r){const i=r.parent==null?r.vnode.appContext&&r.vnode.appContext.provides:r.parent.provides;if(i&&e in i)return i[e];if(arguments.length>1)return n&&ce(t)?t.call(r.proxy):t}}const Yo={};function ri(e,t,n){return Oa(e,t,n)}function Oa(e,t,{immediate:n,deep:r,flush:i,onTrack:o,onTrigger:s}=_e){const a=Ue;let l,u=!1,f=!1;if(Ye(e)?(l=()=>e.value,u=Si(e)):fn(e)?(l=()=>e,r=!0):ae(e)?(f=!0,u=e.some(S=>fn(S)||Si(S)),l=()=>e.map(S=>{if(Ye(S))return S.value;if(fn(S))return Kt(S);if(ce(S))return Vt(S,a,2)})):ce(e)?t?l=()=>Vt(e,a,2):l=()=>{if(!(a&&a.isUnmounted))return d&&d(),st(e,a,3,[h])}:l=gt,t&&r){const S=l;l=()=>Kt(S())}let d,h=S=>{d=b.onStop=()=>{Vt(S,a,4)}};if(Dn)return h=gt,t?n&&st(t,a,3,[l(),f?[]:void 0,h]):l(),gt;let g=f?[]:Yo;const y=()=>{if(!!b.active)if(t){const S=b.run();(r||u||(f?S.some((C,A)=>gr(C,g[A])):gr(S,g)))&&(d&&d(),st(t,a,3,[S,g===Yo?void 0:g,h]),g=S)}else b.run()};y.allowRecurse=!!t;let w;i==="sync"?w=y:i==="post"?w=()=>Xe(y,a&&a.suspense):w=()=>Xu(y);const b=new oo(l,w);return t?n?y():g=b.run():i==="post"?Xe(b.run.bind(b),a&&a.suspense):b.run(),()=>{b.stop(),a&&a.scope&&to(a.scope.effects,b)}}function ff(e,t,n){const r=this.proxy,i=Oe(e)?e.includes(".")?Na(r,e):()=>r[e]:e.bind(r,r);let o;ce(t)?o=t:(o=t.handler,n=t);const s=Ue;cn(this);const a=Oa(i,o.bind(r),n);return s?cn(s):Zt(),a}function Na(e,t){const n=t.split(".");return()=>{let r=e;for(let i=0;i{Kt(n,t)});else if(va(e))for(const n in e)Kt(e[n],t);return e}function cf(){const e={isMounted:!1,isLeaving:!1,isUnmounting:!1,leavingVNodes:new Map};return Ha(()=>{e.isMounted=!0}),$a(()=>{e.isUnmounting=!0}),e}const it=[Function,Array],df={name:"BaseTransition",props:{mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:it,onEnter:it,onAfterEnter:it,onEnterCancelled:it,onBeforeLeave:it,onLeave:it,onAfterLeave:it,onLeaveCancelled:it,onBeforeAppear:it,onAppear:it,onAfterAppear:it,onAppearCancelled:it},setup(e,{slots:t}){const n=Zf(),r=cf();let i;return()=>{const o=t.default&&Ua(t.default(),!0);if(!o||!o.length)return;let s=o[0];if(o.length>1){for(const w of o)if(w.type!==mt){s=w;break}}const a=xe(e),{mode:l}=a;if(r.isLeaving)return ii(s);const u=Ko(s);if(!u)return ii(s);const f=Fi(u,a,r,n);Li(u,f);const d=n.subTree,h=d&&Ko(d);let g=!1;const{getTransitionKey:y}=u.type;if(y){const w=y();i===void 0?i=w:w!==i&&(i=w,g=!0)}if(h&&h.type!==mt&&(!Gt(u,h)||g)){const w=Fi(h,a,r,n);if(Li(h,w),l==="out-in")return r.isLeaving=!0,w.afterLeave=()=>{r.isLeaving=!1,n.update()},ii(s);l==="in-out"&&u.type!==mt&&(w.delayLeave=(b,S,C)=>{const A=Va(r,h);A[String(h.key)]=h,b._leaveCb=()=>{S(),b._leaveCb=void 0,delete f.delayedLeave},f.delayedLeave=C})}return s}}},hf=df;function Va(e,t){const{leavingVNodes:n}=e;let r=n.get(t.type);return r||(r=Object.create(null),n.set(t.type,r)),r}function Fi(e,t,n,r){const{appear:i,mode:o,persisted:s=!1,onBeforeEnter:a,onEnter:l,onAfterEnter:u,onEnterCancelled:f,onBeforeLeave:d,onLeave:h,onAfterLeave:g,onLeaveCancelled:y,onBeforeAppear:w,onAppear:b,onAfterAppear:S,onAppearCancelled:C}=t,A=String(e.key),E=Va(n,e),T=(P,L)=>{P&&st(P,r,9,L)},m=(P,L)=>{const B=L[1];T(P,L),ae(P)?P.every(R=>R.length<=1)&&B():P.length<=1&&B()},x={mode:o,persisted:s,beforeEnter(P){let L=a;if(!n.isMounted)if(i)L=w||a;else return;P._leaveCb&&P._leaveCb(!0);const B=E[A];B&&Gt(e,B)&&B.el._leaveCb&&B.el._leaveCb(),T(L,[P])},enter(P){let L=l,B=u,R=f;if(!n.isMounted)if(i)L=b||l,B=S||u,R=C||f;else return;let j=!1;const H=P._enterCb=W=>{j||(j=!0,W?T(R,[P]):T(B,[P]),x.delayedLeave&&x.delayedLeave(),P._enterCb=void 0)};L?m(L,[P,H]):H()},leave(P,L){const B=String(e.key);if(P._enterCb&&P._enterCb(!0),n.isUnmounting)return L();T(d,[P]);let R=!1;const j=P._leaveCb=H=>{R||(R=!0,L(),H?T(y,[P]):T(g,[P]),P._leaveCb=void 0,E[B]===e&&delete E[B])};E[B]=e,h?m(h,[P,j]):j()},clone(P){return Fi(P,t,n,r)}};return x}function ii(e){if(Ur(e))return e=zt(e),e.children=null,e}function Ko(e){return Ur(e)?e.children?e.children[0]:void 0:e}function Li(e,t){e.shapeFlag&6&&e.component?Li(e.component.subTree,t):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function Ua(e,t=!1,n){let r=[],i=0;for(let o=0;o1)for(let o=0;o!!e.type.__asyncLoader,Ur=e=>e.type.__isKeepAlive;function pf(e,t){za(e,"a",t)}function vf(e,t){za(e,"da",t)}function za(e,t,n=Ue){const r=e.__wdc||(e.__wdc=()=>{let i=n;for(;i;){if(i.isDeactivated)return;i=i.parent}return e()});if(zr(t,r,n),n){let i=n.parent;for(;i&&i.parent;)Ur(i.parent.vnode)&&gf(r,t,n,i),i=i.parent}}function gf(e,t,n,r){const i=zr(t,e,r,!0);ja(()=>{to(r[t],i)},n)}function zr(e,t,n=Ue,r=!1){if(n){const i=n[e]||(n[e]=[]),o=t.__weh||(t.__weh=(...s)=>{if(n.isUnmounted)return;yn(),cn(n);const a=st(t,n,e,s);return Zt(),wn(),a});return r?i.unshift(o):i.push(o),o}}const kt=e=>(t,n=Ue)=>(!Dn||e==="sp")&&zr(e,t,n),mf=kt("bm"),Ha=kt("m"),yf=kt("bu"),wf=kt("u"),$a=kt("bum"),ja=kt("um"),bf=kt("sp"),xf=kt("rtg"),_f=kt("rtc");function Ef(e,t=Ue){zr("ec",e,t)}function Bn(e,t){const n=ot;if(n===null)return e;const r=$r(n)||n.proxy,i=e.dirs||(e.dirs=[]);for(let o=0;ot(s,a,void 0,o&&o[a]));else{const s=Object.keys(e);i=new Array(s.length);for(let a=0,l=s.length;ae?il(e)?$r(e)||e.proxy:ki(e.parent):null,br=We(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>ki(e.parent),$root:e=>ki(e.root),$emit:e=>e.emit,$options:e=>Ya(e),$forceUpdate:e=>e.f||(e.f=()=>La(e.update)),$nextTick:e=>e.n||(e.n=Gu.bind(e.proxy)),$watch:e=>ff.bind(e)}),Tf={get({_:e},t){const{ctx:n,setupState:r,data:i,props:o,accessCache:s,type:a,appContext:l}=e;let u;if(t[0]!=="$"){const g=s[t];if(g!==void 0)switch(g){case 1:return r[t];case 2:return i[t];case 4:return n[t];case 3:return o[t]}else{if(r!==_e&&ge(r,t))return s[t]=1,r[t];if(i!==_e&&ge(i,t))return s[t]=2,i[t];if((u=e.propsOptions[0])&&ge(u,t))return s[t]=3,o[t];if(n!==_e&&ge(n,t))return s[t]=4,n[t];Ri&&(s[t]=0)}}const f=br[t];let d,h;if(f)return t==="$attrs"&&nt(e,"get",t),f(e);if((d=a.__cssModules)&&(d=d[t]))return d;if(n!==_e&&ge(n,t))return s[t]=4,n[t];if(h=l.config.globalProperties,ge(h,t))return h[t]},set({_:e},t,n){const{data:r,setupState:i,ctx:o}=e;return i!==_e&&ge(i,t)?(i[t]=n,!0):r!==_e&&ge(r,t)?(r[t]=n,!0):ge(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(o[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:r,appContext:i,propsOptions:o}},s){let a;return!!n[s]||e!==_e&&ge(e,s)||t!==_e&&ge(t,s)||(a=o[0])&&ge(a,s)||ge(r,s)||ge(br,s)||ge(i.config.globalProperties,s)},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:ge(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};let Ri=!0;function Sf(e){const t=Ya(e),n=e.proxy,r=e.ctx;Ri=!1,t.beforeCreate&&Zo(t.beforeCreate,e,"bc");const{data:i,computed:o,methods:s,watch:a,provide:l,inject:u,created:f,beforeMount:d,mounted:h,beforeUpdate:g,updated:y,activated:w,deactivated:b,beforeDestroy:S,beforeUnmount:C,destroyed:A,unmounted:E,render:T,renderTracked:m,renderTriggered:x,errorCaptured:P,serverPrefetch:L,expose:B,inheritAttrs:R,components:j,directives:H,filters:W}=t;if(u&&Mf(u,r,null,e.appContext.config.unwrapInjectedRef),s)for(const q in s){const Z=s[q];ce(Z)&&(r[q]=Z.bind(n))}if(i){const q=i.call(n,n);ze(q)&&(e.data=uo(q))}if(Ri=!0,o)for(const q in o){const Z=o[q],z=ce(Z)?Z.bind(n,n):ce(Z.get)?Z.get.bind(n,n):gt,V=!ce(Z)&&ce(Z.set)?Z.set.bind(n):gt,Y=ic({get:z,set:V});Object.defineProperty(r,q,{enumerable:!0,configurable:!0,get:()=>Y.value,set:X=>Y.value=X})}if(a)for(const q in a)Ga(a[q],r,n,q);if(l){const q=ce(l)?l.call(n):l;Reflect.ownKeys(q).forEach(Z=>{uf(Z,q[Z])})}f&&Zo(f,e,"c");function $(q,Z){ae(Z)?Z.forEach(z=>q(z.bind(n))):Z&&q(Z.bind(n))}if($(mf,d),$(Ha,h),$(yf,g),$(wf,y),$(pf,w),$(vf,b),$(Ef,P),$(_f,m),$(xf,x),$($a,C),$(ja,E),$(bf,L),ae(B))if(B.length){const q=e.exposed||(e.exposed={});B.forEach(Z=>{Object.defineProperty(q,Z,{get:()=>n[Z],set:z=>n[Z]=z})})}else e.exposed||(e.exposed={});T&&e.render===gt&&(e.render=T),R!=null&&(e.inheritAttrs=R),j&&(e.components=j),H&&(e.directives=H)}function Mf(e,t,n=gt,r=!1){ae(e)&&(e=Bi(e));for(const i in e){const o=e[i];let s;ze(o)?"default"in o?s=ni(o.from||i,o.default,!0):s=ni(o.from||i):s=ni(o),Ye(s)&&r?Object.defineProperty(t,i,{enumerable:!0,configurable:!0,get:()=>s.value,set:a=>s.value=a}):t[i]=s}}function Zo(e,t,n){st(ae(e)?e.map(r=>r.bind(t.proxy)):e.bind(t.proxy),t,n)}function Ga(e,t,n,r){const i=r.includes(".")?Na(n,r):()=>n[r];if(Oe(e)){const o=t[e];ce(o)&&ri(i,o)}else if(ce(e))ri(i,e.bind(n));else if(ze(e))if(ae(e))e.forEach(o=>Ga(o,t,n,r));else{const o=ce(e.handler)?e.handler.bind(n):t[e.handler];ce(o)&&ri(i,o,e)}}function Ya(e){const t=e.type,{mixins:n,extends:r}=t,{mixins:i,optionsCache:o,config:{optionMergeStrategies:s}}=e.appContext,a=o.get(t);let l;return a?l=a:!i.length&&!n&&!r?l=t:(l={},i.length&&i.forEach(u=>xr(l,u,s,!0)),xr(l,t,s)),o.set(t,l),l}function xr(e,t,n,r=!1){const{mixins:i,extends:o}=t;o&&xr(e,o,n,!0),i&&i.forEach(s=>xr(e,s,n,!0));for(const s in t)if(!(r&&s==="expose")){const a=Pf[s]||n&&n[s];e[s]=a?a(e[s],t[s]):t[s]}return e}const Pf={data:Qo,props:qt,emits:qt,methods:qt,computed:qt,beforeCreate:qe,created:qe,beforeMount:qe,mounted:qe,beforeUpdate:qe,updated:qe,beforeDestroy:qe,beforeUnmount:qe,destroyed:qe,unmounted:qe,activated:qe,deactivated:qe,errorCaptured:qe,serverPrefetch:qe,components:qt,directives:qt,watch:Lf,provide:Qo,inject:Ff};function Qo(e,t){return t?e?function(){return We(ce(e)?e.call(this,this):e,ce(t)?t.call(this,this):t)}:t:e}function Ff(e,t){return qt(Bi(e),Bi(t))}function Bi(e){if(ae(e)){const t={};for(let n=0;n0)&&!(s&16)){if(s&8){const f=e.vnode.dynamicProps;for(let d=0;d{l=!0;const[h,g]=Xa(d,t,!0);We(s,h),g&&a.push(...g)};!n&&t.mixins.length&&t.mixins.forEach(f),e.extends&&f(e.extends),e.mixins&&e.mixins.forEach(f)}if(!o&&!l)return r.set(e,ln),ln;if(ae(o))for(let f=0;f-1,g[1]=w<0||y-1||ge(g,"default"))&&a.push(d)}}}const u=[s,a];return r.set(e,u),u}function Jo(e){return e[0]!=="$"}function es(e){const t=e&&e.toString().match(/^\s*function (\w+)/);return t?t[1]:e===null?"null":""}function ts(e,t){return es(e)===es(t)}function ns(e,t){return ae(t)?t.findIndex(n=>ts(n,e)):ce(t)&&ts(t,e)?0:-1}const Za=e=>e[0]==="_"||e==="$stable",yo=e=>ae(e)?e.map(xt):[xt(e)],Bf=(e,t,n)=>{if(t._n)return t;const r=tf((...i)=>yo(t(...i)),n);return r._c=!1,r},Qa=(e,t,n)=>{const r=e._ctx;for(const i in e){if(Za(i))continue;const o=e[i];if(ce(o))t[i]=Bf(i,o,r);else if(o!=null){const s=yo(o);t[i]=()=>s}}},Ja=(e,t)=>{const n=yo(t);e.slots.default=()=>n},If=(e,t)=>{if(e.vnode.shapeFlag&32){const n=t._;n?(e.slots=xe(t),mr(t,"_",n)):Qa(t,e.slots={})}else e.slots={},t&&Ja(e,t);mr(e.slots,Hr,1)},Df=(e,t,n)=>{const{vnode:r,slots:i}=e;let o=!0,s=_e;if(r.shapeFlag&32){const a=t._;a?n&&a===1?o=!1:(We(i,t),!n&&a===1&&delete i._):(o=!t.$stable,Qa(t,i)),s=t}else t&&(Ja(e,t),s={default:1});if(o)for(const a in i)!Za(a)&&!(a in s)&&delete i[a]};function el(){return{app:null,config:{isNativeTag:ou,performance:!1,globalProperties:{},optionMergeStrategies:{},errorHandler:void 0,warnHandler:void 0,compilerOptions:{}},mixins:[],components:{},directives:{},provides:Object.create(null),optionsCache:new WeakMap,propsCache:new WeakMap,emitsCache:new WeakMap}}let Of=0;function Nf(e,t){return function(r,i=null){ce(r)||(r=Object.assign({},r)),i!=null&&!ze(i)&&(i=null);const o=el(),s=new Set;let a=!1;const l=o.app={_uid:Of++,_component:r,_props:i,_container:null,_context:o,_instance:null,version:oc,get config(){return o.config},set config(u){},use(u,...f){return s.has(u)||(u&&ce(u.install)?(s.add(u),u.install(l,...f)):ce(u)&&(s.add(u),u(l,...f))),l},mixin(u){return o.mixins.includes(u)||o.mixins.push(u),l},component(u,f){return f?(o.components[u]=f,l):o.components[u]},directive(u,f){return f?(o.directives[u]=f,l):o.directives[u]},mount(u,f,d){if(!a){const h=Se(r,i);return h.appContext=o,f&&t?t(h,u):e(h,u,d),a=!0,l._container=u,u.__vue_app__=l,$r(h.component)||h.component.proxy}},unmount(){a&&(e(null,l._container),delete l._container.__vue_app__)},provide(u,f){return o.provides[u]=f,l}};return l}}function Di(e,t,n,r,i=!1){if(ae(e)){e.forEach((h,g)=>Di(h,t&&(ae(t)?t[g]:t),n,r,i));return}if(fr(r)&&!i)return;const o=r.shapeFlag&4?$r(r.component)||r.component.proxy:r.el,s=i?null:o,{i:a,r:l}=e,u=t&&t.r,f=a.refs===_e?a.refs={}:a.refs,d=a.setupState;if(u!=null&&u!==l&&(Oe(u)?(f[u]=null,ge(d,u)&&(d[u]=null)):Ye(u)&&(u.value=null)),ce(l))Vt(l,a,12,[s,f]);else{const h=Oe(l),g=Ye(l);if(h||g){const y=()=>{if(e.f){const w=h?f[l]:l.value;i?ae(w)&&to(w,o):ae(w)?w.includes(o)||w.push(o):h?(f[l]=[o],ge(d,l)&&(d[l]=f[l])):(l.value=[o],e.k&&(f[e.k]=l.value))}else h?(f[l]=s,ge(d,l)&&(d[l]=s)):g&&(l.value=s,e.k&&(f[e.k]=s))};s?(y.id=-1,Xe(y,n)):y()}}}const Xe=lf;function Vf(e){return Uf(e)}function Uf(e,t){const n=cu();n.__VUE__=!0;const{insert:r,remove:i,patchProp:o,createElement:s,createText:a,createComment:l,setText:u,setElementText:f,parentNode:d,nextSibling:h,setScopeId:g=gt,cloneNode:y,insertStaticContent:w}=e,b=(c,p,v,_=null,M=null,F=null,O=!1,I=null,U=!!p.dynamicChildren)=>{if(c===p)return;c&&!Gt(c,p)&&(_=de(c),te(c,M,F,!0),c=null),p.patchFlag===-2&&(U=!1,p.dynamicChildren=null);const{type:N,ref:Q,shapeFlag:K}=p;switch(N){case wo:S(c,p,v,_);break;case mt:C(c,p,v,_);break;case oi:c==null&&A(p,v,_,O);break;case Ge:H(c,p,v,_,M,F,O,I,U);break;default:K&1?m(c,p,v,_,M,F,O,I,U):K&6?W(c,p,v,_,M,F,O,I,U):(K&64||K&128)&&N.process(c,p,v,_,M,F,O,I,U,le)}Q!=null&&M&&Di(Q,c&&c.ref,F,p||c,!p)},S=(c,p,v,_)=>{if(c==null)r(p.el=a(p.children),v,_);else{const M=p.el=c.el;p.children!==c.children&&u(M,p.children)}},C=(c,p,v,_)=>{c==null?r(p.el=l(p.children||""),v,_):p.el=c.el},A=(c,p,v,_)=>{[c.el,c.anchor]=w(c.children,p,v,_,c.el,c.anchor)},E=({el:c,anchor:p},v,_)=>{let M;for(;c&&c!==p;)M=h(c),r(c,v,_),c=M;r(p,v,_)},T=({el:c,anchor:p})=>{let v;for(;c&&c!==p;)v=h(c),i(c),c=v;i(p)},m=(c,p,v,_,M,F,O,I,U)=>{O=O||p.type==="svg",c==null?x(p,v,_,M,F,O,I,U):B(c,p,M,F,O,I,U)},x=(c,p,v,_,M,F,O,I)=>{let U,N;const{type:Q,props:K,shapeFlag:ee,transition:ne,patchFlag:he,dirs:we}=c;if(c.el&&y!==void 0&&he===-1)U=c.el=y(c.el);else{if(U=c.el=s(c.type,F,K&&K.is,K),ee&8?f(U,c.children):ee&16&&L(c.children,U,null,_,M,F&&Q!=="foreignObject",O,I),we&&jt(c,null,_,"created"),K){for(const D in K)D!=="value"&&!lr(D)&&o(U,D,null,K[D],F,c.children,_,M,oe);"value"in K&&o(U,"value",null,K.value),(N=K.onVnodeBeforeMount)&&wt(N,_,c)}P(U,c,c.scopeId,O,_)}we&&jt(c,null,_,"beforeMount");const be=(!M||M&&!M.pendingBranch)&&ne&&!ne.persisted;be&&ne.beforeEnter(U),r(U,p,v),((N=K&&K.onVnodeMounted)||be||we)&&Xe(()=>{N&&wt(N,_,c),be&&ne.enter(U),we&&jt(c,null,_,"mounted")},M)},P=(c,p,v,_,M)=>{if(v&&g(c,v),_)for(let F=0;F<_.length;F++)g(c,_[F]);if(M){let F=M.subTree;if(p===F){const O=M.vnode;P(c,O,O.scopeId,O.slotScopeIds,M.parent)}}},L=(c,p,v,_,M,F,O,I,U=0)=>{for(let N=U;N{const I=p.el=c.el;let{patchFlag:U,dynamicChildren:N,dirs:Q}=p;U|=c.patchFlag&16;const K=c.props||_e,ee=p.props||_e;let ne;v&&Wt(v,!1),(ne=ee.onVnodeBeforeUpdate)&&wt(ne,v,p,c),Q&&jt(p,c,v,"beforeUpdate"),v&&Wt(v,!0);const he=M&&p.type!=="foreignObject";if(N?R(c.dynamicChildren,N,I,v,_,he,F):O||z(c,p,I,null,v,_,he,F,!1),U>0){if(U&16)j(I,p,K,ee,v,_,M);else if(U&2&&K.class!==ee.class&&o(I,"class",null,ee.class,M),U&4&&o(I,"style",K.style,ee.style,M),U&8){const we=p.dynamicProps;for(let be=0;be{ne&&wt(ne,v,p,c),Q&&jt(p,c,v,"updated")},_)},R=(c,p,v,_,M,F,O)=>{for(let I=0;I{if(v!==_){for(const I in _){if(lr(I))continue;const U=_[I],N=v[I];U!==N&&I!=="value"&&o(c,I,N,U,O,p.children,M,F,oe)}if(v!==_e)for(const I in v)!lr(I)&&!(I in _)&&o(c,I,v[I],null,O,p.children,M,F,oe);"value"in _&&o(c,"value",v.value,_.value)}},H=(c,p,v,_,M,F,O,I,U)=>{const N=p.el=c?c.el:a(""),Q=p.anchor=c?c.anchor:a("");let{patchFlag:K,dynamicChildren:ee,slotScopeIds:ne}=p;ne&&(I=I?I.concat(ne):ne),c==null?(r(N,v,_),r(Q,v,_),L(p.children,v,Q,M,F,O,I,U)):K>0&&K&64&&ee&&c.dynamicChildren?(R(c.dynamicChildren,ee,v,M,F,O,I),(p.key!=null||M&&p===M.subTree)&&tl(c,p,!0)):z(c,p,v,Q,M,F,O,I,U)},W=(c,p,v,_,M,F,O,I,U)=>{p.slotScopeIds=I,c==null?p.shapeFlag&512?M.ctx.activate(p,v,_,O,U):k(p,v,_,M,F,O,U):$(c,p,U)},k=(c,p,v,_,M,F,O)=>{const I=c.component=Xf(c,_,M);if(Ur(c)&&(I.ctx.renderer=le),Qf(I),I.asyncDep){if(M&&M.registerDep(I,q),!c.el){const U=I.subTree=Se(mt);C(null,U,p,v)}return}q(I,c,p,v,M,F,O)},$=(c,p,v)=>{const _=p.component=c.component;if(of(c,p,v))if(_.asyncDep&&!_.asyncResolved){Z(_,p,v);return}else _.next=p,Ku(_.update),_.update();else p.el=c.el,_.vnode=p},q=(c,p,v,_,M,F,O)=>{const I=()=>{if(c.isMounted){let{next:Q,bu:K,u:ee,parent:ne,vnode:he}=c,we=Q,be;Wt(c,!1),Q?(Q.el=he.el,Z(c,Q,O)):Q=he,K&&ur(K),(be=Q.props&&Q.props.onVnodeBeforeUpdate)&&wt(be,ne,Q,he),Wt(c,!0);const D=ti(c),J=c.subTree;c.subTree=D,b(J,D,d(J.el),de(J),c,M,F),Q.el=D.el,we===null&&sf(c,D.el),ee&&Xe(ee,M),(be=Q.props&&Q.props.onVnodeUpdated)&&Xe(()=>wt(be,ne,Q,he),M)}else{let Q;const{el:K,props:ee}=p,{bm:ne,m:he,parent:we}=c,be=fr(p);if(Wt(c,!1),ne&&ur(ne),!be&&(Q=ee&&ee.onVnodeBeforeMount)&&wt(Q,we,p),Wt(c,!0),K&&Ne){const D=()=>{c.subTree=ti(c),Ne(K,c.subTree,c,M,null)};be?p.type.__asyncLoader().then(()=>!c.isUnmounted&&D()):D()}else{const D=c.subTree=ti(c);b(null,D,v,_,c,M,F),p.el=D.el}if(he&&Xe(he,M),!be&&(Q=ee&&ee.onVnodeMounted)){const D=p;Xe(()=>wt(Q,we,D),M)}(p.shapeFlag&256||we&&fr(we.vnode)&&we.vnode.shapeFlag&256)&&c.a&&Xe(c.a,M),c.isMounted=!0,p=v=_=null}},U=c.effect=new oo(I,()=>La(N),c.scope),N=c.update=()=>U.run();N.id=c.uid,Wt(c,!0),N()},Z=(c,p,v)=>{p.component=c;const _=c.vnode.props;c.vnode=p,c.next=null,Rf(c,p.props,_,v),Df(c,p.children,v),yn(),Or(void 0,c.update),wn()},z=(c,p,v,_,M,F,O,I,U=!1)=>{const N=c&&c.children,Q=c?c.shapeFlag:0,K=p.children,{patchFlag:ee,shapeFlag:ne}=p;if(ee>0){if(ee&128){Y(N,K,v,_,M,F,O,I,U);return}else if(ee&256){V(N,K,v,_,M,F,O,I,U);return}}ne&8?(Q&16&&oe(N,M,F),K!==N&&f(v,K)):Q&16?ne&16?Y(N,K,v,_,M,F,O,I,U):oe(N,M,F,!0):(Q&8&&f(v,""),ne&16&&L(K,v,_,M,F,O,I,U))},V=(c,p,v,_,M,F,O,I,U)=>{c=c||ln,p=p||ln;const N=c.length,Q=p.length,K=Math.min(N,Q);let ee;for(ee=0;eeQ?oe(c,M,F,!0,!1,K):L(p,v,_,M,F,O,I,U,K)},Y=(c,p,v,_,M,F,O,I,U)=>{let N=0;const Q=p.length;let K=c.length-1,ee=Q-1;for(;N<=K&&N<=ee;){const ne=c[N],he=p[N]=U?It(p[N]):xt(p[N]);if(Gt(ne,he))b(ne,he,v,null,M,F,O,I,U);else break;N++}for(;N<=K&&N<=ee;){const ne=c[K],he=p[ee]=U?It(p[ee]):xt(p[ee]);if(Gt(ne,he))b(ne,he,v,null,M,F,O,I,U);else break;K--,ee--}if(N>K){if(N<=ee){const ne=ee+1,he=neee)for(;N<=K;)te(c[N],M,F,!0),N++;else{const ne=N,he=N,we=new Map;for(N=he;N<=ee;N++){const Re=p[N]=U?It(p[N]):xt(p[N]);Re.key!=null&&we.set(Re.key,N)}let be,D=0;const J=ee-he+1;let Ce=!1,yt=0;const Qe=new Array(J);for(N=0;N=J){te(Re,M,F,!0);continue}let rt;if(Re.key!=null)rt=we.get(Re.key);else for(be=he;be<=ee;be++)if(Qe[be-he]===0&&Gt(Re,p[be])){rt=be;break}rt===void 0?te(Re,M,F,!0):(Qe[rt-he]=N+1,rt>=yt?yt=rt:Ce=!0,b(Re,p[rt],v,null,M,F,O,I,U),D++)}const Ct=Ce?zf(Qe):ln;for(be=Ct.length-1,N=J-1;N>=0;N--){const Re=he+N,rt=p[Re],No=Re+1{const{el:F,type:O,transition:I,children:U,shapeFlag:N}=c;if(N&6){X(c.component.subTree,p,v,_);return}if(N&128){c.suspense.move(p,v,_);return}if(N&64){O.move(c,p,v,le);return}if(O===Ge){r(F,p,v);for(let K=0;KI.enter(F),M);else{const{leave:K,delayLeave:ee,afterLeave:ne}=I,he=()=>r(F,p,v),we=()=>{K(F,()=>{he(),ne&&ne()})};ee?ee(F,he,we):we()}else r(F,p,v)},te=(c,p,v,_=!1,M=!1)=>{const{type:F,props:O,ref:I,children:U,dynamicChildren:N,shapeFlag:Q,patchFlag:K,dirs:ee}=c;if(I!=null&&Di(I,null,v,c,!0),Q&256){p.ctx.deactivate(c);return}const ne=Q&1&&ee,he=!fr(c);let we;if(he&&(we=O&&O.onVnodeBeforeUnmount)&&wt(we,p,c),Q&6)Me(c.component,v,_);else{if(Q&128){c.suspense.unmount(v,_);return}ne&&jt(c,null,p,"beforeUnmount"),Q&64?c.type.remove(c,p,v,M,le,_):N&&(F!==Ge||K>0&&K&64)?oe(N,p,v,!1,!0):(F===Ge&&K&384||!M&&Q&16)&&oe(U,p,v),_&&re(c)}(he&&(we=O&&O.onVnodeUnmounted)||ne)&&Xe(()=>{we&&wt(we,p,c),ne&&jt(c,null,p,"unmounted")},v)},re=c=>{const{type:p,el:v,anchor:_,transition:M}=c;if(p===Ge){ve(v,_);return}if(p===oi){T(c);return}const F=()=>{i(v),M&&!M.persisted&&M.afterLeave&&M.afterLeave()};if(c.shapeFlag&1&&M&&!M.persisted){const{leave:O,delayLeave:I}=M,U=()=>O(v,F);I?I(c.el,F,U):U()}else F()},ve=(c,p)=>{let v;for(;c!==p;)v=h(c),i(c),c=v;i(p)},Me=(c,p,v)=>{const{bum:_,scope:M,update:F,subTree:O,um:I}=c;_&&ur(_),M.stop(),F&&(F.active=!1,te(O,c,p,v)),I&&Xe(I,p),Xe(()=>{c.isUnmounted=!0},p),p&&p.pendingBranch&&!p.isUnmounted&&c.asyncDep&&!c.asyncResolved&&c.suspenseId===p.pendingId&&(p.deps--,p.deps===0&&p.resolve())},oe=(c,p,v,_=!1,M=!1,F=0)=>{for(let O=F;Oc.shapeFlag&6?de(c.component.subTree):c.shapeFlag&128?c.suspense.next():h(c.anchor||c.el),ue=(c,p,v)=>{c==null?p._vnode&&te(p._vnode,null,null,!0):b(p._vnode||null,c,p,null,null,null,v),Ba(),p._vnode=c},le={p:b,um:te,m:X,r:re,mt:k,mc:L,pc:z,pbc:R,n:de,o:e};let ke,Ne;return t&&([ke,Ne]=t(le)),{render:ue,hydrate:ke,createApp:Nf(ue,ke)}}function Wt({effect:e,update:t},n){e.allowRecurse=t.allowRecurse=n}function tl(e,t,n=!1){const r=e.children,i=t.children;if(ae(r)&&ae(i))for(let o=0;o>1,e[n[a]]0&&(t[r]=n[o-1]),n[o]=r)}}for(o=n.length,s=n[o-1];o-- >0;)n[o]=s,s=t[s];return n}const Hf=e=>e.__isTeleport,Ge=Symbol(void 0),wo=Symbol(void 0),mt=Symbol(void 0),oi=Symbol(void 0),Pn=[];let vt=null;function se(e=!1){Pn.push(vt=e?null:[])}function $f(){Pn.pop(),vt=Pn[Pn.length-1]||null}let In=1;function rs(e){In+=e}function nl(e){return e.dynamicChildren=In>0?vt||ln:null,$f(),In>0&&vt&&vt.push(e),e}function fe(e,t,n,r,i,o){return nl(G(e,t,n,r,i,o,!0))}function _r(e,t,n,r,i){return nl(Se(e,t,n,r,i,!0))}function jf(e){return e?e.__v_isVNode===!0:!1}function Gt(e,t){return e.type===t.type&&e.key===t.key}const Hr="__vInternal",rl=({key:e})=>e!=null?e:null,cr=({ref:e,ref_key:t,ref_for:n})=>e!=null?Oe(e)||Ye(e)||ce(e)?{i:ot,r:e,k:t,f:!!n}:e:null;function G(e,t=null,n=null,r=0,i=null,o=e===Ge?0:1,s=!1,a=!1){const l={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&rl(t),ref:t&&cr(t),scopeId:Vr,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetAnchor:null,staticCount:0,shapeFlag:o,patchFlag:r,dynamicProps:i,dynamicChildren:null,appContext:null};return a?(bo(l,n),o&128&&e.normalize(l)):n&&(l.shapeFlag|=Oe(n)?8:16),In>0&&!s&&vt&&(l.patchFlag>0||o&6)&&l.patchFlag!==32&&vt.push(l),l}const Se=Wf;function Wf(e,t=null,n=null,r=0,i=null,o=!1){if((!e||e===Wa)&&(e=mt),jf(e)){const a=zt(e,t,!0);return n&&bo(a,n),In>0&&!o&&vt&&(a.shapeFlag&6?vt[vt.indexOf(e)]=a:vt.push(a)),a.patchFlag|=-2,a}if(rc(e)&&(e=e.__vccOpts),t){t=qf(t);let{class:a,style:l}=t;a&&!Oe(a)&&(t.class=Qt(a)),ze(l)&&(Sa(l)&&!ae(l)&&(l=We({},l)),t.style=je(l))}const s=Oe(e)?1:af(e)?128:Hf(e)?64:ze(e)?4:ce(e)?2:0;return G(e,t,n,r,i,s,o,!0)}function qf(e){return e?Sa(e)||Hr in e?We({},e):e:null}function zt(e,t,n=!1){const{props:r,ref:i,patchFlag:o,children:s}=e,a=t?Gf(r||{},t):r;return{__v_isVNode:!0,__v_skip:!0,type:e.type,props:a,key:a&&rl(a),ref:t&&t.ref?n&&i?ae(i)?i.concat(cr(t)):[i,cr(t)]:cr(t):i,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:s,target:e.target,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==Ge?o===-1?16:o|16:o,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:e.transition,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&zt(e.ssContent),ssFallback:e.ssFallback&&zt(e.ssFallback),el:e.el,anchor:e.anchor}}function Ie(e=" ",t=0){return Se(wo,null,e,t)}function Te(e="",t=!1){return t?(se(),_r(mt,null,e)):Se(mt,null,e)}function xt(e){return e==null||typeof e=="boolean"?Se(mt):ae(e)?Se(Ge,null,e.slice()):typeof e=="object"?It(e):Se(wo,null,String(e))}function It(e){return e.el===null||e.memo?e:zt(e)}function bo(e,t){let n=0;const{shapeFlag:r}=e;if(t==null)t=null;else if(ae(t))n=16;else if(typeof t=="object")if(r&65){const i=t.default;i&&(i._c&&(i._d=!1),bo(e,i()),i._c&&(i._d=!0));return}else{n=32;const i=t._;!i&&!(Hr in t)?t._ctx=ot:i===3&&ot&&(ot.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else ce(t)?(t={default:t,_ctx:ot},n=32):(t=String(t),r&64?(n=16,t=[Ie(t)]):n=8);e.children=t,e.shapeFlag|=n}function Gf(...e){const t={};for(let n=0;nUe||ot,cn=e=>{Ue=e,e.scope.on()},Zt=()=>{Ue&&Ue.scope.off(),Ue=null};function il(e){return e.vnode.shapeFlag&4}let Dn=!1;function Qf(e,t=!1){Dn=t;const{props:n,children:r}=e.vnode,i=il(e);kf(e,n,i,t),If(e,r);const o=i?Jf(e,t):void 0;return Dn=!1,o}function Jf(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=Ma(new Proxy(e.ctx,Tf));const{setup:r}=n;if(r){const i=e.setupContext=r.length>1?tc(e):null;cn(e),yn();const o=Vt(r,e,0,[e.props,i]);if(wn(),Zt(),ha(o)){if(o.then(Zt,Zt),t)return o.then(s=>{is(e,s,t)}).catch(s=>{Dr(s,e,0)});e.asyncDep=o}else is(e,o,t)}else ol(e,t)}function is(e,t,n){ce(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:ze(t)&&(e.setupState=Pa(t)),ol(e,n)}let os;function ol(e,t,n){const r=e.type;if(!e.render){if(!t&&os&&!r.render){const i=r.template;if(i){const{isCustomElement:o,compilerOptions:s}=e.appContext.config,{delimiters:a,compilerOptions:l}=r,u=We(We({isCustomElement:o,delimiters:a},s),l);r.render=os(i,u)}}e.render=r.render||gt}cn(e),yn(),Sf(e),wn(),Zt()}function ec(e){return new Proxy(e.attrs,{get(t,n){return nt(e,"get","$attrs"),t[n]}})}function tc(e){const t=r=>{e.exposed=r||{}};let n;return{get attrs(){return n||(n=ec(e))},slots:e.slots,emit:e.emit,expose:t}}function $r(e){if(e.exposed)return e.exposeProxy||(e.exposeProxy=new Proxy(Pa(Ma(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in br)return br[n](e)}}))}function nc(e,t=!0){return ce(e)?e.displayName||e.name:e.name||t&&e.__name}function rc(e){return ce(e)&&"__vccOpts"in e}const ic=(e,t)=>Wu(e,t,Dn),oc="3.2.37",sc="http://www.w3.org/2000/svg",Yt=typeof document!="undefined"?document:null,ss=Yt&&Yt.createElement("template"),ac={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,r)=>{const i=t?Yt.createElementNS(sc,e):Yt.createElement(e,n?{is:n}:void 0);return e==="select"&&r&&r.multiple!=null&&i.setAttribute("multiple",r.multiple),i},createText:e=>Yt.createTextNode(e),createComment:e=>Yt.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>Yt.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},cloneNode(e){const t=e.cloneNode(!0);return"_value"in e&&(t._value=e._value),t},insertStaticContent(e,t,n,r,i,o){const s=n?n.previousSibling:t.lastChild;if(i&&(i===o||i.nextSibling))for(;t.insertBefore(i.cloneNode(!0),n),!(i===o||!(i=i.nextSibling)););else{ss.innerHTML=r?`${e}`:e;const a=ss.content;if(r){const l=a.firstChild;for(;l.firstChild;)a.appendChild(l.firstChild);a.removeChild(l)}t.insertBefore(a,n)}return[s?s.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}};function lc(e,t,n){const r=e._vtc;r&&(t=(t?[t,...r]:[...r]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}function uc(e,t,n){const r=e.style,i=Oe(n);if(n&&!i){for(const o in n)Oi(r,o,n[o]);if(t&&!Oe(t))for(const o in t)n[o]==null&&Oi(r,o,"")}else{const o=r.display;i?t!==n&&(r.cssText=n):t&&e.removeAttribute("style"),"_vod"in e&&(r.display=o)}}const as=/\s*!important$/;function Oi(e,t,n){if(ae(n))n.forEach(r=>Oi(e,t,r));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const r=fc(e,t);as.test(n)?e.setProperty(mn(r),n.replace(as,""),"important"):e[r]=n}}const ls=["Webkit","Moz","ms"],si={};function fc(e,t){const n=si[t];if(n)return n;let r=Et(t);if(r!=="filter"&&r in e)return si[t]=r;r=Br(r);for(let i=0;i{let e=Date.now,t=!1;if(typeof window!="undefined"){Date.now()>document.createEvent("Event").timeStamp&&(e=performance.now.bind(performance));const n=navigator.userAgent.match(/firefox\/(\d+)/i);t=!!(n&&Number(n[1])<=53)}return[e,t]})();let Ni=0;const pc=Promise.resolve(),vc=()=>{Ni=0},gc=()=>Ni||(pc.then(vc),Ni=sl());function sn(e,t,n,r){e.addEventListener(t,n,r)}function mc(e,t,n,r){e.removeEventListener(t,n,r)}function yc(e,t,n,r,i=null){const o=e._vei||(e._vei={}),s=o[t];if(r&&s)s.value=r;else{const[a,l]=wc(t);if(r){const u=o[t]=bc(r,i);sn(e,a,u,l)}else s&&(mc(e,a,s,l),o[t]=void 0)}}const fs=/(?:Once|Passive|Capture)$/;function wc(e){let t;if(fs.test(e)){t={};let n;for(;n=e.match(fs);)e=e.slice(0,e.length-n[0].length),t[n[0].toLowerCase()]=!0}return[mn(e.slice(2)),t]}function bc(e,t){const n=r=>{const i=r.timeStamp||sl();(hc||i>=n.attached-1)&&st(xc(r,n.value),t,5,[r])};return n.value=e,n.attached=gc(),n}function xc(e,t){if(ae(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(r=>i=>!i._stopped&&r&&r(i))}else return t}const cs=/^on[a-z]/,_c=(e,t,n,r,i=!1,o,s,a,l)=>{t==="class"?lc(e,r,i):t==="style"?uc(e,n,r):Lr(t)?eo(t)||yc(e,t,n,r,s):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):Ec(e,t,r,i))?dc(e,t,r,o,s,a,l):(t==="true-value"?e._trueValue=r:t==="false-value"&&(e._falseValue=r),cc(e,t,r,i))};function Ec(e,t,n,r){return r?!!(t==="innerHTML"||t==="textContent"||t in e&&cs.test(t)&&ce(n)):t==="spellcheck"||t==="draggable"||t==="translate"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA"||cs.test(t)&&Oe(n)?!1:t in e}const Cc={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String};hf.props;const ds=e=>{const t=e.props["onUpdate:modelValue"]||!1;return ae(t)?n=>ur(t,n):t};function Ac(e){e.target.composing=!0}function hs(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const al={created(e,{modifiers:{lazy:t,trim:n,number:r}},i){e._assign=ds(i);const o=r||i.props&&i.props.type==="number";sn(e,t?"change":"input",s=>{if(s.target.composing)return;let a=e.value;n&&(a=a.trim()),o&&(a=_i(a)),e._assign(a)}),n&&sn(e,"change",()=>{e.value=e.value.trim()}),t||(sn(e,"compositionstart",Ac),sn(e,"compositionend",hs),sn(e,"change",hs))},mounted(e,{value:t}){e.value=t==null?"":t},beforeUpdate(e,{value:t,modifiers:{lazy:n,trim:r,number:i}},o){if(e._assign=ds(o),e.composing||document.activeElement===e&&e.type!=="range"&&(n||r&&e.value.trim()===t||(i||e.type==="number")&&_i(e.value)===t))return;const s=t==null?"":t;e.value!==s&&(e.value=s)}},Tc=["ctrl","shift","alt","meta"],Sc={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>Tc.some(n=>e[`${n}Key`]&&!t.includes(n))},_t=(e,t)=>(n,...r)=>{for(let i=0;i{bn(e,!1)}):bn(e,t))},beforeUnmount(e,{value:t}){bn(e,t)}};function bn(e,t){e.style.display=t?e._vod:"none"}const Pc=We({patchProp:_c},ac);let ps;function Fc(){return ps||(ps=Vf(Pc))}const vs=(...e)=>{const t=Fc().createApp(...e),{mount:n}=t;return t.mount=r=>{const i=Lc(r);if(!i)return;const o=t._component;!ce(o)&&!o.render&&!o.template&&(o.template=i.innerHTML),i.innerHTML="";const s=n(i,!1,i instanceof SVGElement);return i instanceof Element&&(i.removeAttribute("v-cloak"),i.setAttribute("data-v-app","")),s},t};function Lc(e){return Oe(e)?document.querySelector(e):e}const Xn=new Map,zn=[],Vi=zn.map,kc=zn.some,Rc=zn.hasOwnProperty,Bc=/^((?:@[^/@]+\/)?[^/@]+)(?:@([^/]+))?(?:\/(.*))?$/,Ic=/^\d+\.\d+\.\d+(-[\w-.+]+)?$/,gs=/(?:\.[^/]*|\/)$/;class dn extends Error{constructor(t){super(t)}}dn.prototype.name=dn.name;function ms(e){const t=Bc.exec(e);return t&&{name:t[1],version:t[2],path:t[3]}}function Dc(e="https://cdn.jsdelivr.net/npm/",t=["unpkg","jsdelivr","browser","main"]){if(!/\/$/.test(e))throw new Error("origin lacks trailing slash");function n(i){for(const o of t){let s=i[o];if(typeof s=="string")return s.startsWith("./")&&(s=s.slice(2)),gs.test(s)?s:`${s}.js`}}function r(i){const o=`${e}${i.name}${i.version?`@${i.version}`:""}/package.json`;let s=Xn.get(o);return s||Xn.set(o,s=fetch(o).then(a=>{if(!a.ok)throw new dn("unable to load package.json");return a.redirected&&!Xn.has(a.url)&&Xn.set(a.url,s),a.json()})),s}return async function(o,s){if(o.startsWith(e)&&(o=o.substring(e.length)),/^(\w+:)|\/\//i.test(o))return o;if(/^[.]{0,2}\//i.test(o))return new URL(o,s==null?location:s).href;if(!o.length||/^[\s._]/.test(o)||/\s$/.test(o))throw new dn("illegal name");const a=ms(o);if(!a)return`${e}${o}`;if(!a.version&&s!=null&&s.startsWith(e)){const u=await r(ms(s.substring(e.length)));a.version=u.dependencies&&u.dependencies[a.name]||u.peerDependencies&&u.peerDependencies[a.name]}if(a.path&&!gs.test(a.path)&&(a.path+=".js"),a.path&&a.version&&Ic.test(a.version))return`${e}${a.name}@${a.version}/${a.path}`;const l=await r(a);return`${e}${l.name}@${l.version}/${a.path||n(l)||"index.js"}`}}var Oc=ll(Dc());function ll(e){const t=new Map,n=i(null);function r(a){if(typeof a!="string")return a;let l=t.get(a);return l||t.set(a,l=new Promise((u,f)=>{const d=document.createElement("script");d.onload=()=>{try{u(zn.pop()(i(a)))}catch{f(new dn("invalid module"))}d.remove()},d.onerror=()=>{f(new dn("unable to load module")),d.remove()},d.async=!0,d.src=a,window.define=ul,document.head.appendChild(d)})),l}function i(a){return l=>Promise.resolve(e(l,a)).then(r)}function o(a){return ll((l,u)=>l in a&&(l=a[l],u=null,typeof l!="string")?l:e(l,u))}function s(a){return arguments.length>1?Promise.all(Vi.call(arguments,n)).then(Nc):n(a)}return s.alias=o,s.resolve=e,s}function Nc(e){const t={};for(const n of e)for(const r in n)Rc.call(n,r)&&(n[r]==null?Object.defineProperty(t,r,{get:Vc(n,r)}):t[r]=n[r]);return t}function Vc(e,t){return()=>e[t]}function Uc(e){return e=e+"",e==="exports"||e==="module"}function ul(e,t,n){const r=arguments.length;r<2?(n=e,t=[]):r<3&&(n=t,t=typeof e=="string"?[]:e),zn.push(kc.call(t,Uc)?i=>{const o={},s={exports:o};return Promise.all(Vi.call(t,a=>(a=a+"",a==="exports"?o:a==="module"?s:i(a)))).then(a=>(n.apply(null,a),s.exports))}:i=>Promise.all(Vi.call(t,i)).then(o=>typeof n=="function"?n.apply(null,o):n))}ul.amd={};var jr=function(t){Hc(t);var n=zc(t);return t.on=n.on,t.off=n.off,t.fire=n.fire,t};function zc(e){var t=Object.create(null);return{on:function(n,r,i){if(typeof r!="function")throw new Error("callback is expected to be a function");var o=t[n];return o||(o=t[n]=[]),o.push({callback:r,ctx:i}),e},off:function(n,r){var i=typeof n=="undefined";if(i)return t=Object.create(null),e;if(t[n]){var o=typeof r!="function";if(o)delete t[n];else for(var s=t[n],a=0;a1&&(i=Array.prototype.splice.call(arguments,1));for(var o=0;o0?(b=Math.sqrt(w+1)*2,e[3]=.25*b,e[0]=(d-g)/b,e[1]=(h-l)/b,e[2]=(a-u)/b):s>f&&s>y?(b=Math.sqrt(1+s-f-y)*2,e[3]=(d-g)/b,e[0]=.25*b,e[1]=(a+u)/b,e[2]=(h+l)/b):f>y?(b=Math.sqrt(1+f-s-y)*2,e[3]=(h-l)/b,e[0]=(a+u)/b,e[1]=.25*b,e[2]=(d+g)/b):(b=Math.sqrt(1+y-s-f)*2,e[3]=(a-u)/b,e[0]=(h+l)/b,e[1]=(d+g)/b,e[2]=.25*b),e}function td(e,t,n,r,i){var o=1/Math.tan(t/2),s;return e[0]=o/n,e[1]=0,e[2]=0,e[3]=0,e[4]=0,e[5]=o,e[6]=0,e[7]=0,e[8]=0,e[9]=0,e[11]=-1,e[12]=0,e[13]=0,e[15]=0,i!=null&&i!==1/0?(s=1/(r-i),e[10]=(i+r)*s,e[14]=2*i*r*s):(e[10]=-1,e[14]=-2*r),e}var nd=td;function _o(e,t,n,r){var i=t[0],o=t[1],s=t[2],a=r[0],l=r[1],u=r[2],f=i-n[0],d=o-n[1],h=s-n[2],g=f*f+d*d+h*h;g>0&&(g=1/Math.sqrt(g),f*=g,d*=g,h*=g);var y=l*h-u*d,w=u*f-a*h,b=a*d-l*f;return g=y*y+w*w+b*b,g>0&&(g=1/Math.sqrt(g),y*=g,w*=g,b*=g),e[0]=y,e[1]=w,e[2]=b,e[3]=0,e[4]=d*b-h*w,e[5]=h*y-f*b,e[6]=f*w-d*y,e[7]=0,e[8]=f,e[9]=d,e[10]=h,e[11]=0,e[12]=i,e[13]=o,e[14]=s,e[15]=1,e}var rd=Ht;function cl(){var e=new Ke(3);return Ke!=Float32Array&&(e[0]=0,e[1]=0,e[2]=0),e}function id(e){var t=new Ke(3);return t[0]=e[0],t[1]=e[1],t[2]=e[2],t}function od(e){var t=e[0],n=e[1],r=e[2];return Math.hypot(t,n,r)}function ys(e,t,n){var r=new Ke(3);return r[0]=e,r[1]=t,r[2]=n,r}function Er(e,t,n,r){return e[0]=t,e[1]=n,e[2]=r,e}function sd(e,t,n){return e[0]=t[0]+n[0],e[1]=t[1]+n[1],e[2]=t[2]+n[2],e}function ad(e,t,n){return e[0]=t[0]-n[0],e[1]=t[1]-n[1],e[2]=t[2]-n[2],e}function Eo(e,t,n,r){return e[0]=t[0]+n[0]*r,e[1]=t[1]+n[1]*r,e[2]=t[2]+n[2]*r,e}function Wr(e,t){var n=t[0],r=t[1],i=t[2],o=n*n+r*r+i*i;return o>0&&(o=1/Math.sqrt(o)),e[0]=t[0]*o,e[1]=t[1]*o,e[2]=t[2]*o,e}function Ui(e,t){return e[0]*t[0]+e[1]*t[1]+e[2]*t[2]}function ai(e,t,n){var r=t[0],i=t[1],o=t[2],s=n[0],a=n[1],l=n[2];return e[0]=i*l-o*a,e[1]=o*s-r*l,e[2]=r*a-i*s,e}function hn(e,t,n){var r=t[0],i=t[1],o=t[2],s=n[3]*r+n[7]*i+n[11]*o+n[15];return s=s||1,e[0]=(n[0]*r+n[4]*i+n[8]*o+n[12])/s,e[1]=(n[1]*r+n[5]*i+n[9]*o+n[13])/s,e[2]=(n[2]*r+n[6]*i+n[10]*o+n[14])/s,e}function Cr(e,t,n){var r=n[0],i=n[1],o=n[2],s=n[3],a=t[0],l=t[1],u=t[2],f=i*u-o*l,d=o*a-r*u,h=r*l-i*a,g=i*h-o*d,y=o*f-r*h,w=r*d-i*f,b=s*2;return f*=b,d*=b,h*=b,g*=2,y*=2,w*=2,e[0]=a+f+g,e[1]=l+d+y,e[2]=u+h+w,e}var Fn=ad,ld=od;(function(){var e=cl();return function(t,n,r,i,o,s){var a,l;for(n||(n=3),r||(r=0),i?l=Math.min(i*n+r,t.length):l=t.length,a=r;a0&&(s=1/Math.sqrt(s)),e[0]=n*s,e[1]=r*s,e[2]=i*s,e[3]=o*s,e}function dl(e,t,n){var r=t[0],i=t[1],o=t[2],s=t[3];return e[0]=n[0]*r+n[4]*i+n[8]*o+n[12]*s,e[1]=n[1]*r+n[5]*i+n[9]*o+n[13]*s,e[2]=n[2]*r+n[6]*i+n[10]*o+n[14]*s,e[3]=n[3]*r+n[7]*i+n[11]*o+n[15]*s,e}(function(){var e=ud();return function(t,n,r,i,o,s){var a,l;for(n||(n=4),r||(r=0),i?l=Math.min(i*n+r,t.length):l=t.length,a=r;afl?(h=Math.acos(g),y=Math.sin(h),w=Math.sin((1-r)*h)/y,b=Math.sin(r*h)/y):(w=1-r,b=r),e[0]=w*i+b*l,e[1]=w*o+b*u,e[2]=w*s+b*f,e[3]=w*a+b*d,e}function pd(e,t){var n=t[0]+t[4]+t[8],r;if(n>0)r=Math.sqrt(n+1),e[3]=.5*r,r=.5/r,e[0]=(t[5]-t[7])*r,e[1]=(t[6]-t[2])*r,e[2]=(t[1]-t[3])*r;else{var i=0;t[4]>t[0]&&(i=1),t[8]>t[i*3+i]&&(i=2);var o=(i+1)%3,s=(i+2)%3;r=Math.sqrt(t[i*3+i]-t[o*3+o]-t[s*3+s]+1),e[i]=.5*r,r=.5/r,e[3]=(t[o*3+s]-t[s*3+o])*r,e[o]=(t[o*3+i]+t[i*3+o])*r,e[s]=(t[s*3+i]+t[i*3+s])*r}return e}var bs=fd,hl=cd,Ar=hd,pl=dd;(function(){var e=cl(),t=ys(1,0,0),n=ys(0,1,0);return function(r,i,o){var s=Ui(i,o);return s<-.999999?(ai(e,t,i),ld(e)<1e-6&&ai(e,n,i),Wr(e,e),zi(r,e,Math.PI),r):s>.999999?(r[0]=0,r[1]=0,r[2]=0,r[3]=1,r):(ai(e,i,o),r[0]=e[0],r[1]=e[1],r[2]=e[2],r[3]=1+s,pl(r,r))}})();(function(){var e=ws(),t=ws();return function(n,r,i,o,s,a){return dr(e,r,s,a),dr(t,i,o,a),dr(n,e,t,2*a*(1-a)),n}})();(function(){var e=jc();return function(t,n,r,i){return e[0]=r[0],e[3]=r[1],e[6]=r[2],e[1]=i[0],e[4]=i[1],e[7]=i[2],e[2]=-n[0],e[5]=-n[1],e[8]=-n[2],pl(t,pd(t,e))}})();var Ae=function(){this.children=[],this.model=Ft(),this.worldModel=Ft(),this.modelViewProjection=Ft(),this.worldTransformNeedsUpdate=!0,this.modelViewProjectionNeedsUpdate=!0,this.type="Element",this.scene=null,this.parent=null};Ae.prototype.appendChild=function(t,n){n===void 0&&(n=!1),t.parent=this,n?this.children.unshift(t):this.children.push(t),t.bindScene&&t.bindScene(this.scene),this.scene&&this.scene.renderFrame()};Ae.prototype.insertChildAfter=function(t,n){t.parent=this;var r=this.children.indexOf(n);if(r<0)throw new Error("Could not find element to insert after");this.children.splice(r+1,0,t),t.bindScene&&t.bindScene(this.scene),this.scene&&this.scene.renderFrame()};Ae.prototype.bindScene=function(t){this.scene=t,this.worldTransformNeedsUpdate=!0,this.modelViewProjectionNeedsUpdate=!0};Ae.prototype.traverse=function(t,n){t(this);for(var r=0;r-1&&(this.children.splice(n,1),t.bindScene(null)),this.scene&&this.scene.renderFrame()};Ae.prototype.updateWorldTransform=function(t){t===void 0&&(t=!1),(this.worldTransformNeedsUpdate||t)&&(this.parent?Ht(this.worldModel,this.parent.worldModel,this.model):Wc(this.worldModel,this.model),this.modelViewProjectionNeedsUpdate=!0,this.worldTransformNeedsUpdate=!1,t=!0);for(var n=t,r=this.children,i=0;i1)){var f=Date.now()-r;if(!(f>xs.maxSingleTouchTime)){var d=u.changedTouches[0],h=d.pageX-i.x,g=d.pageY-i.y;h*h+g*g0?n=s:t=s;while(Math.abs(o)>_d&&++a=xd?Td(l,g,t,r):y===0?g:Ad(l,u,u+Zn,t,r)}return function(u){return u===0?0:u===1?1:Tr(a(u),n,i)}},_s={ease:xn(.25,.1,.25,1),easeIn:xn(.42,0,1,1),easeOut:xn(0,0,.58,1),easeInOut:xn(.42,0,.58,1),linear:xn(0,0,1,1)},Co=Fd,Md=wl,Pd=wl();function Fd(e,t,n){var r=Object.create(null),i=Object.create(null);n=n||{};var o=typeof n.easing=="function"?n.easing:_s[n.easing];o||(n.easing&&console.warn("Unknown easing function in amator: "+n.easing),o=_s.ease);var s=typeof n.step=="function"?n.step:Es,a=typeof n.done=="function"?n.done:Es,l=Ld(n.scheduler),u=Object.keys(t);u.forEach(function(S){r[S]=e[S],i[S]=t[S]-e[S]});var f=typeof n.duration=="number"?n.duration:400,d=Math.max(1,f*.06),h,g=0;return h=l.next(w),{cancel:y};function y(){l.cancel(h),h=0}function w(){var S=o(g/d);g+=1,b(S),g<=d?(h=l.next(w),s(e)):(h=0,setTimeout(function(){a(e)},0))}function b(S){u.forEach(function(C){e[C]=i[C]*S+r[C]})}}function Es(){}function Ld(e){if(!e){var t=typeof window!="undefined"&&window.requestAnimationFrame;return t?kd():Rd()}if(typeof e.next!="function")throw new Error("Scheduler is supposed to have next(cb) function");if(typeof e.cancel!="function")throw new Error("Scheduler is supposed to have cancel(handle) function");return e}function kd(){return{next:window.requestAnimationFrame.bind(window),cancel:window.cancelAnimationFrame.bind(window)}}function Rd(){return{next:function(e){return setTimeout(e,1e3/60)},cancel:function(e){return clearTimeout(e)}}}function wl(){var e=new Set,t=new Set,n=0;return{next:i,cancel:i,clearAll:r};function r(){e.clear(),t.clear(),cancelAnimationFrame(n),n=0}function i(a){t.add(a),o()}function o(){n||(n=requestAnimationFrame(s))}function s(){n=0;var a=t;t=e,e=a,e.forEach(function(l){l()}),e.clear()}}Co.makeAggregateRaf=Md;Co.sharedScheduler=Pd;function Cs(e,t,n){typeof n!="object"&&(n={});var r=.001,i=typeof n.minVelocity=="number"?n.minVelocity:r,o=typeof n.amplitude=="number"?n.amplitude:.01,s=typeof n.cancelAnimationFrame=="function"?n.cancelAnimationFrame:Bd(),a=typeof n.requestAnimationFrame=="function"?n.requestAnimationFrame:Id(),l,u,f=342,d,h,g,y,w,b,S,C;return{start:m,setAmplitude:A,getAmplitude:E,stop:P,impulse:L,cancel:T};function A(R){o=R}function E(){return o}function T(){s(d),s(C)}function m(){l=e(),g=w=h=y=b=0,u=new Date,s(d),s(C),d=a(x)}function x(){var R=Date.now(),j=R-u;u=R;var H=e(),W=H.x-l.x,k=H.y-l.y,$=(H.z||0)-l.z;l=H;var q=1e3/(1+j);h=.8*W*q+.2*h,y=.8*k*q+.2*y,b=.8*$*q+.2*b,d=a(x)}function P(){!d||(s(d),d=0,s(C),C=0,L(h,y,b))}function L(R,j,H){u=Date.now(),(R<-i||R>i)&&(g=o*R),(j<-i||j>i)&&(w=o*j),(H<-i||H>i)&&(S=o*H),C=a(B)}function B(){var R=Date.now()-u,j=!1,H=0,W=0,k=0,$=Math.exp(-R/f);if(g&&(H=g*$,H>r||H<-r?j=!0:H=g=0),w&&(W=w*$,W>r||W<-r?j=!0:W=w=0),S&&(k=S*$,k>r||k<-r?j=!0:k=S=0),j){var q=e();t(q.x+H,q.y+W,q.z+k),C=a(B)}}}function Bd(){return typeof cancelAnimationFrame=="function"?cancelAnimationFrame:clearTimeout}function Id(){return typeof requestAnimationFrame=="function"?requestAnimationFrame:function(e){return setTimeout(e,16)}}var bl=function(t){this.x=t.clientX,this.y=t.clientY,this.lastX=this.x,this.lastY=this.y,this.id=t.identifier,this.createdAt=Date.now()};bl.prototype.move=function(t){this.lastX=this.x,this.lastY=this.y,this.x=t.clientX,this.y=t.clientY};var qr=0,Dd=1,Od=2,Nd=3,Gr=function(t){this.allowRotation=t,this.state=qr,this.canRotate=!1,this.canScale=!1,this.canIncline=!1,this.first=void 0,this.second=void 0,this.stateChanged=!1};Gr.prototype.reset=function(){this.state=qr,this.canRotate=!1,this.canScale=!1,this.canIncline=!1,this.first=void 0,this.second=void 0};Gr.prototype.isUnknown=function(){return this.state===qr};Gr.prototype.track=function(t,n){if(this.stateChanged=!1,this.state===qr){if(!(this.first&&this.second)){this.first={id:t.id,x:t.x,y:t.y},this.second={id:n.id,x:n.x,y:n.y};return}var r=this.first,i=this.second;if(t.id===i.id&&n.id===r.id){var o=r;r=i,i=o}var s=r.y-i.y,a=r.x-i.x,l=t.y-n.y,u=t.x-n.x,f=Math.abs(Math.hypot(s,a)-Math.hypot(l,u)),d=Math.atan2(s,a),h=Math.abs(d-Math.atan2(l,u));d=Math.abs(d)*180/Math.PI;var g=60,y=d42&&(this.canIncline=!0)}this.canIncline?(this.canRotate=!1,this.canScale=!1,this.canIncline=!0,this.state=Nd):h>.1&&this.allowRotation?(this.canRotate=!0,this.canScale=!0,this.canIncline=!1,this.state=Od):f>15&&(this.canRotate=!1,this.canScale=!0,this.canIncline=!1,this.state=Dd),this.stateChanged=!0}};function Vd(e,t){var n=!1,r=new Map,i=t.allowRotation,o=t.allowPinchRotation,s=t.panAnimation,a=t.rotateAnimation,l=new Gr(o&&i),u,f=Date.now(),d=f;return g(),{dispose:h};function h(){e.removeEventListener("touchstart",y,{passive:!1}),C()}function g(){e.addEventListener("touchstart",y,{passive:!1})}function y(A){n||(S(),n=!0),s.cancel(),a.cancel(),A.touches.length===1&&s.start();for(var E=0;E1&&l.isUnknown();(T!==0||m!==0)&&!ve&&(t.panByAbsoluteOffset(T,m),R=!0),R&&t.redraw()}function b(A){var E=Date.now(),T=E-f;f=E;for(var m=A.changedTouches,x=0;x350){var L=A.changedTouches[0],B=Math.abs(L.clientX-u.clientX),R=Math.abs(L.clientY-u.clientY);Math.hypot(B,R)<30&&t.zoomToClientCoordinates(u.clientX,u.clientY,.5,!0)}u=A.changedTouches[0]}}function S(){document.addEventListener("touchmove",w,{passive:!1}),document.addEventListener("touchend",b,{passive:!1}),document.addEventListener("touchcancel ",b,{passive:!1})}function C(){document.removeEventListener("touchmove",w),document.removeEventListener("touchend",b),document.removeEventListener("touchcancel ",b)}}function As(e,t,n){var r=e*Math.cos(t),i=e*Math.sin(t)*Math.cos(n),o=e*Math.sin(t)*Math.sin(n);return[i,o,r]}function Je(e,t,n){return en&&(e=n),e}function Dt(e,t){return e===void 0?t:e}function dt(e,t,n){return Math.abs(e)0?100:1,S=y(-w.deltaY*b);t.zoomToClientCoordinates(w.clientX,w.clientY,S),w.preventDefault()}function y(w){return Math.sign(w)*Math.min(.25,Math.abs(w/128))}}function Ao(e,t){if(typeof e=="string"){var n=document.querySelector(e);if(!n)throw new Error("Cannot resolve input target element: "+e);return n}return e||t}var xl=function(t){this.drawContext=t.getDrawContext(),this.updated=!1};function _l(e){var t=e.getDrawContext(),n=t.view,r=Math.PI*2,i=Math.PI*1.618,o=new xl(e),s=e.getOptions()||{},a=s.allowRotation===void 0?!0:!!s.allowRotation,l=s.allowPinchRotation===void 0?a:!!s.allowPinchRotation,u=Dt(s.minPhi,-1/0),f=Dt(s.maxPhi,1/0),d=Je(-Math.PI/2,u,f),h=Dt(s.minTheta,0),g=Dt(s.maxTheta,Math.PI),y=Je(0,h,g),w=Dt(s.minZoom,-1/0),b=Dt(s.maxZoom,1/0),S=Je(1,w,b),C=n.center,A=n.position,E=Cs(Y,re),T=Cs(X,te,{minVelocity:1}),m=[0,0,1],x={dispose:H,setViewBox:j,panByAbsoluteOffset:q,slideCenterUpDown:V,rotateByAngle:k,rotateByAbsoluteOffset:$,zoomCenterByScaleFactor:ve,zoomToClientCoordinates:Z,redraw:Me,allowRotation:a,allowPinchRotation:l,rotateAnimation:T,panAnimation:E},P=Ao(s.inputTarget,t.canvas),L=Ud(P,x),B=Vd(P,x),R=Hd(P,x);return Me(),x;function j(){return A=n.position,S=Math.hypot(A[2]),C[0]=A[0],C[1]=A[1],C[2]=0,y=Je(0,h,g),d=Je(-Math.PI/2,u,f),Me(),x}function H(){T.cancel(),E.cancel(),B.dispose(),L.dispose(),R.dispose()}function W(oe,de){var ue=e.getSceneCoordinate(oe,de),le=Fn(ue,ue,A);Wr(le,le);var ke=Ui(m,le);if(Math.abs(ke)>1e-7){var Ne=Ui(Fn([0,0,0],C,A),m)/ke;return Eo([0,0,0],A,le,Ne)}}function k(oe,de){d=Je(d+oe,u,f),y=Je(y+de,h,g)}function $(oe,de){if(!!a){var ue=t.width/t.height;d-=r*oe/t.width,y-=i*de/t.height*ue,y=Je(y,h,g),d=Je(d,u,f)}}function q(oe,de){var ue=t.width/t.height,le=2*S*Math.tan(t.fov/2),ke=ue*le*oe/(t.width/t.pixelRatio),Ne=le*de/(t.height/t.pixelRatio);z(ke,-Ne)}function Z(oe,de,ue,le){var ke=W(oe,de);if(!!ke){var Ne=ke[0]-C[0],c=ke[1]-C[1];if(le){var p={r:S,x:C[0],y:C[1]},v={r:Je(S*(1-ue),w,b),x:p.x+Ne*ue,y:p.y+c*ue};Co(p,v,{step:function(M){S=M.r,C[0]=M.x,C[1]=M.y,Me()}})}else ve(ue,Ne,c),Me()}}function z(oe,de){var ue=Math.cos(d),le=Math.sin(d);C[0]+=ue*de+le*oe,C[1]+=le*de-ue*oe}function V(oe){C[2]+=oe*S*.001}function Y(){return{x:C[0],y:C[1],z:C[2]}}function X(){return{x:d,y,z:0}}function te(oe,de){y=Je(de,h,g),d=Je(oe,u,f),Me()}function re(oe,de,ue){Er(C,oe,de,ue),Me()}function ve(oe,de,ue){var le=Je(S*(1-oe),w,b);le!==S&&(S=le,C[0]+=de*oe,C[1]+=ue*oe)}function Me(){var oe=As(S,y,d),de=Math.hypot(S,1),ue=y-Math.acos(S/de),le=As(de,ue,d);if(Fn(le,le,oe),Er(A,oe[0],oe[1],oe[2]),sd(A,A,C),_o(n.cameraWorld,A,C,le),xo(n.orientation,n.cameraWorld),n.update(),o.updated=!1,e.fire("transform",o),o.updated){Me();return}e.getRoot().scheduleMVPUpdate(),e.renderFrame()}}$c(Float64Array);function Hi(e,t){t===void 0&&(t={});var n,r,i=t.devicePixelRatio||window.devicePixelRatio,o=t.wglContextOptions,s=e.getContext(t.version===2?"webgl2":"webgl",o)||e.getContext("experimental-webgl",o);s.enable(s.BLEND),s.blendFuncSeparate(s.SRC_ALPHA,s.ONE_MINUS_SRC_ALPHA,s.ONE,s.ONE_MINUS_SRC_ALPHA),s.clearColor(0,0,0,1),s.clear(s.COLOR_BUFFER_BIT|s.DEPTH_BUFFER_BIT);var a=0,l=new Ae,u=!1,f=!1,d=Ao(t.inputTarget,e),h,g=new $t,y=Ft(),w=Ft(),b=t.fov===void 0?Math.PI*45/180:t.fov,S=t.near===void 0?.01:t.near,C=t.far===void 0?1/0:t.far,A={width:window.innerWidth,height:window.innerHeight,pixelRatio:i,canvas:e,projection:y,inverseProjection:w,view:g,fov:b};X();var E=jr({appendChild:ke,getSceneCoordinate:ve,getClientCoordinate:Me,getTransform:$,getRoot:H,getGL:j,removeChild:Ne,setViewBox:oe,setClearColor:q,getClearColor:Z,clear:le,dispose:V,renderFrame:de,getPixelRatio:P,setPixelRatio:R,getCameraController:k,setCameraController:W,getDrawContext:L,getOptions:B}),T=E.on;E.on=c,l.bindScene(E);var m=(t.controls||_l)(E),x;return z(),de(),E;function P(){return i}function L(){return A}function B(){return t}function R(p){i=p,A.pixelRatio=i,X()}function j(){return s}function H(){return l}function W(p){return m&&m.dispose(),m=p(E,A),m}function k(){return m}function $(){return l.model}function q(p,v,_,M){s.clearColor(p,v,_,M)}function Z(){return s.getParameter(s.COLOR_CLEAR_VALUE)}function z(){d.addEventListener("mousemove",re),x=vd(d,te),window.addEventListener("resize",Y,!0)}function V(){d.removeEventListener("mousemove",re),x&&x(),window.removeEventListener("resize",Y,!0),m.dispose(),l.dispose(),a&&(cancelAnimationFrame(a),a=0)}function Y(){X()}function X(){t.size?(n=e.width=t.size.width,r=e.height=t.size.height):(n=e.width=e.offsetWidth*i,r=e.height=e.offsetHeight*i),h=e.getBoundingClientRect(),s.viewport(0,0,n,r),A.width=n,A.height=r,l.worldTransformNeedsUpdate=!0,nd(y,b,n/r,S,C),Hn(w,y),de()}function te(p){if(!!u){var v=ve(p.clientX,p.clientY);!v||E.fire("click",{originalEvent:p,x:v[0],y:v[1],z:v[2]})}}function re(p){if(!!f){var v=ve(p.clientX,p.clientY);!v||E.fire("mousemove",{originalEvent:p,x:v[0],y:v[1],z:v[2]})}}function ve(p,v){p-=h.left,v-=h.top;var _=E.getPixelRatio(),M=_*p/n*2-1,F=(1-_*v/r)*2-1,O=[0,0,0],I=hn(O,[M,F,0],w);hn(I,I,g.cameraWorld),Fn(I,I,g.position),Wr(I,I);var U=0,N=(U-g.position[2])/I[2];return I[2]>0,Eo(I,g.position,I,N),I}function Me(p,v,_){_===void 0&&(_=0);var M=Ht(Ft(),y,g.matrix);Ht(M,M,l.model);var F=dl([0,0,0,0],[p,v,_,1],M),O=E.getPixelRatio(),I=n*(F[0]/F[3]+1)*.5/O,U=r*(1-(F[1]/F[3]+1)*.5)/O;return{x:I,y:U}}function oe(p){var v=A.pixelRatio,_=v*Math.max((p.top-p.bottom)/2,(p.right-p.left)/2),M=A.view,F=M.position,O=M.orientation;F[0]=(p.left+p.right)/2,F[1]=(p.top+p.bottom)/2,F[2]=_/Math.tan(A.fov/2),hl(O,0,0,0,1),A.view.update(),m.setViewBox&&m.setViewBox(p)}function de(p){if(p===void 0&&(p=!1),p)return ue();a||(a=requestAnimationFrame(ue))}function ue(){s.clear(s.COLOR_BUFFER_BIT),l.updateWorldTransform(),l.draw(s,A),a=0}function le(){s.clear(s.COLOR_BUFFER_BIT)}function ke(p,v){v===void 0&&(v=!1),l.appendChild(p,v),E.fire("append-child",p)}function Ne(p){l.removeChild(p),E.fire("remove-child",p)}function c(p,v,_){return p==="click"&&(u=!0),p==="mousemove"&&(f=!0),T(p,v,_)}}var $e={compile:$d,link:jd,getLocations:Wd,getAttributes:El,getUniforms:Cl,initBuffer:qd};function $d(e,t,n){var r=e.createShader(t);if(!r)throw new Error("Failed to create a shared "+n);if(e.shaderSource(r,n),e.compileShader(r),!e.getShaderParameter(r,e.COMPILE_STATUS))throw new Error(e.getShaderInfoLog(r)||"Failed to compile shader "+n);return r}function jd(e,t,n){var r=e.createProgram();if(!r)throw new Error("Failed to link a program");if(e.attachShader(r,t),e.attachShader(r,n),e.linkProgram(r),!e.getProgramParameter(r,e.LINK_STATUS))throw new Error(e.getProgramInfoLog(r)||"Failed to link a program");return r}function Wd(e,t){return{attributes:El(e,t),uniforms:Cl(e,t)}}function El(e,t){for(var n=Object.create(null),r=e.getProgramParameter(t,e.ACTIVE_ATTRIBUTES),i=0;i= 0.5) {discard;} + gl_FragColor = vColor; + } + `,n=` + uniform vec4 uColor; + uniform mat4 projectionMatrix; + uniform mat4 uModel; + uniform mat4 uView; + + attribute float aPointSize; + attribute vec3 aPosition; + attribute vec3 aPoint; + `+(e?"attribute vec4 aColor;":"")+` + + varying vec4 vColor; + varying vec3 vPosition; + + void main() { + vPosition = aPoint; + gl_Position = projectionMatrix * uView * uModel * vec4( aPosition + aPoint * aPointSize, 1.0 ); + vColor = `+(e?"aColor.abgr":"uColor")+`; + } +`;return{fragmentShaderCode:t,vertexShaderCode:n}}var To=function(t,n,r,i){i===void 0&&(i=1),this.r=t,this.g=n,this.b=r,this.a=i===void 0?1:i},So=function(t,n,r){this.offset=n,this._points=t,r!==void 0&&(this.data=r)};So.prototype.update=function(t){var n=this.offset,r=this._points.positions,i=this._points.is3D;r[n]=t.x,n++,r[n]=t.y,n++,i&&(r[n]=t.z||0,n++);var o=t.size||this._points.size||1;o!==void 0&&(r[n]=o),this.setColor(t.color)};So.prototype.setColor=function(t){if(!(!this._points.colors||t===void 0)){var n=this.offset+(this._points.is3D?4:3);this._points.colors[n]=t}};var Kd=function(e){function t(n,r){if(n===void 0)throw new Error("Point capacity should be defined");e.call(this),this.is3D=!r||r.is3D===void 0||r.is3D,this.allowColors=!r||r.allowColors===void 0||r.allowColors,this.itemsPerPoint=3,this.is3D&&(this.itemsPerPoint+=1),this.allowColors&&(this.itemsPerPoint+=1),this.capacity=n,this.count=0,this.color=new To(1,1,1,1),this._program=null,this.buffer=new ArrayBuffer(n*this.itemsPerPoint*4),this.positions=new Float32Array(this.buffer),this.colors=this.allowColors?new Uint32Array(this.buffer):null}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.draw=function(r,i){this._program||(this._program=Gd(r,this)),this._program.draw(i)},t.prototype.dispose=function(){this._program&&(this._program=null)},t.prototype.add=function(r,i){if(!r)throw new Error("Point is required");this.count>=this.capacity&&this._extendArray();var o=this.count*this.itemsPerPoint,s=new So(this,o,i);return s.update(r),this.count+=1,s},t.prototype._extendArray=function(){var r=new ArrayBuffer(this.buffer.byteLength*2),i=new Float32Array(r);this.positions&&i.set(this.positions),this.buffer=r,this.positions=i,this.allowColors&&(this.colors=new Uint32Array(r)),this.capacity*=2},t}(Ae),ui=Yr();function $i(e,t){var n=!!t.allowColors,r=[n,e],i=ui.get(r);if(!i){var o=Xd(n),s=o.frag,a=o.vert,l=$e.compile(e,e.VERTEX_SHADER,a),u=$e.compile(e,e.FRAGMENT_SHADER,s);i=$e.link(e,l,u),ui.set(r,i)}var f=$e.getLocations(e,i),d=e.createBuffer(),h=t.is3D?3:2,g=(h+1)*4,y=h*4,w={draw:S,dispose:b};return w;function b(){e.deleteBuffer(d),e.deleteProgram(i),ui.remove(r)}function S(C){if(t.count!==0){var A=t.buffer;e.useProgram(i),e.uniformMatrix4fv(f.uniforms.uModel,!1,t.worldModel),e.uniformMatrix4fv(f.uniforms.projectionMatrix,!1,C.projection),e.uniformMatrix4fv(f.uniforms.uView,!1,C.view.matrix);var E=t.color;e.uniform4f(f.uniforms.uColor,E.r,E.g,E.b,E.a),e.bindBuffer(e.ARRAY_BUFFER,d),t.isDirtyBuffer&&(e.bufferData(e.ARRAY_BUFFER,A,e.STATIC_DRAW),t.isDirtyBuffer=!1),e.enableVertexAttribArray(f.attributes.aPosition),n?(e.vertexAttribPointer(f.attributes.aPosition,h,e.FLOAT,!1,g,0),e.enableVertexAttribArray(f.attributes.aColor),e.vertexAttribPointer(f.attributes.aColor,4,e.UNSIGNED_BYTE,!0,g,y)):e.vertexAttribPointer(f.attributes.aPosition,h,e.FLOAT,!1,4*h,0),e.drawArrays(e.LINES,0,t.count*2)}}}function Xd(e){return{vert:`attribute vec3 aPosition; + varying vec4 vColor; + `+(e?"attribute vec4 aColor;":"")+` + uniform vec4 uColor; + uniform mat4 projectionMatrix; + uniform mat4 uModel; + uniform mat4 uView; + +void main() { + gl_Position = projectionMatrix * uView * uModel * vec4(aPosition, 1.0); + vColor = `+(e?"aColor.abgr":"uColor")+`; +}`,frag:`precision mediump float; + varying vec4 vColor; + void main() { + gl_FragColor = vColor; + }`}}var fi=Yr();function Zd(e,t){var n=Number.isFinite(t.width)&&t.width>0&&t.width!==1,r;if(n){if(r=e.getExtension("ANGLE_instanced_arrays"),!r)return console.error("ANGLE_instanced_arrays is not supported, thick lines are not possible"),$i(e,t)}else return $i(e,t);var i=!!t.allowColors,o=[i,e],s=fi.get(o);if(!s){var a=Qd(i),l=a.frag,u=a.vert,f=$e.compile(e,e.VERTEX_SHADER,u),d=$e.compile(e,e.FRAGMENT_SHADER,l);s=$e.link(e,f,d),fi.set(o,s)}var h=$e.getLocations(e,s),g=e.createBuffer(),y=t.is3D?3:2,w=i?2*(y+1)*4:2*y*4,b=e.createBuffer(),S=new Float32Array([-.5,0,-.5,1,.5,1,-.5,0,.5,1,.5,0]),C={isThickWire:!0,draw:E,dispose:A};return C;function A(){g&&e.deleteBuffer(g),b&&e.deleteBuffer(b),h&&(e.disableVertexAttribArray(h.attributes.aFrom),e.disableVertexAttribArray(h.attributes.aFromColor),e.disableVertexAttribArray(h.attributes.aTo),e.disableVertexAttribArray(h.attributes.aToColor),e.disableVertexAttribArray(h.attributes.aPosition)),e.deleteProgram(s),fi.remove(o)}function E(T){if(t.count!==0){var m=t.buffer;e.useProgram(s),e.uniformMatrix4fv(h.uniforms.uModel,!1,t.worldModel),e.uniformMatrix4fv(h.uniforms.projectionMatrix,!1,T.projection),e.uniformMatrix4fv(h.uniforms.uView,!1,T.view.matrix),e.uniform3fv(h.uniforms.uOrigin,T.view.position),e.uniform1f(h.uniforms.uWidth,t.width),e.uniform2f(h.uniforms.uResolution,T.width,T.height);var x=t.color;e.uniform4f(h.uniforms.uColor,x.r,x.g,x.b,x.a),e.bindBuffer(e.ARRAY_BUFFER,b),e.bufferData(e.ARRAY_BUFFER,S,e.STATIC_DRAW),e.enableVertexAttribArray(h.attributes.aPosition),e.vertexAttribPointer(h.attributes.aPosition,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,g),e.bufferData(e.ARRAY_BUFFER,m,e.DYNAMIC_DRAW),e.enableVertexAttribArray(h.attributes.aFrom),e.vertexAttribPointer(h.attributes.aFrom,y,e.FLOAT,!1,w,0),i?(e.enableVertexAttribArray(h.attributes.aFromColor),e.vertexAttribPointer(h.attributes.aFromColor,4,e.UNSIGNED_BYTE,!0,w,y*4),e.enableVertexAttribArray(h.attributes.aTo),e.vertexAttribPointer(h.attributes.aTo,y,e.FLOAT,!1,w,(y+1)*4),e.enableVertexAttribArray(h.attributes.aToColor),e.vertexAttribPointer(h.attributes.aToColor,4,e.UNSIGNED_BYTE,!0,w,(2*y+1)*4)):(e.enableVertexAttribArray(h.attributes.aTo),e.vertexAttribPointer(h.attributes.aTo,y,e.FLOAT,!1,w,y*4)),r.vertexAttribDivisorANGLE(h.attributes.aPosition,0),r.vertexAttribDivisorANGLE(h.attributes.aTo,1),r.vertexAttribDivisorANGLE(h.attributes.aFrom,1),r.vertexAttribDivisorANGLE(h.attributes.aFromColor,1),r.vertexAttribDivisorANGLE(h.attributes.aToColor,1),r.drawArraysInstancedANGLE(e.TRIANGLES,0,6,t.count),r.vertexAttribDivisorANGLE(h.attributes.aFrom,0),r.vertexAttribDivisorANGLE(h.attributes.aTo,0),r.vertexAttribDivisorANGLE(h.attributes.aFromColor,0),r.vertexAttribDivisorANGLE(h.attributes.aToColor,0)}}}function Qd(e){return{vert:`attribute vec3 aPosition, aFrom, aTo; + varying vec4 vColor; + `+(e?"attribute vec4 aFromColor, aToColor;":"")+` + uniform vec4 uColor; + uniform mat4 projectionMatrix; + uniform mat4 uModel; + uniform mat4 uView; + uniform float uWidth; + uniform vec2 uResolution; + + void main() { + // let's get the model point to clip space: + vec4 clip0 = projectionMatrix * uView * uModel * vec4(aFrom, 1.0); + vec4 clip1 = projectionMatrix * uView * uModel * vec4(aTo, 1.0); + + // And from the clip space move to the screen pixels + // (as we set width of the lines in pixels) + vec2 screen0 = uResolution * (0.5 * clip0.xy/clip0.w + 0.5); + vec2 screen1 = uResolution * (0.5 * clip1.xy/clip1.w + 0.5); + + // this is direction along the x axis + vec2 xBasis = normalize(screen1 - screen0); + // But since we set the width, we get the direction along the Y: + vec2 yBasis = vec2(-xBasis.y, xBasis.x); + + // Offset the original points: + vec2 pt0 = screen0 + uWidth * aPosition.x * yBasis; + vec2 pt1 = screen1 + uWidth * aPosition.x * yBasis; + + // and interpolate along the Y of the instanced geometry + // (remember, Y changes from 0 to 1): + vec2 pt = mix(pt0, pt1, aPosition.y); + vec4 clip = mix(clip0, clip1, aPosition.y); + + // Finally move back to the clip space: + gl_Position = vec4(clip.w * (2.0 * pt/uResolution - 1.0), clip.z, clip.w); + vColor = `+(e?"mix(aFromColor.abgr, aToColor.abgr, aPosition.y)":"uColor")+`; + }`,frag:`precision mediump float; + varying vec4 vColor; + void main() { + gl_FragColor = vColor; + }`}}var Mo=function(t,n){this.offset=n,this._wire=t,this.update=t.is3D?this.update3D:this.update2D};Mo.prototype.update2D=function(t,n){this._wire.isDirtyBuffer=!0;var r=this._wire.positions,i=this.offset;r[i+0]=t.x,r[i+1]=t.y,i+=2;var o=this._wire.allowColors;o&&(t.color!==void 0&&(this._wire.colors[i]=t.color),i+=1),r[i+0]=n.x,r[i+1]=n.y,o&&n.color!==void 0&&(this._wire.colors[i+2]=n.color)};Mo.prototype.update3D=function(t,n){this._wire.isDirtyBuffer=!0;var r=this._wire.positions,i=this.offset;r[i+0]=t.x,r[i+1]=t.y,r[i+2]=t.z||0,i+=3;var o=this._wire.allowColors;o&&(t.color!==void 0?this._wire.colors[i]=t.color:this._wire.colors[i]=Ts(this._wire.color),i+=1),r[i+0]=n.x,r[i+1]=n.y,r[i+2]=n.z||0,o&&(n.color!==void 0?this._wire.colors[i+3]=n.color:this._wire.colors[i+3]=Ts(this._wire.color))};function Ts(e){var t=Math.round(e.r*255),n=Math.round(e.g*255),r=Math.round(e.b*255),i=Math.round(e.a*255);return t<<24|n<<16|r<<8|i}function Jd(e,t,n){n===void 0&&(n=.5);var r=Ss(e),i=Ss(t);return[r[0]*n+(1-n)*i[0],r[1]*n+(1-n)*i[1],r[2]*n+(1-n)*i[2],r[3]*n+(1-n)*i[3]]}function Ss(e){return[e>>24&255/255,e>>16&255/255,e>>8&255/255,e&255/255]}function ji(e){var t=ci(e[0]),n=ci(e[1]),r=ci(e[2]);return"#"+t+n+r}function ci(e){var t=Math.floor(e*255).toString(16);return t.length===1?"0"+t:t}var Ln=function(e){function t(n,r){e.call(this);var i=4;this.allowColors=!r||r.allowColors===void 0||r.allowColors,this.is3D=!r||r.is3D===void 0||r.is3D,this.itemsPerLine=4,this.is3D&&(this.itemsPerLine+=2),this.allowColors&&(this.itemsPerLine+=2),this.capacity=n,this.count=0,this.color=new To(1,1,1,1),this.type="WireCollection",this._program=null,this.buffer=new ArrayBuffer(n*this.itemsPerLine*i),this.positions=new Float32Array(this.buffer),this.width=r&&r.width||1,this.allowColors?this.colors=new Uint32Array(this.buffer):this.colors=null,this.isDirtyBuffer=!0}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.draw=function(r,i){this._program||(this._program=Ms(this.width)?Zd(r,this):$i(r,this)),this._program.draw(i)},t.prototype.setLineWidth=function(r){if(r!==this.width){var i=Ms(r);if(this.width=r,!(!this._program||!this.scene)){if(i&&this._program.isThickWire){this.scene.renderFrame();return}if(this.parent){var o=this.parent;o.removeChild(this),this.dispose(),o.appendChild(this)}}}},t.prototype.add=function(r){if(!r)throw new Error("Line is required");this.count>=this.capacity&&this._extendArray();var i=this.count*this.itemsPerLine,o=new Mo(this,i);return o.update(r.from,r.to),this.count+=1,o},t.prototype.getLineColor=function(r,i){return this.allowColors&&r&&r.color&&i&&i.color?Jd(r.color,i.color):[this.color.r,this.color.g,this.color.b,this.color.a]},t.prototype.forEachLine=function(r){var i=this,o=i.positions,s=i.count,a=i.itemsPerLine,l=s*a;if(this.is3D)for(var u=0;u0}var di=Yr();function eh(e,t){var n=t.allowColors,r=t.is3D;n=!!n;var i=[n,e],o=di.get(i),s=2+(n?1:0)+(r?1:0),a=t.buffer;if(!o){var l=th(n),u=l.lineFSSrc,f=l.lineVSSrc,d=$e.compile(e,e.VERTEX_SHADER,f),h=$e.compile(e,e.FRAGMENT_SHADER,u);o=$e.link(e,d,h),di.set(i,o)}var g=$e.getLocations(e,o),y=r?3:2,w=(y+1)*4,b=y*4,S=e.createBuffer(),C={draw:E,dispose:A};return C;function A(){e.deleteBuffer(S),e.deleteProgram(o),di.remove(i)}function E(T,m){if(a.length!==0){e.useProgram(o),e.uniformMatrix4fv(g.uniforms.uModel,!1,T.worldModel),e.uniformMatrix4fv(g.uniforms.projectionMatrix,!1,m.projection),e.uniformMatrix4fv(g.uniforms.uView,!1,m.view.matrix),e.uniform3fv(g.uniforms.uOrigin,m.view.position);var x=T.color,P=T.nextElementIndex,L=T.madeFullCircle;if(e.uniform4f(g.uniforms.uColor,x.r,x.g,x.b,x.a),e.bindBuffer(e.ARRAY_BUFFER,S),e.enableVertexAttribArray(g.attributes.aPosition),e.bufferData(e.ARRAY_BUFFER,a,e.DYNAMIC_DRAW),n?(e.vertexAttribPointer(g.attributes.aPosition,y,e.FLOAT,!1,w,0),e.enableVertexAttribArray(g.attributes.aColor),e.vertexAttribPointer(g.attributes.aColor,4,e.UNSIGNED_BYTE,!0,w,b)):e.vertexAttribPointer(g.attributes.aPosition,y,e.FLOAT,!1,0,0),L){var B=a.byteLength/4/s-P;e.drawArrays(e.LINE_STRIP,P,B),P>1&&e.drawArrays(e.LINE_STRIP,0,P-1)}else e.drawArrays(e.LINE_STRIP,1,P-1)}}}function th(e){var t=`precision mediump float; +varying vec4 vColor; +void main() { + gl_FragColor = vColor; +} +`,n=`attribute vec3 aPosition; + varying vec4 vColor; + `+(e?"attribute vec4 aColor;":"")+` + uniform vec4 uColor; + uniform mat4 projectionMatrix; + uniform mat4 uModel; + uniform mat4 uView; + void main() { + gl_Position = projectionMatrix * uView * uModel * vec4(aPosition, 1.0); + vColor = `+(e?"aColor.abgr":"uColor")+`; + }`;return{lineVSSrc:n,lineFSSrc:t}}var nh=function(e){function t(n,r){e.call(this);var i=4;this.drawCount=0,this.madeFullCircle=!1,this.allowColors=!r||r.allowColors===void 0||r.allowColors,this.is3D=!r||r.is3D===void 0||r.is3D,this.itemsPerLine=2,this.allowColors&&(this.itemsPerLine+=1),this.is3D&&(this.itemsPerLine+=1),this.capacity=n,this.nextElementIndex=1,this._program=null,this.color=new To(1,1,1,1),this.buffer=new ArrayBuffer((n+1)*this.itemsPerLine*i),this.positions=new Float32Array(this.buffer),this.allowColors?this.colors=new Uint32Array(this.buffer):this.colors=null}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.draw=function(r,i){this._program||(this._program=eh(r,this)),this._program.draw(this,i)},t.prototype.add=function(r){var i=this.nextElementIndex*this.itemsPerLine,o=this.positions;if(o[i]=r.x,i+=1,o[i]=r.y,i+=1,this.is3D&&(o[i]=r.z||0,i+=1),this.colors&&(this.colors[i]=r.color===void 0?4294967295:r.color),this.nextElementIndex+=1,this.drawCount+=1,this.nextElementIndex>this.capacity){this.nextElementIndex=1;var s=0;o[s]=r.x,s+=1,o[s]=r.y,s+=1,this.is3D&&(o[s]=r.z||0,s+=1),this.colors&&(this.colors[s]=this.colors[i]),this.madeFullCircle=!0}},t.prototype.dispose=function(){this._program&&(this._program.dispose(),this._program=null)},t}(Ae);function Al(e){try{return window.WebGLRenderingContext?(e||(e=document.createElement("canvas")),!!(e.getContext("webgl")||e.getContext("experimental-webgl"))):!1}catch{return!1}}var Ps=rh;function rh(e){if(e=e||{},"uniqueLinkId"in e&&(console.warn("ngraph.graph: Starting from version 0.14 `uniqueLinkId` is deprecated.\nUse `multigraph` option instead\n",` +`,`Note: there is also change in default behavior: From now on each graph +is considered to be not a multigraph by default (each edge is unique).`),e.multigraph=e.uniqueLinkId),e.multigraph===void 0&&(e.multigraph=!1),typeof Map!="function")throw new Error("ngraph.graph requires `Map` to be defined. Please polyfill it before using ngraph");var t=new Map,n=[],r={},i=0,o=e.multigraph?E:A,s=[],a=k,l=k,u=k,f=k,d={addNode:w,addLink:C,removeLink:P,removeNode:S,getNode:b,getNodeCount:T,getLinkCount:m,getLinksCount:m,getNodesCount:T,getLinks:x,forEachNode:Z,forEachLinkedNode:j,forEachLink:R,beginUpdate:u,endUpdate:f,clear:B,hasLink:L,hasNode:b,getLink:L};return jr(d),h(),d;function h(){var z=d.on;d.on=V;function V(){return d.beginUpdate=u=$,d.endUpdate=f=q,a=g,l=y,d.on=z,z.apply(d,arguments)}}function g(z,V){s.push({link:z,changeType:V})}function y(z,V){s.push({node:z,changeType:V})}function w(z,V){if(z===void 0)throw new Error("Invalid node identifier");u();var Y=b(z);return Y?(Y.data=V,l(Y,"update")):(Y=new ih(z,V),l(Y,"add")),t.set(z,Y),f(),Y}function b(z){return t.get(z)}function S(z){var V=b(z);if(!V)return!1;u();var Y=V.links;if(Y){V.links=null;for(var X=0;X=0&&Y.links.splice(V,1)),X&&(V=hi(z,X.links),V>=0&&X.links.splice(V,1)),a(z,"remove"),f(),!0}function L(z,V){var Y=b(z),X;if(!Y||!Y.links)return null;for(X=0;X0&&(d.fire("changed",s),s.length=0)}function Z(z){if(typeof z!="function")throw new Error("Function is expected to iterate over graph nodes. You passed "+z);for(var V=t.values(),Y=V.next();!Y.done;){if(z(Y.value))return!0;Y=V.next()}}}function hi(e,t){if(!t)return-1;if(t.indexOf)return t.indexOf(e);var n=t.length,r;for(r=0;r'),t.open&&e.write(t.open()),e.write(` + + +`),e.background&&e.write('')}function lh(e,t){t.close&&e.write(t.close()),e.write("")}function uh(e,t,n){if(!!e.scene){var r=n.beforeWrite,i=n.round,o=Ps(),s=new Map,a=e.multiColorSegment,l=ch(e,t,i);e.forEachLine(function(f,d){var h=l(f.x,f.y,f.z),g=l(d.x,d.y,d.z);if(!(h.isBehind||g.isBehind)&&ph(h,g,t.width,t.height)){var y=ji(e.getLineColor(f,d)),w=h.x+"|"+h.y,b=g.x+"|"+g.y,S=o;a&&(S=s.get(y),S||(S=Ps(),s.set(y,S))),S.getNode(w)||S.addNode(w,h),S.getNode(b)||S.addNode(b,g),S.hasLink(w,b)||S.addLink(w,b,{stroke:y})}});var u=[];a?s.forEach(function(f,d){u.push([f,d])}):u.push([o,ji(e.getLineColor())]),u.forEach(function(f){var d=f[0],h=f[1];if(d.getLinksCount()===0)return;var g=e.width===void 0?1:e.width,y=g/e.scene.getPixelRatio(),w='fill="none" stroke-width="'+y+'" stroke="'+h+'"',b=e.id?'":"";t.write(b);var S=fh(d),C=null,A=null;S.forEach(function(T){var m=T.from,x=T.to;if(m!==C)if(x===C){var P=m;m=x,x=P}else E(),A=[];A&&A.push(m,x),C=x}),E(),t.write("");function E(){if(!!A){var T=A.map(function(x){var P=d.getNode(x);if(P)return P.data;throw new Error("Node is found in the path construction, but missing in the graph")});if(!(r&&!r(T))){var m="M"+T[0].x+" "+T[0].y+" L"+T.slice(1).map(function(x){return x.x+" "+x.y}).join(",");t.write('')}}}})}}function fh(e){var t=new Set,n=[],r=[];return e.forEachNode(function(o){t.has(o.id)||(r.push({to:o.id}),i())}),n;function i(){for(var o=function(){var s=r.pop();s.to&&s.from&&n.push({from:s.from,to:s.to}),!t.has(s.to)&&(t.add(s.to),e.forEachLinkedNode(s.to,function(a){t.has(a.id)||r.push({from:s.to,to:a.id})},!1))};r.length;)o()}}function ch(e,t,n){var r=t.width,i=t.height,o=t.projection,s=t.view,a=Ht(Ft(),o,s.matrix);Ht(a,a,e.worldModel);var l=hh(n);return function(u,f,d){var h=dl([0,0,0,0],[u,f,d||0,1],a),g=l(r*(h[0]/h[3]+1)*.5),y=l(i*(1-(h[1]/h[3]+1)*.5));return{x:g,y,isBehind:h[3]<=0}}}function dh(e){return e}function hh(e){return e===void 0?dh:e===!0||e===0?Math.round:function(t){return Math.round(t*e)/e}}function ph(e,t,n,r){return Qn(e,t,{x:0,y:0},{x:0,y:1})&&Qn(e,t,{x:0,y:0},{x:1,y:0})&&Qn(e,t,{x:0,y:r},{x:0,y:-1})&&Qn(e,t,{x:n,y:0},{x:-1,y:0})}function Qn(e,t,n,r){var i=ks(e,n,r),o=ks(t,n,r);if(i<=0&&o<=0)return!1;if(i>0&&o>0)return!0;var s=i/(i-o),a=e.x+s*(t.x-e.x),l=e.y+s*(t.y-e.y);return i<=0?(e.x=a,e.y=l):(t.x=a,t.y=l),!0}function ks(e,t,n){return(e.x-t.x)*n.x+(e.y-t.y)*n.y}var Jn=.5*Math.PI/180,Rs=[0,0,-1];function vh(e,t,n,r){n||(n=Function.prototype),e.addEventListener("touchstart",b),e.addEventListener("touchend",S);var i="deviceorientationabsolute";window.addEventListener("orientationchange",g);var o=!0,s=[0,0,0,1],a=[0,0,0,1],l=[0,0,0,1];g();var u={isEnabled:!1,isAbsolute:!0,useCurrentOrientation:d,dispose:w,enable:f};return u;function f(C){u.isEnabled=C,u.isEnabled?window.DeviceOrientationEvent!==void 0&&window.DeviceOrientationEvent.requestPermission!==void 0?DeviceOrientationEvent.requestPermission().then(function(A){A==="granted"?(i="deviceorientation",window.addEventListener(i,h)):u.isEnabled=!1,r&&r.fire("device-orientation",u.isEnabled)}).catch(function(A){u.isEnabled=!1,r&&r.fire("device-orientation",u.isEnabled)}):window.addEventListener(i,h):(b(),r&&r.fire("device-orientation",u.isEnabled))}function d(){o=!0}function h(C){var A=C.alpha,E=C.beta,T=C.gamma;if(C.absolute&&A===null&&E===null&&T===null){window.removeEventListener("deviceorientationabsolute",h),window.addEventListener("deviceorientation",h),i="deviceorientation",u.isAbsolute=!1;return}if(y(A,E,T),o){o=!1;var m=Cr([0,0,0],Rs,a),x=Cr([0,0,0],Rs,t),P=m[0]*x[0]+m[1]*x[1],L=Math.sqrt(m[0]*m[0]+m[1]*m[1]),B=Math.sqrt(x[0]*x[0]+x[1]*x[1]),R=Math.acos(P/(L*B))/2,j=Math.sign(m[0]*x[1]-m[1]*x[0]);s[2]=j*Math.sin(R),s[3]=Math.cos(R)}Ar(a,a,l),Ar(t,s,a),n()}function g(){var C=window.orientation||0,A=-C*Jn;l[2]=Math.sin(A),l[3]=Math.cos(A)}function y(C,A,E){var T=A?A*Jn:0,m=E?E*Jn:0,x=C?C*Jn:0,P=Math.cos(T),L=Math.cos(m),B=Math.cos(x),R=Math.sin(T),j=Math.sin(m),H=Math.sin(x);a[0]=R*L*B-P*j*H,a[1]=P*j*B+R*L*H,a[2]=P*L*H+R*j*B,a[3]=P*L*B-R*j*H}function w(){e.removeEventListener("touchstart",b),e.removeEventListener("touchend",S),window.removeEventListener("deviceorientationabsolute",h),window.removeEventListener("deviceorientation",h),window.removeEventListener("orientationchange",g)}function b(C){o||(o=!0,C&&C.preventDefault(),window.removeEventListener(i,h))}function S(C){C.touches.length||(o=!0,u.isEnabled&&(window.removeEventListener(i,h),window.addEventListener(i,h)))}}var Bs=[0,0,-1],ie={MOVE_FORWARD:1,MOVE_BACKWARD:2,MOVE_LEFT:3,MOVE_RIGHT:4,MOVE_UP:5,MOVE_DOWN:6,TURN_LEFT:7,TURN_RIGHT:8,TURN_UP:9,TURN_DOWN:10};function gh(e){var t=e.getDrawContext(),n=t.view,r=n.position,i=n.center,o=e.getOptions()||{},s=[0,0,1],a=Math.PI,l=Math.PI*1.618,u=Dt(o.captureMouse,!1),f,d,h=[0,0,0,1],g=0,y=[0,0,0,1],w=[0,0,0,1],b=[0,0,0],S=0,C=0,A=0,E=Ao(o.inputTarget,t.canvas);E.style.outline="none",E.getAttribute("tabindex")||E.setAttribute("tabindex","0"),E.addEventListener("keydown",re),E.addEventListener("keyup",ve),E.addEventListener("mousedown",Me),E.addEventListener("touchmove",le),E.addEventListener("touchstart",oe),E.addEventListener("wheel",de),document.addEventListener("pointerlockchange",c,!1);var T=new xl(e),m=0,x=0,P=0,L=0,B=0,R=0,j=0,H=0,W=0,k=0,$=0,q={};q[ie.MOVE_FORWARD]=!1,q[ie.MOVE_BACKWARD]=!1,q[ie.MOVE_LEFT]=!1,q[ie.MOVE_RIGHT]=!1,q[ie.MOVE_UP]=!1,q[ie.MOVE_DOWN]=!1,q[ie.TURN_LEFT]=!1,q[ie.TURN_RIGHT]=!1,q[ie.TURN_UP]=!1,q[ie.TURN_DOWN]=!1;var Z=.01,z=3,V=.01,Y={dispose:be,handleCommand:I,setViewBox:N,getUpVector:ee,lookAt:K,enableMouseCapture:_,enableDeviceOrientation:M,isDeviceOrientationEnabled:F,setRotationSpeed:function(J){return a=J,Y},setMoveSpeed:function(J){return Z=J,Y},setScrollSpeed:function(J){return z=J,Y},setFlySpeed:function(J){return V=J,Y},setSpeed:function(J){return Z=J,V=J,Y},getRotationSpeed:function(){return a},getMoveSpeed:function(){return Z},getScrollSpeed:function(){return z},getFlySpeed:function(){return V},getKeymap:function(){return X},getMouseCapture:function(){return u}},X={87:ie.MOVE_FORWARD,65:ie.MOVE_LEFT,83:ie.MOVE_BACKWARD,68:ie.MOVE_RIGHT,81:ie.TURN_LEFT,37:ie.TURN_LEFT,69:ie.TURN_RIGHT,39:ie.TURN_RIGHT,38:ie.TURN_UP,40:ie.TURN_DOWN,16:ie.MOVE_DOWN,32:ie.MOVE_UP};jr(Y);var te=vh(E,n.orientation,ne,Y);return Dt(o.useDeviceOrientation,!0)&&te.enable(!0),Y;function re(D){O(D,1)}function ve(D){O(D,0)}function Me(D){D.which===1&&(document.pointerLockElement?document.exitPointerLock():u?E.requestPointerLock():(E.focus(),document.addEventListener("mousemove",ke),document.addEventListener("mouseup",Ne),f=D.clientX,d=D.clientY,D.preventDefault()))}function oe(D){D.touches.length===1&&(f=D.touches[0].clientX,d=D.touches[0].clientY)}function de(D){D.preventDefault();var J=D.deltaMode>0?100:1,Ce=z*ue(-D.deltaY*J),yt=+new Date,Qe=D.clientX,Ct=D.clientY;if(document.pointerLockElement&&(Qe=t.width/(t.pixelRatio*2),Ct=t.height/(t.pixelRatio*2)),document.pointerLockElement||yt-S>200||Math.hypot(Qe-C,Ct-A)>20){var Re=[0,0,-1];Re[0]=(Qe*t.pixelRatio/t.width-.5)*2,Re[1]=(1-Ct*t.pixelRatio/t.height-.5)*2,hn(Re,Re,rd([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],t.view.cameraWorld,t.inverseProjection)),b=Fn([0,0,0],Re,n.position),Wr(b,b);var rt=id(i);y=bs(n.orientation),K(r,Re),w=bs(n.orientation),K(r,rt),C=Qe,A=Ct,g=0,S=yt}g<1&&(dr(h,y,w,g),hl(n.orientation,h[0],h[1],h[2],h[3]),g+=.01),r[0]+=Z*Ce*b[0],r[1]+=Z*Ce*b[1],r[2]+=Z*Ce*b[2],ne(),D.preventDefault()}function ue(D){return Math.sign(D)*Math.min(.25,Math.abs(D/128))}function le(D){if(D.touches.length===1){var J=D.touches[0].clientY-d,Ce=D.touches[0].clientX-f;v(-Ce,J),f=D.touches[0].clientX,d=D.touches[0].clientY,D.preventDefault()}}function ke(D){var J=D.clientY-d,Ce=D.clientX-f;v(-Ce,J),f=D.clientX,d=D.clientY,D.preventDefault()}function Ne(D){document.removeEventListener("mousemove",ke),document.removeEventListener("mouseup",Ne)}function c(D){document.pointerLockElement?document.addEventListener("mousemove",p,!1):(document.removeEventListener("mousemove",p,!1),H=0,k=0),Y.fire("pointer-locked",document.pointerLockElement)}function p(D){v(D.movementX,-D.movementY)}function v(D,J){var Ce=a*D/t.width,yt=l*J/t.height;he(Ce,yt),ne()}function _(D){return u=D,Y.fire("mouse-capture",D),Y}function M(D){te.enable(D)}function F(){return te.isEnabled}function O(D,J){if(mh(D)){L=0;return}var Ce=X[D.which];Ce&&I(Ce,J)}function I(D,J){switch(D){case ie.MOVE_FORWARD:P=J;break;case ie.MOVE_BACKWARD:P=-J;break;case ie.MOVE_LEFT:x=J;break;case ie.MOVE_RIGHT:x=-J;break;case ie.MOVE_UP:L=J;break;case ie.MOVE_DOWN:L=-J;break;case ie.TURN_LEFT:W=-J;break;case ie.TURN_RIGHT:W=J;break;case ie.TURN_UP:$=J;break;case ie.TURN_DOWN:$=-J;break;default:throw new Error("Unknown command "+D)}U()}function U(){m||(m=requestAnimationFrame(Q))}function N(D){var J=e.getPixelRatio(),Ce=J*Math.max((D.top-D.bottom)/2,(D.right-D.left)/2),yt=(D.left+D.right)/2,Qe=(D.top+D.bottom)/2,Ct=Ce/Math.tan(t.fov/2);return K([yt,Qe,Ct],[yt,Qe,0]),Y}function Q(){m=0;var D=.9,J=!1;B=dt(B*D+x,.5,0),R=dt(R*D+P,.5,0),j=dt(j*D+L,.5,0),H=dt(H*D+W/2,Math.PI/360,0),k=dt(k*D+$/6,Math.PI/360,0),(B||R)&&(we(B*Z,R*Z),J=!0),j&&(r[2]+=j*V,J=!0),(k||H)&&(he(H*.01,k*.01),J=!0),J&&(ne(),U()),q[ie.MOVE_LEFT]=B>0,q[ie.MOVE_RIGHT]=B<0,q[ie.MOVE_FORWARD]=R>0,q[ie.MOVE_BACKWARD]=R<0,q[ie.MOVE_UP]=j>0,q[ie.MOVE_DOWN]=j<0,q[ie.TURN_LEFT]=H<0,q[ie.TURN_RIGHT]=H>0,Y.fire("move",q)}function K(D,J){return Er(r,D[0],D[1],D[2]),Er(i,J[0],J[1],J[2]),_o(n.cameraWorld,r,i,s),xo(n.orientation,n.cameraWorld),Hn(n.matrix,n.cameraWorld),ne(),Y}function ee(){return s}function ne(){if(n.update(),hn(i,Bs,n.cameraWorld),T.updated=!1,e.fire("transform",T),T.updated){ne();return}e.getRoot().scheduleMVPUpdate(),e.renderFrame()}function he(D,J){D&&(Ar(n.orientation,zi([0,0,0,0],Bs,D),n.orientation),te.useCurrentOrientation()),J&&Ar(n.orientation,n.orientation,zi([0,0,0,0],[1,0,0],J))}function we(D,J){var Ce=Cr([0,0,0],[-D,0,-J],n.orientation);r[0]+=Ce[0],r[1]+=Ce[1]}function be(){cancelAnimationFrame(m),m=0,E.removeEventListener("keydown",re),E.removeEventListener("keyup",ve),E.removeEventListener("mousedown",Me),E.removeEventListener("touchmove",le),E.removeEventListener("touchstart",oe),E.removeEventListener("wheel",de),document.removeEventListener("mousemove",p,!1),document.removeEventListener("pointerlockchange",c,!1),document.removeEventListener("mousemove",ke),document.removeEventListener("mouseup",Ne),te.dispose()}}function mh(e){return e.altKey||e.ctrlKey||e.metaKey}function yh(e,t){var n="navigation-controls",r=document.createElement("div");r.classList.add(n),r.innerHTML=wh();var i=document.createElement("style");i.appendChild(document.createTextNode(xh(n))),document.querySelector("head").appendChild(i),e.appendChild(r);var o=Array.from(r.querySelectorAll("a.navigation-btn")),s=o.map(f),a=r.querySelector("#capture-mouse");t.getMouseCapture()&&(a.checked=!0),a.addEventListener("change",d);var l=r.querySelector("#device-orientation");return l&&(l.checked=t.isDeviceOrientationEnabled(),l.addEventListener("change",g)),t.on("move",w),t.on("mouse-capture",h),t.on("device-orientation",y),t.on("pointer-locked",u),{dispose:S};function u(C){var A=r.querySelector(".cross");A&&(A.style.display=C?"block":"none")}function f(C){var A=b(C);return _h(C,function(E){t.handleCommand(A,E?1:0)})}function d(C){t.enableMouseCapture(a.checked)}function h(C){a.checked=C}function g(){t.enableDeviceOrientation(l.checked)}function y(C){l&&(l.checked=C)}function w(C){o.forEach(function(A){C[b(A)]?A.classList.add("down"):A.classList.remove("down")})}function b(C){return Number.parseInt(C.getAttribute("data-command"),10)}function S(){t.off("move",w),t.off("mouse-capture",h),t.off("device-orientation",y),t.off("pointer-locked",u),s.forEach(function(C){return C()}),r.parentElement&&r.parentElement.removeChild(r),i.parentElement&&i.parentElement.removeChild(i)}}function wh(){return` + + + +
+ + +
+ `+bh()+` +
+
+`}function bh(){return window.DeviceOrientationEvent&&"ontouchstart"in window?`
+ + +
`:""}function xh(e){var t="."+e;return` +`+t+` { + position: fixed; + bottom: 8px; + left: 8px; + font-family: 'Avenir', Helvetica, Arial, sans-serif +} +`+t+` * { + box-sizing: border-box; +} +`+t+` label { + color: white; +} +`+t+` .nav-key-legend { + text-align: center; + font-size: 14px; +} +`+t+` .navigation-row { + display: flex; +} +`+t+` .item { + width: 42px; + height: 42px; + margin: 2px; +} +`+t+` .navigation-btn { + background: rgba(0,0,0,0.2); + box-shadow: 0 2px 4px #000, 0 -1px 0 rgb(0 0 0 / 5%); + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + text-decoration: none; + display: flex; + width: 42px; + flex-direction: column; + color: #cecece; +} +`+t+` .navigation-btn.down { + background: rgba(250,250,250,.2); +} +`+t+` .padded { + margin-left: 10px; +} +`+t+` .navigation-btn.secondary { + width: 42px; + height: 42px; + transform: scale(0.70); +} + +`+t+` .navigation-btn.secondary svg { + padding: 4px; +} +`+t+` .navigation-btn.secondary .nav-key-legend { + color: #aaa; +} +`+t+` .navigation-btn.secondary.left { + transform-origin: right bottom; +} +`+t+` .navigation-btn.secondary.right { + transform-origin: left bottom; +} +`+t+` .navigation-btn.wide { + width: 75px; +} +`+t+` .navigation-btn svg { + fill: white; + padding-top: 4px; +} +`+t+` .cursor-legend { + margin-top: 8px; + display: none; +} + +`+t+` .cross { + position: fixed; + pointer-events: none; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + font-size: 68px; + color: white; + display: none; +} +@media (pointer: fine) { + `+t+` .cursor-legend { + display: block; + } +}`}function _h(e,t,n){n===void 0&&(n=15);var r;return e.addEventListener("mousedown",o),e.addEventListener("touchstart",o),e.addEventListener("keydown",l),e.addEventListener("keyup",u),i;function i(){e.removeEventListener("mousedown",o),e.removeEventListener("touchstart",o),e.removeEventListener("keydown",l),e.removeEventListener("keyup",u),document.removeEventListener("mouseup",a),document.removeEventListener("touchend",f),document.removeEventListener("touchcancel",f),clearTimeout(r)}function o(h){h.preventDefault(),document.addEventListener("mouseup",a),document.addEventListener("touchend",f),document.addEventListener("touchcancel",f),s()}function s(){t(1),r=setTimeout(s,n)}function a(){d()}function l(h){h.which===13&&(t(1),h.preventDefault())}function u(h){h.which===13&&(t(0),h.preventDefault())}function f(){d()}function d(){clearTimeout(r),document.removeEventListener("mouseup",a),document.removeEventListener("touchend",f),document.removeEventListener("touchcancel",f),t(0)}}function Eh(e,t){t===void 0&&(t={}),e.getCameraController();var n={redraw:Function.prototype,dispose:Function.prototype},r=t.lineColor||196194594,i=t.maxAlpha||255,o=u(r),s=f(t.cursorColor||4294967295);return e.on("transform",l),{dispose:a,update:l};function a(){e.off("transform",l),o.dispose(),s.dispose()}function l(){o.redraw(),s.redraw()}function u(d){if(t.showGrid===!1)return n;var h=32*2,g=new Ln(2*(h+1),{width:2.5,is3D:!0,allowColors:!0});g.svgInvisible=!0;var y=new Ln(2*(h+1),{width:1.5,is3D:!0,allowColors:!0});y.svgInvisible=!0;var w=e.getDrawContext(),b=w.view.center;return A(),e.appendChild(y),e.appendChild(g),{redraw:A,dispose:S};function S(){e.removeChild(y),e.removeChild(g)}function C(T){return 1-(T-Math.floor(T))}function A(){var T=e.getDrawContext().view.position,m=T[0]-b[0],x=T[1]-b[1],P=T[2]-b[2],L=Math.sqrt(m*m+x*x+P*P),B=L*Math.tan(w.fov/2),R=Math.log10(B),j=Math.pow(10,Math.floor(R)),H=C(R),W=Math.round(H*i),k=Math.floor(b[0]/j)*j-Math.floor(h*j/2),$=Math.floor(b[1]/j)*j-Math.floor(h*j/2),q=k+j*h,Z=$+j*h;E(y,k,$,q,Z,j,W),E(g,k,$,q,Z,j*10,i-W)}function E(T,m,x,P,L,B,R){T.model[14]=b[2],T.worldTransformNeedsUpdate=!0,T.count=0;for(var j=d&4294967040|R,H=Math.ceil(x/B)*B,W=H;W<=L;W+=B)T.add({from:{x:m,y:W,color:j},to:{x:P,y:W,color:j}});for(var k=Math.ceil(m/B)*B,$=k;$<=P;$+=B)T.add({from:{x:$,y:x,color:j},to:{x:$,y:L,color:j}})}}function f(d){if(t.showCursor===!1)return n;var h=360,g=e.getDrawContext().view.center,y=e.getDrawContext().view.position,w=new Ln(h+1,{width:3,is3D:!0,allowColors:!0});w.svgInvisible=!0;for(var b,S=[],C=0;C<=h;++C)S.push(w.add({from:{x:0,y:0,color:d},to:{x:C,y:C,color:d}}));return e.appendChild(w),E(),{redraw:E,dispose:A};function A(){e.removeChild(w)}function E(){var T=y[0]-g[0],m=y[1]-g[1],x=y[2]-g[2],P=Math.sqrt(T*T+m*m+x*x);P*=.025;for(var L=0;L<=h+1;++L){var B=L/h*2*Math.PI;if(L===0){b={x:P*Math.cos(B),y:P*Math.sin(B),color:d};continue}var R={x:P*Math.cos(B),y:P*Math.sin(B),color:d};S[L-1].update(b,R),b=R}w.model[12]=g[0],w.model[13]=g[1],w.model[14]=g[2],w.worldTransformNeedsUpdate=!0}}}var Ch={mat4:"uniformMatrix4fv",mat3:"uniformMatrix3fv",mat2:"uniformMatrix2fv",vec4:"uniform4fv",vec3:"uniform3fv",vec2:"uniform2fv",float:"uniform1f",bool:"uniform1i"},Po=function(t,n){var r=Ch[n];if(!r)throw new Error("Function name for uniform is required");this.name=t,this.functionName=r,this.location=this.name+"UniformLocation"};Po.prototype.getInitBlockForDraw=function(){return"let "+this.location+" = gl.getUniformLocation(program, '"+this.name+"');"};Po.prototype.getDraw=function(){return this.functionName.indexOf("Matrix")>-1?"gl."+this.functionName+"("+this.location+", false, uniforms."+this.name+");":"gl."+this.functionName+"("+this.location+", uniforms."+this.name+");"};var pn=function(t,n){n===void 0&&(n=0),this.name=t,this.offset=n,this.variableName=t+"Texture",this.ready=this.variableName+"Ready",this.location=this.name+"UniformLocation",this.isTexture=!0};pn.prototype.getInitBlockForDraw=function(){return` + let `+this.location+" = gl.getUniformLocation(program, '"+this.name+`'); + let `+this.variableName+` = gl.createTexture(); + let `+this.ready+` = false; +`};pn.prototype.getTextureInitCanvasBlock=function(){return` + gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, true); + gl.bindTexture(gl.TEXTURE_2D, `+this.variableName+`); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, textureCanvas); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + gl.bindTexture(gl.TEXTURE_2D, null); + `+this.ready+" = true"};pn.prototype.getDraw=function(){return` + gl.activeTexture(gl.TEXTURE`+this.offset+`); + gl.bindTexture(gl.TEXTURE_2D, `+this.variableName+`); + gl.uniform1i(`+this.location+", "+this.offset+`); +`};var lt=function(){this.type="gl.FLOAT",this.debug=!1,this.bufferViewType="Float32Array",this.count=1,this.name=void 0,this.bytePerElement=4};lt.prototype.setName=function(t){this.name=t};lt.prototype.getInitBlockForBuffer=function(t){this.ensureNameIsSet();var n=t?"let ":"";return""+n+this.name+"Array = new "+this.bufferViewType+"(buffer);"};lt.prototype.getInitBlockForDraw=function(){this.ensureNameIsSet();var t=this,n=t.name;return"let "+n+"AttributeLocation = gl.getAttribLocation(program, '"+n+"');"};lt.prototype.getAddBlock=function(t,n){throw new Error("Concrete types have to implement this")};lt.prototype.getMoveBlock=function(t,n){throw new Error("Concrete type have to implement `getMoveBlock`")};lt.prototype.getGetBlock=function(t){throw new Error("Concrete types have to implement `getGetBlock`")};lt.prototype.getDivisor=function(t){this.ensureNameIsSet();var n=this.name+"AttributeLocation";return"if ("+n+" > -1) gle.vertexAttribDivisorANGLE("+n+", "+t+");"};lt.prototype.getDraw=function(t,n){this.ensureNameIsSet();var r=this.name+"AttributeLocation";return` + gl.enableVertexAttribArray(`+r+`); + gl.vertexAttribPointer(`+r+", "+this.count+", "+this.type+", false, "+t+", "+n+");"};lt.prototype.ensureNameIsSet=function(){if(!this.name)throw new Error("You have to call setName() before using attributes")};var hr=function(e){function t(n){e.call(this),this.count=n}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.getAddBlock=function(r,i){i===void 0&&(i=` +`);var o=this.name,s=o+"Array",a=[];this.debug&&a.push("if (item."+o+` === undefined) throw new Error('Attribute "`+o+`" is missing'); +`);for(var l=0;l glBuffer = newBuffer,"])}function h(T,m){m.addToInit(["let glBuffer = gl.createBuffer();","if (!glBuffer) throw new Error('failed to create a WebGL buffer');",""]),m.addToAPI(["getGLBuffer: () => glBuffer,"])}function g(T,m){var x=T.uniforms,P=[];if(x.forEach(function(R){R instanceof pn&&P.push(R)}),!!P.length){m.addToAPI("setTextureCanvas: setTextureCanvas,");var L=P.map(function(R){return` + case '`+R.name+`': { + `+R.getTextureInitCanvasBlock()+` + return; + } + `});m.addToImplementation(` + function setTextureCanvas(textureName, textureCanvas) { + switch(textureName) { + `+L.join(` + `)+` + } + throw new Error('Unknown texture name: ' + textureName); + } +`);var B=P.map(function(R){return"case '"+R.name+"': return "+R.variableName+";"});m.addToAPI("getTextureByName: getTextureByName,"),m.addToImplementation(` + function getTextureByName(textureName) { + switch(textureName) { + `+B.join(` + `)+` + } + throw new Error('Unknown texture name: ' + textureName); + } +`)}}function y(T,m){var x=T.attributes,P=T.instanced,L=T.uniforms,B=T.bytePerVertex;T.itemPerVertex;var R=e.sourceBuffer&&e.sourceBuffer.getCode();R?(m.addToInit(R.bufferInit),m.addBufferInit(R.bufferInit)):x.forEach(function($){var q=" "+$.getInitBlockForDraw();m.addToInit(q),m.addBufferInit(q)});var j=[];L.forEach(function($){m.addToInit(" "+$.getInitBlockForDraw()),$ instanceof pn&&j.push($)}),P.length&&(m.addToInit(` let gle = gl.getExtension('ANGLE_instanced_arrays'); + if (!gle) { + // Not sure if this is going to be an error, given instancing is widely supported. But + // If you get this error please ping me so that we can find a fallback solution + throw new Error('Instanced collection requires instancing support. Please ping @anvaka so that we can add fallback'); + } +`),P.forEach(function($){m.addToInit(" "+$.getInitBlock())}));var H=[];if(R)H=R.attributesDrawBlock;else{var W=0;x.forEach(function($){H.push($.getDraw(B,W)),W+=$.count*$.bytePerElement})}m.setAttributesDrawBlock(H),m.addToImplementation(k()),m.addToAPI(["draw: draw,"]);function k(){var $=L.map(function(re){return re.getDraw()}),q=[],Z=[],z=[];P.forEach(function(re){q.push(re.getDraw()),Z.push(re.getDivisor(0)),z.push(re.getDivisor(0))});var V=[];return P.length?(x.forEach(function(re){Z.push(re.getDivisor(1)),z.push(re.getDivisor(0))}),V.push(Z.join(` + `)),V.push("gle.drawArraysInstancedANGLE(gl.TRIANGLES, 0, 6, count)"),V.push(z.join(` + `))):V.push("gl.drawArrays(gl.TRIANGLES, 0, count)"),` + function draw(uniforms, from, to) { + `+X()+` + `+te()+` + `+o(T)+` + + gl.useProgram(program); + `+$.join(` + `)+` + `+q.join(` + `)+` + + gl.bindBuffer(gl.ARRAY_BUFFER, glBuffer); + `+Y()+` + + `+H.join(` + `)+` + `+V.join(` + `)+` + + `+s(T)+` + }`;function Y(){return e.sourceBuffer?"":` if (isDirty) { + gl.bufferData(gl.ARRAY_BUFFER, buffer, gl.DYNAMIC_DRAW); + isDirty = false; + }`}function X(){return"if (count === 0) return;"}function te(){return j.length===0?"":j.map(function(re){return"if (!"+re.ready+") return;"}).join(` + `)}}}function w(T,m){m.addToInit([" var count = 0;"]),m.addToAPI(["setCount: (newCount) => count = newCount,","getCount: () => count,"])}function b(T,m){var x=T.attributes,P=T.bytePerVertex,L=T.itemPerVertex;m.addToInit(["var bytePerVertex = "+P+";","var itemPerVertex = "+L+";","var capacity = "+(e.capacity||1)*P+";","var buffer = new ArrayBuffer(capacity);","","var isDirty = true;","var dirtyOffset = 0;"]),x.forEach(function(R){m.addToInit(R.getInitBlockForBuffer(!0))}),m.addToAPI(["add: add,","get: get,","update: update,","remove: remove,","getBuffer: getBuffer,","appendBuffer: appendBuffer,"]),m.addToImplementation(B());function B(){var R=[],j=[],H=[],W=[],k=0;return x.forEach($),` + function add(item) { + if (count * bytePerVertex >= capacity) { + extend(); + } + + var index = count * itemPerVertex; + + `+R.join("")+` + + isDirty = true; + return count++; + } + + function update(index, item) { + `+S()+` + index *= itemPerVertex; + `+R.join(` + `)+` + isDirty = true; + } + + function remove(index) { + `+C()+` + isDirty = true; + count -= 1; + if (count <= 0) { + count = 0; + return count; // last element removed + } + // move last element to take this element's position + var from = count * itemPerVertex; + var to = index * itemPerVertex; + for (var i = 0; i < itemPerVertex; ++i) { + `+H.join(` +`)+` + } + + return count; + } + + function get(index) { + index *= itemPerVertex; + return { + `+j.join(`, + `)+` + }; + } + + function extend() { + var oldBuffer = buffer; + capacity *= 2; + buffer = new ArrayBuffer(capacity); + // Copy old buffer to the new buffer + new Uint8Array(buffer).set(new Uint8Array(oldBuffer)); + // And re-assign views: + `+W.join(` + `)+` + } + + function getBuffer() { + return buffer.slice(0, count * bytePerVertex); + } + + function appendBuffer(uint8Collection, byteOffset) { + var requiredCapacity = byteOffset + uint8Collection.byteLength; + if (requiredCapacity > capacity) { + // extend the buffer to fulfill the request: + let oldBuffer = buffer; + buffer = new ArrayBuffer(requiredCapacity); + new Uint8Array(buffer).set(new Uint8Array(oldBuffer)); + capacity = requiredCapacity; + } + + var view = new Uint8Array(buffer); + view.set(uint8Collection, byteOffset); + count = Math.floor(requiredCapacity / bytePerVertex); + + `+W.join(` + `)+` + + isDirty = true; + } +`;function $(q){var Z=q.getInitBlockForBuffer(!1);Z&&W.push(Z);var z=q.getAddBlock(k,` + `);R.push(z.code),H.push(q.getMoveBlock(k,` + `)),j.push(q.getGetBlock(k)),k=z.offset}}}function S(){return e.debug?` + if (!Number.isFinite(index)) throw new Error('update() requires integer value for "index", got: ' + index); + if (index < 0 || index >= count) throw new Error('update(' + index + ') is outside of [0..' + count + ') range'); +`:""}function C(){return e.debug?` + if (!Number.isFinite(index)) throw new Error('remove() requires integer value for "index", got: ' + index); + if (index < 0 || index >= count) throw new Error('remove(' + index + ') is outside of [0..' + count + ') range'); +`:""}function A(T,m){var x=E(t.VERTEX_SHADER,T),P=E(t.FRAGMENT_SHADER,m),L=t.createProgram();if(!L)throw new Error("Failed to link a program");if(t.attachShader(L,x),t.attachShader(L,P),t.linkProgram(L),!t.getProgramParameter(L,t.LINK_STATUS))throw new Error(t.getProgramInfoLog(L)||"Failed to link a program");return L}function E(T,m){var x=t.createShader(T);if(!x)throw new Error("Failed to create a shared "+m);if(t.shaderSource(x,m),t.compileShader(x),!t.getShaderParameter(x,t.COMPILE_STATUS))throw console.error(t.getShaderInfoLog(x)),new Error(t.getShaderInfoLog(x)||"Failed to compile shader "+m);return x}}function Ds(){return""}var Sh=function(e){function t(){e.call(this),this.type="gl.UNSIGNED_BYTE",this.bufferViewType="Uint32Array"}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.getAddBlock=function(r){var i=this.name+"Array",o="";return this.debug&&(o="if (item."+this.name+` === undefined) throw new Error('Attribute "`+this.name+`" is missing'); +`),o+=i+"[index + "+r+"] = item."+this.name+";",{code:o,offset:r+this.count}},t.prototype.getMoveBlock=function(r,i){i===void 0&&(i=` +`);var o=this.name,s=o+"Array",a="";return a+=s+"[to + "+r+"] = "+s+"[from + "+r+"];"+i,a},t.prototype.getGetBlock=function(r){return this.name+": "+this.name+"Array[index + "+r+"]"},t.prototype.getDraw=function(r,i){var o=this.name+"AttributeLocation";return` + if (`+o+` > -1) { + gl.enableVertexAttribArray(`+o+`); + gl.vertexAttribPointer(`+o+", 4, "+this.type+", true, "+r+", "+i+`); + }`},t}(lt),$n=function(t){this.bufferValues=t,this.typeDef=void 0};$n.prototype.setTypeDefinition=function(t){this.typeDef=t};$n.prototype.getInitBlock=function(){var t=this.typeDef,n=t.name;return` + const `+n+`InstancedBuffer = gl.createBuffer(); + if (!`+n+`InstancedBuffer) throw new Error('failed to create a WebGL buffer'); + const `+n+"InstancedBufferValues = new Float32Array(["+this.bufferValues.join(",")+`]); + let `+n+"AttributeLocation = gl.getAttribLocation(program, '"+n+`'); +`};$n.prototype.getDivisor=function(t){return this.typeDef.getDivisor(t)};$n.prototype.getDraw=function(){var t=this,n=t.typeDef,r=n.name;return` + gl.bindBuffer(gl.ARRAY_BUFFER, `+r+`InstancedBuffer); + gl.bufferData(gl.ARRAY_BUFFER, `+r+`InstancedBufferValues, gl.STATIC_DRAW); + + gl.enableVertexAttribArray(`+r+`AttributeLocation); + gl.vertexAttribPointer(`+r+"AttributeLocation, "+n.count+`, gl.FLOAT, false, 0, 0); +`};var Pl=function(e){function t(n){e.call(this),this.program=n,this.uniforms=void 0}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.getBuffer=function(){return this.program.getBuffer()},t.prototype.appendBuffer=function(r,i){this.program.appendBuffer(r,i),this.scene&&this.scene.renderFrame()},t.prototype.add=function(r){return this.program.add(r)},t.prototype.update=function(r,i){this.program.update(r,i)},t.prototype.remove=function(r){return this.program.remove(r)},t.prototype.get=function(r){return this.program.get(r)},t.prototype.draw=function(r,i){this.uniforms||(this.uniforms={projectionMatrix:i.projection,model:this.worldModel,view:i.view.matrix,modelViewProjection:this.modelViewProjection}),this.program.draw(this.uniforms)},t.prototype.dispose=function(){e.prototype.dispose.call(this),this.program&&this.program.dispose()},t}(Ae);function me(e){return Math.abs(e)<1e-10?0:e}var Mh=function(e){function t(n){var r=Ml({gl:n,vertex:` + uniform mat4 modelViewProjection; + attribute vec3 point; + + void main() { + gl_Position = modelViewProjection * vec4(point, 1.0); + }`,fragment:` + precision highp float; + void main() { + gl_FragColor = vec4(0., 0., 0., 0.); + }`,preDrawHook:function(){return`gl.disable(gl.BLEND); + gl.enable(gl.DEPTH_TEST); + gl.depthFunc(gl.LEQUAL);`},postDrawHook:function(){return"gl.enable(gl.BLEND); gl.disable(gl.DEPTH_TEST);"}});e.call(this,r),this.domElementToPoints=new Map,this.uiIDToUI=new Map}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.appendFromDomElement=function(r){var i=this,o=Number.parseFloat(r.el.style.width),s=Number.parseFloat(r.el.style.height),a=[[-o/2,-s/2,0],[o/2,-s/2,0],[o/2,s/2,0],[o/2,s/2,0],[-o/2,s/2,0],[-o/2,-s/2,0]];r.updateWorldTransform();var l=a.map(function(u){var f=hn([0,0,0],u,r.worldModel),d={original:u,point:f,uiId:-1};return d.uiId=i.add(d),i.uiIDToUI.set(d.uiId,d),d});this.domElementToPoints.set(r,l),r.on("update-transform",this.updateDOMElementTransform,this),r.on("disposed",this.disposeDomElement,this)},t.prototype.disposeDomElement=function(r){var i=this,o=this.domElementToPoints.get(r);if(!o)throw new Error("Unknown dom element requested to be disposed");o.forEach(function(s){var a=s.uiId,l=i.remove(a),u=i.uiIDToUI.get(l);if(!u)throw new Error("Cannot find moved vertex ui");i.uiIDToUI.delete(l),l!==a&&(u.uiId=a,i.uiIDToUI.set(a,u))}),r.off("update-transform",this.updateDOMElementTransform),r.off("disposed",this.disposeDomElement),this.domElementToPoints.delete(r)},t.prototype.updateDOMElementTransform=function(r){var i=this,o=this.domElementToPoints.get(r);if(!o)throw new Error("Unknown dom element requested transform update");o.forEach(function(s){hn(s.point,s.original,r.worldModel),i.update(s.uiId,s)})},t.prototype.clear=function(){this.program.setCount(0)},t}(Pl),Fl=function(e){function t(n){e.call(this),this.container=document.createElement("div"),this.container.style.overflow="hidden",this.camera=document.createElement("div"),this.camera.style.transformStyle="preserve-3d",this.camera.style.pointerEvents="none",this.camera.style.position="relative",this.container.appendChild(this.camera),this.container.style.pointerEvents="none",this.bound=!1,this.lastCameraTransform="",this.seeThrough=n&&typeof n.seeThrough!="undefined"?n.seeThrough:!1}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.bindScene=function(r){if(r){var i=r.getDrawContext(),o=i.canvas.parentElement;if(!o)throw new Error("Scene does not have a parent element");this.seeThrough?o.insertBefore(this.container,i.canvas):o.append(this.container),this.bound=!0}else this.container.parentElement&&this.container.parentElement.removeChild(this.container),this.bound=!1,this.seeThroughQuads&&this.seeThroughQuads.parent&&this.seeThroughQuads.parent.removeChild(this.seeThroughQuads);e.prototype.bindScene.call(this,r)},t.prototype.acceptDomChild=function(r){if(this.camera.appendChild(r.el),!!this.seeThrough){if(!this.scene)throw new Error("Scene should be available at this point!");this.seeThroughQuads||(this.seeThroughQuads=new Mh(this.scene.getGL()),this.scene.appendChild(this.seeThroughQuads)),this.seeThroughQuads.appendFromDomElement(r)}},t.prototype.draw=function(r,i){!this.bound||(this._updateCameraTransforms(i),e.prototype.draw.call(this,r,i))},t.prototype._updateCameraTransforms=function(r){var i=r.projection[5]*r.height/(2*r.pixelRatio),o=r.width/r.pixelRatio,s=r.height/r.pixelRatio,a="translateZ("+i+"px)"+Ph(r.view.matrix)+"translate("+o/2+"px,"+s/2+"px)";this.lastCameraTransform!=a&&(this.lastCameraTransform=a,this.camera.style.transform=this.lastCameraTransform,this.camera.style.width=o+"px",this.camera.style.height=s+"px",this.container.style.width=o+"px",this.container.style.height=s+"px",this.container.style.perspective=i+"px")},t}(Ae);function Ph(e){return"matrix3d("+me(e[0])+","+me(-e[1])+","+me(e[2])+","+me(e[3])+","+me(e[4])+","+me(-e[5])+","+me(e[6])+","+me(e[7])+","+me(e[8])+","+me(-e[9])+","+me(e[10])+","+me(e[11])+","+me(e[12])+","+me(-e[13])+","+me(e[14])+","+me(e[15])+")"}var Fh=function(e){function t(n){e.call(this),this.lastTransform="",this.el=document.createElement("div");var r=this.el.style;if(r.position="absolute",r.pointerEvents="initial",n){var i=this.el.style;Object.keys(n).forEach(function(o){i[o]=n[o]})}jr(this)}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.updateWorldTransform=function(r){var i=e.prototype.updateWorldTransform.call(this,r);return i&&this.fire("update-transform",this),i},t.prototype.bindScene=function(r){if(r){var i=Ll(this);if(!i)throw new Error("DomElement should be part of DomContainer hierarchy");i.acceptDomChild(this)}else this.el.parentNode&&(this.el.parentNode.removeChild(this.el),this.fire("disposed",this));e.prototype.bindScene.call(this,r)},t.prototype.draw=function(){var r=Lh(this.worldModel);r!==this.lastTransform&&(this.el.style.transform=r,this.lastTransform=r)},t.prototype.dispose=function(){this.el.parentNode&&this.el.parentNode.removeChild(this.el)},t}(Ae);function Lh(e){var t="matrix3d("+me(e[0])+","+me(e[1])+","+me(e[2])+","+me(e[3])+","+me(-e[4])+","+me(-e[5])+","+me(-e[6])+","+me(-e[7])+","+me(e[8])+","+me(e[9])+","+me(e[10])+","+me(e[11])+","+me(e[12])+","+me(e[13])+","+me(e[14])+","+me(e[15])+")";return"translate(-50%,-50%)"+t}function Ll(e){return e instanceof Fl?e:e.parent&&Ll(e.parent)}var kh=Object.freeze(Object.defineProperty({__proto__:null,ColorAttribute:Sh,DomContainer:Fl,DomElement:Fh,Element:Ae,FloatAttribute:hr,GLCollection:Pl,InstancedAttribute:$n,LineStripCollection:nh,NumberAttribute:Sl,PointCollection:Kd,WireCollection:Ln,createFPSControlsUI:yh,createGuide:Eh,createScene:Hi,defineProgram:Ml,fpsControls:gh,isWebGLEnabled:Al,mapControls:_l,scene:Hi,toSVG:Tl,utils:$e},Symbol.toStringTag,{value:"Module"})),ut=(e,t)=>{const n=e.__vccOpts||e;for(const[r,i]of t)n[r]=i;return n};const Rh={},Bh={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 32",width:"12",height:"12",fill:"black",class:"loader"},Ih=G("path",{opacity:".25",d:"M16 0 A16 16 0 0 0 16 32 A16 16 0 0 0 16 0 M16 4 A12 12 0 0 1 16 28 A12 12 0 0 1 16 4"},null,-1),Dh=G("path",{d:"M16 0 A16 16 0 0 1 32 16 L28 16 A12 12 0 0 0 16 4z"},[G("animateTransform",{attributeName:"transform",type:"rotate",from:"0 16 16",to:"360 16 16",dur:"0.8s",repeatCount:"indefinite"})],-1),Oh=[Ih,Dh];function Nh(e,t){return se(),fe("svg",Bh,Oh)}var kl=ut(Rh,[["render",Nh]]),Fo=function(t){Uh(t);var n=Vh(t);return t.on=n.on,t.off=n.off,t.fire=n.fire,t};function Vh(e){var t=Object.create(null);return{on:function(n,r,i){if(typeof r!="function")throw new Error("callback is expected to be a function");var o=t[n];return o||(o=t[n]=[]),o.push({callback:r,ctx:i}),e},off:function(n,r){var i=typeof n=="undefined";if(i)return t=Object.create(null),e;if(t[n]){var o=typeof r!="function";if(o)delete t[n];else for(var s=t[n],a=0;a1&&(i=Array.prototype.splice.call(arguments,1));for(var o=0;o{n.setRequestHeader(h,t.headers[h])}),t.method==="POST"?n.send(t.body):n.send(null);function l(h){h.lengthComputable?r.notify({loaded:h.loaded,total:h.total,percent:h.loaded/h.total,lengthComputable:!0}):r.notify({loaded:h.loaded,lengthComputable:!1})}function u(){if(r.offCancel(i),!r.isCancelled){if(n.status!==200){a({statusError:n.status,message:`Unexpected status code ${n.status} when calling ${e}`});return}var h=n.response;t.responseType==="json"&&typeof h=="string"&&(h=JSON.parse(h)),setTimeout(()=>s(h),0)}}function f(){a(`Failed to download ${e}`)}function d(){a({cancelled:!0,message:`Cancelled download of ${e}`})}}}let vi=["https://overpass.kumi.systems/api/interpreter","https://overpass-api.de/api/interpreter","https://overpass.openstreetmap.ru/cgi/interpreter"];function zh(e,t){t=t||new Kr;const n={method:"POST",responseType:"json",progress:t,headers:{"Content-type":"application/x-www-form-urlencoded; charset=UTF-8"},body:"data="+encodeURIComponent(e)};let r=0;return i(vi[r]);function i(s){return Xr(s,n).catch(o)}function o(s){if(s.cancelled||r>=vi.length-1)throw s;return s.statusError&&t.notify({loaded:-1}),r+=1,i(vi[r])}}class Hh{constructor(){this.minX=1/0,this.minY=1/0,this.maxX=-1/0,this.maxY=-1/0}growBy(t){this.minX-=t,this.minY-=t,this.maxX+=t,this.maxY+=t}get left(){return this.minX}get top(){return this.minY}get right(){return this.maxX}get bottom(){return this.maxY}get width(){return this.maxX-this.minX}get height(){return this.maxY-this.minY}get cx(){return(this.minX+this.maxX)/2}get cy(){return(this.minY+this.maxY)/2}addPoint(t,n){if(t===void 0)throw new Error("Point is not defined");let r=t,i=n;i===void 0&&(r=t.x,i=t.y),rthis.maxX&&(this.maxX=r),ithis.maxY&&(this.maxY=i)}addRect(t){if(!t)throw new Error("rect is not defined");this.addPoint(t.left,t.top),this.addPoint(t.right,t.top),this.addPoint(t.left,t.bottom),this.addPoint(t.right,t.bottom)}merge(t){t.minXthis.maxX&&(this.maxX=t.maxX),t.maxY>this.maxY&&(this.maxY=t.maxY)}}class $h{constructor(){this._partials=new Float64Array(32),this._n=0}add(t){const n=this._partials;let r=0;for(let i=0;i0){for(s=t[--n];n>0&&(r=s,i=t[--n],s=r+i,o=i-(s-r),!o););n>0&&(o<0&&t[n-1]<0||o>0&&t[n-1]>0)&&(i=o*2,r=s+i,i==r-s&&(s=r))}return s}}function*jh(e){for(const t of e)yield*t}function Rl(e){return Array.from(jh(e))}var Ee=1e-6,Wh=1e-12,pe=Math.PI,Ze=pe/2,Os=pe/4,at=pe*2,et=180/pe,Be=pe/180,Le=Math.abs,Bl=Math.atan,On=Math.atan2,Pe=Math.cos,qh=Math.exp,Gh=Math.log,Fe=Math.sin,Yh=Math.sign||function(e){return e>0?1:e<0?-1:0},Zr=Math.sqrt,Kh=Math.tan;function Xh(e){return e>1?0:e<-1?pe:Math.acos(e)}function Nn(e){return e>1?Ze:e<-1?-Ze:Math.asin(e)}function An(){}function Sr(e,t){e&&Vs.hasOwnProperty(e.type)&&Vs[e.type](e,t)}var Ns={Feature:function(e,t){Sr(e.geometry,t)},FeatureCollection:function(e,t){for(var n=e.features,r=-1,i=n.length;++rpe?e+Math.round(-e/at)*at:e,t]}Ki.invert=Ki;function Il(e,t,n){return(e%=at)?t||n?Yi(Hs(e),$s(t,n)):Hs(e):t||n?$s(t,n):Ki}function zs(e){return function(t,n){return t+=e,[t>pe?t-at:t<-pe?t+at:t,n]}}function Hs(e){var t=zs(e);return t.invert=zs(-e),t}function $s(e,t){var n=Pe(e),r=Fe(e),i=Pe(t),o=Fe(t);function s(a,l){var u=Pe(l),f=Pe(a)*u,d=Fe(a)*u,h=Fe(l),g=h*n+f*r;return[On(d*i-g*o,f*n-h*r),Nn(g*i+d*o)]}return s.invert=function(a,l){var u=Pe(l),f=Pe(a)*u,d=Fe(a)*u,h=Fe(l),g=h*i-d*o;return[On(d*i+h*o,f*n+g*r),Nn(g*n-f*r)]},s}function Qh(e){e=Il(e[0]*Be,e[1]*Be,e.length>2?e[2]*Be:0);function t(n){return n=e(n[0]*Be,n[1]*Be),n[0]*=et,n[1]*=et,n}return t.invert=function(n){return n=e.invert(n[0]*Be,n[1]*Be),n[0]*=et,n[1]*=et,n},t}function Jh(e,t,n,r,i,o){if(!!n){var s=Pe(t),a=Fe(t),l=r*n;i==null?(i=t+r*at,o=t-l/2):(i=js(s,i),o=js(s,o),(r>0?io)&&(i+=r*at));for(var u,f=i;r>0?f>o:f1&&e.push(e.pop().concat(e.shift()))},result:function(){var n=e;return e=[],t=null,n}}}function pr(e,t){return Le(e[0]-t[0])=0;--a)i.point((d=f[a])[0],d[1]);else r(h.x,h.p.x,-1,i);h=h.p}h=h.o,f=h.z,g=!g}while(!h.v);i.lineEnd()}}}function Ws(e){if(!!(t=e.length)){for(var t,n=0,r=e[0],i;++n=0?1:-1,B=L*P,R=B>pe,j=b*m;if(l.add(On(j*L*Fe(B),S*x+j*Pe(B))),s+=R?P+L*at:P,R^y>=n^E>=n){var H=Mr(vn(g),vn(A));Gi(H);var W=Mr(o,H);Gi(W);var k=(R^P>=0?-1:1)*Nn(W[2]);(r>k||r===k&&(H[0]||H[1]))&&(a+=R^P>=0?1:-1)}}return(s<-Ee||s0){for(l||(i.polygonStart(),l=!0),i.lineStart(),m=0;m1&&E&2&&T.push(T.pop().concat(T.shift())),f.push(T.filter(tp))}}return h}}function tp(e){return e.length>1}function np(e,t){return((e=e.x)[0]<0?e[1]-Ze-Ee:Ze-e[1])-((t=t.x)[0]<0?t[1]-Ze-Ee:Ze-t[1])}var qs=Nl(function(){return!0},rp,op,[-pe,-Ze]);function rp(e){var t=NaN,n=NaN,r=NaN,i;return{lineStart:function(){e.lineStart(),i=1},point:function(o,s){var a=o>0?pe:-pe,l=Le(o-t);Le(l-pe)0?Ze:-Ze),e.point(r,n),e.lineEnd(),e.lineStart(),e.point(a,n),e.point(o,n),i=0):r!==a&&l>=pe&&(Le(t-r)Ee?Bl((Fe(t)*(o=Pe(r))*Fe(n)-Fe(r)*(i=Pe(t))*Fe(e))/(i*o*s)):(t+r)/2}function op(e,t,n,r){var i;if(e==null)i=n*Ze,r.point(-pe,i),r.point(0,i),r.point(pe,i),r.point(pe,0),r.point(pe,-i),r.point(0,-i),r.point(-pe,-i),r.point(-pe,0),r.point(-pe,i);else if(Le(e[0]-t[0])>Ee){var o=e[0]0,i=Le(t)>Ee;function o(f,d,h,g){Jh(g,e,n,h,f,d)}function s(f,d){return Pe(f)*Pe(d)>t}function a(f){var d,h,g,y,w;return{lineStart:function(){y=g=!1,w=1},point:function(b,S){var C=[b,S],A,E=s(b,S),T=r?E?0:u(b,S):E?u(b+(b<0?pe:-pe),S):0;if(!d&&(y=g=E)&&f.lineStart(),E!==g&&(A=l(d,C),(!A||pr(d,A)||pr(C,A))&&(C[2]=1)),E!==g)w=0,E?(f.lineStart(),A=l(C,d),f.point(A[0],A[1])):(A=l(d,C),f.point(A[0],A[1],2),f.lineEnd()),d=A;else if(i&&d&&r^E){var m;!(T&h)&&(m=l(C,d,!0))&&(w=0,r?(f.lineStart(),f.point(m[0][0],m[0][1]),f.point(m[1][0],m[1][1]),f.lineEnd()):(f.point(m[1][0],m[1][1]),f.lineEnd(),f.lineStart(),f.point(m[0][0],m[0][1],3)))}E&&(!d||!pr(d,C))&&f.point(C[0],C[1]),d=C,g=E,h=T},lineEnd:function(){g&&f.lineEnd(),d=null},clean:function(){return w|(y&&g)<<1}}}function l(f,d,h){var g=vn(f),y=vn(d),w=[1,0,0],b=Mr(g,y),S=er(b,b),C=b[0],A=S-C*C;if(!A)return!h&&f;var E=t*S/A,T=-t*C/A,m=Mr(w,b),x=tr(w,E),P=tr(b,T);gi(x,P);var L=m,B=er(x,L),R=er(L,L),j=B*B-R*(er(x,x)-1);if(!(j<0)){var H=Zr(j),W=tr(L,(-B-H)/R);if(gi(W,x),W=qi(W),!h)return W;var k=f[0],$=d[0],q=f[1],Z=d[1],z;$0^W[1]<(Le(W[0]-k)pe^(k<=W[0]&&W[0]<=$)){var te=tr(L,(-B+H)/R);return gi(te,x),[W,qi(te)]}}}function u(f,d){var h=r?e:pe-e,g=0;return f<-h?g|=1:f>h&&(g|=2),d<-h?g|=4:d>h&&(g|=8),g}return Nl(s,a,o,r?[0,-e]:[-pe,e-pe])}function ap(e,t,n,r,i,o){var s=e[0],a=e[1],l=t[0],u=t[1],f=0,d=1,h=l-s,g=u-a,y;if(y=n-s,!(!h&&y>0)){if(y/=h,h<0){if(y0){if(y>d)return;y>f&&(f=y)}if(y=i-s,!(!h&&y<0)){if(y/=h,h<0){if(y>d)return;y>f&&(f=y)}else if(h>0){if(y0)){if(y/=g,g<0){if(y0){if(y>d)return;y>f&&(f=y)}if(y=o-a,!(!g&&y<0)){if(y/=g,g<0){if(y>d)return;y>f&&(f=y)}else if(g>0){if(y0&&(e[0]=s+f*h,e[1]=a+f*g),d<1&&(t[0]=s+d*h,t[1]=a+d*g),!0}}}}}var Tn=1e9,rr=-Tn;function lp(e,t,n,r){function i(u,f){return e<=u&&u<=n&&t<=f&&f<=r}function o(u,f,d,h){var g=0,y=0;if(u==null||(g=s(u,d))!==(y=s(f,d))||l(u,f)<0^d>0)do h.point(g===0||g===3?e:n,g>1?r:t);while((g=(g+d+4)%4)!==y);else h.point(f[0],f[1])}function s(u,f){return Le(u[0]-e)0?0:3:Le(u[0]-n)0?2:1:Le(u[1]-t)0?1:0:f>0?3:2}function a(u,f){return l(u.x,f.x)}function l(u,f){var d=s(u,1),h=s(f,1);return d!==h?d-h:d===0?f[1]-u[1]:d===1?u[0]-f[0]:d===2?u[1]-f[1]:f[0]-u[0]}return function(u){var f=u,d=Dl(),h,g,y,w,b,S,C,A,E,T,m,x={point:P,lineStart:j,lineEnd:H,polygonStart:B,polygonEnd:R};function P(k,$){i(k,$)&&f.point(k,$)}function L(){for(var k=0,$=0,q=g.length;$r&&(re-X)*(r-te)>(ve-te)*(e-X)&&++k:ve<=r&&(re-X)*(r-te)<(ve-te)*(e-X)&&--k;return k}function B(){f=d,h=[],g=[],m=!0}function R(){var k=L(),$=m&&k,q=(h=Rl(h)).length;($||q)&&(u.polygonStart(),$&&(u.lineStart(),o(null,null,1,u),u.lineEnd()),q&&Ol(h,a,k,o,u),u.polygonEnd()),f=u,h=g=y=null}function j(){x.point=W,g&&g.push(y=[]),T=!0,E=!1,C=A=NaN}function H(){h&&(W(w,b),S&&E&&d.rejoin(),h.push(d.result())),x.point=P,E&&f.lineEnd()}function W(k,$){var q=i(k,$);if(g&&y.push([k,$]),T)w=k,b=$,S=q,T=!1,q&&(f.lineStart(),f.point(k,$));else if(q&&E)f.point(k,$);else{var Z=[C=Math.max(rr,Math.min(Tn,C)),A=Math.max(rr,Math.min(Tn,A))],z=[k=Math.max(rr,Math.min(Tn,k)),$=Math.max(rr,Math.min(Tn,$))];ap(Z,z,e,t,n,r)?(E||(f.lineStart(),f.point(Z[0],Z[1])),f.point(z[0],z[1]),q||f.lineEnd(),m=!1):q&&(f.lineStart(),f.point(k,$),m=!1)}C=k,A=$,E=q}return x}}var Gs=e=>e,gn=1/0,Pr=gn,Vn=-gn,Fr=Vn,up={point:fp,lineStart:An,lineEnd:An,polygonStart:An,polygonEnd:An,result:function(){var e=[[gn,Pr],[Vn,Fr]];return Vn=Fr=-(Pr=gn=1/0),e}};function fp(e,t){eVn&&(Vn=e),tFr&&(Fr=t)}var Ys=up;function Lo(e){return function(t){var n=new Xi;for(var r in e)n[r]=e[r];return n.stream=t,n}}function Xi(){}Xi.prototype={constructor:Xi,point:function(e,t){this.stream.point(e,t)},sphere:function(){this.stream.sphere()},lineStart:function(){this.stream.lineStart()},lineEnd:function(){this.stream.lineEnd()},polygonStart:function(){this.stream.polygonStart()},polygonEnd:function(){this.stream.polygonEnd()}};function ko(e,t,n){var r=e.clipExtent&&e.clipExtent();return e.scale(150).translate([0,0]),r!=null&&e.clipExtent(null),Zh(n,e.stream(Ys)),t(Ys.result()),r!=null&&e.clipExtent(r),e}function Vl(e,t,n){return ko(e,function(r){var i=t[1][0]-t[0][0],o=t[1][1]-t[0][1],s=Math.min(i/(r[1][0]-r[0][0]),o/(r[1][1]-r[0][1])),a=+t[0][0]+(i-s*(r[1][0]+r[0][0]))/2,l=+t[0][1]+(o-s*(r[1][1]+r[0][1]))/2;e.scale(150*s).translate([a,l])},n)}function cp(e,t,n){return Vl(e,[[0,0],t],n)}function dp(e,t,n){return ko(e,function(r){var i=+t,o=i/(r[1][0]-r[0][0]),s=(i-o*(r[1][0]+r[0][0]))/2,a=-o*r[0][1];e.scale(150*o).translate([s,a])},n)}function hp(e,t,n){return ko(e,function(r){var i=+t,o=i/(r[1][1]-r[0][1]),s=-o*r[0][0],a=(i-o*(r[1][1]+r[0][1]))/2;e.scale(150*o).translate([s,a])},n)}var Ks=16,pp=Pe(30*Be);function Xs(e,t){return+t?gp(e,t):vp(e)}function vp(e){return Lo({point:function(t,n){t=e(t,n),this.stream.point(t[0],t[1])}})}function gp(e,t){function n(r,i,o,s,a,l,u,f,d,h,g,y,w,b){var S=u-r,C=f-i,A=S*S+C*C;if(A>4*t&&w--){var E=s+h,T=a+g,m=l+y,x=Zr(E*E+T*T+m*m),P=Nn(m/=x),L=Le(Le(m)-1)t||Le((S*H+C*W)/A-.5)>.3||s*h+a*g+l*y2?k[2]%360*Be:0,H()):[a*et,l*et,u*et]},R.angle=function(k){return arguments.length?(d=k%360*Be,H()):d*et},R.reflectX=function(k){return arguments.length?(h=k?-1:1,H()):h<0},R.reflectY=function(k){return arguments.length?(g=k?-1:1,H()):g<0},R.precision=function(k){return arguments.length?(m=Xs(x,T=k*k),W()):Zr(T)},R.fitExtent=function(k,$){return Vl(R,k,$)},R.fitSize=function(k,$){return cp(R,k,$)},R.fitWidth=function(k,$){return dp(R,k,$)},R.fitHeight=function(k,$){return hp(R,k,$)};function H(){var k=Zs(n,0,0,h,g,d).apply(null,t(o,s)),$=Zs(n,r-k[0],i-k[1],h,g,d);return f=Il(a,l,u),x=Yi(t,$),P=Yi(f,x),m=Xs(x,T),W()}function W(){return L=B=null,R}return function(){return t=e.apply(this,arguments),R.invert=t.invert&&j,H()}}function Ro(e,t){return[e,Gh(Kh((Ze+t)/2))]}Ro.invert=function(e,t){return[e,2*Bl(qh(t))-Ze]};function _p(){return Ep(Ro).scale(961/at)}function Ep(e){var t=bp(e),n=t.center,r=t.scale,i=t.translate,o=t.clipExtent,s=null,a,l,u;t.scale=function(d){return arguments.length?(r(d),f()):r()},t.translate=function(d){return arguments.length?(i(d),f()):i()},t.center=function(d){return arguments.length?(n(d),f()):n()},t.clipExtent=function(d){return arguments.length?(d==null?s=a=l=u=null:(s=+d[0][0],a=+d[0][1],l=+d[1][0],u=+d[1][1]),f()):s==null?null:[[s,a],[l,u]]};function f(){var d=pe*r(),h=t(Qh(t.rotate()).invert([0,0]));return o(s==null?[[h[0]-d,h[1]-d],[h[0]+d,h[1]+d]]:e===Ro?[[Math.max(h[0]-d,s),a],[Math.min(h[0]+d,l),u]]:[[s,Math.max(h[1]-d,a)],[l,Math.min(h[1]+d,u)]])}return f()}class Un{constructor(){this.elements=[],this.bounds=new Hh,this.nodes=new Map,this.wayPointCount=0,this.id=0,this.name="",this.isArea=!0,this.projector=void 0}setName(t){this.name=t}setId(t){this.id=t}setIsArea(t){this.isArea=t}setBBox(t){this.bboxString=t}hasRoads(){return this.wayPointCount>0}setProjector(t){this.projector=t}static fromPBF(t){if(t.version!==1)throw new Error("Unknown version "+t.version);let n=[];t.nodes.forEach(i=>{i.type="node",n.push(i)}),t.ways.forEach(i=>{i.type="way",n.push(i)});const r=Un.fromOSMResponse(n);return r.setName(t.name),r.setId(t.id),r}static fromOSMResponse(t){let n=new Un,r=n.nodes,i=n.bounds,o=0;return t.forEach(s=>{s.type==="node"?(r.set(s.id,s),i.addPoint(s.lon,s.lat)):s.type==="way"&&(o+=s.nodes.length)}),n.elements=t,n.wayPointCount=o,n}getProjectedRect(){let t=this.bounds,n=this.getProjector(),r=n({lon:t.left,lat:t.bottom}),i=n({lon:t.right,lat:t.top}),o=r.x,s=r.y,a=i.y,l=i.x;return{left:o,top:s,right:l,bottom:a,width:l-o,height:Math.abs(a-s)}}forEachElement(t){this.elements.forEach(t)}forEachWay(t,n,r){let i=this.nodes,o=this.getProjector();this.elements.forEach(s=>{if(s.type!=="way")return;let a=s.nodes,l=i.get(a[0]);if(!l)return;let u=o(l);n&&n(s);for(let f=1;f(Qs.set(e,r),r))}function Cp(e){return e.map(n=>{let r,i;return n.osm_type==="relation"?r=n.osm_id+36e8:n.osm_type==="way"&&(r=n.osm_id+24e8),n.boundingbox&&(i=[Number.parseFloat(n.boundingbox[0]),Number.parseFloat(n.boundingbox[2]),Number.parseFloat(n.boundingbox[1]),Number.parseFloat(n.boundingbox[3])]),{areaId:r,bbox:i,lat:n.lat,lon:n.lon,osmId:n.osm_id,osmType:n.osm_type,name:n.display_name,type:n.type}})}const Oo=class{static runFromOptions(t,n){return t.getQueryTemplate().then(r=>new Oo(r,n).run())}constructor(t,n){this.queryBounds=t.bounds,this.queryString=t.queryString,this.progress=n,this.promise=null}run(){if(this.promise)return this.promise;let t=Sp(this.queryString);return this.promise=Ap(t).then(n=>zh(n,this.progress)).then(n=>{let r=Un.fromOSMResponse(n.elements);return r.queryBounds=this.queryBounds,r}),this.promise}};let ct=Oo;en(ct,"All","way"),en(ct,"Building","way[building]"),en(ct,"Road","way[highway]"),en(ct,"RoadBasic",'way[highway~"^(motorway|primary|secondary|tertiary)|residential"]'),en(ct,"RoadStrict",'way[highway~"^(((motorway|trunk|primary|secondary|tertiary)(_link)?)|unclassified|residential|living_street|pedestrian|service|track)$"][area!=yes]');function Ap(e){let t=0;return r().then(n);function n(){return e.map(i=>{if(typeof i=="string")return i;if(i.geoType==="Area")return`area(${i.areaId})`;if(i.geoType==="Coords")return i.lat+","+i.lon;if(i.geoType==="Id")return`${i.osmType}(${i.osmId})`;if(i.geoType==="Bbox")return i.bbox.join(",")}).join("")}function r(){if(t>=e.length)return Promise.resolve();let i=e[t];return t+=1,typeof i=="string"?r():Bo(i.name).then(Tp).then(o=>{if(!o)throw new Error("No areas found for request "+i.name);Object.assign(i,o)}).then(Mp(1e3)).then(r)}}function Tp(e){if(e.length>0)return e[0]}function Sp(e){let t=/{{geocode(.+?):(.+?)}}/,n,r=[];for(;n=e.match(t);)r.push(e.substr(0,n.index)),r.push({geoType:n[1],name:n[2]}),e=e.substr(n.index+n[0].length);return r.push(e),r}function Mp(e){return function(t){return new Promise(n=>{setTimeout(()=>n(t),e)})}}var Pp=function(e){Lp(e);var t=Fp(e);return e.on=t.on,e.off=t.off,e.fire=t.fire,e};function Fp(e){var t=Object.create(null);return{on:function(n,r,i){if(typeof r!="function")throw new Error("callback is expected to be a function");var o=t[n];return o||(o=t[n]=[]),o.push({callback:r,ctx:i}),e},off:function(n,r){var i=typeof n=="undefined";if(i)return t=Object.create(null),e;if(t[n]){var o=typeof r!="function";if(o)delete t[n];else for(var s=t[n],a=0;a1&&(i=Array.prototype.splice.call(arguments,1));for(var o=0;o=0,M=!p&&_&&(c==="hex"||c==="hex6"||c==="hex3"||c==="hex4"||c==="hex8"||c==="name");return M?c==="name"&&this._a===0?this.toName():this.toRgbString():(c==="rgb"&&(v=this.toRgbString()),c==="prgb"&&(v=this.toPercentageRgbString()),(c==="hex"||c==="hex6")&&(v=this.toHexString()),c==="hex3"&&(v=this.toHexString(!0)),c==="hex4"&&(v=this.toHex8String(!0)),c==="hex8"&&(v=this.toHex8String()),c==="name"&&(v=this.toName()),c==="hsl"&&(v=this.toHslString()),c==="hsv"&&(v=this.toHsvString()),v||this.toHexString())},clone:function(){return u(this.toString())},_applyModification:function(c,p){var v=c.apply(null,[this].concat([].slice.call(p)));return this._r=v._r,this._g=v._g,this._b=v._b,this.setAlpha(v._a),this},lighten:function(){return this._applyModification(m,arguments)},brighten:function(){return this._applyModification(x,arguments)},darken:function(){return this._applyModification(P,arguments)},desaturate:function(){return this._applyModification(A,arguments)},saturate:function(){return this._applyModification(E,arguments)},greyscale:function(){return this._applyModification(T,arguments)},spin:function(){return this._applyModification(L,arguments)},_applyCombination:function(c,p){return c.apply(null,[this].concat([].slice.call(p)))},analogous:function(){return this._applyCombination(W,arguments)},complement:function(){return this._applyCombination(B,arguments)},monochromatic:function(){return this._applyCombination(k,arguments)},splitcomplement:function(){return this._applyCombination(H,arguments)},triad:function(){return this._applyCombination(R,arguments)},tetrad:function(){return this._applyCombination(j,arguments)}},u.fromRatio=function(c,p){if(typeof c=="object"){var v={};for(var _ in c)c.hasOwnProperty(_)&&(_==="a"?v[_]=c[_]:v[_]=Me(c[_]));c=v}return u(c,p)};function f(c){var p={r:0,g:0,b:0},v=1,_=null,M=null,F=null,O=!1,I=!1;return typeof c=="string"&&(c=ke(c)),typeof c=="object"&&(le(c.r)&&le(c.g)&&le(c.b)?(p=d(c.r,c.g,c.b),O=!0,I=String(c.r).substr(-1)==="%"?"prgb":"rgb"):le(c.h)&&le(c.s)&&le(c.v)?(_=Me(c.s),M=Me(c.v),p=w(c.h,_,M),O=!0,I="hsv"):le(c.h)&&le(c.s)&&le(c.l)&&(_=Me(c.s),F=Me(c.l),p=g(c.h,_,F),O=!0,I="hsl"),c.hasOwnProperty("a")&&(v=c.a)),v=z(v),{ok:O,format:c.format||I,r:s(255,a(p.r,0)),g:s(255,a(p.g,0)),b:s(255,a(p.b,0)),a:v}}function d(c,p,v){return{r:V(c,255)*255,g:V(p,255)*255,b:V(v,255)*255}}function h(c,p,v){c=V(c,255),p=V(p,255),v=V(v,255);var _=a(c,p,v),M=s(c,p,v),F,O,I=(_+M)/2;if(_==M)F=O=0;else{var U=_-M;switch(O=I>.5?U/(2-_-M):U/(_+M),_){case c:F=(p-v)/U+(p1&&(K-=1),K<1/6?N+(Q-N)*6*K:K<1/2?Q:K<2/3?N+(Q-N)*(2/3-K)*6:N}if(p===0)_=M=F=v;else{var I=v<.5?v*(1+p):v+p-v*p,U=2*v-I;_=O(U,I,c+1/3),M=O(U,I,c),F=O(U,I,c-1/3)}return{r:_*255,g:M*255,b:F*255}}function y(c,p,v){c=V(c,255),p=V(p,255),v=V(v,255);var _=a(c,p,v),M=s(c,p,v),F,O,I=_,U=_-M;if(O=_===0?0:U/_,_==M)F=0;else{switch(_){case c:F=(p-v)/U+(p>1)+720)%360;--p;)_.h=(_.h+M)%360,F.push(u(_));return F}function k(c,p){p=p||6;for(var v=u(c).toHsv(),_=v.h,M=v.s,F=v.v,O=[],I=1/p;p--;)O.push(u({h:_,s:M,v:F})),F=(F+I)%1;return O}u.mix=function(c,p,v){v=v===0?0:v||50;var _=u(c).toRgb(),M=u(p).toRgb(),F=v/100,O={r:(M.r-_.r)*F+_.r,g:(M.g-_.g)*F+_.g,b:(M.b-_.b)*F+_.b,a:(M.a-_.a)*F+_.a};return u(O)},u.readability=function(c,p){var v=u(c),_=u(p);return(t.max(v.getLuminance(),_.getLuminance())+.05)/(t.min(v.getLuminance(),_.getLuminance())+.05)},u.isReadable=function(c,p,v){var _=u.readability(c,p),M,F;switch(F=!1,M=Ne(v),M.level+M.size){case"AAsmall":case"AAAlarge":F=_>=4.5;break;case"AAlarge":F=_>=3;break;case"AAAsmall":F=_>=7;break}return F},u.mostReadable=function(c,p,v){var _=null,M=0,F,O,I,U;v=v||{},O=v.includeFallbackColors,I=v.level,U=v.size;for(var N=0;NM&&(M=F,_=u(p[N]));return u.isReadable(c,_,{level:I,size:U})||!O?_:(v.includeFallbackColors=!1,u.mostReadable(c,["#fff","#000"],v))};var $=u.names={aliceblue:"f0f8ff",antiquewhite:"faebd7",aqua:"0ff",aquamarine:"7fffd4",azure:"f0ffff",beige:"f5f5dc",bisque:"ffe4c4",black:"000",blanchedalmond:"ffebcd",blue:"00f",blueviolet:"8a2be2",brown:"a52a2a",burlywood:"deb887",burntsienna:"ea7e5d",cadetblue:"5f9ea0",chartreuse:"7fff00",chocolate:"d2691e",coral:"ff7f50",cornflowerblue:"6495ed",cornsilk:"fff8dc",crimson:"dc143c",cyan:"0ff",darkblue:"00008b",darkcyan:"008b8b",darkgoldenrod:"b8860b",darkgray:"a9a9a9",darkgreen:"006400",darkgrey:"a9a9a9",darkkhaki:"bdb76b",darkmagenta:"8b008b",darkolivegreen:"556b2f",darkorange:"ff8c00",darkorchid:"9932cc",darkred:"8b0000",darksalmon:"e9967a",darkseagreen:"8fbc8f",darkslateblue:"483d8b",darkslategray:"2f4f4f",darkslategrey:"2f4f4f",darkturquoise:"00ced1",darkviolet:"9400d3",deeppink:"ff1493",deepskyblue:"00bfff",dimgray:"696969",dimgrey:"696969",dodgerblue:"1e90ff",firebrick:"b22222",floralwhite:"fffaf0",forestgreen:"228b22",fuchsia:"f0f",gainsboro:"dcdcdc",ghostwhite:"f8f8ff",gold:"ffd700",goldenrod:"daa520",gray:"808080",green:"008000",greenyellow:"adff2f",grey:"808080",honeydew:"f0fff0",hotpink:"ff69b4",indianred:"cd5c5c",indigo:"4b0082",ivory:"fffff0",khaki:"f0e68c",lavender:"e6e6fa",lavenderblush:"fff0f5",lawngreen:"7cfc00",lemonchiffon:"fffacd",lightblue:"add8e6",lightcoral:"f08080",lightcyan:"e0ffff",lightgoldenrodyellow:"fafad2",lightgray:"d3d3d3",lightgreen:"90ee90",lightgrey:"d3d3d3",lightpink:"ffb6c1",lightsalmon:"ffa07a",lightseagreen:"20b2aa",lightskyblue:"87cefa",lightslategray:"789",lightslategrey:"789",lightsteelblue:"b0c4de",lightyellow:"ffffe0",lime:"0f0",limegreen:"32cd32",linen:"faf0e6",magenta:"f0f",maroon:"800000",mediumaquamarine:"66cdaa",mediumblue:"0000cd",mediumorchid:"ba55d3",mediumpurple:"9370db",mediumseagreen:"3cb371",mediumslateblue:"7b68ee",mediumspringgreen:"00fa9a",mediumturquoise:"48d1cc",mediumvioletred:"c71585",midnightblue:"191970",mintcream:"f5fffa",mistyrose:"ffe4e1",moccasin:"ffe4b5",navajowhite:"ffdead",navy:"000080",oldlace:"fdf5e6",olive:"808000",olivedrab:"6b8e23",orange:"ffa500",orangered:"ff4500",orchid:"da70d6",palegoldenrod:"eee8aa",palegreen:"98fb98",paleturquoise:"afeeee",palevioletred:"db7093",papayawhip:"ffefd5",peachpuff:"ffdab9",peru:"cd853f",pink:"ffc0cb",plum:"dda0dd",powderblue:"b0e0e6",purple:"800080",rebeccapurple:"663399",red:"f00",rosybrown:"bc8f8f",royalblue:"4169e1",saddlebrown:"8b4513",salmon:"fa8072",sandybrown:"f4a460",seagreen:"2e8b57",seashell:"fff5ee",sienna:"a0522d",silver:"c0c0c0",skyblue:"87ceeb",slateblue:"6a5acd",slategray:"708090",slategrey:"708090",snow:"fffafa",springgreen:"00ff7f",steelblue:"4682b4",tan:"d2b48c",teal:"008080",thistle:"d8bfd8",tomato:"ff6347",turquoise:"40e0d0",violet:"ee82ee",wheat:"f5deb3",white:"fff",whitesmoke:"f5f5f5",yellow:"ff0",yellowgreen:"9acd32"},q=u.hexNames=Z($);function Z(c){var p={};for(var v in c)c.hasOwnProperty(v)&&(p[c[v]]=v);return p}function z(c){return c=parseFloat(c),(isNaN(c)||c<0||c>1)&&(c=1),c}function V(c,p){te(c)&&(c="100%");var v=re(c);return c=s(p,a(0,parseFloat(c))),v&&(c=parseInt(c*p,10)/100),t.abs(c-p)<1e-6?1:c%p/parseFloat(p)}function Y(c){return s(1,a(0,c))}function X(c){return parseInt(c,16)}function te(c){return typeof c=="string"&&c.indexOf(".")!=-1&&parseFloat(c)===1}function re(c){return typeof c=="string"&&c.indexOf("%")!=-1}function ve(c){return c.length==1?"0"+c:""+c}function Me(c){return c<=1&&(c=c*100+"%"),c}function oe(c){return t.round(parseFloat(c)*255).toString(16)}function de(c){return X(c)/255}var ue=function(){var c="[-\\+]?\\d+%?",p="[-\\+]?\\d*\\.\\d+%?",v="(?:"+p+")|(?:"+c+")",_="[\\s|\\(]+("+v+")[,|\\s]+("+v+")[,|\\s]+("+v+")\\s*\\)?",M="[\\s|\\(]+("+v+")[,|\\s]+("+v+")[,|\\s]+("+v+")[,|\\s]+("+v+")\\s*\\)?";return{CSS_UNIT:new RegExp(v),rgb:new RegExp("rgb"+_),rgba:new RegExp("rgba"+M),hsl:new RegExp("hsl"+_),hsla:new RegExp("hsla"+M),hsv:new RegExp("hsv"+_),hsva:new RegExp("hsva"+M),hex3:/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex6:/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,hex4:/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex8:/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/}}();function le(c){return!!ue.CSS_UNIT.exec(c)}function ke(c){c=c.replace(n,"").replace(r,"").toLowerCase();var p=!1;if($[c])c=$[c],p=!0;else if(c=="transparent")return{r:0,g:0,b:0,a:0,format:"name"};var v;return(v=ue.rgb.exec(c))?{r:v[1],g:v[2],b:v[3]}:(v=ue.rgba.exec(c))?{r:v[1],g:v[2],b:v[3],a:v[4]}:(v=ue.hsl.exec(c))?{h:v[1],s:v[2],l:v[3]}:(v=ue.hsla.exec(c))?{h:v[1],s:v[2],l:v[3],a:v[4]}:(v=ue.hsv.exec(c))?{h:v[1],s:v[2],v:v[3]}:(v=ue.hsva.exec(c))?{h:v[1],s:v[2],v:v[3],a:v[4]}:(v=ue.hex8.exec(c))?{r:X(v[1]),g:X(v[2]),b:X(v[3]),a:de(v[4]),format:p?"name":"hex8"}:(v=ue.hex6.exec(c))?{r:X(v[1]),g:X(v[2]),b:X(v[3]),format:p?"name":"hex"}:(v=ue.hex4.exec(c))?{r:X(v[1]+""+v[1]),g:X(v[2]+""+v[2]),b:X(v[3]+""+v[3]),a:de(v[4]+""+v[4]),format:p?"name":"hex8"}:(v=ue.hex3.exec(c))?{r:X(v[1]+""+v[1]),g:X(v[2]+""+v[2]),b:X(v[3]+""+v[3]),format:p?"name":"hex"}:!1}function Ne(c){var p,v;return c=c||{level:"AA",size:"small"},p=(c.level||"AA").toUpperCase(),v=(c.size||"small").toLowerCase(),p!=="AA"&&p!=="AAA"&&(p="AA"),v!=="small"&&v!=="large"&&(v="small"),{level:p,size:v}}e.exports?e.exports=u:window.tinycolor=u})(Math)})(zl);var He=zl.exports,Pt={areaServer:"https://city-roads.s3-us-west-2.amazonaws.com/nov-02-2020",getDefaultLineColor(){return He("rgba(26, 26, 26, 0.8)")},getLabelColor(){return He("#161616")},getBackgroundColor(){return He("#F7F2E8")}};class Qr{static parse(t,n,r){let i=new Qr;if(typeof r=="string"&&(i.place=r),n&&(i.wayFilter=n),!r)return i;Object.assign(i,r);let o=Xp(t,r.layer);if(o){i.projector=o.getGridProjector();let s=o.getQueryBounds();s&&!i.place&&!i.areaId&&!i.bbox&&(i.place=s.place,i.areaId=s.areaId,i.bbox=s.bbox)}return r.projector&&(i.projector=projector),i}constructor(t){this.place=void 0,this.projector=void 0,this.wayFilter=void 0,this.timeout=900,this.maxHeapByteSize=1073741824,this.outputMethod="skel",Object.assign(this,t)}getQueryTemplate(){if(this.raw)return Promise.resolve({queryString:this.raw});if(!this.wayFilter)throw new Error("Way filter is required");return this.getBounds().then(t=>{let n;if(t.areaId)n=`[timeout:${this.timeout}][maxsize:${this.maxHeapByteSize}][out:json]; +area(${t.areaId}); +(._; )->.area; +(${this.wayFilter}(area.area); node(w);); +out ${this.outputMethod};`;else if(t.bbox){let r=Zp(t.bbox);n=`[timeout:${this.timeout}][maxsize:${this.maxHeapByteSize}][bbox:${r}][out:json]; +(${this.wayFilter}; node(w);); +out ${this.outputMethod};`}return{bounds:t,queryString:n}})}getBounds(){if(this.place)return Bo(this.place).then(t=>t&&t[0]);if(this.areaId)return Promise.resolve({areaId:this.areaId});if(this.bbox)return Promise.resolve({bbox:this.bbox});throw new Error("Please specify bounding area for the query (place|areaId|bbox)")}}function Xp(e,t){if(t!==void 0)return typeof t=="number"?e.queryLayerAll()[t]:typeof t=="string"?e.queryLayer(t):t}function Zp(e){return e&&e.join(",")}var Do={};/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh */Do.read=function(e,t,n,r,i){var o,s,a=i*8-r-1,l=(1<>1,f=-7,d=n?i-1:0,h=n?-1:1,g=e[t+d];for(d+=h,o=g&(1<<-f)-1,g>>=-f,f+=a;f>0;o=o*256+e[t+d],d+=h,f-=8);for(s=o&(1<<-f)-1,o>>=-f,f+=r;f>0;s=s*256+e[t+d],d+=h,f-=8);if(o===0)o=1-u;else{if(o===l)return s?NaN:(g?-1:1)*(1/0);s=s+Math.pow(2,r),o=o-u}return(g?-1:1)*s*Math.pow(2,o-r)};Do.write=function(e,t,n,r,i,o){var s,a,l,u=o*8-i-1,f=(1<>1,h=i===23?Math.pow(2,-24)-Math.pow(2,-77):0,g=r?0:o-1,y=r?1:-1,w=t<0||t===0&&1/t<0?1:0;for(t=Math.abs(t),isNaN(t)||t===1/0?(a=isNaN(t)?1:0,s=f):(s=Math.floor(Math.log(t)/Math.LN2),t*(l=Math.pow(2,-s))<1&&(s--,l*=2),s+d>=1?t+=h/l:t+=h*Math.pow(2,1-d),t*l>=2&&(s++,l/=2),s+d>=f?(a=0,s=f):s+d>=1?(a=(t*l-1)*Math.pow(2,i),s=s+d):(a=t*Math.pow(2,d-1)*Math.pow(2,i),s=0));i>=8;e[n+g]=a&255,g+=y,a/=256,i-=8);for(s=s<0;e[n+g]=s&255,g+=y,s/=256,u-=8);e[n+g-y]|=w*128};var Qp=ye,sr=Do;function ye(e){this.buf=ArrayBuffer.isView&&ArrayBuffer.isView(e)?e:new Uint8Array(e||0),this.pos=0,this.type=0,this.length=this.buf.length}ye.Varint=0;ye.Fixed64=1;ye.Bytes=2;ye.Fixed32=5;var Zi=(1<<16)*(1<<16),Js=1/Zi,Jp=12,Hl=typeof TextDecoder=="undefined"?null:new TextDecoder("utf8");ye.prototype={destroy:function(){this.buf=null},readFields:function(e,t,n){for(n=n||this.length;this.pos>3,o=this.pos;this.type=r&7,e(i,t,this),this.pos===o&&this.skip(r)}return t},readMessage:function(e,t){return this.readFields(e,t,this.readVarint()+this.pos)},readFixed32:function(){var e=ar(this.buf,this.pos);return this.pos+=4,e},readSFixed32:function(){var e=ta(this.buf,this.pos);return this.pos+=4,e},readFixed64:function(){var e=ar(this.buf,this.pos)+ar(this.buf,this.pos+4)*Zi;return this.pos+=8,e},readSFixed64:function(){var e=ar(this.buf,this.pos)+ta(this.buf,this.pos+4)*Zi;return this.pos+=8,e},readFloat:function(){var e=sr.read(this.buf,this.pos,!0,23,4);return this.pos+=4,e},readDouble:function(){var e=sr.read(this.buf,this.pos,!0,52,8);return this.pos+=8,e},readVarint:function(e){var t=this.buf,n,r;return r=t[this.pos++],n=r&127,r<128||(r=t[this.pos++],n|=(r&127)<<7,r<128)||(r=t[this.pos++],n|=(r&127)<<14,r<128)||(r=t[this.pos++],n|=(r&127)<<21,r<128)?n:(r=t[this.pos],n|=(r&15)<<28,ev(n,e,this))},readVarint64:function(){return this.readVarint(!0)},readSVarint:function(){var e=this.readVarint();return e%2===1?(e+1)/-2:e/2},readBoolean:function(){return Boolean(this.readVarint())},readString:function(){var e=this.readVarint()+this.pos,t=this.pos;return this.pos=e,e-t>=Jp&&Hl?pv(this.buf,t,e):hv(this.buf,t,e)},readBytes:function(){var e=this.readVarint()+this.pos,t=this.buf.subarray(this.pos,e);return this.pos=e,t},readPackedVarint:function(e,t){if(this.type!==ye.Bytes)return e.push(this.readVarint(t));var n=At(this);for(e=e||[];this.pos127;);else if(t===ye.Bytes)this.pos=this.readVarint()+this.pos;else if(t===ye.Fixed32)this.pos+=4;else if(t===ye.Fixed64)this.pos+=8;else throw new Error("Unimplemented type: "+t)},writeTag:function(e,t){this.writeVarint(e<<3|t)},realloc:function(e){for(var t=this.length||16;t268435455||e<0){tv(e,this);return}this.realloc(4),this.buf[this.pos++]=e&127|(e>127?128:0),!(e<=127)&&(this.buf[this.pos++]=(e>>>=7)&127|(e>127?128:0),!(e<=127)&&(this.buf[this.pos++]=(e>>>=7)&127|(e>127?128:0),!(e<=127)&&(this.buf[this.pos++]=e>>>7&127)))},writeSVarint:function(e){this.writeVarint(e<0?-e*2-1:e*2)},writeBoolean:function(e){this.writeVarint(Boolean(e))},writeString:function(e){e=String(e),this.realloc(e.length*4),this.pos++;var t=this.pos;this.pos=vv(this.buf,e,this.pos);var n=this.pos-t;n>=128&&ea(t,n,this),this.pos=t-1,this.writeVarint(n),this.pos+=n},writeFloat:function(e){this.realloc(4),sr.write(this.buf,e,this.pos,!0,23,4),this.pos+=4},writeDouble:function(e){this.realloc(8),sr.write(this.buf,e,this.pos,!0,52,8),this.pos+=8},writeBytes:function(e){var t=e.length;this.writeVarint(t),this.realloc(t);for(var n=0;n=128&&ea(n,r,this),this.pos=n-1,this.writeVarint(r),this.pos+=r},writeMessage:function(e,t,n){this.writeTag(e,ye.Bytes),this.writeRawMessage(t,n)},writePackedVarint:function(e,t){t.length&&this.writeMessage(e,iv,t)},writePackedSVarint:function(e,t){t.length&&this.writeMessage(e,ov,t)},writePackedBoolean:function(e,t){t.length&&this.writeMessage(e,lv,t)},writePackedFloat:function(e,t){t.length&&this.writeMessage(e,sv,t)},writePackedDouble:function(e,t){t.length&&this.writeMessage(e,av,t)},writePackedFixed32:function(e,t){t.length&&this.writeMessage(e,uv,t)},writePackedSFixed32:function(e,t){t.length&&this.writeMessage(e,fv,t)},writePackedFixed64:function(e,t){t.length&&this.writeMessage(e,cv,t)},writePackedSFixed64:function(e,t){t.length&&this.writeMessage(e,dv,t)},writeBytesField:function(e,t){this.writeTag(e,ye.Bytes),this.writeBytes(t)},writeFixed32Field:function(e,t){this.writeTag(e,ye.Fixed32),this.writeFixed32(t)},writeSFixed32Field:function(e,t){this.writeTag(e,ye.Fixed32),this.writeSFixed32(t)},writeFixed64Field:function(e,t){this.writeTag(e,ye.Fixed64),this.writeFixed64(t)},writeSFixed64Field:function(e,t){this.writeTag(e,ye.Fixed64),this.writeSFixed64(t)},writeVarintField:function(e,t){this.writeTag(e,ye.Varint),this.writeVarint(t)},writeSVarintField:function(e,t){this.writeTag(e,ye.Varint),this.writeSVarint(t)},writeStringField:function(e,t){this.writeTag(e,ye.Bytes),this.writeString(t)},writeFloatField:function(e,t){this.writeTag(e,ye.Fixed32),this.writeFloat(t)},writeDoubleField:function(e,t){this.writeTag(e,ye.Fixed64),this.writeDouble(t)},writeBooleanField:function(e,t){this.writeVarintField(e,Boolean(t))}};function ev(e,t,n){var r=n.buf,i,o;if(o=r[n.pos++],i=(o&112)>>4,o<128||(o=r[n.pos++],i|=(o&127)<<3,o<128)||(o=r[n.pos++],i|=(o&127)<<10,o<128)||(o=r[n.pos++],i|=(o&127)<<17,o<128)||(o=r[n.pos++],i|=(o&127)<<24,o<128)||(o=r[n.pos++],i|=(o&1)<<31,o<128))return tn(e,i,t);throw new Error("Expected varint not more than 10 bytes")}function At(e){return e.type===ye.Bytes?e.readVarint()+e.pos:e.pos+1}function tn(e,t,n){return n?t*4294967296+(e>>>0):(t>>>0)*4294967296+(e>>>0)}function tv(e,t){var n,r;if(e>=0?(n=e%4294967296|0,r=e/4294967296|0):(n=~(-e%4294967296),r=~(-e/4294967296),n^4294967295?n=n+1|0:(n=0,r=r+1|0)),e>=18446744073709552e3||e<-18446744073709552e3)throw new Error("Given varint doesn't fit into 10 bytes");t.realloc(10),nv(n,r,t),rv(r,t)}function nv(e,t,n){n.buf[n.pos++]=e&127|128,e>>>=7,n.buf[n.pos++]=e&127|128,e>>>=7,n.buf[n.pos++]=e&127|128,e>>>=7,n.buf[n.pos++]=e&127|128,e>>>=7,n.buf[n.pos]=e&127}function rv(e,t){var n=(e&7)<<4;t.buf[t.pos++]|=n|((e>>>=3)?128:0),e&&(t.buf[t.pos++]=e&127|((e>>>=7)?128:0),e&&(t.buf[t.pos++]=e&127|((e>>>=7)?128:0),e&&(t.buf[t.pos++]=e&127|((e>>>=7)?128:0),e&&(t.buf[t.pos++]=e&127|((e>>>=7)?128:0),e&&(t.buf[t.pos++]=e&127)))))}function ea(e,t,n){var r=t<=16383?1:t<=2097151?2:t<=268435455?3:Math.floor(Math.log(t)/(Math.LN2*7));n.realloc(r);for(var i=n.pos-1;i>=e;i--)n.buf[i+r]=n.buf[i]}function iv(e,t){for(var n=0;n>>8,e[n+2]=t>>>16,e[n+3]=t>>>24}function ta(e,t){return(e[t]|e[t+1]<<8|e[t+2]<<16)+(e[t+3]<<24)}function hv(e,t,n){for(var r="",i=t;i239?4:o>223?3:o>191?2:1;if(i+a>n)break;var l,u,f;a===1?o<128&&(s=o):a===2?(l=e[i+1],(l&192)===128&&(s=(o&31)<<6|l&63,s<=127&&(s=null))):a===3?(l=e[i+1],u=e[i+2],(l&192)===128&&(u&192)===128&&(s=(o&15)<<12|(l&63)<<6|u&63,(s<=2047||s>=55296&&s<=57343)&&(s=null))):a===4&&(l=e[i+1],u=e[i+2],f=e[i+3],(l&192)===128&&(u&192)===128&&(f&192)===128&&(s=(o&15)<<18|(l&63)<<12|(u&63)<<6|f&63,(s<=65535||s>=1114112)&&(s=null))),s===null?(s=65533,a=1):s>65535&&(s-=65536,r+=String.fromCharCode(s>>>10&1023|55296),s=56320|s&1023),r+=String.fromCharCode(s),i+=a}return r}function pv(e,t,n){return Hl.decode(e.subarray(t,n))}function vv(e,t,n){for(var r=0,i,o;r55295&&i<57344)if(o)if(i<56320){e[n++]=239,e[n++]=191,e[n++]=189,o=i;continue}else i=o-55296<<10|i-56320|65536,o=null;else{i>56319||r+1===t.length?(e[n++]=239,e[n++]=191,e[n++]=189):o=i;continue}else o&&(e[n++]=239,e[n++]=191,e[n++]=189,o=null);i<128?e[n++]=i:(i<2048?e[n++]=i>>6|192:(i<65536?e[n++]=i>>12|224:(e[n++]=i>>18|240,e[n++]=i>>12&63|128),e[n++]=i>>6&63|128),e[n++]=i&63|128)}return n}const De={};De.read=function(e,t){return e.readFields(De._readField,{version:0,name:"",date:"",id:"",nodes:[],ways:[]},t)};De._readField=function(e,t,n){e===1?t.version=n.readVarint():e===2?t.name=n.readString():e===3?t.date=n.readString():e===4?t.id=n.readString():e===5?t.nodes.push(De.node.read(n,n.readVarint()+n.pos)):e===6&&t.ways.push(De.way.read(n,n.readVarint()+n.pos))};De.write=function(e,t){if(e.version&&t.writeVarintField(1,e.version),e.name&&t.writeStringField(2,e.name),e.date&&t.writeStringField(3,e.date),e.id&&t.writeStringField(4,e.id),e.nodes)for(var n=0;n{this.loading=null,this.hideInput=t&&t.length,this.boxInTheMiddle?(this.boxInTheMiddle=!1,setTimeout(()=>{this.suggestionsLoaded=!0,this.suggestions=t},50)):(this.suggestionsLoaded=!0,this.suggestions=t)})},getBugReportURL(e){let t=encodeURIComponent("OSM Error"),n="";return e&&(n="Hello, an error occurred on the website:\n\n```\n"+e.toString()+"\n```\n\n Can you please help?"),`https://github.com/anvaka/city-roads/issues/new?title=${t}&body=${encodeURIComponent(n)}`},updateProgress(e){if(this.stillLoading=0,clearInterval(this.notifyStillLoading),e.loaded<0){this.loading="Trying a different server",this.restartLoadingMonitor();return}e.percent!==void 0?this.loading="Loaded "+Math.round(100*e.percent)+"% ("+ra(e.loaded)+" bytes)...":this.loading="Loaded "+ra(e.loaded)+" bytes..."},retry(){this.lastSuggestion&&this.pickSuggestion(this.lastSuggestion)},pickSuggestion(e){this.lastSuggestion=e,this.error=!1,Ve.isCacheEnabled()&&e.areaId?this.checkCache(e).catch(t=>{if(!t.cancelled)return this.useOSM(e)}):this.useOSM(e)},restartLoadingMonitor(){clearInterval(this.notifyStillLoading),this.stillLoading=0,this.notifyStillLoading=setInterval(()=>{this.stillLoading++},1e4)},checkCache(e){this.loading="Checking cache...";let t=e.areaId;return Xr(Pt.areaServer+"/"+t+".pbf",{progress:this.generateNewProgressToken(),responseType:"arraybuffer"}).then(n=>{var r=new Uint8Array(n);return r}).then(n=>{var r=new Qp(n),i=De.read(r);let o=Un.fromPBF(i);this.$emit("loaded",o)})},useOSM(e){this.loading="Connecting to OpenStreetMap...",this.restartLoadingMonitor(),ct.runFromOptions(new Qr({wayFilter:ct.Road,areaId:e.areaId,bbox:e.bbox}),this.generateNewProgressToken()).then(t=>{this.loading=null,t.hasRoads()?(t.setName(e.name),t.setId(e.areaId||e.osm_id),t.setIsArea(e.areaId),t.setBBox(mv(e.bbox)),this.$emit("loaded",t)):this.noRoads=!0}).catch(t=>{if(t.cancelled){this.loading=null;return}console.error(t),this.error=t,this.loading=null,this.suggestions=[]}).finally(()=>{clearInterval(this.notifyStillLoading),this.stillLoading=0})},cancelRequest(){this.progressToken&&(this.progressToken.cancel(),this.progressToken=null,this.loading=!1)},generateNewProgressToken(){return this.progressToken&&(this.progressToken.cancel(),this.progressToken=null),this.progressToken=new Kr(this.updateProgress),this.progressToken}}};function mv(e){return e&&e.join(",")}function ra(e){return Number.isFinite(e)?e.toString().replace(/\B(?=(\d{3})+(?!\d))/g,","):"N/A"}function ia(e){let t=yv();if(t)return{name:e,areaId:t};let n=wv();if(n)return{name:e,osm_id:n.osm_id,bbox:n.bbox}}function yv(){let e=Ve.get("areaId");return Number.isFinite(Number.parseInt(e,10))||(e=null),e}function wv(){let e=Ve.get("osm_id");if(!Number.isFinite(Number.parseInt(e,10)))return;let t=bv(Ve.get("bbox"));if(!!t)return{osm_id:e,bbox:t}}function bv(e){if(!e)return null;let t=e.split(",").map(n=>Number.parseFloat(n)).filter(n=>Number.isFinite(n));return t.length===4?t:null}const xv={key:0},_v=G("h3",{class:"site-header"},"city roads",-1),Ev=G("p",{class:"description"},"This website renders every single road within a city",-1),Cv=[_v,Ev],Av={key:1,class:"prompt message note shadow"},Tv={key:2,class:"results"},Sv={key:0,class:"suggestions shadow"},Mv=G("div",{class:"prompt message"},[G("div",null,"Select boundaries below to download all roads within"),G("div",{class:"note"},"large cities may require 200MB+ of data transfer and a powerful device")],-1),Pv=["onClick"],Fv={key:1,class:"no-results message shadow"},Lv={key:2,class:"no-results message shadow"},kv={key:3,class:"error message shadow"},Rv=Ie("Sorry, we were not able to download data from the OpenStreetMap. It could be very busy at the moment processing other requests. "),Bv=G("br",null,null,-1),Iv=G("br",null,null,-1),Dv=Ie(" Please bookmark this website and "),Ov=Ie(" later?"),Nv={class:"error-links"},Vv=G("a",{href:"https://twitter.com/anvaka/status/1218971717734789120",title:"see what it supposed to do",target:"_blank"},"see how it should have worked",-1),Uv=["href","title"],zv={key:4,class:"loading message shadow"},Hv={key:0,class:"load-padding"},$v={key:1,class:"load-padding"};function jv(e,t,n,r,i,o){const s=pt("loading-icon");return se(),fe("div",{class:Qt(["find-place",{centered:i.boxInTheMiddle}])},[i.boxInTheMiddle?(se(),fe("div",xv,Cv)):Te("",!0),G("form",{onSubmit:t[2]||(t[2]=_t((...a)=>o.onSubmit&&o.onSubmit(...a),["prevent"])),class:"search-box"},[Bn(G("input",{class:"query-input","onUpdate:modelValue":t[0]||(t[0]=a=>i.enteredInput=a),type:"text",placeholder:"Enter a city name to start",ref:"input"},null,512),[[al,i.enteredInput]]),i.enteredInput&&!i.hideInput?(se(),fe("a",{key:0,type:"submit",class:"search-submit",href:"#",onClick:t[1]||(t[1]=_t((...a)=>o.onSubmit&&o.onSubmit(...a),["prevent"]))},Ot(i.mainActionText),1)):Te("",!0)],32),i.showWarning?(se(),fe("div",Av," Note: Large cities may require 200MB+ of data transfer and may need a powerful device to render. ")):Te("",!0),i.loading?Te("",!0):(se(),fe("div",Tv,[i.suggestionsLoaded&&i.suggestions.length?(se(),fe("div",Sv,[Mv,G("ul",null,[(se(!0),fe(Ge,null,mo(i.suggestions,(a,l)=>(se(),fe("li",{key:l},[G("a",{onClick:_t(u=>o.pickSuggestion(a),["prevent"]),class:"suggestion",href:"#"},[G("span",null,[Ie(Ot(a.name)+" ",1),G("small",null,"("+Ot(a.type)+")",1)])],8,Pv)]))),128))])])):Te("",!0),i.suggestionsLoaded&&!i.suggestions.length&&!i.loading&&!i.error?(se(),fe("div",Fv," Didn't find matching cities. Try a different query? ")):Te("",!0),i.noRoads?(se(),fe("div",Lv," Didn't find any roads. Try a different query? ")):Te("",!0)])),i.error?(se(),fe("div",kv,[G("div",null,[Rv,Bv,Iv,Dv,G("a",{href:"#",onClick:t[3]||(t[3]=_t((...a)=>o.retry&&o.retry(...a),["prevent"]))},"try again"),Ov]),G("div",Nv,[Vv,G("a",{href:o.getBugReportURL(i.error),title:"report error: "+i.error,target:"_blank"},"report this bug",8,Uv)])])):Te("",!0),i.loading?(se(),fe("div",zv,[Se(s),G("span",null,Ot(i.loading),1),G("a",{href:"#",onClick:t[4]||(t[4]=_t((...a)=>o.cancelRequest&&o.cancelRequest(...a),["prevent"])),class:"cancel-request"},"cancel"),i.stillLoading>0?(se(),fe("div",Hv," Still loading... ")):Te("",!0),i.stillLoading>1?(se(),fe("div",$v," Sorry it takes so long! ")):Te("",!0)])):Te("",!0)],2)}var Wv=ut(gv,[["render",jv]]);const an=[],Tt="@@clickoutsideContext";let Jr,qv=0;document.addEventListener("mousedown",e=>Jr=e,!0);document.addEventListener("mouseup",e=>{an.forEach(t=>t[Tt].documentHandler(e,Jr))},!0);document.addEventListener("touchstart",e=>{Jr=e},!0);document.addEventListener("touchend",e=>{an.forEach(t=>t[Tt].documentHandler(e,Jr))},!0);function oa(e,t,n){return function(r={},i={}){if(!n||!r.target||!i.target||e.contains(r.target)||e.contains(i.target)||e===r.target)return;const o=e[Tt].handler;o&&o()}}var $l={created(e,t,n){an.push(e);const r=qv++;e[Tt]={id:r,documentHandler:oa(e,t,n),handler:t.value}},updated(e,t,n){e[Tt].documentHandler=oa(e,t,n),e[Tt].handler=t.value},unmounted(e){let t=an.length;for(let n=0;ne.$emit("update:modelValue",a.target.value)),ref:"input"},null,40,Xv)])])),[[s,o.looseFocus]])}var Qv=ut(Gv,[["render",Zv]]);function yi(e={},t=0){const n=e&&e.a;let r;e&&e.hsl?r=He(e.hsl):e&&e.hex&&e.hex.length>0?r=He(e.hex):e&&e.hsv?r=He(e.hsv):e&&e.rgba?r=He(e.rgba):e&&e.rgb?r=He(e.rgb):r=He(e),r&&(r._a===void 0||r._a===null)&&r.setAlpha(n||1);const i=r.toHsl(),o=r.toHsv();return i.s===0&&(o.h=i.h=e.h||e.hsl&&e.hsl.h||t||0),{hsl:i,hex:r.toHexString().toUpperCase(),hex8:r.toHex8String().toUpperCase(),rgba:r.toRgb(),hsv:o,oldHue:e.h||t||i.h,source:e.source,a:e.a||r.getAlpha()}}var Jv={props:["modelValue"],data(){return{val:yi(this.modelValue)}},computed:{colors:{get(){return this.val},set(e){this.val=e,this.$emit("update:modelValue",e)}}},watch:{modelValue(e){this.val=yi(e)}},methods:{colorChange(e,t){this.oldHue=this.colors.hsl.h,this.colors=yi(e,t||this.oldHue)},isValidHex(e){return He(e).isValid()},simpleCheckForValidColor(e){const t=["r","g","b","a","h","s","l","v"];let n=0,r=0;for(let i=0;it.toUpperCase())},isTransparent(e){return He(e).getAlpha()===0}}};const e0={name:"editableInput",props:{label:String,labelText:String,desc:String,modelValue:[String,Number],max:Number,min:Number,arrowOffset:{type:Number,default:1}},computed:{val:{get(){return this.modelValue},set(e){if(this.max!==void 0&&+e>this.max)this.$refs.input.value=this.max;else return e}},labelId(){return`input__label__${this.label}__${Math.random().toString().slice(2,5)}`},labelSpanText(){return this.labelText||this.label}},methods:{update(e){this.handleChange(e.target.value)},handleChange(e){const t={};t[this.label]=e,t.hex===void 0&&t["#"]===void 0?this.$emit("change",t):e.length>5&&this.$emit("change",t)},handleKeyDown(e){let t=this.val;const n=Number(t);if(n){const r=this.arrowOffset||1;e.keyCode===38&&(t=n+r,this.handleChange(t),e.preventDefault()),e.keyCode===40&&(t=n-r,this.handleChange(t),e.preventDefault())}}}},t0={class:"vc-editable-input"},n0=["aria-labelledby"],r0=["for","id"],i0={class:"vc-input__desc"};function o0(e,t,n,r,i,o){return se(),fe("div",t0,[Bn(G("input",{"aria-labelledby":o.labelId,class:"vc-input__input","onUpdate:modelValue":t[0]||(t[0]=s=>o.val=s),onKeydown:t[1]||(t[1]=(...s)=>o.handleKeyDown&&o.handleKeyDown(...s)),onInput:t[2]||(t[2]=(...s)=>o.update&&o.update(...s)),ref:"input"},null,40,n0),[[al,o.val]]),G("span",{for:n.label,class:"vc-input__label",id:o.labelId},Ot(o.labelSpanText),9,r0),G("span",i0,Ot(n.desc),1)])}var s0=ut(e0,[["render",o0]]);const a0={name:"Saturation",props:{modelValue:Object},computed:{colors(){return this.modelValue},bgColor(){return`hsl(${this.colors.hsv.h}, 100%, 50%)`},pointerTop(){return-(this.colors.hsv.v*100)+1+100+"%"},pointerLeft(){return this.colors.hsv.s*100+"%"}},methods:{throttle:l0((e,t)=>{e(t)},20),handleChange(e,t){!t&&e.preventDefault();const n=this.$refs.container;if(!n)return;const r=n.clientWidth,i=n.clientHeight,o=n.getBoundingClientRect().left+window.pageXOffset,s=n.getBoundingClientRect().top+window.pageYOffset,a=e.pageX||(e.touches?e.touches[0].pageX:0),l=e.pageY||(e.touches?e.touches[0].pageY:0),u=wi(a-o,0,r),f=wi(l-s,0,i),d=u/r,h=wi(-(f/i)+1,0,1);this.throttle(this.onChange,{h:this.colors.hsv.h,s:d,v:h,a:this.colors.hsv.a,source:"hsva"})},onChange(e){this.$emit("change",e)},handleMouseDown(e){window.addEventListener("mousemove",this.handleChange),window.addEventListener("mouseup",this.handleChange),window.addEventListener("mouseup",this.handleMouseUp)},handleMouseUp(e){this.unbindEventListeners()},unbindEventListeners(){window.removeEventListener("mousemove",this.handleChange),window.removeEventListener("mouseup",this.handleChange),window.removeEventListener("mouseup",this.handleMouseUp)}}};function wi(e,t,n){return tn?n:e:et?t:e}function l0(e,t){var n=0;return function(...r){var i=new Date;i-n>=t&&(e(...r),n=i)}}const u0=G("div",{class:"vc-saturation--white"},null,-1),f0=G("div",{class:"vc-saturation--black"},null,-1),c0=G("div",{class:"vc-saturation-circle"},null,-1),d0=[c0];function h0(e,t,n,r,i,o){return se(),fe("div",{class:"vc-saturation",style:je({background:o.bgColor}),ref:"container",onMousedown:t[0]||(t[0]=(...s)=>o.handleMouseDown&&o.handleMouseDown(...s)),onTouchmove:t[1]||(t[1]=(...s)=>o.handleChange&&o.handleChange(...s)),onTouchstart:t[2]||(t[2]=(...s)=>o.handleChange&&o.handleChange(...s))},[u0,f0,G("div",{class:"vc-saturation-pointer",style:je({top:o.pointerTop,left:o.pointerLeft})},d0,4)],36)}var p0=ut(a0,[["render",h0]]);const v0={name:"Hue",props:{modelValue:Object,direction:{type:String,default:"horizontal"}},data(){return{oldHue:0,pullDirection:""}},computed:{colors(){const e=this.modelValue.hsl.h;return e!==0&&e-this.oldHue>0&&(this.pullDirection="right"),e!==0&&e-this.oldHue<0&&(this.pullDirection="left"),this.oldHue=e,this.modelValue},directionClass(){return{"vc-hue--horizontal":this.direction==="horizontal","vc-hue--vertical":this.direction==="vertical"}},pointerTop(){return this.direction==="vertical"?this.colors.hsl.h===0&&this.pullDirection==="right"?0:-(this.colors.hsl.h*100/360)+100+"%":0},pointerLeft(){return this.direction==="vertical"?0:this.colors.hsl.h===0&&this.pullDirection==="right"?"100%":this.colors.hsl.h*100/360+"%"}},methods:{handleChange(e,t){!t&&e.preventDefault();const n=this.$refs.container;if(!n)return;const r=n.clientWidth,i=n.clientHeight,o=n.getBoundingClientRect().left+window.pageXOffset,s=n.getBoundingClientRect().top+window.pageYOffset,a=e.pageX||(e.touches?e.touches[0].pageX:0),l=e.pageY||(e.touches?e.touches[0].pageY:0),u=a-o,f=l-s;let d,h;this.direction==="vertical"?(f<0?d=360:f>i?d=0:(h=-(f*100/i)+100,d=360*h/100),this.colors.hsl.h!==d&&this.$emit("change",{h:d,s:this.colors.hsl.s,l:this.colors.hsl.l,a:this.colors.hsl.a,source:"hsl"})):(u<0?d=0:u>r?d=360:(h=u*100/r,d=360*h/100),this.colors.hsl.h!==d&&this.$emit("change",{h:d,s:this.colors.hsl.s,l:this.colors.hsl.l,a:this.colors.hsl.a,source:"hsl"}))},handleMouseDown(e){this.handleChange(e,!0),window.addEventListener("mousemove",this.handleChange),window.addEventListener("mouseup",this.handleMouseUp)},handleMouseUp(e){this.unbindEventListeners()},unbindEventListeners(){window.removeEventListener("mousemove",this.handleChange),window.removeEventListener("mouseup",this.handleMouseUp)}}},g0=["aria-valuenow"],m0=G("div",{class:"vc-hue-picker"},null,-1),y0=[m0];function w0(e,t,n,r,i,o){return se(),fe("div",{class:Qt(["vc-hue",o.directionClass])},[G("div",{class:"vc-hue-container",role:"slider","aria-valuenow":o.colors.hsl.h,"aria-valuemin":"0","aria-valuemax":"360",ref:"container",onMousedown:t[0]||(t[0]=(...s)=>o.handleMouseDown&&o.handleMouseDown(...s)),onTouchmove:t[1]||(t[1]=(...s)=>o.handleChange&&o.handleChange(...s)),onTouchstart:t[2]||(t[2]=(...s)=>o.handleChange&&o.handleChange(...s))},[G("div",{class:"vc-hue-pointer",style:je({top:o.pointerTop,left:o.pointerLeft}),role:"presentation"},y0,4)],40,g0)],2)}var b0=ut(v0,[["render",w0]]);const bi={},x0={name:"Checkboard",props:{size:{type:[Number,String],default:8},white:{type:String,default:"#fff"},grey:{type:String,default:"#e6e6e6"}},computed:{bgStyle(){return{"background-image":"url("+E0(this.white,this.grey,this.size)+")"}}}};function _0(e,t,n){if(typeof document=="undefined")return null;const r=document.createElement("canvas");r.width=r.height=n*2;const i=r.getContext("2d");return i?(i.fillStyle=e,i.fillRect(0,0,r.width,r.height),i.fillStyle=t,i.fillRect(0,0,n,n),i.translate(n,n),i.fillRect(0,0,n,n),r.toDataURL()):null}function E0(e,t,n){const r=e+","+t+","+n;if(bi[r])return bi[r];{const i=_0(e,t,n);return bi[r]=i,i}}function C0(e,t,n,r,i,o){return se(),fe("div",{class:"vc-checkerboard",style:je(o.bgStyle)},null,4)}var jl=ut(x0,[["render",C0]]);const A0={name:"Alpha",props:{modelValue:Object,onChange:Function},components:{checkboard:jl},computed:{colors(){return this.modelValue},gradientColor(){const e=this.colors.rgba,t=[e.r,e.g,e.b].join(",");return"linear-gradient(to right, rgba("+t+", 0) 0%, rgba("+t+", 1) 100%)"}},methods:{handleChange(e,t){!t&&e.preventDefault();const n=this.$refs.container;if(!n)return;const r=n.clientWidth,i=n.getBoundingClientRect().left+window.pageXOffset,s=(e.pageX||(e.touches?e.touches[0].pageX:0))-i;let a;s<0?a=0:s>r?a=1:a=Math.round(s*100/r)/100,this.colors.a!==a&&this.$emit("change",{h:this.colors.hsl.h,s:this.colors.hsl.s,l:this.colors.hsl.l,a,source:"rgba"})},handleMouseDown(e){this.handleChange(e,!0),window.addEventListener("mousemove",this.handleChange),window.addEventListener("mouseup",this.handleMouseUp)},handleMouseUp(){this.unbindEventListeners()},unbindEventListeners(){window.removeEventListener("mousemove",this.handleChange),window.removeEventListener("mouseup",this.handleMouseUp)}}},T0={class:"vc-alpha"},S0={class:"vc-alpha-checkboard-wrap"},M0=G("div",{class:"vc-alpha-picker"},null,-1),P0=[M0];function F0(e,t,n,r,i,o){const s=pt("checkboard");return se(),fe("div",T0,[G("div",S0,[Se(s)]),G("div",{class:"vc-alpha-gradient",style:je({background:o.gradientColor})},null,4),G("div",{class:"vc-alpha-container",ref:"container",onMousedown:t[0]||(t[0]=(...a)=>o.handleMouseDown&&o.handleMouseDown(...a)),onTouchmove:t[1]||(t[1]=(...a)=>o.handleChange&&o.handleChange(...a)),onTouchstart:t[2]||(t[2]=(...a)=>o.handleChange&&o.handleChange(...a))},[G("div",{class:"vc-alpha-pointer",style:je({left:o.colors.a*100+"%"})},P0,4)],544)])}var L0=ut(A0,[["render",F0]]);const k0=["#D0021B","#F5A623","#F8E71C","#8B572A","#7ED321","#417505","#BD10E0","#9013FE","#4A90E2","#50E3C2","#B8E986","#000000","#4A4A4A","#9B9B9B","#FFFFFF","rgba(0,0,0,0)"],R0={name:"Sketch",mixins:[Jv],components:{saturation:p0,hue:b0,alpha:L0,"ed-in":s0,checkboard:jl},props:{presetColors:{type:Array,default(){return k0}},disableAlpha:{type:Boolean,default:!1},disableFields:{type:Boolean,default:!1}},computed:{hex(){let e;return this.colors.a<1?e=this.colors.hex8:e=this.colors.hex,e.replace("#","")},activeColor(){const e=this.colors.rgba;return"rgba("+[e.r,e.g,e.b,e.a].join(",")+")"}},methods:{handlePreset(e){this.colorChange({hex:e,source:"hex"})},childChange(e){this.colorChange(e)},inputChange(e){!e||(e.hex?this.isValidHex(e.hex)&&this.colorChange({hex:e.hex,source:"hex"}):(e.r||e.g||e.b||e.a)&&this.colorChange({r:e.r||this.colors.rgba.r,g:e.g||this.colors.rgba.g,b:e.b||this.colors.rgba.b,a:e.a||this.colors.rgba.a,source:"rgba"}))}}},B0={class:"vc-sketch-saturation-wrap"},I0={class:"vc-sketch-controls"},D0={class:"vc-sketch-sliders"},O0={class:"vc-sketch-hue-wrap"},N0={key:0,class:"vc-sketch-alpha-wrap"},V0={class:"vc-sketch-color-wrap"},U0=["aria-label"],z0={key:0,class:"vc-sketch-field"},H0={class:"vc-sketch-field--double"},$0={class:"vc-sketch-field--single"},j0={class:"vc-sketch-field--single"},W0={class:"vc-sketch-field--single"},q0={key:0,class:"vc-sketch-field--single"},G0={class:"vc-sketch-presets",role:"group","aria-label":"A color preset, pick one to set as current color"},Y0=["aria-label","onClick"],K0=["aria-label","onClick"];function X0(e,t,n,r,i,o){const s=pt("saturation"),a=pt("hue"),l=pt("alpha"),u=pt("checkboard"),f=pt("ed-in");return se(),fe("div",{role:"application","aria-label":"Sketch color picker",class:Qt(["vc-sketch",n.disableAlpha?"vc-sketch__disable-alpha":""])},[G("div",B0,[Se(s,{modelValue:e.colors,"onUpdate:modelValue":t[0]||(t[0]=d=>e.colors=d),onChange:o.childChange},null,8,["modelValue","onChange"])]),G("div",I0,[G("div",D0,[G("div",O0,[Se(a,{modelValue:e.colors,"onUpdate:modelValue":t[1]||(t[1]=d=>e.colors=d),onChange:o.childChange},null,8,["modelValue","onChange"])]),n.disableAlpha?Te("",!0):(se(),fe("div",N0,[Se(l,{modelValue:e.colors,"onUpdate:modelValue":t[2]||(t[2]=d=>e.colors=d),onChange:o.childChange},null,8,["modelValue","onChange"])]))]),G("div",V0,[G("div",{"aria-label":`Current color is ${o.activeColor}`,class:"vc-sketch-active-color",style:je({background:o.activeColor})},null,12,U0),Se(u)])]),n.disableFields?Te("",!0):(se(),fe("div",z0,[G("div",H0,[Se(f,{label:"hex",modelValue:o.hex,onChange:o.inputChange},null,8,["modelValue","onChange"])]),G("div",$0,[Se(f,{label:"r",modelValue:e.colors.rgba.r,onChange:o.inputChange},null,8,["modelValue","onChange"])]),G("div",j0,[Se(f,{label:"g",modelValue:e.colors.rgba.g,onChange:o.inputChange},null,8,["modelValue","onChange"])]),G("div",W0,[Se(f,{label:"b",modelValue:e.colors.rgba.b,onChange:o.inputChange},null,8,["modelValue","onChange"])]),n.disableAlpha?Te("",!0):(se(),fe("div",q0,[Se(f,{label:"a",modelValue:e.colors.a,"arrow-offset":.01,max:1,onChange:o.inputChange},null,8,["modelValue","arrow-offset","onChange"])]))])),G("div",G0,[(se(!0),fe(Ge,null,mo(n.presetColors,d=>(se(),fe(Ge,null,[e.isTransparent(d)?(se(),fe("div",{key:"else-"+d,"aria-label":"Color:"+d,class:"vc-sketch-presets-color",onClick:h=>o.handlePreset(d)},[Se(u)],8,K0)):(se(),fe("div",{class:"vc-sketch-presets-color","aria-label":"Color:"+d,key:"if-"+d,style:je({background:d}),onClick:h=>o.handlePreset(d)},null,12,Y0))],64))),256))])],2)}var Z0=ut(R0,[["render",X0]]);const Q0={name:"vue-colorpicker",components:{"sketch-picker":Z0},directives:{ClickOutside:$l},props:{modelValue:{type:Object}},emits:["update:modelValue","change"],data(){return{showPicker:!1,colors:{hex:"#FFFFFF",a:1},colorValue:"#FFFFFF",panelLeft:"0px",panelTop:"0px"}},computed:{pickerType(){return"sketch-picker"},isTransparent(){return this.colors.a===0},btnStyle(){if(this.isTransparent)return{background:"#eee",backgroundImage:"linear-gradient(45deg, rgba(0,0,0,.25) 25%, transparent 0, transparent 75%,rgba(0,0,0,.25)0), linear-gradient(45deg, rgba(0,0,0,.25)25%,transparent 0, transparent 75%,rgba(0,0,0,.25)0)",backgroundPosition:"0 0, 11px 11px",backgroundSize:"22px 22px"};let{r:e,g:t,b:n,a:r}=this.colorValue;return{background:`rgba(${e}, ${t}, ${n}, ${r})`}}},watch:{modelValue(e,t){e!==t&&this.updateColorObject(e)},showPicker(e){if(!e)return;const t=220,n=320;let r=this.$refs.triggerButton.getBoundingClientRect(),i=r.x,o=r.bottom;r.y+n>window.innerHeight&&(o=Math.max(0,window.innerHeight-n),i+=36),i+t>window.innerWidth&&(i=Math.max(0,window.innerWidth-t)),this.panelLeft=i+"px",this.panelTop=o+"px"}},methods:{hide(){this.showPicker=!1},changeColor(e){this.colorValue=e.rgba,this.$emit("update:modelValue",this.colorValue),this.$emit("change",this.colorValue)},updateColorObject(e){if(!e)return;const t=He(e);!e||e==="transparent"?this.colors={hex:"#FFFFFF",hsl:{h:0,s:0,l:1,a:0},hsv:{h:0,s:0,v:1,a:0},rgba:{r:255,g:255,b:255,a:0},a:0}:this.colors={hex:t.toHexString(),hsl:t.toHsl(),hsv:t.toHsv(),rgba:t.toRgb(),a:t.getAlpha()},this.colorValue=this.colors.rgba}},mounted(){this.updateColorObject(this.modelValue)}};function J0(e,t,n,r,i,o){const s=qa("click-outside");return Bn((se(),fe("div",{class:"vue-colorpicker",onClick:t[0]||(t[0]=a=>i.showPicker=!0)},[G("span",{class:"vue-colorpicker-btn",style:je(o.btnStyle),ref:"triggerButton"},null,4),Bn(G("div",{class:"vue-colorpicker-panel",style:je({left:i.panelLeft,top:i.panelTop})},[(se(),_r(Af(o.pickerType),{modelValue:i.colors,"onUpdate:modelValue":o.changeColor},null,8,["modelValue","onUpdate:modelValue"]))],4),[[Mc,i.showPicker]])])),[[s,o.hide]])}var eg=ut(Q0,[["render",J0],["__scopeId","data-v-01827dd4"]]),St=Fo({});let sa=0;class Wl{get color(){return this._color}set color(t){let n=He(t);this._color=n,this.lines&&(this.lines.color=aa(n.toRgb())),this.scene&&this.scene.renderFrame()}get lineWidth(){return this._lineWidth}set lineWidth(t){this._lineWidth=t,!(!this.lines||!this.scene)&&this.lines.setLineWidth(t)}constructor(){this._color=Pt.getDefaultLineColor(),this.grid=null,this.lines=null,this.scene=null,this.dx=0,this.dy=0,this.scale=1,this.hidden=!1,this.id="paths_"+sa,this._lineWidth=1,sa+=1}getGridProjector(){if(this.grid)return this.grid.projector}getQueryBounds(){const{grid:t}=this;if(t){if(t.queryBounds)return t.queryBounds;if(t.isArea)return{areaId:t.id}}}setGrid(t){this.grid=t,this.scene&&this.bindToScene(this.scene)}getViewBox(){if(!this.grid)return null;let{width:t,height:n}=this.grid.getProjectedRect(),r=Math.max(t,n)/4;return{left:-r,top:r,right:r,bottom:-r}}moveTo(t,n=0){console.warn("Please use moveBy() instead. The moveTo() is under construction")}moveBy(t,n=0){this.dx=t,this.dy=n,this._transferTransform()}buildLinesCollection(){if(this.lines)return this.lines;let t=this.grid,n=new Ln(t.wayPointCount,{width:this._lineWidth,allowColors:!1,is3D:!1});t.forEachWay(function(i,o){n.add({from:i,to:o})});let r=He(this._color).toRgb();n.color=aa(r),n.id=this.id,this.lines=n}destroy(){!this.scene||!this.lines||this.scene.removeChild(this.lines)}bindToScene(t){this.scene&&this.lines&&console.error("You seem to be adding this layer twice..."),this.scene=t,this.grid&&(this.buildLinesCollection(),!this.hidden&&this.scene.appendChild(this.lines))}hide(){this.hidden||(this.hidden=!0,!(!this.scene||!this.grid)&&this.scene.removeChild(this.lines))}show(){if(!!this.hidden){if(this.hidden=!1,!this.scene||!this.grid){console.log("Layer will be shown when grid is available");return}this.scene.appendChild(this.lines)}}_transferTransform(){!this.lines||(this.lines.translate([this.dx,this.dy,0]),this.lines.updateWorldTransform(!0),this.scene&&this.scene.renderFrame(!0))}}function aa(e){return{r:e.r/255,g:e.g/255,b:e.b/255,a:e.a}}function tg(e,t){const n=e.getRenderer(),r={open(){return``},close(){return o()}};return t.minLength&&(r.beforeWrite=s=>{let a=0;for(let l=1;lt.minLength)return!0;return a>t.minLength}),r.round=t.round,Tl(n,r);function o(){let s=n.getPixelRatio();return t.printable.map(a=>{if(a.element instanceof SVGSVGElement){let l=a.bounds;l.left*s,l.top*s;let u=a.element;u.setAttribute("x",l.left*s),u.setAttribute("y",l.top*s),u.setAttribute("width",l.width*s),u.setAttribute("height",l.height*s);let f=new XMLSerializer().serializeToString(a.element);return u.removeAttribute("x"),u.removeAttribute("y"),u.removeAttribute("width"),u.removeAttribute("height"),f}else{let l=a;if(!l.text)return;let u=l.text.replace(/&/g,"&").replace(//g,">"),f=l.bounds,d=(f.right-l.paddingRight)*s,h=(f.bottom-l.paddingBottom)*s,g=l.fontSize*s,y=l.fontFamily.replace(/"/g,"'");return`${u}`}}).filter(a=>a).join(` +`)}}function ng(e,t){t=t||{};let n=tg(e,{printable:Yl(),...t}),r=new Blob([n],{type:"image/svg+xml"}),i=window.URL.createObjectURL(r),o=Gl(t.name,".svg");setTimeout(()=>{let s=document.createElement("a");s.href=i,s.download=o,s.click(),Kl(i)},30)}function rg(e,t){t=t||{},ql(e).then(n=>{let r=Gl(t.name,".png");n.toBlob(function(i){let o=window.URL.createObjectURL(i),s=document.createElement("a");s.href=o,s.download=r,s.click(),Kl(o)},"image/png")})}function ql(e){let t=Qi(),n=t.width,r=t.height,i=document.createElement("canvas"),o=i.getContext("2d");return i.width=n,i.height=r,e.render(),o.drawImage(t,0,0,t.width,t.height,0,0,n,r),Promise.all(Yl().map(s=>og(s,o))).then(()=>i)}function Qi(){return document.querySelector("#canvas")}function Gl(e,t){return ig(e||new Date().toISOString())+(t||"")}function ig(e){return e?e.replace(/[#%&{}\\/?*><$!'":@+`|=]/g,"_"):""}function og(e,t){return e?new Promise((n,r)=>{let i=window.devicePixelRatio||1;if(e.element instanceof SVGSVGElement){let o=e.element,s=e.bounds,a=new Image;a.width=s.width*i,a.height=s.height*i,a.onload=()=>{t.drawImage(a,s.left*i,s.top*i,a.width,a.height),o.removeAttribute("width"),o.removeAttribute("height"),n()},o.setAttribute("width",a.width),o.setAttribute("height",a.height),a.src="data:image/svg+xml;base64,"+btoa(new XMLSerializer().serializeToString(o))}else t.save(),t.font=i*e.fontSize+"px "+e.fontFamily,t.fillStyle=e.color,t.textAlign="end",t.fillText(e.text,(e.bounds.right-e.paddingRight)*i,(e.bounds.bottom-e.paddingBottom)*i),t.restore(),n()}):Promise.resolve()}function Yl(){return Array.from(document.querySelectorAll(".printable")).map(e=>{let t=window.getComputedStyle(e),n=e.getBoundingClientRect(),r=Number.parseInt(t.fontSize,10),i=Number.parseInt(t.paddingRight,10),o=Number.parseInt(t.paddingBottom,10)*2;return{text:e.innerText,bounds:n,fontSize:r,paddingBottom:o,paddingRight:i,color:t.color,fontFamily:t.fontFamily,fill:t.color,element:e}})}function Kl(e){setTimeout(()=>{window.URL.revokeObjectURL(e)},45e3)}function sg(e){let t=Hi(e),n=Pt.getDefaultLineColor();t.on("transform",w),t.on("append-child",b),t.on("remove-child",S),t.setClearColor(247/255,242/255,232/255,1);let r=t.getCameraController();r.setMoveSpeed&&(r.setMoveSpeed(200),r.setRotationSpeed(Math.PI/500));let i=t.getGL();i.blendFuncSeparate(i.SRC_ALPHA,i.ONE_MINUS_SRC_ALPHA,i.ONE,i.ONE_MINUS_SRC_ALPHA);let o=!1,s=[],a=Pt.getBackgroundColor();C();let l={render(){t.renderFrame(!0)},clear(){s.forEach(m=>m.destroy()),s=[],t.clear()},queryLayerAll:f,queryLayer:d,getRenderer(){return t},getWGL(){return kh},version(){return"0.0.2"},dispose(){t.clear(),t.dispose(),l.fire("dispose",l),A()},set lineColor(m){s.forEach(x=>{x.color=m}),n=He(m),St.fire("line-color",n),l.fire("line-color",n)},get lineColor(){let m=d();return m&&m.color||n},set background(m){a=He(m);let x=a.toRgb();t.setClearColor(x.r/255,x.g/255,x.b/255,x.a),t.renderFrame(),St.fire("background-color",a),l.fire("background-color",a)},get background(){return a},add:h,load:u,saveToPNG:g,saveToSVG:y};return Fo(l);function u(m,x){let P=Qr.parse(l,m,x),L=new Wl;return L.id=P.place,ct.runFromOptions(P).then(B=>{B.setProjector(P.projector),L.setGrid(B)}).catch(B=>{console.error(`Could not execute: + ${m} + The error was:`),console.error(B),L.destroy()}),h(L),L}function f(m){return m?s.filter(x=>x.id===m):s}function d(m){let x=f(m);if(x)return x[0]}function h(m){if(!(s.indexOf(m)>-1)&&(m.bindToScene(t),s.push(m),s.length===1)){let x=m.getViewBox();x&&t.setViewBox(x)}}function g(m){return rg(l,{name:m})}function y(m,x){return ng(l,Object.assign({},{name:m},x))}function w(m){St.fire("scene-transform")}function b(m){l.fire("layer-added",m)}function S(m){l.fire("layer-removed",m)}function C(){document.addEventListener("keydown",E,!0),document.addEventListener("keyup",T,!0)}function A(){document.removeEventListener("keydown",E,!0),document.removeEventListener("keyup",T,!0)}function E(m){m.shiftKey&&(o=!0,r.setSpeed&&r.setSpeed(.1))}function T(m){!m.shiftKey&&o&&(r.setSpeed&&r.setSpeed(1),o=!1)}}let ag="https://edi6jgnosf.execute-api.us-west-2.amazonaws.com/Stage/put_image";const lg={mug:"168739066664861503"};function ug(e,t){const n=lg[e];if(!n)throw new Error("Unknown product kind: "+e);const r=encodeURIComponent(t);return`https://www.zazzle.com/api/create/at-238058511445368984?rf=238058511445368984&ax=Linkover&pd=${n}&ed=true&tc=&ic=&t_map_iid=${r}`}function fg(e){var t=e.toDataURL("image/png").replace(/^data:image\/(png|jpg);base64,/,"");const n=new FormData;return n.append("image",t),Xr(ag,{method:"POST",responseType:"json",progress:new Kr(Function.prototype),body:n}).then(r=>{if(!r.success)throw new Error("Failed to upload image");let i=r.data.link;return ug("mug",i)}).catch(r=>{throw console.log("error",r),r})}(function(e){var t=e.HTMLCanvasElement&&e.HTMLCanvasElement.prototype,n=e.Blob&&function(){try{return Boolean(new Blob)}catch{return!1}}(),r=n&&e.Uint8Array&&function(){try{return new Blob([new Uint8Array(100)]).size===100}catch{return!1}}(),i=e.BlobBuilder||e.WebKitBlobBuilder||e.MozBlobBuilder||e.MSBlobBuilder,o=/^data:((.*?)(;charset=.*?)?)(;base64)?,/,s=(n||i)&&e.atob&&e.ArrayBuffer&&e.Uint8Array&&function(a){var l,u,f,d,h,g,y,w,b;if(l=a.match(o),!l)throw new Error("invalid data URI");for(u=l[2]?l[1]:"text/plain"+(l[3]||";charset=US-ASCII"),f=!!l[4],d=a.slice(l[0].length),f?h=atob(d):h=decodeURIComponent(d),g=new ArrayBuffer(h.length),y=new Uint8Array(g),w=0;w1)return;let x=m.touches[0];u(x.clientX,x.clientY,m)}function a(m){if(m.changedTouches.length>1)return;let x=m.changedTouches[0];f(x.clientX,x.clientY)&&(m.preventDefault(),m.stopPropagation())}function l(m){if(m.touches.length>1)return;let x=m.touches[0];d(x.clientX,x.clientY),m.preventDefault(),m.stopPropagation()}function u(m,x,P){let L=w(m,x),B=document.querySelectorAll(".overlay-active");for(let H=0;H300?!1:Math.hypot(m-t.x,x-t.y)<40}function w(m,x){let P=document.querySelectorAll(".can-drag");for(let L=0;LP.right||xP.bottom)}function A(m){return m.getBoundingClientRect()}function E(m,x){m.style.pointerEvents="none",m.classList.add("can-drag"),x&&x.receiveFocus&&(m.receiveFocus=x.receiveFocus)}function T(){document.removeEventListener("mousedown",r),document.removeEventListener("mouseup",o),document.removeEventListener("touchstart",s),document.removeEventListener("touchend",a),document.removeEventListener("touchcancel",a),t.clickedElement=void 0,g()}}class xi{constructor(t,n,r){this.name=t,this.changeColor=r,this.color=n}}const dg={name:"App",components:{FindPlace:Wv,LoadingIcon:kl,EditableLabel:Qv,ColorPicker:eg},data(){return{placeFound:!1,name:"",zazzleLink:null,generatingPreview:!1,showSettings:!1,settingsOpen:!1,labelColor:Pt.getLabelColor().toRgb(),backgroundColor:Pt.getBackgroundColor().toRgb(),layers:[]}},computed:{labelColorRGBA(){return la(this.labelColor)}},created(){St.on("scene-transform",this.handleSceneTransform),St.on("background-color",this.syncBackground),St.on("line-color",this.syncLineColor),this.overlayManager=cg()},beforeUnmount(){debugger;this.overlayManager.dispose(),this.dispose(),St.off("scene-transform",this.handleSceneTransform),St.off("background-color",this.syncBackground),St.off("line-color",this.syncLineColor)},methods:{dispose(){this.scene&&(this.scene.dispose(),window.scene=null)},toggleSettings(){this.showSettings=!this.showSettings},handleSceneTransform(){this.zazzleLink=null},onGridLoaded(e){e.isArea?(Ve.set("areaId",e.id),Ve.unset("osm_id"),Ve.unset("bbox")):e.bboxString&&(Ve.unset("areaId"),Ve.set("osm_id",e.id),Ve.set("bbox",e.bboxString)),this.placeFound=!0,this.name=e.name.split(",")[0];let t=Qi();t.style.visibility="visible",this.scene=sg(t),this.scene.on("layer-added",this.updateLayers),this.scene.on("layer-removed",this.updateLayers),window.scene=this.scene;let n=new Wl;n.id="lines",n.setGrid(e),this.scene.add(n)},startOver(){Ve.unset("areaId"),Ve.unsetPlace(),Ve.unset("q"),Ve.enableCache(),this.dispose(),this.placeFound=!1,this.zazzleLink=null,this.showSettings=!1,this.backgroundColor=Pt.getBackgroundColor().toRgb(),this.labelColor=Pt.getLabelColor().toRgb(),document.body.style.backgroundColor=Pt.getBackgroundColor().toRgbString(),Qi().style.visibility="hidden"},toPNGFile(e){scene.saveToPNG(this.name)},toSVGFile(e){scene.saveToSVG(this.name)},updateLayers(){let e=[],t=0,n=this.scene.getRenderer();n.getRoot().children.forEach(o=>{if(!o.color)return;let s=o.id;s||(t+=1,s="lines "+t);let a=He.fromRatio(o.color);e.push(new xi(s,a,l=>{this.zazzleLink=null,o.color=i(l),n.renderFrame(),this.scene.fire("color-change",o)}))}),e.push(new xi("background",this.backgroundColor,this.setBackgroundColor),new xi("labels",this.labelColor,o=>this.labelColor=o)),this.layers=e;function i(o){return{r:o.r/255,g:o.g/255,b:o.b/255,a:o.a}}this.zazzleLink=null},syncLineColor(){this.updateLayers()},syncBackground(e){this.backgroundColor=e.toRgb(),this.updateLayers()},updateBackground(){this.setBackgroundColor(this.backgroundColor),this.zazzleLink=null},setBackgroundColor(e){this.scene.background=e,document.body.style.backgroundColor=la(e),this.zazzleLink=null},zazzleMugPrint(){if(this.zazzleLink){window.open(this.zazzleLink,"_blank"),ua(this.zazzleLink);return}this.generatingPreview=!0,ql(this.scene).then(e=>{fg(e).then(t=>{this.zazzleLink=t,window.open(t,"_blank"),ua(t),this.generatingPreview=!1}).catch(t=>{this.error=t,this.generatingPreview=!1})})}}};function la(e){return`rgba(${e.r}, ${e.g}, ${e.b}, ${e.a})`}function ua(e){typeof gtag!="undefined"&>ag("event","click",{event_category:"Outbound Link",event_label:e})}const hg={id:"app"},pg={key:0},vg={class:"controls"},gg={key:0,class:"print-window"},mg=G("h3",null,"Display",-1),yg={class:"row"},wg=G("div",{class:"col"},"Colors",-1),bg={class:"col colors c-2"},xg={class:"color-label"},_g=G("h3",null,"Export",-1),Eg={class:"row"},Cg=G("span",{class:"col c-2"},[Ie(" Print what you see onto a mug. "),G("br"),Ie("Get a unique gift of your favorite city. ")],-1),Ag={key:0,class:"preview-actions message"},Tg={key:0,class:"padded popup-help"},Sg=Ie(" If your browser has blocked the new window, "),Mg=G("br",null,null,-1),Pg=Ie("please "),Fg=["href"],Lg=Ie(" to open it. "),kg={key:1,class:"loading-container"},Rg=Ie(" Generating preview url... "),Bg={class:"row"},Ig=G("span",{class:"col c-2"}," Save the current screen as a raster image. ",-1),Dg={class:"row"},Og=G("span",{class:"col c-2"}," Save the current screen as a vector image. ",-1),Ng=G("h3",null,"About",-1),Vg=G("div",null,[G("p",null,[Ie("This website was created by "),G("a",{href:"https://twitter.com/anvaka",target:"_blank"},"@anvaka"),Ie(". It downloads roads from OpenStreetMap and renders them with WebGL. ")]),G("p",null,[Ie(" You can find the entire "),G("a",{href:"https://github.com/anvaka/city-roads"},"source code here"),Ie(". If you love this website you can also "),G("a",{href:"https://www.paypal.com/paypalme2/anvakos/3"},"buy me a coffee"),Ie(" or "),G("a",{href:"https://www.patreon.com/anvaka"},"support me on Patreon"),Ie(", but you don't have to. ")])],-1),Ug=Ie("data ");function zg(e,t,n,r,i,o){const s=pt("find-place"),a=pt("color-picker"),l=pt("loading-icon"),u=pt("editable-label");return se(),fe(Ge,null,[i.placeFound?Te("",!0):(se(),_r(s,{key:0,onLoaded:o.onGridLoaded},null,8,["onLoaded"])),G("div",hg,[i.placeFound?(se(),fe("div",pg,[G("div",vg,[G("a",{href:"#",class:"print-button",onClick:t[0]||(t[0]=_t((...f)=>o.toggleSettings&&o.toggleSettings(...f),["prevent"]))},"Customize..."),G("a",{href:"#",class:"try-another",onClick:t[1]||(t[1]=_t((...f)=>o.startOver&&o.startOver(...f),["prevent"]))},"Try another city")]),i.showSettings?(se(),fe("div",gg,[mg,G("div",yg,[wg,G("div",bg,[(se(!0),fe(Ge,null,mo(i.layers,f=>(se(),fe("div",{key:f.name,class:"color-container"},[Se(a,{modelValue:f.color,"onUpdate:modelValue":d=>f.color=d,onChange:f.changeColor},null,8,["modelValue","onUpdate:modelValue","onChange"]),G("div",xg,Ot(f.name),1)]))),128))])]),_g,G("div",Eg,[G("a",{href:"#",onClick:t[2]||(t[2]=_t(f=>o.zazzleMugPrint(),["prevent"])),class:"col"},"Onto a mug"),Cg]),i.zazzleLink||i.generatingPreview?(se(),fe("div",Ag,[i.zazzleLink?(se(),fe("div",Tg,[Sg,Mg,Pg,G("a",{href:i.zazzleLink,target:"_blank"},"click here",8,Fg),Lg])):Te("",!0),i.generatingPreview?(se(),fe("div",kg,[Se(l),Rg])):Te("",!0)])):Te("",!0),G("div",Bg,[G("a",{href:"#",onClick:t[3]||(t[3]=_t((...f)=>o.toPNGFile&&o.toPNGFile(...f),["prevent"])),class:"col"},"As an image (.png)"),Ig]),G("div",Dg,[G("a",{href:"#",onClick:t[4]||(t[4]=_t((...f)=>o.toSVGFile&&o.toSVGFile(...f),["prevent"])),class:"col"},"As a vector (.svg)"),Og]),Te("",!0),Ng,Vg])):Te("",!0)])):Te("",!0)]),i.placeFound?(se(),_r(u,{key:1,modelValue:i.name,"onUpdate:modelValue":t[6]||(t[6]=f=>i.name=f),class:"city-name",printable:!0,style:je({color:o.labelColorRGBA}),"overlay-manager":e.overlayManager},null,8,["modelValue","style","overlay-manager"])):Te("",!0),i.placeFound?(se(),fe("div",{key:2,class:"license printable can-drag",style:je({color:o.labelColorRGBA})},[Ug,G("a",{href:"https://www.openstreetmap.org/about/",target:"_blank",style:je({color:o.labelColorRGBA})},"\xA9 OpenStreetMap",4)],4)):Te("",!0)],64)}var Hg=ut(dg,[["render",zg]]);const $g={},jn=e=>(Ju("data-v-3325dbc3"),e=e(),ef(),e),jg={class:"absolute no-webgl"},Wg=jn(()=>G("h3",null,"WebGL is not enabled :(",-1)),qg=jn(()=>G("p",null,"This website renders millions of roads at once.",-1)),Gg=jn(()=>G("p",null,[Ie(" To render this amount of data fast, the website uses "),G("a",{href:"https://get.webgl.org/"},"WebGL"),Ie(", which seem to be not supported by the device that you are using. ")],-1)),Yg=jn(()=>G("p",null,"Please try a different device to play with this website",-1)),Kg=jn(()=>G("img",{src:"https://i.imgur.com/Fbbe5a6.png",alt:"demo"},null,-1)),Xg=[Wg,qg,Gg,Yg,Kg];function Zg(e,t){return se(),fe("div",jg,Xg)}var Qg=ut($g,[["render",Zg],["__scopeId","data-v-3325dbc3"]]);window.addEventListener("error",Jg);window.requireModule=Oc;window.Query=ct;Al(document.querySelector("#canvas"))?vs(Hg).mount("#host"):vs(Qg).mount("#host");function Jg(e){if(typeof gtag!="function")return;const t=e?`${e.message} in ${e.filename}:${e.lineno}`:"Unknown exception";gtag("send","exception",{description:t,fatal:!1})}});export default em(); diff --git a/app/dataviz/city-roads/assets/index.e4ff2fbf.css b/app/dataviz/city-roads/assets/index.e4ff2fbf.css new file mode 100644 index 00000000..d776a396 --- /dev/null +++ b/app/dataviz/city-roads/assets/index.e4ff2fbf.css @@ -0,0 +1 @@ +.find-place{width:442px}h3.site-header{margin:0;font-weight:400;font-size:32px;text-align:center}input{border:none;flex:1;font-family:Avenir,Helvetica,Arial,sans-serif;padding:0;color:#434343;height:100%;font-size:16px}input:focus{outline:none}.search-box{position:relative;background-color:#fff;padding:0 0 0 8px;box-shadow:0 2px 4px #0003,0 -1px #00000005;height:48px;display:flex;font-size:16px;cursor:text}.search-box a{cursor:pointer}.search-box span{display:flex;align-items:center;flex-shrink:0}.prompt{padding:4px;text-align:center;font-size:12px}.search-submit{padding:0 8px;align-items:center;text-decoration:none;display:flex;flex-shrink:0;justify-content:center;outline:none;z-index:1;color:#ff4081}.search-submit:hover{color:#fff;background:#ff4081}.suggestion{display:block;min-height:64px;align-items:center;border-bottom:1px solid #e9eaed;display:flex;padding:0 10px;text-decoration:none;color:#ff4081}.suggestions{position:relative;background:#fff}.suggestions .note{font-size:10px;font-style:italic}.suggestions ul{list-style-type:none;margin:0;padding:0;max-height:calc(100vh - 128px);overflow-y:auto;overflow-x:hidden}.message,.loading{padding:4px 8px;position:relative}.loading svg{margin-right:8px}.shadow{box-shadow:0 2px 4px #0003}.error{overflow-x:auto}.find-place{position:absolute;display:flex;flex-direction:column;top:8px;left:50%;transform:translate(-50%) translateY(0);transition-timing-function:ease-out;transition-property:top left transform;transition-duration:.2s}.find-place.centered{top:50%;left:50%;transform:translate(-50%) translateY(-143px)}.load-padding{padding-left:16px}.description{padding:8px;margin:0;text-align:center}.cancel-request{position:absolute;right:4px;top:4px;font-size:12px}.error-links{display:flex;justify-content:space-between;font-size:12px}@media (max-width: 450px){.find-place{width:100%}.find-place.centered{top:8px;left:0;transform:none}.message,.prompt{font-size:12px}.prompt .note{font-size:9px}}.editable-label{position:relative}.editable-label span{position:relative;top:0;left:0;display:flex;align-items:center;font-family:Roboto,sans-serif;white-space:pre;padding:8px;border:1px solid transparent}.editable-label input{caret-color:#212121;color:transparent;font-family:Roboto,sans-serif;background:transparent;display:flex;align-items:center;position:absolute;overflow:hidden;top:0;left:0;width:100%;padding:8px}.vc-editable-input{position:relative}.vc-input__input{padding:0;border:0;outline:none}.vc-input__label{text-transform:capitalize}.vc-saturation,.vc-saturation--white,.vc-saturation--black{cursor:pointer;position:absolute;top:0;left:0;right:0;bottom:0}.vc-saturation--white{background:linear-gradient(to right,#fff,rgba(255,255,255,0))}.vc-saturation--black{background:linear-gradient(to top,#000,rgba(0,0,0,0))}.vc-saturation-pointer{cursor:pointer;position:absolute}.vc-saturation-circle{cursor:head;width:4px;height:4px;box-shadow:0 0 0 1.5px #fff,inset 0 0 1px 1px #0000004d,0 0 1px 2px #0006;border-radius:50%;transform:translate(-2px,-2px)}.vc-hue{position:absolute;top:0px;right:0px;bottom:0px;left:0px;border-radius:2px}.vc-hue--horizontal{background:linear-gradient(to right,#f00 0%,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,#f00 100%)}.vc-hue--vertical{background:linear-gradient(to top,#f00 0%,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,#f00 100%)}.vc-hue-container{cursor:pointer;margin:0 2px;position:relative;height:100%}.vc-hue-pointer{z-index:2;position:absolute}.vc-hue-picker{cursor:pointer;margin-top:1px;width:4px;border-radius:1px;height:8px;box-shadow:0 0 2px #0009;background:#fff;transform:translate(-2px)}.vc-checkerboard{position:absolute;top:0px;right:0px;bottom:0px;left:0px;background-size:contain}.vc-alpha{position:absolute;top:0px;right:0px;bottom:0px;left:0px}.vc-alpha-checkboard-wrap{position:absolute;top:0px;right:0px;bottom:0px;left:0px;overflow:hidden}.vc-alpha-gradient{position:absolute;top:0px;right:0px;bottom:0px;left:0px}.vc-alpha-container{cursor:pointer;position:relative;z-index:2;height:100%;margin:0 3px}.vc-alpha-pointer{z-index:2;position:absolute}.vc-alpha-picker{cursor:pointer;width:4px;border-radius:1px;height:8px;box-shadow:0 0 2px #0009;background:#fff;margin-top:1px;transform:translate(-2px)}.vc-sketch{position:relative;width:200px;padding:10px 10px 0;box-sizing:initial;background:#fff;border-radius:4px;box-shadow:0 0 0 1px #00000026,0 8px 16px #00000026}.vc-sketch-saturation-wrap{width:100%;padding-bottom:75%;position:relative;overflow:hidden}.vc-sketch-controls{display:flex}.vc-sketch-sliders{padding:4px 0;flex:1}.vc-sketch-sliders .vc-hue,.vc-sketch-sliders .vc-alpha-gradient{border-radius:2px}.vc-sketch-hue-wrap{position:relative;height:10px}.vc-sketch-alpha-wrap{position:relative;height:10px;margin-top:4px;overflow:hidden}.vc-sketch-color-wrap{width:24px;height:24px;position:relative;margin-top:4px;margin-left:4px;border-radius:3px}.vc-sketch-active-color{position:absolute;top:0;left:0;right:0;bottom:0;border-radius:2px;box-shadow:inset 0 0 0 1px #00000026,inset 0 0 4px #00000040;z-index:2}.vc-sketch-color-wrap .vc-checkerboard{background-size:auto}.vc-sketch-field{display:flex;padding-top:4px}.vc-sketch-field .vc-input__input{width:90%;padding:4px 0 3px 10%;border:none;box-shadow:inset 0 0 0 1px #ccc;font-size:10px}.vc-sketch-field .vc-input__label{display:block;text-align:center;font-size:11px;color:#222;padding-top:3px;padding-bottom:4px;text-transform:capitalize}.vc-sketch-field--single{flex:1;padding-left:6px}.vc-sketch-field--double{flex:2}.vc-sketch-presets{margin-right:-10px;margin-left:-10px;padding-left:10px;padding-top:10px;border-top:1px solid #eee}.vc-sketch-presets-color{border-radius:3px;overflow:hidden;position:relative;display:inline-block;margin:0 10px 10px 0;vertical-align:top;cursor:pointer;width:16px;height:16px;box-shadow:inset 0 0 0 1px #00000026}.vc-sketch-presets-color .vc-checkerboard{box-shadow:inset 0 0 0 1px #00000026;border-radius:3px}.vc-sketch__disable-alpha .vc-sketch-color-wrap{height:10px}.vue-colorpicker[data-v-01827dd4]{display:inline-block;box-sizing:border-box;font-size:0;cursor:pointer}.vue-colorpicker-btn[data-v-01827dd4]{display:inline-block;width:30px;height:22px;border:1px solid #666;background:#fff}.vue-colorpicker .vue-colorpicker-panel[data-v-01827dd4]{position:absolute;z-index:1}#app{margin:8px;max-height:100vh;position:absolute;z-index:1}#app h3{font-weight:400}.can-drag{border:1px solid transparent}.drag-overlay{position:fixed;background:transparent;left:0;top:0;right:0;bottom:0}.overlay-active{border:1px dashed #ff4081}.overlay-active.exclusive{border-style:solid}.controls{height:48px;background:#fff;display:flex;flex-direction:row;align-items:stretch;width:442px;justify-content:space-around;box-shadow:0 2px 4px #0003,0 -1px #00000005}.controls a{text-decoration:none;display:flex;justify-content:center;align-items:center;color:#ff4081;margin:0;border:0}.controls a:hover{color:#fff;background:#ff4081}.controls a.try-another{flex:1}.controls a.print-button{flex:1;border-right:1px solid #e9eaed}.controls a.print-button:focus{border:1px dashed #ff4081}.col{display:flex;flex:1}.col select{margin-left:14px}.row{margin-top:4px;display:flex;flex-direction:row;min-height:32px}.colors{display:flex;flex-direction:row;flex-wrap:wrap}.colors .color-container{display:flex;flex-direction:column;align-items:center;width:64px}.colors .color-label{font-size:12px}a{border:1px solid transparent;margin:-1px;text-decoration:none;color:#ff4081}a:focus{border:1px dashed #ff4081;outline:none}.print-window{max-height:calc(100vh - 48px);overflow-y:auto;border-top:1px solid #e9eaed;background:#fff;box-shadow:0 2px 4px #0003;width:442px;padding:8px}.print-window .row a{margin-right:4px}.print-window h3{margin:8px 0;text-align:right}.message{border-top:1px solid #e9eaed;border-bottom:1px solid #e9eaed;background:#f5f5f5}.preview-actions{padding:8px 0;margin-left:-8px;margin-bottom:14px;margin-top:1px;width:442px;flex-direction:column;align-items:stretch;font-size:14px;align-items:center;display:flex}.preview-actions .popup-help{text-align:center}.city-name{position:absolute;right:32px;bottom:54px;font-size:24px;color:#434343}.city-name input{font-size:24px}.license{text-align:right;position:fixed;font-family:Roboto,sans-serif;right:32px;bottom:32px;font-size:12px;padding-right:8px}.license a{text-decoration:none;display:inline-block}.c-2{flex:2}@media (max-width: 450px){#app{width:100%;margin:0}#app .preview-actions,#app .error,#app .controls,#app .print-window{width:100%}#app .loading-container{font-size:12px}#app .print-window{font-size:14px}.city-name{right:8px;bottom:24px}.license{right:8px;bottom:8px}}.no-webgl[data-v-3325dbc3]{overflow-y:auto;display:flex;flex-direction:column;align-items:center;margin:20px auto;position:absolute;top:0;bottom:0;width:100%;height:100%;text-align:center;padding:8px}.no-webgl h3[data-v-3325dbc3]{font-weight:400;font-size:32px;margin:16px}.no-webgl p[data-v-3325dbc3]{max-width:400px;margin:8px 0}.no-webgl img[data-v-3325dbc3]{width:100%;max-width:1440px} diff --git a/app/dataviz/city-roads/index.html b/app/dataviz/city-roads/index.html new file mode 100644 index 00000000..2c5bab7c --- /dev/null +++ b/app/dataviz/city-roads/index.html @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + Draw all roads in a city at once + + + + + + + + + +
+ + + + + diff --git a/app/dataviz/mark-twain-portrait/.gitignore b/app/dataviz/mark-twain-portrait/.gitignore new file mode 100644 index 00000000..5148e527 --- /dev/null +++ b/app/dataviz/mark-twain-portrait/.gitignore @@ -0,0 +1,37 @@ +# Logs +logs +*.log +npm-debug.log* + +# Runtime data +pids +*.pid +*.seed + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (http://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules +jspm_packages + +# Optional npm cache directory +.npm + +# Optional REPL history +.node_repl_history diff --git a/app/dataviz/mark-twain-portrait/LICENSE b/app/dataviz/mark-twain-portrait/LICENSE new file mode 100644 index 00000000..ea4b79fd --- /dev/null +++ b/app/dataviz/mark-twain-portrait/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2016-2024 Andrei Kashcha + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/app/dataviz/mark-twain-portrait/README.md b/app/dataviz/mark-twain-portrait/README.md new file mode 100644 index 00000000..0ef68620 --- /dev/null +++ b/app/dataviz/mark-twain-portrait/README.md @@ -0,0 +1,72 @@ +# [Portrait](https://anvaka.github.io/portrait/) + +I took this picture of Mark Twain: + +![mark twain](https://raw.githubusercontent.com/anvaka/portrait/master/docs/mark_twain_small.png) + +Pixelated it into this: + +![mark twain pixelated](https://raw.githubusercontent.com/anvaka/portrait/master/docs/mark_twain_cloud.png) + +When you zoom closer you will see quotes from Mark Twain: + +![mark twain twist](https://raw.githubusercontent.com/anvaka/portrait/master/docs/mark_twist.gif) + +Explore it live here: https://anvaka.github.io/portrait/ + +# Map Navigation + +You can explore the portrait the same way you would explore Google Maps. Most +of the keyboard/mouse/touch shortcuts should be familiar: + +* `+`/`-`, `Mouse wheel`/`Pinch`, `Single click`, `Double tap` - Zoom in/out +* `Left arrow` - Move left +* `Right arrow` - Move right +* `Up arrow` - Move up +* `Down arrow` - Move down +* `Mini map click` - Reset zoom + +## Tidbits + +* The page address updates as you explore the map. So if you send link to +someone - they will see what you see. +* To fully zoom out - click on the mini-map portrait +* When fully zoomed out - help text appears + + +# How does this work? + +I wrote down more than 200 Mark Twain's quotes. Mostly quotes came from +[reddit](https://www.reddit.com/r/QuotesPorn/search?q=mark+twain&restrict_sr=on&sort=relevance&t=all) +and [Goodreads](https://www.goodreads.com/author/quotes/1244.Mark_Twain). + +Then I sorted them according to their popularity (e.g. by number of votes on reddit, +or likes on good reads), and dropped them onto canvas. + +Once I got the canvas, I saved it into high-resolution png file (8,000 x 8,000 pixels). + +* I used [OpenSeadragon](https://openseadragon.github.io) to have pan and zoom support. +* When URL changes, I update query string, so that you can share favorite quotes. +The query string state is managed by [query-state](https://github.com/anvaka/query-state) + +### The canvas algorithm + +The canvas algorithm works by randomly traversing empty space of the mask, +trying to find a rectangle that will fit required box. This bit of the code is +not yet available since it requires good amount of hand-tuning. However if +you'd like to play with ready-to-use code, I can highly recommend [amueller/word_cloud](https://github.com/amueller/word_cloud) +Python package. + +# Have an advice? + +If you'd like to explore other portraits in a similar way or have a suggestion +how to make this better, please reach out to me: + +* Open issue here: https://github.com/anvaka/portrait/issues +* Email to me: anvaka@gmail.com +* Tweet to me: https://twitter.com/anvaka + + +# Enjoy! + +That's it! Hope you enjoy exploring Mark Twain's wisdom in a new, artistic way! diff --git a/app/dataviz/mark-twain-portrait/bundle.js b/app/dataviz/mark-twain-portrait/bundle.js new file mode 100644 index 00000000..3938836e --- /dev/null +++ b/app/dataviz/mark-twain-portrait/bundle.js @@ -0,0 +1,21548 @@ +(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o [{callback: function, ctx: object}] } + var registeredEvents = Object.create(null); + + return { + on: function (eventName, callback, ctx) { + if (typeof callback !== 'function') { + throw new Error('callback is expected to be a function'); + } + var handlers = registeredEvents[eventName]; + if (!handlers) { + handlers = registeredEvents[eventName] = []; + } + handlers.push({callback: callback, ctx: ctx}); + + return subject; + }, + + off: function (eventName, callback) { + var wantToRemoveAll = (typeof eventName === 'undefined'); + if (wantToRemoveAll) { + // Killing old events storage should be enough in this case: + registeredEvents = Object.create(null); + return subject; + } + + if (registeredEvents[eventName]) { + var deleteAllCallbacksForEvent = (typeof callback !== 'function'); + if (deleteAllCallbacksForEvent) { + delete registeredEvents[eventName]; + } else { + var callbacks = registeredEvents[eventName]; + for (var i = 0; i < callbacks.length; ++i) { + if (callbacks[i].callback === callback) { + callbacks.splice(i, 1); + } + } + } + } + + return subject; + }, + + fire: function (eventName) { + var callbacks = registeredEvents[eventName]; + if (!callbacks) { + return subject; + } + + var fireArguments; + if (arguments.length > 1) { + fireArguments = Array.prototype.splice.call(arguments, 1); + } + for(var i = 0; i < callbacks.length; ++i) { + var callbackInfo = callbacks[i]; + callbackInfo.callback.apply(callbackInfo.ctx, fireArguments); + } + + return subject; + } + }; +} + +function validateSubject(subject) { + if (!subject) { + throw new Error('Eventify cannot use falsy object as events subject'); + } + var reservedWords = ['on', 'fire', 'off']; + for (var i = 0; i < reservedWords.length; ++i) { + if (subject.hasOwnProperty(reservedWords[i])) { + throw new Error("Subject cannot be eventified, since it already has property '" + reservedWords[i] + "'"); + } + } +} + +},{}],5:[function(require,module,exports){ +//! openseadragon 2.2.1 +//! Built on 2016-07-01 +//! Git commit: v2.2.1-0-babdefd +//! http://openseadragon.github.io +//! License: http://openseadragon.github.io/license/ + +/* + * OpenSeadragon + * + * Copyright (C) 2009 CodePlex Foundation + * Copyright (C) 2010-2013 OpenSeadragon contributors + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of CodePlex Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * Portions of this source file taken from jQuery: + * + * Copyright 2011 John Resig + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* + * Portions of this source file taken from mattsnider.com: + * + * Copyright (c) 2006-2013 Matt Snider + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT + * OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + + +/** + * @namespace OpenSeadragon + * @version openseadragon 2.2.1 + * @classdesc The root namespace for OpenSeadragon. All utility methods + * and classes are defined on or below this namespace. + * + */ + + +// Typedefs + + /** + * All required and optional settings for instantiating a new instance of an OpenSeadragon image viewer. + * + * @typedef {Object} Options + * @memberof OpenSeadragon + * + * @property {String} id + * Id of the element to append the viewer's container element to. If not provided, the 'element' property must be provided. + * If both the element and id properties are specified, the viewer is appended to the element provided in the element property. + * + * @property {Element} element + * The element to append the viewer's container element to. If not provided, the 'id' property must be provided. + * If both the element and id properties are specified, the viewer is appended to the element provided in the element property. + * + * @property {Array|String|Function|Object} [tileSources=null] + * Tile source(s) to open initially. This is a complex parameter; see + * {@link OpenSeadragon.Viewer#open} for details. + * + * @property {Number} [tabIndex=0] + * Tabbing order index to assign to the viewer element. Positive values are selected in increasing order. When tabIndex is 0 + * source order is used. A negative value omits the viewer from the tabbing order. + * + * @property {Array} overlays Array of objects defining permanent overlays of + * the viewer. The overlays added via this option and later removed with + * {@link OpenSeadragon.Viewer#removeOverlay} will be added back when a new + * image is opened. + * To add overlays which can be definitively removed, one must use + * {@link OpenSeadragon.Viewer#addOverlay} + * If displaying a sequence of images, the overlays can be associated + * with a specific page by passing the overlays array to the page's + * tile source configuration. + * Expected properties: + * * x, y, (or px, py for pixel coordinates) to define the location. + * * width, height in point if using x,y or in pixels if using px,py. If width + * and height are specified, the overlay size is adjusted when zooming, + * otherwise the size stays the size of the content (or the size defined by CSS). + * * className to associate a class to the overlay + * * id to set the overlay element. If an element with this id already exists, + * it is reused, otherwise it is created. If not specified, a new element is + * created. + * * placement a string to define the relative position to the viewport. + * Only used if no width and height are specified. Default: 'TOP_LEFT'. + * See {@link OpenSeadragon.Placement} for possible values. + * + * @property {String} [xmlPath=null] + * DEPRECATED. A relative path to load a DZI file from the server. + * Prefer the newer Options.tileSources. + * + * @property {String} [prefixUrl='/images/'] + * Prepends the prefixUrl to navImages paths, which is very useful + * since the default paths are rarely useful for production + * environments. + * + * @property {OpenSeadragon.NavImages} [navImages] + * An object with a property for each button or other built-in navigation + * control, eg the current 'zoomIn', 'zoomOut', 'home', and 'fullpage'. + * Each of those in turn provides an image path for each state of the button + * or navigation control, eg 'REST', 'GROUP', 'HOVER', 'PRESS'. Finally the + * image paths, by default assume there is a folder on the servers root path + * called '/images', eg '/images/zoomin_rest.png'. If you need to adjust + * these paths, prefer setting the option.prefixUrl rather than overriding + * every image path directly through this setting. + * + * @property {Boolean} [debugMode=false] + * TODO: provide an in-screen panel providing event detail feedback. + * + * @property {String} [debugGridColor='#437AB2'] + * + * @property {Number} [blendTime=0] + * Specifies the duration of animation as higher or lower level tiles are + * replacing the existing tile. + * + * @property {Boolean} [alwaysBlend=false] + * Forces the tile to always blend. By default the tiles skip blending + * when the blendTime is surpassed and the current animation frame would + * not complete the blend. + * + * @property {Boolean} [autoHideControls=true] + * If the user stops interacting with the viewport, fade the navigation + * controls. Useful for presentation since the controls are by default + * floated on top of the image the user is viewing. + * + * @property {Boolean} [immediateRender=false] + * Render the best closest level first, ignoring the lowering levels which + * provide the effect of very blurry to sharp. It is recommended to change + * setting to true for mobile devices. + * + * @property {Number} [defaultZoomLevel=0] + * Zoom level to use when image is first opened or the home button is clicked. + * If 0, adjusts to fit viewer. + * + * @property {Number} [opacity=1] + * Default opacity of the tiled images (1=opaque, 0=transparent) + * + * @property {String} [compositeOperation=null] + * Valid values are 'source-over', 'source-atop', 'source-in', 'source-out', + * 'destination-over', 'destination-atop', 'destination-in', + * 'destination-out', 'lighter', 'copy' or 'xor' + * + * @property {String|CanvasGradient|CanvasPattern|Function} [placeholderFillStyle=null] + * Draws a colored rectangle behind the tile if it is not loaded yet. + * You can pass a CSS color value like "#FF8800". + * When passing a function the tiledImage and canvas context are available as argument which is useful when you draw a gradient or pattern. + * + * @property {Number} [degrees=0] + * Initial rotation. + * + * @property {Number} [minZoomLevel=null] + * + * @property {Number} [maxZoomLevel=null] + * + * @property {Boolean} [homeFillsViewer=false] + * Make the 'home' button fill the viewer and clip the image, instead + * of fitting the image to the viewer and letterboxing. + * + * @property {Boolean} [panHorizontal=true] + * Allow horizontal pan. + * + * @property {Boolean} [panVertical=true] + * Allow vertical pan. + * + * @property {Boolean} [constrainDuringPan=false] + * + * @property {Boolean} [wrapHorizontal=false] + * Set to true to force the image to wrap horizontally within the viewport. + * Useful for maps or images representing the surface of a sphere or cylinder. + * + * @property {Boolean} [wrapVertical=false] + * Set to true to force the image to wrap vertically within the viewport. + * Useful for maps or images representing the surface of a sphere or cylinder. + * + * @property {Number} [minZoomImageRatio=0.9] + * The minimum percentage ( expressed as a number between 0 and 1 ) of + * the viewport height or width at which the zoom out will be constrained. + * Setting it to 0, for example will allow you to zoom out infinity. + * + * @property {Number} [maxZoomPixelRatio=1.1] + * The maximum ratio to allow a zoom-in to affect the highest level pixel + * ratio. This can be set to Infinity to allow 'infinite' zooming into the + * image though it is less effective visually if the HTML5 Canvas is not + * availble on the viewing device. + * + * @property {Number} [smoothTileEdgesMinZoom=1.1] + * A zoom percentage ( where 1 is 100% ) of the highest resolution level. + * When zoomed in beyond this value alternative compositing will be used to + * smooth out the edges between tiles. This will have a performance impact. + * Can be set to Infinity to turn it off. + * Note: This setting is ignored on iOS devices due to a known bug (See {@link https://github.com/openseadragon/openseadragon/issues/952}) + * + * @property {Boolean} [iOSDevice=?] + * True if running on an iOS device, false otherwise. + * Used to disable certain features that behave differently on iOS devices. + * + * @property {Boolean} [autoResize=true] + * Set to false to prevent polling for viewer size changes. Useful for providing custom resize behavior. + * + * @property {Boolean} [preserveImageSizeOnResize=false] + * Set to true to have the image size preserved when the viewer is resized. This requires autoResize=true (default). + * + * @property {Number} [minScrollDeltaTime=50] + * Number of milliseconds between canvas-scroll events. This value helps normalize the rate of canvas-scroll + * events between different devices, causing the faster devices to slow down enough to make the zoom control + * more manageable. + * + * @property {Number} [pixelsPerWheelLine=40] + * For pixel-resolution scrolling devices, the number of pixels equal to one scroll line. + * + * @property {Number} [visibilityRatio=0.5] + * The percentage ( as a number from 0 to 1 ) of the source image which + * must be kept within the viewport. If the image is dragged beyond that + * limit, it will 'bounce' back until the minimum visibility ratio is + * achieved. Setting this to 0 and wrapHorizontal ( or wrapVertical ) to + * true will provide the effect of an infinitely scrolling viewport. + * + * @property {Object} [viewportMargins={}] + * Pushes the "home" region in from the sides by the specified amounts. + * Possible subproperties (Numbers, in screen coordinates): left, top, right, bottom. + * + * @property {Number} [imageLoaderLimit=0] + * The maximum number of image requests to make concurrently. By default + * it is set to 0 allowing the browser to make the maximum number of + * image requests in parallel as allowed by the browsers policy. + * + * @property {Number} [clickTimeThreshold=300] + * The number of milliseconds within which a pointer down-up event combination + * will be treated as a click gesture. + * + * @property {Number} [clickDistThreshold=5] + * The maximum distance allowed between a pointer down event and a pointer up event + * to be treated as a click gesture. + * + * @property {Number} [dblClickTimeThreshold=300] + * The number of milliseconds within which two pointer down-up event combinations + * will be treated as a double-click gesture. + * + * @property {Number} [dblClickDistThreshold=20] + * The maximum distance allowed between two pointer click events + * to be treated as a double-click gesture. + * + * @property {Number} [springStiffness=6.5] + * + * @property {Number} [animationTime=1.2] + * Specifies the animation duration per each {@link OpenSeadragon.Spring} + * which occur when the image is dragged or zoomed. + * + * @property {OpenSeadragon.GestureSettings} [gestureSettingsMouse] + * Settings for gestures generated by a mouse pointer device. (See {@link OpenSeadragon.GestureSettings}) + * @property {Boolean} [gestureSettingsMouse.scrollToZoom=true] - Zoom on scroll gesture + * @property {Boolean} [gestureSettingsMouse.clickToZoom=true] - Zoom on click gesture + * @property {Boolean} [gestureSettingsMouse.dblClickToZoom=false] - Zoom on double-click gesture. Note: If set to true + * then clickToZoom should be set to false to prevent multiple zooms. + * @property {Boolean} [gestureSettingsMouse.pinchToZoom=false] - Zoom on pinch gesture + * @property {Boolean} [gestureSettingsMouse.flickEnabled=false] - Enable flick gesture + * @property {Number} [gestureSettingsMouse.flickMinSpeed=120] - If flickEnabled is true, the minimum speed to initiate a flick gesture (pixels-per-second) + * @property {Number} [gestureSettingsMouse.flickMomentum=0.25] - If flickEnabled is true, the momentum factor for the flick gesture + * @property {Boolean} [gestureSettingsMouse.pinchRotate=false] - If pinchRotate is true, the user will have the ability to rotate the image using their fingers. + * + * @property {OpenSeadragon.GestureSettings} [gestureSettingsTouch] + * Settings for gestures generated by a touch pointer device. (See {@link OpenSeadragon.GestureSettings}) + * @property {Boolean} [gestureSettingsTouch.scrollToZoom=false] - Zoom on scroll gesture + * @property {Boolean} [gestureSettingsTouch.clickToZoom=false] - Zoom on click gesture + * @property {Boolean} [gestureSettingsTouch.dblClickToZoom=true] - Zoom on double-click gesture. Note: If set to true + * then clickToZoom should be set to false to prevent multiple zooms. + * @property {Boolean} [gestureSettingsTouch.pinchToZoom=true] - Zoom on pinch gesture + * @property {Boolean} [gestureSettingsTouch.flickEnabled=true] - Enable flick gesture + * @property {Number} [gestureSettingsTouch.flickMinSpeed=120] - If flickEnabled is true, the minimum speed to initiate a flick gesture (pixels-per-second) + * @property {Number} [gestureSettingsTouch.flickMomentum=0.25] - If flickEnabled is true, the momentum factor for the flick gesture + * @property {Boolean} [gestureSettingsTouch.pinchRotate=false] - If pinchRotate is true, the user will have the ability to rotate the image using their fingers. + * + * @property {OpenSeadragon.GestureSettings} [gestureSettingsPen] + * Settings for gestures generated by a pen pointer device. (See {@link OpenSeadragon.GestureSettings}) + * @property {Boolean} [gestureSettingsPen.scrollToZoom=false] - Zoom on scroll gesture + * @property {Boolean} [gestureSettingsPen.clickToZoom=true] - Zoom on click gesture + * @property {Boolean} [gestureSettingsPen.dblClickToZoom=false] - Zoom on double-click gesture. Note: If set to true + * then clickToZoom should be set to false to prevent multiple zooms. + * @property {Boolean} [gestureSettingsPen.pinchToZoom=false] - Zoom on pinch gesture + * @property {Boolean} [gestureSettingsPen.flickEnabled=false] - Enable flick gesture + * @property {Number} [gestureSettingsPen.flickMinSpeed=120] - If flickEnabled is true, the minimum speed to initiate a flick gesture (pixels-per-second) + * @property {Number} [gestureSettingsPen.flickMomentum=0.25] - If flickEnabled is true, the momentum factor for the flick gesture + * @property {Boolean} [gestureSettingsPen.pinchRotate=false] - If pinchRotate is true, the user will have the ability to rotate the image using their fingers. + * + * @property {OpenSeadragon.GestureSettings} [gestureSettingsUnknown] + * Settings for gestures generated by unknown pointer devices. (See {@link OpenSeadragon.GestureSettings}) + * @property {Boolean} [gestureSettingsUnknown.scrollToZoom=true] - Zoom on scroll gesture + * @property {Boolean} [gestureSettingsUnknown.clickToZoom=false] - Zoom on click gesture + * @property {Boolean} [gestureSettingsUnknown.dblClickToZoom=true] - Zoom on double-click gesture. Note: If set to true + * then clickToZoom should be set to false to prevent multiple zooms. + * @property {Boolean} [gestureSettingsUnknown.pinchToZoom=true] - Zoom on pinch gesture + * @property {Boolean} [gestureSettingsUnknown.flickEnabled=true] - Enable flick gesture + * @property {Number} [gestureSettingsUnknown.flickMinSpeed=120] - If flickEnabled is true, the minimum speed to initiate a flick gesture (pixels-per-second) + * @property {Number} [gestureSettingsUnknown.flickMomentum=0.25] - If flickEnabled is true, the momentum factor for the flick gesture + * @property {Boolean} [gestureSettingsUnknown.pinchRotate=false] - If pinchRotate is true, the user will have the ability to rotate the image using their fingers. + * + * @property {Number} [zoomPerClick=2.0] + * The "zoom distance" per mouse click or touch tap. Note: Setting this to 1.0 effectively disables the click-to-zoom feature (also see gestureSettings[Mouse|Touch|Pen].clickToZoom/dblClickToZoom). + * + * @property {Number} [zoomPerScroll=1.2] + * The "zoom distance" per mouse scroll or touch pinch. Note: Setting this to 1.0 effectively disables the mouse-wheel zoom feature (also see gestureSettings[Mouse|Touch|Pen].scrollToZoom}). + * + * @property {Number} [zoomPerSecond=1.0] + * The number of seconds to animate a single zoom event over. + * + * @property {Boolean} [showNavigator=false] + * Set to true to make the navigator minimap appear. + * + * @property {String} [navigatorId=navigator-GENERATED DATE] + * The ID of a div to hold the navigator minimap. + * If an ID is specified, the navigatorPosition, navigatorSizeRatio, navigatorMaintainSizeRatio, navigator[Top|Left|Height|Width] and navigatorAutoFade options will be ignored. + * If an ID is not specified, a div element will be generated and placed on top of the main image. + * + * @property {String} [navigatorPosition='TOP_RIGHT'] + * Valid values are 'TOP_LEFT', 'TOP_RIGHT', 'BOTTOM_LEFT', 'BOTTOM_RIGHT', or 'ABSOLUTE'.
+ * If 'ABSOLUTE' is specified, then navigator[Top|Left|Height|Width] determines the size and position of the navigator minimap in the viewer, and navigatorSizeRatio and navigatorMaintainSizeRatio are ignored.
+ * For 'TOP_LEFT', 'TOP_RIGHT', 'BOTTOM_LEFT', and 'BOTTOM_RIGHT', the navigatorSizeRatio or navigator[Height|Width] values determine the size of the navigator minimap. + * + * @property {Number} [navigatorSizeRatio=0.2] + * Ratio of navigator size to viewer size. Ignored if navigator[Height|Width] are specified. + * + * @property {Boolean} [navigatorMaintainSizeRatio=false] + * If true, the navigator minimap is resized (using navigatorSizeRatio) when the viewer size changes. + * + * @property {Number|String} [navigatorTop=null] + * Specifies the location of the navigator minimap (see navigatorPosition). + * + * @property {Number|String} [navigatorLeft=null] + * Specifies the location of the navigator minimap (see navigatorPosition). + * + * @property {Number|String} [navigatorHeight=null] + * Specifies the size of the navigator minimap (see navigatorPosition). + * If specified, navigatorSizeRatio and navigatorMaintainSizeRatio are ignored. + * + * @property {Number|String} [navigatorWidth=null] + * Specifies the size of the navigator minimap (see navigatorPosition). + * If specified, navigatorSizeRatio and navigatorMaintainSizeRatio are ignored. + * + * @property {Boolean} [navigatorAutoResize=true] + * Set to false to prevent polling for navigator size changes. Useful for providing custom resize behavior. + * Setting to false can also improve performance when the navigator is configured to a fixed size. + * + * @property {Boolean} [navigatorAutoFade=true] + * If the user stops interacting with the viewport, fade the navigator minimap. + * Setting to false will make the navigator minimap always visible. + * + * @property {Boolean} [navigatorRotate=true] + * If true, the navigator will be rotated together with the viewer. + * + * @property {Number} [controlsFadeDelay=2000] + * The number of milliseconds to wait once the user has stopped interacting + * with the interface before begining to fade the controls. Assumes + * showNavigationControl and autoHideControls are both true. + * + * @property {Number} [controlsFadeLength=1500] + * The number of milliseconds to animate the controls fading out. + * + * @property {Number} [maxImageCacheCount=200] + * The max number of images we should keep in memory (per drawer). + * + * @property {Number} [timeout=30000] + * + * @property {Boolean} [useCanvas=true] + * Set to false to not use an HTML canvas element for image rendering even if canvas is supported. + * + * @property {Number} [minPixelRatio=0.5] + * The higher the minPixelRatio, the lower the quality of the image that + * is considered sufficient to stop rendering a given zoom level. For + * example, if you are targeting mobile devices with less bandwith you may + * try setting this to 1.5 or higher. + * + * @property {Boolean} [mouseNavEnabled=true] + * Is the user able to interact with the image via mouse or touch. Default + * interactions include draging the image in a plane, and zooming in toward + * and away from the image. + * + * @property {Boolean} [showNavigationControl=true] + * Set to false to prevent the appearance of the default navigation controls.
+ * Note that if set to false, the customs buttons set by the options + * zoomInButton, zoomOutButton etc, are rendered inactive. + * + * @property {OpenSeadragon.ControlAnchor} [navigationControlAnchor=TOP_LEFT] + * Placement of the default navigation controls. + * To set the placement of the sequence controls, see the + * sequenceControlAnchor option. + * + * @property {Boolean} [showZoomControl=true] + * If true then + and - buttons to zoom in and out are displayed.
+ * Note: {@link OpenSeadragon.Options.showNavigationControl} is overriding + * this setting when set to false. + * + * @property {Boolean} [showHomeControl=true] + * If true then the 'Go home' button is displayed to go back to the original + * zoom and pan.
+ * Note: {@link OpenSeadragon.Options.showNavigationControl} is overriding + * this setting when set to false. + * + * @property {Boolean} [showFullPageControl=true] + * If true then the 'Toggle full page' button is displayed to switch + * between full page and normal mode.
+ * Note: {@link OpenSeadragon.Options.showNavigationControl} is overriding + * this setting when set to false. + * + * @property {Boolean} [showRotationControl=false] + * If true then the rotate left/right controls will be displayed as part of the + * standard controls. This is also subject to the browser support for rotate + * (e.g. viewer.drawer.canRotate()).
+ * Note: {@link OpenSeadragon.Options.showNavigationControl} is overriding + * this setting when set to false. + * + * @property {Boolean} [showSequenceControl=true] + * If sequenceMode is true, then provide buttons for navigating forward and + * backward through the images. + * + * @property {OpenSeadragon.ControlAnchor} [sequenceControlAnchor=TOP_LEFT] + * Placement of the default sequence controls. + * + * @property {Boolean} [navPrevNextWrap=false] + * If true then the 'previous' button will wrap to the last image when + * viewing the first image and the 'next' button will wrap to the first + * image when viewing the last image. + * + * @property {String} zoomInButton + * Set the id of the custom 'Zoom in' button to use. + * This is useful to have a custom button anywhere in the web page.
+ * To only change the button images, consider using + * {@link OpenSeadragon.Options.navImages} + * + * @property {String} zoomOutButton + * Set the id of the custom 'Zoom out' button to use. + * This is useful to have a custom button anywhere in the web page.
+ * To only change the button images, consider using + * {@link OpenSeadragon.Options.navImages} + * + * @property {String} homeButton + * Set the id of the custom 'Go home' button to use. + * This is useful to have a custom button anywhere in the web page.
+ * To only change the button images, consider using + * {@link OpenSeadragon.Options.navImages} + * + * @property {String} fullPageButton + * Set the id of the custom 'Toggle full page' button to use. + * This is useful to have a custom button anywhere in the web page.
+ * To only change the button images, consider using + * {@link OpenSeadragon.Options.navImages} + * + * @property {String} rotateLeftButton + * Set the id of the custom 'Rotate left' button to use. + * This is useful to have a custom button anywhere in the web page.
+ * To only change the button images, consider using + * {@link OpenSeadragon.Options.navImages} + * + * @property {String} rotateRightButton + * Set the id of the custom 'Rotate right' button to use. + * This is useful to have a custom button anywhere in the web page.
+ * To only change the button images, consider using + * {@link OpenSeadragon.Options.navImages} + * + * @property {String} previousButton + * Set the id of the custom 'Previous page' button to use. + * This is useful to have a custom button anywhere in the web page.
+ * To only change the button images, consider using + * {@link OpenSeadragon.Options.navImages} + * + * @property {String} nextButton + * Set the id of the custom 'Next page' button to use. + * This is useful to have a custom button anywhere in the web page.
+ * To only change the button images, consider using + * {@link OpenSeadragon.Options.navImages} + * + * @property {Boolean} [sequenceMode=false] + * Set to true to have the viewer treat your tilesources as a sequence of images to + * be opened one at a time rather than all at once. + * + * @property {Number} [initialPage=0] + * If sequenceMode is true, display this page initially. + * + * @property {Boolean} [preserveViewport=false] + * If sequenceMode is true, then normally navigating through each image resets the + * viewport to 'home' position. If preserveViewport is set to true, then the viewport + * position is preserved when navigating between images in the sequence. + * + * @property {Boolean} [preserveOverlays=false] + * If sequenceMode is true, then normally navigating through each image + * resets the overlays. + * If preserveOverlays is set to true, then the overlays added with {@link OpenSeadragon.Viewer#addOverlay} + * are preserved when navigating between images in the sequence. + * Note: setting preserveOverlays overrides any overlays specified in the global + * "overlays" option for the Viewer. It's also not compatible with specifying + * per-tileSource overlays via the options, as those overlays will persist + * even after the tileSource is closed. + * + * @property {Boolean} [showReferenceStrip=false] + * If sequenceMode is true, then display a scrolling strip of image thumbnails for + * navigating through the images. + * + * @property {String} [referenceStripScroll='horizontal'] + * + * @property {Element} [referenceStripElement=null] + * + * @property {Number} [referenceStripHeight=null] + * + * @property {Number} [referenceStripWidth=null] + * + * @property {String} [referenceStripPosition='BOTTOM_LEFT'] + * + * @property {Number} [referenceStripSizeRatio=0.2] + * + * @property {Boolean} [collectionMode=false] + * Set to true to have the viewer arrange your TiledImages in a grid or line. + * + * @property {Number} [collectionRows=3] + * If collectionMode is true, specifies how many rows the grid should have. Use 1 to make a line. + * If collectionLayout is 'vertical', specifies how many columns instead. + * + * @property {Number} [collectionColumns=0] + * If collectionMode is true, specifies how many columns the grid should have. Use 1 to make a line. + * If collectionLayout is 'vertical', specifies how many rows instead. Ignored if collectionRows is not set to a falsy value. + * + * @property {String} [collectionLayout='horizontal'] + * If collectionMode is true, specifies whether to arrange vertically or horizontally. + * + * @property {Number} [collectionTileSize=800] + * If collectionMode is true, specifies the size, in viewport coordinates, for each TiledImage to fit into. + * The TiledImage will be centered within a square of the specified size. + * + * @property {Number} [collectionTileMargin=80] + * If collectionMode is true, specifies the margin, in viewport coordinates, between each TiledImage. + * + * @property {String|Boolean} [crossOriginPolicy=false] + * Valid values are 'Anonymous', 'use-credentials', and false. If false, canvas requests will + * not use CORS, and the canvas will be tainted. + * + * @property {Boolean} [ajaxWithCredentials=false] + * Whether to set the withCredentials XHR flag for AJAX requests (when loading tile sources). + * Note that this can be overridden at the {@link OpenSeadragon.TileSource} level. + * + */ + + /** + * Settings for gestures generated by a pointer device. + * + * @typedef {Object} GestureSettings + * @memberof OpenSeadragon + * + * @property {Boolean} scrollToZoom + * Set to false to disable zooming on scroll gestures. + * + * @property {Boolean} clickToZoom + * Set to false to disable zooming on click gestures. + * + * @property {Boolean} dblClickToZoom + * Set to false to disable zooming on double-click gestures. Note: If set to true + * then clickToZoom should be set to false to prevent multiple zooms. + * + * @property {Boolean} pinchToZoom + * Set to false to disable zooming on pinch gestures. + * + * @property {Boolean} flickEnabled + * Set to false to disable the kinetic panning effect (flick) at the end of a drag gesture. + * + * @property {Number} flickMinSpeed + * If flickEnabled is true, the minimum speed (in pixels-per-second) required to cause the kinetic panning effect (flick) at the end of a drag gesture. + * + * @property {Number} flickMomentum + * If flickEnabled is true, a constant multiplied by the velocity to determine the distance of the kinetic panning effect (flick) at the end of a drag gesture. + * A larger value will make the flick feel "lighter", while a smaller value will make the flick feel "heavier". + * Note: springStiffness and animationTime also affect the "spring" used to stop the flick animation. + * + */ + +/** + * The names for the image resources used for the image navigation buttons. + * + * @typedef {Object} NavImages + * @memberof OpenSeadragon + * + * @property {Object} zoomIn - Images for the zoom-in button. + * @property {String} zoomIn.REST + * @property {String} zoomIn.GROUP + * @property {String} zoomIn.HOVER + * @property {String} zoomIn.DOWN + * + * @property {Object} zoomOut - Images for the zoom-out button. + * @property {String} zoomOut.REST + * @property {String} zoomOut.GROUP + * @property {String} zoomOut.HOVER + * @property {String} zoomOut.DOWN + * + * @property {Object} home - Images for the home button. + * @property {String} home.REST + * @property {String} home.GROUP + * @property {String} home.HOVER + * @property {String} home.DOWN + * + * @property {Object} fullpage - Images for the full-page button. + * @property {String} fullpage.REST + * @property {String} fullpage.GROUP + * @property {String} fullpage.HOVER + * @property {String} fullpage.DOWN + * + * @property {Object} rotateleft - Images for the rotate left button. + * @property {String} rotateleft.REST + * @property {String} rotateleft.GROUP + * @property {String} rotateleft.HOVER + * @property {String} rotateleft.DOWN + * + * @property {Object} rotateright - Images for the rotate right button. + * @property {String} rotateright.REST + * @property {String} rotateright.GROUP + * @property {String} rotateright.HOVER + * @property {String} rotateright.DOWN + * + * @property {Object} previous - Images for the previous button. + * @property {String} previous.REST + * @property {String} previous.GROUP + * @property {String} previous.HOVER + * @property {String} previous.DOWN + * + * @property {Object} next - Images for the next button. + * @property {String} next.REST + * @property {String} next.GROUP + * @property {String} next.HOVER + * @property {String} next.DOWN + * + */ + + + /** + * This function serves as a single point of instantiation for an {@link OpenSeadragon.Viewer}, including all + * combinations of out-of-the-box configurable features. + * + * @param {OpenSeadragon.Options} options - Viewer options. + * @returns {OpenSeadragon.Viewer} + */ +window.OpenSeadragon = window.OpenSeadragon || function( options ){ + + return new OpenSeadragon.Viewer( options ); + +}; + +if (typeof define === 'function' && define.amd) { + define(function () { + return (window.OpenSeadragon); + }); +} + + +(function( $ ){ + + + /** + * The OpenSeadragon version. + * + * @member {Object} OpenSeadragon.version + * @property {String} versionStr - The version number as a string ('major.minor.revision'). + * @property {Number} major - The major version number. + * @property {Number} minor - The minor version number. + * @property {Number} revision - The revision number. + * @since 1.0.0 + */ + $.version = { + versionStr: '2.2.1', + major: parseInt('2', 10), + minor: parseInt('2', 10), + revision: parseInt('1', 10) + }; + + + /** + * Taken from jquery 1.6.1 + * [[Class]] -> type pairs + * @private + */ + var class2type = { + '[object Boolean]': 'boolean', + '[object Number]': 'number', + '[object String]': 'string', + '[object Function]': 'function', + '[object Array]': 'array', + '[object Date]': 'date', + '[object RegExp]': 'regexp', + '[object Object]': 'object' + }, + // Save a reference to some core methods + toString = Object.prototype.toString, + hasOwn = Object.prototype.hasOwnProperty; + + /** + * Taken from jQuery 1.6.1 + * @function isFunction + * @memberof OpenSeadragon + * @see {@link http://www.jquery.com/ jQuery} + */ + $.isFunction = function( obj ) { + return $.type(obj) === "function"; + }; + + + /** + * Taken from jQuery 1.6.1 + * @function isArray + * @memberof OpenSeadragon + * @see {@link http://www.jquery.com/ jQuery} + */ + $.isArray = Array.isArray || function( obj ) { + return $.type(obj) === "array"; + }; + + + /** + * A crude way of determining if an object is a window. + * Taken from jQuery 1.6.1 + * @function isWindow + * @memberof OpenSeadragon + * @see {@link http://www.jquery.com/ jQuery} + */ + $.isWindow = function( obj ) { + return obj && typeof obj === "object" && "setInterval" in obj; + }; + + + /** + * Taken from jQuery 1.6.1 + * @function type + * @memberof OpenSeadragon + * @see {@link http://www.jquery.com/ jQuery} + */ + $.type = function( obj ) { + return ( obj === null ) || ( obj === undefined ) ? + String( obj ) : + class2type[ toString.call(obj) ] || "object"; + }; + + + /** + * Taken from jQuery 1.6.1 + * @function isPlainObject + * @memberof OpenSeadragon + * @see {@link http://www.jquery.com/ jQuery} + */ + $.isPlainObject = function( obj ) { + // Must be an Object. + // Because of IE, we also have to check the presence of the constructor property. + // Make sure that DOM nodes and window objects don't pass through, as well + if ( !obj || OpenSeadragon.type(obj) !== "object" || obj.nodeType || $.isWindow( obj ) ) { + return false; + } + + // Not own constructor property must be Object + if ( obj.constructor && + !hasOwn.call(obj, "constructor") && + !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) { + return false; + } + + // Own properties are enumerated firstly, so to speed up, + // if last one is own, then all properties are own. + + var lastKey; + for (var key in obj ) { + lastKey = key; + } + + return lastKey === undefined || hasOwn.call( obj, lastKey ); + }; + + + /** + * Taken from jQuery 1.6.1 + * @function isEmptyObject + * @memberof OpenSeadragon + * @see {@link http://www.jquery.com/ jQuery} + */ + $.isEmptyObject = function( obj ) { + for ( var name in obj ) { + return false; + } + return true; + }; + + /** + * Shim around Object.freeze. Does nothing if Object.freeze is not supported. + * @param {Object} obj The object to freeze. + * @return {Object} obj The frozen object. + */ + $.freezeObject = function(obj) { + if (Object.freeze) { + $.freezeObject = Object.freeze; + } else { + $.freezeObject = function(obj) { + return obj; + }; + } + return $.freezeObject(obj); + }; + + /** + * True if the browser supports the HTML5 canvas element + * @member {Boolean} supportsCanvas + * @memberof OpenSeadragon + */ + $.supportsCanvas = (function () { + var canvasElement = document.createElement( 'canvas' ); + return !!( $.isFunction( canvasElement.getContext ) && + canvasElement.getContext( '2d' ) ); + }()); + + /** + * Test whether the submitted canvas is tainted or not. + * @argument {Canvas} canvas The canvas to test. + * @returns {Boolean} True if the canvas is tainted. + */ + $.isCanvasTainted = function(canvas) { + var isTainted = false; + try { + // We test if the canvas is tainted by retrieving data from it. + // An exception will be raised if the canvas is tainted. + var data = canvas.getContext('2d').getImageData(0, 0, 1, 1); + } catch (e) { + isTainted = true; + } + return isTainted; + }; + + /** + * A ratio comparing the device screen's pixel density to the canvas's backing store pixel density. Defaults to 1 if canvas isn't supported by the browser. + * @member {Number} pixelDensityRatio + * @memberof OpenSeadragon + */ + $.pixelDensityRatio = (function () { + if ( $.supportsCanvas ) { + var context = document.createElement('canvas').getContext('2d'); + var devicePixelRatio = window.devicePixelRatio || 1; + var backingStoreRatio = context.webkitBackingStorePixelRatio || + context.mozBackingStorePixelRatio || + context.msBackingStorePixelRatio || + context.oBackingStorePixelRatio || + context.backingStorePixelRatio || 1; + return devicePixelRatio / backingStoreRatio; + } else { + return 1; + } + }()); + +}( OpenSeadragon )); + +/** + * This closure defines all static methods available to the OpenSeadragon + * namespace. Many, if not most, are taked directly from jQuery for use + * to simplify and reduce common programming patterns. More static methods + * from jQuery may eventually make their way into this though we are + * attempting to avoid an explicit dependency on jQuery only because + * OpenSeadragon is a broadly useful code base and would be made less broad + * by requiring jQuery fully. + * + * Some static methods have also been refactored from the original OpenSeadragon + * project. + */ +(function( $ ){ + + /** + * Taken from jQuery 1.6.1 + * @function extend + * @memberof OpenSeadragon + * @see {@link http://www.jquery.com/ jQuery} + */ + $.extend = function() { + var options, + name, + src, + copy, + copyIsArray, + clone, + target = arguments[ 0 ] || {}, + length = arguments.length, + deep = false, + i = 1; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + target = arguments[ 1 ] || {}; + // skip the boolean and the target + i = 2; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !OpenSeadragon.isFunction( target ) ) { + target = {}; + } + + // extend jQuery itself if only one argument is passed + if ( length === i ) { + target = this; + --i; + } + + for ( ; i < length; i++ ) { + // Only deal with non-null/undefined values + options = arguments[ i ]; + if ( options !== null || options !== undefined ) { + // Extend the base object + for ( name in options ) { + src = target[ name ]; + copy = options[ name ]; + + // Prevent never-ending loop + if ( target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( OpenSeadragon.isPlainObject( copy ) || ( copyIsArray = OpenSeadragon.isArray( copy ) ) ) ) { + if ( copyIsArray ) { + copyIsArray = false; + clone = src && OpenSeadragon.isArray( src ) ? src : []; + + } else { + clone = src && OpenSeadragon.isPlainObject( src ) ? src : {}; + } + + // Never move original objects, clone them + target[ name ] = OpenSeadragon.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; + }; + + var isIOSDevice = function () { + if (typeof navigator !== 'object') { + return false; + } + var userAgent = navigator.userAgent; + if (typeof userAgent !== 'string') { + return false; + } + return userAgent.indexOf('iPhone') !== -1 || + userAgent.indexOf('iPad') !== -1 || + userAgent.indexOf('iPod') !== -1; + }; + + $.extend( $, /** @lends OpenSeadragon */{ + /** + * The default values for the optional settings documented at {@link OpenSeadragon.Options}. + * @static + * @type {Object} + */ + DEFAULT_SETTINGS: { + //DATA SOURCE DETAILS + xmlPath: null, + tileSources: null, + tileHost: null, + initialPage: 0, + crossOriginPolicy: false, + ajaxWithCredentials: false, + + //PAN AND ZOOM SETTINGS AND CONSTRAINTS + panHorizontal: true, + panVertical: true, + constrainDuringPan: false, + wrapHorizontal: false, + wrapVertical: false, + visibilityRatio: 0.5, //-> how much of the viewer can be negative space + minPixelRatio: 0.5, //->closer to 0 draws tiles meant for a higher zoom at this zoom + defaultZoomLevel: 0, + minZoomLevel: null, + maxZoomLevel: null, + homeFillsViewer: false, + + //UI RESPONSIVENESS AND FEEL + clickTimeThreshold: 300, + clickDistThreshold: 5, + dblClickTimeThreshold: 300, + dblClickDistThreshold: 20, + springStiffness: 6.5, + animationTime: 1.2, + gestureSettingsMouse: { scrollToZoom: true, clickToZoom: true, dblClickToZoom: false, pinchToZoom: false, flickEnabled: false, flickMinSpeed: 120, flickMomentum: 0.25, pinchRotate: false }, + gestureSettingsTouch: { scrollToZoom: false, clickToZoom: false, dblClickToZoom: true, pinchToZoom: true, flickEnabled: true, flickMinSpeed: 120, flickMomentum: 0.25, pinchRotate: false }, + gestureSettingsPen: { scrollToZoom: false, clickToZoom: true, dblClickToZoom: false, pinchToZoom: false, flickEnabled: false, flickMinSpeed: 120, flickMomentum: 0.25, pinchRotate: false }, + gestureSettingsUnknown: { scrollToZoom: false, clickToZoom: false, dblClickToZoom: true, pinchToZoom: true, flickEnabled: true, flickMinSpeed: 120, flickMomentum: 0.25, pinchRotate: false }, + zoomPerClick: 2, + zoomPerScroll: 1.2, + zoomPerSecond: 1.0, + blendTime: 0, + alwaysBlend: false, + autoHideControls: true, + immediateRender: false, + minZoomImageRatio: 0.9, //-> closer to 0 allows zoom out to infinity + maxZoomPixelRatio: 1.1, //-> higher allows 'over zoom' into pixels + smoothTileEdgesMinZoom: 1.1, //-> higher than maxZoomPixelRatio disables it + iOSDevice: isIOSDevice(), + pixelsPerWheelLine: 40, + autoResize: true, + preserveImageSizeOnResize: false, // requires autoResize=true + minScrollDeltaTime: 50, + + //DEFAULT CONTROL SETTINGS + showSequenceControl: true, //SEQUENCE + sequenceControlAnchor: null, //SEQUENCE + preserveViewport: false, //SEQUENCE + preserveOverlays: false, //SEQUENCE + navPrevNextWrap: false, //SEQUENCE + showNavigationControl: true, //ZOOM/HOME/FULL/ROTATION + navigationControlAnchor: null, //ZOOM/HOME/FULL/ROTATION + showZoomControl: true, //ZOOM + showHomeControl: true, //HOME + showFullPageControl: true, //FULL + showRotationControl: false, //ROTATION + controlsFadeDelay: 2000, //ZOOM/HOME/FULL/SEQUENCE + controlsFadeLength: 1500, //ZOOM/HOME/FULL/SEQUENCE + mouseNavEnabled: true, //GENERAL MOUSE INTERACTIVITY + + //VIEWPORT NAVIGATOR SETTINGS + showNavigator: false, + navigatorId: null, + navigatorPosition: null, + navigatorSizeRatio: 0.2, + navigatorMaintainSizeRatio: false, + navigatorTop: null, + navigatorLeft: null, + navigatorHeight: null, + navigatorWidth: null, + navigatorAutoResize: true, + navigatorAutoFade: true, + navigatorRotate: true, + + // INITIAL ROTATION + degrees: 0, + + // APPEARANCE + opacity: 1, + compositeOperation: null, + placeholderFillStyle: null, + + //REFERENCE STRIP SETTINGS + showReferenceStrip: false, + referenceStripScroll: 'horizontal', + referenceStripElement: null, + referenceStripHeight: null, + referenceStripWidth: null, + referenceStripPosition: 'BOTTOM_LEFT', + referenceStripSizeRatio: 0.2, + + //COLLECTION VISUALIZATION SETTINGS + collectionRows: 3, //or columns depending on layout + collectionColumns: 0, //columns in horizontal layout, rows in vertical layout + collectionLayout: 'horizontal', //vertical + collectionMode: false, + collectionTileSize: 800, + collectionTileMargin: 80, + + //PERFORMANCE SETTINGS + imageLoaderLimit: 0, + maxImageCacheCount: 200, + timeout: 30000, + useCanvas: true, // Use canvas element for drawing if available + + //INTERFACE RESOURCE SETTINGS + prefixUrl: "/images/", + navImages: { + zoomIn: { + REST: 'zoomin_rest.png', + GROUP: 'zoomin_grouphover.png', + HOVER: 'zoomin_hover.png', + DOWN: 'zoomin_pressed.png' + }, + zoomOut: { + REST: 'zoomout_rest.png', + GROUP: 'zoomout_grouphover.png', + HOVER: 'zoomout_hover.png', + DOWN: 'zoomout_pressed.png' + }, + home: { + REST: 'home_rest.png', + GROUP: 'home_grouphover.png', + HOVER: 'home_hover.png', + DOWN: 'home_pressed.png' + }, + fullpage: { + REST: 'fullpage_rest.png', + GROUP: 'fullpage_grouphover.png', + HOVER: 'fullpage_hover.png', + DOWN: 'fullpage_pressed.png' + }, + rotateleft: { + REST: 'rotateleft_rest.png', + GROUP: 'rotateleft_grouphover.png', + HOVER: 'rotateleft_hover.png', + DOWN: 'rotateleft_pressed.png' + }, + rotateright: { + REST: 'rotateright_rest.png', + GROUP: 'rotateright_grouphover.png', + HOVER: 'rotateright_hover.png', + DOWN: 'rotateright_pressed.png' + }, + previous: { + REST: 'previous_rest.png', + GROUP: 'previous_grouphover.png', + HOVER: 'previous_hover.png', + DOWN: 'previous_pressed.png' + }, + next: { + REST: 'next_rest.png', + GROUP: 'next_grouphover.png', + HOVER: 'next_hover.png', + DOWN: 'next_pressed.png' + } + }, + + //DEVELOPER SETTINGS + debugMode: false, + debugGridColor: '#437AB2' + }, + + + /** + * TODO: get rid of this. I can't see how it's required at all. Looks + * like an early legacy code artifact. + * @static + * @ignore + */ + SIGNAL: "----seadragon----", + + + /** + * Returns a function which invokes the method as if it were a method belonging to the object. + * @function + * @param {Object} object + * @param {Function} method + * @returns {Function} + */ + delegate: function( object, method ) { + return function(){ + var args = arguments; + if ( args === undefined ){ + args = []; + } + return method.apply( object, args ); + }; + }, + + + /** + * An enumeration of Browser vendors. + * @static + * @type {Object} + * @property {Number} UNKNOWN + * @property {Number} IE + * @property {Number} FIREFOX + * @property {Number} SAFARI + * @property {Number} CHROME + * @property {Number} OPERA + */ + BROWSERS: { + UNKNOWN: 0, + IE: 1, + FIREFOX: 2, + SAFARI: 3, + CHROME: 4, + OPERA: 5 + }, + + + /** + * Returns a DOM Element for the given id or element. + * @function + * @param {String|Element} element Accepts an id or element. + * @returns {Element} The element with the given id, null, or the element itself. + */ + getElement: function( element ) { + if ( typeof ( element ) == "string" ) { + element = document.getElementById( element ); + } + return element; + }, + + + /** + * Determines the position of the upper-left corner of the element. + * @function + * @param {Element|String} element - the elemenet we want the position for. + * @returns {OpenSeadragon.Point} - the position of the upper left corner of the element. + */ + getElementPosition: function( element ) { + var result = new $.Point(), + isFixed, + offsetParent; + + element = $.getElement( element ); + isFixed = $.getElementStyle( element ).position == "fixed"; + offsetParent = getOffsetParent( element, isFixed ); + + while ( offsetParent ) { + + result.x += element.offsetLeft; + result.y += element.offsetTop; + + if ( isFixed ) { + result = result.plus( $.getPageScroll() ); + } + + element = offsetParent; + isFixed = $.getElementStyle( element ).position == "fixed"; + offsetParent = getOffsetParent( element, isFixed ); + } + + return result; + }, + + + /** + * Determines the position of the upper-left corner of the element adjusted for current page and/or element scroll. + * @function + * @param {Element|String} element - the element we want the position for. + * @returns {OpenSeadragon.Point} - the position of the upper left corner of the element adjusted for current page and/or element scroll. + */ + getElementOffset: function( element ) { + element = $.getElement( element ); + + var doc = element && element.ownerDocument, + docElement, + win, + boundingRect = { top: 0, left: 0 }; + + if ( !doc ) { + return new $.Point(); + } + + docElement = doc.documentElement; + + if ( typeof element.getBoundingClientRect !== typeof undefined ) { + boundingRect = element.getBoundingClientRect(); + } + + win = ( doc == doc.window ) ? + doc : + ( doc.nodeType === 9 ) ? + doc.defaultView || doc.parentWindow : + false; + + return new $.Point( + boundingRect.left + ( win.pageXOffset || docElement.scrollLeft ) - ( docElement.clientLeft || 0 ), + boundingRect.top + ( win.pageYOffset || docElement.scrollTop ) - ( docElement.clientTop || 0 ) + ); + }, + + + /** + * Determines the height and width of the given element. + * @function + * @param {Element|String} element + * @returns {OpenSeadragon.Point} + */ + getElementSize: function( element ) { + element = $.getElement( element ); + + return new $.Point( + element.clientWidth, + element.clientHeight + ); + }, + + + /** + * Returns the CSSStyle object for the given element. + * @function + * @param {Element|String} element + * @returns {CSSStyle} + */ + getElementStyle: + document.documentElement.currentStyle ? + function( element ) { + element = $.getElement( element ); + return element.currentStyle; + } : + function( element ) { + element = $.getElement( element ); + return window.getComputedStyle( element, "" ); + }, + + /** + * Returns the property with the correct vendor prefix appended. + * @param {String} property the property name + * @returns {String} the property with the correct prefix or null if not + * supported. + */ + getCssPropertyWithVendorPrefix: function(property) { + var memo = {}; + + $.getCssPropertyWithVendorPrefix = function(property) { + if (memo[property] !== undefined) { + return memo[property]; + } + var style = document.createElement('div').style; + var result = null; + if (style[property] !== undefined) { + result = property; + } else { + var prefixes = ['Webkit', 'Moz', 'MS', 'O', + 'webkit', 'moz', 'ms', 'o']; + var suffix = $.capitalizeFirstLetter(property); + for (var i = 0; i < prefixes.length; i++) { + var prop = prefixes[i] + suffix; + if (style[prop] !== undefined) { + result = prop; + break; + } + } + } + memo[property] = result; + return result; + }; + return $.getCssPropertyWithVendorPrefix(property); + }, + + /** + * Capitalizes the first letter of a string + * @param {String} string + * @returns {String} The string with the first letter capitalized + */ + capitalizeFirstLetter: function(string) { + return string.charAt(0).toUpperCase() + string.slice(1); + }, + + /** + * Determines if a point is within the bounding rectangle of the given element (hit-test). + * @function + * @param {Element|String} element + * @param {OpenSeadragon.Point} point + * @returns {Boolean} + */ + pointInElement: function( element, point ) { + element = $.getElement( element ); + var offset = $.getElementOffset( element ), + size = $.getElementSize( element ); + return point.x >= offset.x && point.x < offset.x + size.x && point.y < offset.y + size.y && point.y >= offset.y; + }, + + + /** + * Gets the latest event, really only useful internally since its + * specific to IE behavior. + * @function + * @param {Event} [event] + * @returns {Event} + * @deprecated For internal use only + * @private + */ + getEvent: function( event ) { + if( event ){ + $.getEvent = function( event ) { + return event; + }; + } else { + $.getEvent = function() { + return window.event; + }; + } + return $.getEvent( event ); + }, + + + /** + * Gets the position of the mouse on the screen for a given event. + * @function + * @param {Event} [event] + * @returns {OpenSeadragon.Point} + */ + getMousePosition: function( event ) { + + if ( typeof( event.pageX ) == "number" ) { + $.getMousePosition = function( event ){ + var result = new $.Point(); + + event = $.getEvent( event ); + result.x = event.pageX; + result.y = event.pageY; + + return result; + }; + } else if ( typeof( event.clientX ) == "number" ) { + $.getMousePosition = function( event ){ + var result = new $.Point(); + + event = $.getEvent( event ); + result.x = + event.clientX + + document.body.scrollLeft + + document.documentElement.scrollLeft; + result.y = + event.clientY + + document.body.scrollTop + + document.documentElement.scrollTop; + + return result; + }; + } else { + throw new Error( + "Unknown event mouse position, no known technique." + ); + } + + return $.getMousePosition( event ); + }, + + + /** + * Determines the page's current scroll position. + * @function + * @returns {OpenSeadragon.Point} + */ + getPageScroll: function() { + var docElement = document.documentElement || {}, + body = document.body || {}; + + if ( typeof( window.pageXOffset ) == "number" ) { + $.getPageScroll = function(){ + return new $.Point( + window.pageXOffset, + window.pageYOffset + ); + }; + } else if ( body.scrollLeft || body.scrollTop ) { + $.getPageScroll = function(){ + return new $.Point( + document.body.scrollLeft, + document.body.scrollTop + ); + }; + } else if ( docElement.scrollLeft || docElement.scrollTop ) { + $.getPageScroll = function(){ + return new $.Point( + document.documentElement.scrollLeft, + document.documentElement.scrollTop + ); + }; + } else { + // We can't reassign the function yet, as there was no scroll. + return new $.Point(0,0); + } + + return $.getPageScroll(); + }, + + /** + * Set the page scroll position. + * @function + * @returns {OpenSeadragon.Point} + */ + setPageScroll: function( scroll ) { + if ( typeof ( window.scrollTo ) !== "undefined" ) { + $.setPageScroll = function( scroll ) { + window.scrollTo( scroll.x, scroll.y ); + }; + } else { + var originalScroll = $.getPageScroll(); + if ( originalScroll.x === scroll.x && + originalScroll.y === scroll.y ) { + // We are already correctly positioned and there + // is no way to detect the correct method. + return; + } + + document.body.scrollLeft = scroll.x; + document.body.scrollTop = scroll.y; + var currentScroll = $.getPageScroll(); + if ( currentScroll.x !== originalScroll.x && + currentScroll.y !== originalScroll.y ) { + $.setPageScroll = function( scroll ) { + document.body.scrollLeft = scroll.x; + document.body.scrollTop = scroll.y; + }; + return; + } + + document.documentElement.scrollLeft = scroll.x; + document.documentElement.scrollTop = scroll.y; + currentScroll = $.getPageScroll(); + if ( currentScroll.x !== originalScroll.x && + currentScroll.y !== originalScroll.y ) { + $.setPageScroll = function( scroll ) { + document.documentElement.scrollLeft = scroll.x; + document.documentElement.scrollTop = scroll.y; + }; + return; + } + + // We can't find anything working, so we do nothing. + $.setPageScroll = function( scroll ) { + }; + } + + return $.setPageScroll( scroll ); + }, + + /** + * Determines the size of the browsers window. + * @function + * @returns {OpenSeadragon.Point} + */ + getWindowSize: function() { + var docElement = document.documentElement || {}, + body = document.body || {}; + + if ( typeof( window.innerWidth ) == 'number' ) { + $.getWindowSize = function(){ + return new $.Point( + window.innerWidth, + window.innerHeight + ); + }; + } else if ( docElement.clientWidth || docElement.clientHeight ) { + $.getWindowSize = function(){ + return new $.Point( + document.documentElement.clientWidth, + document.documentElement.clientHeight + ); + }; + } else if ( body.clientWidth || body.clientHeight ) { + $.getWindowSize = function(){ + return new $.Point( + document.body.clientWidth, + document.body.clientHeight + ); + }; + } else { + throw new Error("Unknown window size, no known technique."); + } + + return $.getWindowSize(); + }, + + + /** + * Wraps the given element in a nest of divs so that the element can + * be easily centered using CSS tables + * @function + * @param {Element|String} element + * @returns {Element} outermost wrapper element + */ + makeCenteredNode: function( element ) { + // Convert a possible ID to an actual HTMLElement + element = $.getElement( element ); + + /* + CSS tables require you to have a display:table/row/cell hierarchy so we need to create + three nested wrapper divs: + */ + + var wrappers = [ + $.makeNeutralElement( 'div' ), + $.makeNeutralElement( 'div' ), + $.makeNeutralElement( 'div' ) + ]; + + // It feels like we should be able to pass style dicts to makeNeutralElement: + $.extend(wrappers[0].style, { + display: "table", + height: "100%", + width: "100%" + }); + + $.extend(wrappers[1].style, { + display: "table-row" + }); + + $.extend(wrappers[2].style, { + display: "table-cell", + verticalAlign: "middle", + textAlign: "center" + }); + + wrappers[0].appendChild(wrappers[1]); + wrappers[1].appendChild(wrappers[2]); + wrappers[2].appendChild(element); + + return wrappers[0]; + }, + + + /** + * Creates an easily positionable element of the given type that therefor + * serves as an excellent container element. + * @function + * @param {String} tagName + * @returns {Element} + */ + makeNeutralElement: function( tagName ) { + var element = document.createElement( tagName ), + style = element.style; + + style.background = "transparent none"; + style.border = "none"; + style.margin = "0px"; + style.padding = "0px"; + style.position = "static"; + + return element; + }, + + + /** + * Returns the current milliseconds, using Date.now() if available + * @function + */ + now: function( ) { + if (Date.now) { + $.now = Date.now; + } else { + $.now = function() { return new Date().getTime(); }; + } + + return $.now(); + }, + + + /** + * Ensures an image is loaded correctly to support alpha transparency. + * Generally only IE has issues doing this correctly for formats like + * png. + * @function + * @param {String} src + * @returns {Element} + */ + makeTransparentImage: function( src ) { + + $.makeTransparentImage = function( src ){ + var img = $.makeNeutralElement( "img" ); + + img.src = src; + + return img; + }; + + if ( $.Browser.vendor == $.BROWSERS.IE && $.Browser.version < 7 ) { + + $.makeTransparentImage = function( src ){ + var img = $.makeNeutralElement( "img" ), + element = null; + + element = $.makeNeutralElement("span"); + element.style.display = "inline-block"; + + img.onload = function() { + element.style.width = element.style.width || img.width + "px"; + element.style.height = element.style.height || img.height + "px"; + + img.onload = null; + img = null; // to prevent memory leaks in IE + }; + + img.src = src; + element.style.filter = + "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + + src + + "', sizingMethod='scale')"; + + return element; + }; + + } + + return $.makeTransparentImage( src ); + }, + + + /** + * Sets the opacity of the specified element. + * @function + * @param {Element|String} element + * @param {Number} opacity + * @param {Boolean} [usesAlpha] + */ + setElementOpacity: function( element, opacity, usesAlpha ) { + + var ieOpacity, + ieFilter; + + element = $.getElement( element ); + + if ( usesAlpha && !$.Browser.alpha ) { + opacity = Math.round( opacity ); + } + + if ( $.Browser.opacity ) { + element.style.opacity = opacity < 1 ? opacity : ""; + } else { + if ( opacity < 1 ) { + ieOpacity = Math.round( 100 * opacity ); + ieFilter = "alpha(opacity=" + ieOpacity + ")"; + element.style.filter = ieFilter; + } else { + element.style.filter = ""; + } + } + }, + + + /** + * Sets the specified element's touch-action style attribute to 'none'. + * @function + * @param {Element|String} element + */ + setElementTouchActionNone: function( element ) { + element = $.getElement( element ); + if ( typeof element.style.touchAction !== 'undefined' ) { + element.style.touchAction = 'none'; + } else if ( typeof element.style.msTouchAction !== 'undefined' ) { + element.style.msTouchAction = 'none'; + } + }, + + + /** + * Add the specified CSS class to the element if not present. + * @function + * @param {Element|String} element + * @param {String} className + */ + addClass: function( element, className ) { + element = $.getElement( element ); + + if ( ! element.className ) { + element.className = className; + } else if ( ( ' ' + element.className + ' ' ). + indexOf( ' ' + className + ' ' ) === -1 ) { + element.className += ' ' + className; + } + }, + + /** + * Find the first index at which an element is found in an array or -1 + * if not present. + * + * Code taken and adapted from + * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf#Compatibility + * + * @function + * @param {Array} array The array from which to find the element + * @param {Object} searchElement The element to find + * @param {Number} [fromIndex=0] Index to start research. + * @returns {Number} The index of the element in the array. + */ + indexOf: function( array, searchElement, fromIndex ) { + if ( Array.prototype.indexOf ) { + this.indexOf = function( array, searchElement, fromIndex ) { + return array.indexOf( searchElement, fromIndex ); + }; + } else { + this.indexOf = function( array, searchElement, fromIndex ) { + var i, + pivot = ( fromIndex ) ? fromIndex : 0, + length; + if ( !array ) { + throw new TypeError( ); + } + + length = array.length; + if ( length === 0 || pivot >= length ) { + return -1; + } + + if ( pivot < 0 ) { + pivot = length - Math.abs( pivot ); + } + + for ( i = pivot; i < length; i++ ) { + if ( array[i] === searchElement ) { + return i; + } + } + return -1; + }; + } + return this.indexOf( array, searchElement, fromIndex ); + }, + + /** + * Remove the specified CSS class from the element. + * @function + * @param {Element|String} element + * @param {String} className + */ + removeClass: function( element, className ) { + var oldClasses, + newClasses = [], + i; + + element = $.getElement( element ); + oldClasses = element.className.split( /\s+/ ); + for ( i = 0; i < oldClasses.length; i++ ) { + if ( oldClasses[ i ] && oldClasses[ i ] !== className ) { + newClasses.push( oldClasses[ i ] ); + } + } + element.className = newClasses.join(' '); + }, + + + /** + * Adds an event listener for the given element, eventName and handler. + * @function + * @param {Element|String} element + * @param {String} eventName + * @param {Function} handler + * @param {Boolean} [useCapture] + */ + addEvent: (function () { + if ( window.addEventListener ) { + return function ( element, eventName, handler, useCapture ) { + element = $.getElement( element ); + element.addEventListener( eventName, handler, useCapture ); + }; + } else if ( window.attachEvent ) { + return function ( element, eventName, handler, useCapture ) { + element = $.getElement( element ); + element.attachEvent( 'on' + eventName, handler ); + }; + } else { + throw new Error( "No known event model." ); + } + }()), + + + /** + * Remove a given event listener for the given element, event type and + * handler. + * @function + * @param {Element|String} element + * @param {String} eventName + * @param {Function} handler + * @param {Boolean} [useCapture] + */ + removeEvent: (function () { + if ( window.removeEventListener ) { + return function ( element, eventName, handler, useCapture ) { + element = $.getElement( element ); + element.removeEventListener( eventName, handler, useCapture ); + }; + } else if ( window.detachEvent ) { + return function( element, eventName, handler, useCapture ) { + element = $.getElement( element ); + element.detachEvent( 'on' + eventName, handler ); + }; + } else { + throw new Error( "No known event model." ); + } + }()), + + + /** + * Cancels the default browser behavior had the event propagated all + * the way up the DOM to the window object. + * @function + * @param {Event} [event] + */ + cancelEvent: function( event ) { + event = $.getEvent( event ); + + if ( event.preventDefault ) { + $.cancelEvent = function( event ){ + // W3C for preventing default + event.preventDefault(); + }; + } else { + $.cancelEvent = function( event ){ + event = $.getEvent( event ); + // legacy for preventing default + event.cancel = true; + // IE for preventing default + event.returnValue = false; + }; + } + $.cancelEvent( event ); + }, + + + /** + * Stops the propagation of the event up the DOM. + * @function + * @param {Event} [event] + */ + stopEvent: function( event ) { + event = $.getEvent( event ); + + if ( event.stopPropagation ) { + // W3C for stopping propagation + $.stopEvent = function( event ){ + event.stopPropagation(); + }; + } else { + // IE for stopping propagation + $.stopEvent = function( event ){ + event = $.getEvent( event ); + event.cancelBubble = true; + }; + + } + + $.stopEvent( event ); + }, + + + /** + * Similar to OpenSeadragon.delegate, but it does not immediately call + * the method on the object, returning a function which can be called + * repeatedly to delegate the method. It also allows additonal arguments + * to be passed during construction which will be added during each + * invocation, and each invocation can add additional arguments as well. + * + * @function + * @param {Object} object + * @param {Function} method + * @param [args] any additional arguments are passed as arguments to the + * created callback + * @returns {Function} + */ + createCallback: function( object, method ) { + //TODO: This pattern is painful to use and debug. It's much cleaner + // to use pinning plus anonymous functions. Get rid of this + // pattern! + var initialArgs = [], + i; + for ( i = 2; i < arguments.length; i++ ) { + initialArgs.push( arguments[ i ] ); + } + + return function() { + var args = initialArgs.concat( [] ), + i; + for ( i = 0; i < arguments.length; i++ ) { + args.push( arguments[ i ] ); + } + + return method.apply( object, args ); + }; + }, + + + /** + * Retreives the value of a url parameter from the window.location string. + * @function + * @param {String} key + * @returns {String} The value of the url parameter or null if no param matches. + */ + getUrlParameter: function( key ) { + var value = URLPARAMS[ key ]; + return value ? value : null; + }, + + /** + * Retrieves the protocol used by the url. The url can either be absolute + * or relative. + * @function + * @private + * @param {String} url The url to retrieve the protocol from. + * @return {String} The protocol (http:, https:, file:, ftp: ...) + */ + getUrlProtocol: function( url ) { + var match = url.match(/^([a-z]+:)\/\//i); + if ( match === null ) { + // Relative URL, retrive the protocol from window.location + return window.location.protocol; + } + return match[1].toLowerCase(); + }, + + /** + * Create an XHR object + * @private + * @param {type} [local] If set to true, the XHR will be file: protocol + * compatible if possible (but may raise a warning in the browser). + * @returns {XMLHttpRequest} + */ + createAjaxRequest: function( local ) { + // IE11 does not support window.ActiveXObject so we just try to + // create one to see if it is supported. + // See: http://msdn.microsoft.com/en-us/library/ie/dn423948%28v=vs.85%29.aspx + var supportActiveX; + try { + /* global ActiveXObject:true */ + supportActiveX = !!new ActiveXObject( "Microsoft.XMLHTTP" ); + } catch( e ) { + supportActiveX = false; + } + + if ( supportActiveX ) { + if ( window.XMLHttpRequest ) { + $.createAjaxRequest = function( local ) { + if ( local ) { + return new ActiveXObject( "Microsoft.XMLHTTP" ); + } + return new XMLHttpRequest(); + }; + } else { + $.createAjaxRequest = function() { + return new ActiveXObject( "Microsoft.XMLHTTP" ); + }; + } + } else if ( window.XMLHttpRequest ) { + $.createAjaxRequest = function() { + return new XMLHttpRequest(); + }; + } else { + throw new Error( "Browser doesn't support XMLHttpRequest." ); + } + return $.createAjaxRequest( local ); + }, + + /** + * Makes an AJAX request. + * @param {Object} options + * @param {String} options.url - the url to request + * @param {Function} options.success - a function to call on a successful response + * @param {Function} options.error - a function to call on when an error occurs + * @param {Boolean} [options.withCredentials=false] - whether to set the XHR's withCredentials + * @throws {Error} + */ + makeAjaxRequest: function( url, onSuccess, onError ) { + var withCredentials; + + // Note that our preferred API is that you pass in a single object; the named + // arguments are for legacy support. + if( $.isPlainObject( url ) ){ + onSuccess = url.success; + onError = url.error; + withCredentials = url.withCredentials; + url = url.url; + } + + var protocol = $.getUrlProtocol( url ); + var request = $.createAjaxRequest( protocol === "file:" ); + + if ( !$.isFunction( onSuccess ) ) { + throw new Error( "makeAjaxRequest requires a success callback" ); + } + + request.onreadystatechange = function() { + // 4 = DONE (https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest#Properties) + if ( request.readyState == 4 ) { + request.onreadystatechange = function(){}; + + // With protocols other than http/https, the status is 200 + // on Firefox and 0 on other browsers + if ( request.status === 200 || + ( request.status === 0 && + protocol !== "http:" && + protocol !== "https:" )) { + onSuccess( request ); + } else { + $.console.log( "AJAX request returned %d: %s", request.status, url ); + + if ( $.isFunction( onError ) ) { + onError( request ); + } + } + } + }; + + if (withCredentials) { + request.withCredentials = true; + } + + try { + request.open( "GET", url, true ); + request.send( null ); + } catch (e) { + var msg = e.message; + + /* + IE < 10 does not support CORS and an XHR request to a different origin will fail as soon + as send() is called. This is particularly easy to miss during development and appear in + production if you use a CDN or domain sharding and the security policy is likely to break + exception handlers since any attempt to access a property of the request object will + raise an access denied TypeError inside the catch block. + + To be friendlier, we'll check for this specific error and add a documentation pointer + to point developers in the right direction. We test the exception number because IE's + error messages are localized. + */ + var oldIE = $.Browser.vendor == $.BROWSERS.IE && $.Browser.version < 10; + if ( oldIE && typeof( e.number ) != "undefined" && e.number == -2147024891 ) { + msg += "\nSee http://msdn.microsoft.com/en-us/library/ms537505(v=vs.85).aspx#xdomain"; + } + + $.console.log( "%s while making AJAX request: %s", e.name, msg ); + + request.onreadystatechange = function(){}; + + if (window.XDomainRequest) { // IE9 or IE8 might as well try to use XDomainRequest + var xdr = new XDomainRequest(); + if (xdr) { + xdr.onload = function (e) { + if ( $.isFunction( onSuccess ) ) { + onSuccess({ // Faking an xhr object + responseText: xdr.responseText, + status: 200, // XDomainRequest doesn't support status codes, so we just fake one! :/ + statusText: 'OK' + }); + } + }; + xdr.onerror = function (e) { + if ( $.isFunction ( onError ) ) { + onError({ // Faking an xhr object + responseText: xdr.responseText, + status: 444, // 444 No Response + statusText: 'An error happened. Due to an XDomainRequest deficiency we can not extract any information about this error. Upgrade your browser.' + }); + } + }; + try { + xdr.open('GET', url); + xdr.send(); + } catch (e2) { + if ( $.isFunction( onError ) ) { + onError( request, e ); + } + } + } + } else { + if ( $.isFunction( onError ) ) { + onError( request, e ); + } + } + } + }, + + /** + * Taken from jQuery 1.6.1 + * @function + * @param {Object} options + * @param {String} options.url + * @param {Function} options.callback + * @param {String} [options.param='callback'] The name of the url parameter + * to request the jsonp provider with. + * @param {String} [options.callbackName=] The name of the callback to + * request the jsonp provider with. + */ + jsonp: function( options ){ + var script, + url = options.url, + head = document.head || + document.getElementsByTagName( "head" )[ 0 ] || + document.documentElement, + jsonpCallback = options.callbackName || 'openseadragon' + $.now(), + previous = window[ jsonpCallback ], + replace = "$1" + jsonpCallback + "$2", + callbackParam = options.param || 'callback', + callback = options.callback; + + url = url.replace( /(\=)\?(&|$)|\?\?/i, replace ); + // Add callback manually + url += (/\?/.test( url ) ? "&" : "?") + callbackParam + "=" + jsonpCallback; + + // Install callback + window[ jsonpCallback ] = function( response ) { + if ( !previous ){ + try{ + delete window[ jsonpCallback ]; + }catch(e){ + //swallow + } + } else { + window[ jsonpCallback ] = previous; + } + if( callback && $.isFunction( callback ) ){ + callback( response ); + } + }; + + script = document.createElement( "script" ); + + //TODO: having an issue with async info requests + if( undefined !== options.async || false !== options.async ){ + script.async = "async"; + } + + if ( options.scriptCharset ) { + script.charset = options.scriptCharset; + } + + script.src = url; + + // Attach handlers for all browsers + script.onload = script.onreadystatechange = function( _, isAbort ) { + + if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) { + + // Handle memory leak in IE + script.onload = script.onreadystatechange = null; + + // Remove the script + if ( head && script.parentNode ) { + head.removeChild( script ); + } + + // Dereference the script + script = undefined; + } + }; + // Use insertBefore instead of appendChild to circumvent an IE6 bug. + // This arises when a base node is used (#2709 and #4378). + head.insertBefore( script, head.firstChild ); + + }, + + + /** + * Fully deprecated. Will throw an error. + * @function + * @deprecated use {@link OpenSeadragon.Viewer#open} + */ + createFromDZI: function() { + throw "OpenSeadragon.createFromDZI is deprecated, use Viewer.open."; + }, + + /** + * Parses an XML string into a DOM Document. + * @function + * @param {String} string + * @returns {Document} + */ + parseXml: function( string ) { + if ( window.DOMParser ) { + + $.parseXml = function( string ) { + var xmlDoc = null, + parser; + + parser = new DOMParser(); + xmlDoc = parser.parseFromString( string, "text/xml" ); + return xmlDoc; + }; + + } else if ( window.ActiveXObject ) { + + $.parseXml = function( string ) { + var xmlDoc = null; + + xmlDoc = new ActiveXObject( "Microsoft.XMLDOM" ); + xmlDoc.async = false; + xmlDoc.loadXML( string ); + return xmlDoc; + }; + + } else { + throw new Error( "Browser doesn't support XML DOM." ); + } + + return $.parseXml( string ); + }, + + /** + * Parses a JSON string into a Javascript object. + * @function + * @param {String} string + * @returns {Object} + */ + parseJSON: function(string) { + if (window.JSON && window.JSON.parse) { + $.parseJSON = window.JSON.parse; + } else { + // Should only be used by IE8 in non standards mode + $.parseJSON = function(string) { + /*jshint evil:true*/ + return eval('(' + string + ')'); + }; + } + return $.parseJSON(string); + }, + + /** + * Reports whether the image format is supported for tiling in this + * version. + * @function + * @param {String} [extension] + * @returns {Boolean} + */ + imageFormatSupported: function( extension ) { + extension = extension ? extension : ""; + return !!FILEFORMATS[ extension.toLowerCase() ]; + } + + }); + + + /** + * The current browser vendor, version, and related information regarding detected features. + * @member {Object} Browser + * @memberof OpenSeadragon + * @static + * @type {Object} + * @property {OpenSeadragon.BROWSERS} vendor - One of the {@link OpenSeadragon.BROWSERS} enumeration values. + * @property {Number} version + * @property {Boolean} alpha - Does the browser support image alpha transparency. + */ + $.Browser = { + vendor: $.BROWSERS.UNKNOWN, + version: 0, + alpha: true + }; + + + var FILEFORMATS = { + "bmp": false, + "jpeg": true, + "jpg": true, + "png": true, + "tif": false, + "wdp": false + }, + URLPARAMS = {}; + + (function() { + //A small auto-executing routine to determine the browser vendor, + //version and supporting feature sets. + var app = navigator.appName, + ver = navigator.appVersion, + ua = navigator.userAgent, + regex; + + //console.error( 'appName: ' + navigator.appName ); + //console.error( 'appVersion: ' + navigator.appVersion ); + //console.error( 'userAgent: ' + navigator.userAgent ); + + switch( navigator.appName ){ + case "Microsoft Internet Explorer": + if( !!window.attachEvent && + !!window.ActiveXObject ) { + + $.Browser.vendor = $.BROWSERS.IE; + $.Browser.version = parseFloat( + ua.substring( + ua.indexOf( "MSIE" ) + 5, + ua.indexOf( ";", ua.indexOf( "MSIE" ) ) ) + ); + } + break; + case "Netscape": + if( !!window.addEventListener ){ + if ( ua.indexOf( "Firefox" ) >= 0 ) { + $.Browser.vendor = $.BROWSERS.FIREFOX; + $.Browser.version = parseFloat( + ua.substring( ua.indexOf( "Firefox" ) + 8 ) + ); + } else if ( ua.indexOf( "Safari" ) >= 0 ) { + $.Browser.vendor = ua.indexOf( "Chrome" ) >= 0 ? + $.BROWSERS.CHROME : + $.BROWSERS.SAFARI; + $.Browser.version = parseFloat( + ua.substring( + ua.substring( 0, ua.indexOf( "Safari" ) ).lastIndexOf( "/" ) + 1, + ua.indexOf( "Safari" ) + ) + ); + } else { + regex = new RegExp( "Trident/.*rv:([0-9]{1,}[.0-9]{0,})"); + if ( regex.exec( ua ) !== null ) { + $.Browser.vendor = $.BROWSERS.IE; + $.Browser.version = parseFloat( RegExp.$1 ); + } + } + } + break; + case "Opera": + $.Browser.vendor = $.BROWSERS.OPERA; + $.Browser.version = parseFloat( ver ); + break; + } + + // ignore '?' portion of query string + var query = window.location.search.substring( 1 ), + parts = query.split('&'), + part, + sep, + i; + + for ( i = 0; i < parts.length; i++ ) { + part = parts[ i ]; + sep = part.indexOf( '=' ); + + if ( sep > 0 ) { + URLPARAMS[ part.substring( 0, sep ) ] = + decodeURIComponent( part.substring( sep + 1 ) ); + } + } + + //determine if this browser supports image alpha transparency + $.Browser.alpha = !( + ( + $.Browser.vendor == $.BROWSERS.IE && + $.Browser.version < 9 + ) || ( + $.Browser.vendor == $.BROWSERS.CHROME && + $.Browser.version < 2 + ) + ); + + //determine if this browser supports element.style.opacity + $.Browser.opacity = !( + $.Browser.vendor == $.BROWSERS.IE && + $.Browser.version < 9 + ); + + })(); + + + //TODO: $.console is often used inside a try/catch block which generally + // prevents allowings errors to occur with detection until a debugger + // is attached. Although I've been guilty of the same anti-pattern + // I eventually was convinced that errors should naturally propogate in + // all but the most special cases. + /** + * A convenient alias for console when available, and a simple null + * function when console is unavailable. + * @static + * @private + */ + var nullfunction = function( msg ){ + //document.location.hash = msg; + }; + + $.console = window.console || { + log: nullfunction, + debug: nullfunction, + info: nullfunction, + warn: nullfunction, + error: nullfunction, + assert: nullfunction + }; + + + // Adding support for HTML5's requestAnimationFrame as suggested by acdha. + // Implementation taken from matt synder's post here: + // http://mattsnider.com/cross-browser-and-legacy-supported-requestframeanimation/ + (function( w ) { + + // most browsers have an implementation + var requestAnimationFrame = w.requestAnimationFrame || + w.mozRequestAnimationFrame || + w.webkitRequestAnimationFrame || + w.msRequestAnimationFrame; + + var cancelAnimationFrame = w.cancelAnimationFrame || + w.mozCancelAnimationFrame || + w.webkitCancelAnimationFrame || + w.msCancelAnimationFrame; + + // polyfill, when necessary + if ( requestAnimationFrame && cancelAnimationFrame ) { + // We can't assign these window methods directly to $ because they + // expect their "this" to be "window", so we call them in wrappers. + $.requestAnimationFrame = function(){ + return requestAnimationFrame.apply( w, arguments ); + }; + $.cancelAnimationFrame = function(){ + return cancelAnimationFrame.apply( w, arguments ); + }; + } else { + var aAnimQueue = [], + processing = [], + iRequestId = 0, + iIntervalId; + + // create a mock requestAnimationFrame function + $.requestAnimationFrame = function( callback ) { + aAnimQueue.push( [ ++iRequestId, callback ] ); + + if ( !iIntervalId ) { + iIntervalId = setInterval( function() { + if ( aAnimQueue.length ) { + var time = $.now(); + // Process all of the currently outstanding frame + // requests, but none that get added during the + // processing. + // Swap the arrays so we don't have to create a new + // array every frame. + var temp = processing; + processing = aAnimQueue; + aAnimQueue = temp; + while ( processing.length ) { + processing.shift()[ 1 ]( time ); + } + } else { + // don't continue the interval, if unnecessary + clearInterval( iIntervalId ); + iIntervalId = undefined; + } + }, 1000 / 50); // estimating support for 50 frames per second + } + + return iRequestId; + }; + + // create a mock cancelAnimationFrame function + $.cancelAnimationFrame = function( requestId ) { + // find the request ID and remove it + var i, j; + for ( i = 0, j = aAnimQueue.length; i < j; i += 1 ) { + if ( aAnimQueue[ i ][ 0 ] === requestId ) { + aAnimQueue.splice( i, 1 ); + return; + } + } + + // If it's not in the queue, it may be in the set we're currently + // processing (if cancelAnimationFrame is called from within a + // requestAnimationFrame callback). + for ( i = 0, j = processing.length; i < j; i += 1 ) { + if ( processing[ i ][ 0 ] === requestId ) { + processing.splice( i, 1 ); + return; + } + } + }; + } + })( window ); + + /** + * @private + * @inner + * @function + * @param {Element} element + * @param {Boolean} [isFixed] + * @returns {Element} + */ + function getOffsetParent( element, isFixed ) { + if ( isFixed && element != document.body ) { + return document.body; + } else { + return element.offsetParent; + } + } + +}(OpenSeadragon)); + +/* + * OpenSeadragon - full-screen support functions + * + * Copyright (C) 2009 CodePlex Foundation + * Copyright (C) 2010-2013 OpenSeadragon contributors + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of CodePlex Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +(function( $ ) { + /** + * Determine native full screen support we can get from the browser. + * @member fullScreenApi + * @memberof OpenSeadragon + * @type {object} + * @property {Boolean} supportsFullScreen Return true if full screen API is supported. + * @property {Function} isFullScreen Return true if currently in full screen mode. + * @property {Function} getFullScreenElement Return the element currently in full screen mode. + * @property {Function} requestFullScreen Make a request to go in full screen mode. + * @property {Function} exitFullScreen Make a request to exit full screen mode. + * @property {Function} cancelFullScreen Deprecated, use exitFullScreen instead. + * @property {String} fullScreenEventName Event fired when the full screen mode change. + * @property {String} fullScreenErrorEventName Event fired when a request to go + * in full screen mode failed. + */ + var fullScreenApi = { + supportsFullScreen: false, + isFullScreen: function() { return false; }, + getFullScreenElement: function() { return null; }, + requestFullScreen: function() {}, + exitFullScreen: function() {}, + cancelFullScreen: function() {}, + fullScreenEventName: '', + fullScreenErrorEventName: '' + }; + + // check for native support + if ( document.exitFullscreen ) { + // W3C standard + fullScreenApi.supportsFullScreen = true; + fullScreenApi.getFullScreenElement = function() { + return document.fullscreenElement; + }; + fullScreenApi.requestFullScreen = function( element ) { + return element.requestFullscreen(); + }; + fullScreenApi.exitFullScreen = function() { + document.exitFullscreen(); + }; + fullScreenApi.fullScreenEventName = "fullscreenchange"; + fullScreenApi.fullScreenErrorEventName = "fullscreenerror"; + } else if ( document.msExitFullscreen ) { + // IE 11 + fullScreenApi.supportsFullScreen = true; + fullScreenApi.getFullScreenElement = function() { + return document.msFullscreenElement; + }; + fullScreenApi.requestFullScreen = function( element ) { + return element.msRequestFullscreen(); + }; + fullScreenApi.exitFullScreen = function() { + document.msExitFullscreen(); + }; + fullScreenApi.fullScreenEventName = "MSFullscreenChange"; + fullScreenApi.fullScreenErrorEventName = "MSFullscreenError"; + } else if ( document.webkitExitFullscreen ) { + // Recent webkit + fullScreenApi.supportsFullScreen = true; + fullScreenApi.getFullScreenElement = function() { + return document.webkitFullscreenElement; + }; + fullScreenApi.requestFullScreen = function( element ) { + return element.webkitRequestFullscreen(); + }; + fullScreenApi.exitFullScreen = function() { + document.webkitExitFullscreen(); + }; + fullScreenApi.fullScreenEventName = "webkitfullscreenchange"; + fullScreenApi.fullScreenErrorEventName = "webkitfullscreenerror"; + } else if ( document.webkitCancelFullScreen ) { + // Old webkit + fullScreenApi.supportsFullScreen = true; + fullScreenApi.getFullScreenElement = function() { + return document.webkitCurrentFullScreenElement; + }; + fullScreenApi.requestFullScreen = function( element ) { + return element.webkitRequestFullScreen(); + }; + fullScreenApi.exitFullScreen = function() { + document.webkitCancelFullScreen(); + }; + fullScreenApi.fullScreenEventName = "webkitfullscreenchange"; + fullScreenApi.fullScreenErrorEventName = "webkitfullscreenerror"; + } else if ( document.mozCancelFullScreen ) { + // Firefox + fullScreenApi.supportsFullScreen = true; + fullScreenApi.getFullScreenElement = function() { + return document.mozFullScreenElement; + }; + fullScreenApi.requestFullScreen = function( element ) { + return element.mozRequestFullScreen(); + }; + fullScreenApi.exitFullScreen = function() { + document.mozCancelFullScreen(); + }; + fullScreenApi.fullScreenEventName = "mozfullscreenchange"; + fullScreenApi.fullScreenErrorEventName = "mozfullscreenerror"; + } + fullScreenApi.isFullScreen = function() { + return fullScreenApi.getFullScreenElement() !== null; + }; + fullScreenApi.cancelFullScreen = function() { + $.console.error("cancelFullScreen is deprecated. Use exitFullScreen instead."); + fullScreenApi.exitFullScreen(); + }; + + // export api + $.extend( $, fullScreenApi ); + +})( OpenSeadragon ); + +/* + * OpenSeadragon - EventSource + * + * Copyright (C) 2009 CodePlex Foundation + * Copyright (C) 2010-2013 OpenSeadragon contributors + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of CodePlex Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +(function($){ + +/** + * Event handler method signature used by all OpenSeadragon events. + * + * @callback EventHandler + * @memberof OpenSeadragon + * @param {Object} event - See individual events for event-specific properties. + */ + + +/** + * @class EventSource + * @classdesc For use by classes which want to support custom, non-browser events. + * + * @memberof OpenSeadragon + */ +$.EventSource = function() { + this.events = {}; +}; + +/** @lends OpenSeadragon.EventSource.prototype */ +$.EventSource.prototype = { + + /** + * Add an event handler to be triggered only once (or a given number of times) + * for a given event. + * @function + * @param {String} eventName - Name of event to register. + * @param {OpenSeadragon.EventHandler} handler - Function to call when event + * is triggered. + * @param {Object} [userData=null] - Arbitrary object to be passed unchanged + * to the handler. + * @param {Number} [times=1] - The number of times to handle the event + * before removing it. + */ + addOnceHandler: function(eventName, handler, userData, times) { + var self = this; + times = times || 1; + var count = 0; + var onceHandler = function(event) { + count++; + if (count === times) { + self.removeHandler(eventName, onceHandler); + } + handler(event); + }; + this.addHandler(eventName, onceHandler, userData); + }, + + /** + * Add an event handler for a given event. + * @function + * @param {String} eventName - Name of event to register. + * @param {OpenSeadragon.EventHandler} handler - Function to call when event is triggered. + * @param {Object} [userData=null] - Arbitrary object to be passed unchanged to the handler. + */ + addHandler: function ( eventName, handler, userData ) { + var events = this.events[ eventName ]; + if ( !events ) { + this.events[ eventName ] = events = []; + } + if ( handler && $.isFunction( handler ) ) { + events[ events.length ] = { handler: handler, userData: userData || null }; + } + }, + + /** + * Remove a specific event handler for a given event. + * @function + * @param {String} eventName - Name of event for which the handler is to be removed. + * @param {OpenSeadragon.EventHandler} handler - Function to be removed. + */ + removeHandler: function ( eventName, handler ) { + var events = this.events[ eventName ], + handlers = [], + i; + if ( !events ) { + return; + } + if ( $.isArray( events ) ) { + for ( i = 0; i < events.length; i++ ) { + if ( events[i].handler !== handler ) { + handlers.push( events[ i ] ); + } + } + this.events[ eventName ] = handlers; + } + }, + + + /** + * Remove all event handlers for a given event type. If no type is given all + * event handlers for every event type are removed. + * @function + * @param {String} eventName - Name of event for which all handlers are to be removed. + */ + removeAllHandlers: function( eventName ) { + if ( eventName ){ + this.events[ eventName ] = []; + } else{ + for ( var eventType in this.events ) { + this.events[ eventType ] = []; + } + } + }, + + /** + * Get a function which iterates the list of all handlers registered for a given event, calling the handler for each. + * @function + * @param {String} eventName - Name of event to get handlers for. + */ + getHandler: function ( eventName ) { + var events = this.events[ eventName ]; + if ( !events || !events.length ) { + return null; + } + events = events.length === 1 ? + [ events[ 0 ] ] : + Array.apply( null, events ); + return function ( source, args ) { + var i, + length = events.length; + for ( i = 0; i < length; i++ ) { + if ( events[ i ] ) { + args.eventSource = source; + args.userData = events[ i ].userData; + events[ i ].handler( args ); + } + } + }; + }, + + /** + * Trigger an event, optionally passing additional information. + * @function + * @param {String} eventName - Name of event to register. + * @param {Object} eventArgs - Event-specific data. + */ + raiseEvent: function( eventName, eventArgs ) { + //uncomment if you want to get a log of all events + //$.console.log( eventName ); + var handler = this.getHandler( eventName ); + + if ( handler ) { + if ( !eventArgs ) { + eventArgs = {}; + } + + handler( this, eventArgs ); + } + } +}; + +}( OpenSeadragon )); + +/* + * OpenSeadragon - MouseTracker + * + * Copyright (C) 2009 CodePlex Foundation + * Copyright (C) 2010-2013 OpenSeadragon contributors + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of CodePlex Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +(function ( $ ) { + + // All MouseTracker instances + var MOUSETRACKERS = []; + + // dictionary from hash to private properties + var THIS = {}; + + + /** + * @class MouseTracker + * @classdesc Provides simplified handling of common pointer device (mouse, touch, pen, etc.) gestures + * and keyboard events on a specified element. + * @memberof OpenSeadragon + * @param {Object} options + * Allows configurable properties to be entirely specified by passing + * an options object to the constructor. The constructor also supports + * the original positional arguments 'element', 'clickTimeThreshold', + * and 'clickDistThreshold' in that order. + * @param {Element|String} options.element + * A reference to an element or an element id for which the pointer/key + * events will be monitored. + * @param {Boolean} [options.startDisabled=false] + * If true, event tracking on the element will not start until + * {@link OpenSeadragon.MouseTracker.setTracking|setTracking} is called. + * @param {Number} options.clickTimeThreshold + * The number of milliseconds within which a pointer down-up event combination + * will be treated as a click gesture. + * @param {Number} options.clickDistThreshold + * The maximum distance allowed between a pointer down event and a pointer up event + * to be treated as a click gesture. + * @param {Number} options.dblClickTimeThreshold + * The number of milliseconds within which two pointer down-up event combinations + * will be treated as a double-click gesture. + * @param {Number} options.dblClickDistThreshold + * The maximum distance allowed between two pointer click events + * to be treated as a click gesture. + * @param {Number} [options.stopDelay=50] + * The number of milliseconds without pointer move before the stop + * event is fired. + * @param {OpenSeadragon.EventHandler} [options.enterHandler=null] + * An optional handler for pointer enter. + * @param {OpenSeadragon.EventHandler} [options.exitHandler=null] + * An optional handler for pointer exit. + * @param {OpenSeadragon.EventHandler} [options.pressHandler=null] + * An optional handler for pointer press. + * @param {OpenSeadragon.EventHandler} [options.nonPrimaryPressHandler=null] + * An optional handler for pointer non-primary button press. + * @param {OpenSeadragon.EventHandler} [options.releaseHandler=null] + * An optional handler for pointer release. + * @param {OpenSeadragon.EventHandler} [options.nonPrimaryReleaseHandler=null] + * An optional handler for pointer non-primary button release. + * @param {OpenSeadragon.EventHandler} [options.moveHandler=null] + * An optional handler for pointer move. + * @param {OpenSeadragon.EventHandler} [options.scrollHandler=null] + * An optional handler for mouse wheel scroll. + * @param {OpenSeadragon.EventHandler} [options.clickHandler=null] + * An optional handler for pointer click. + * @param {OpenSeadragon.EventHandler} [options.dblClickHandler=null] + * An optional handler for pointer double-click. + * @param {OpenSeadragon.EventHandler} [options.dragHandler=null] + * An optional handler for the drag gesture. + * @param {OpenSeadragon.EventHandler} [options.dragEndHandler=null] + * An optional handler for after a drag gesture. + * @param {OpenSeadragon.EventHandler} [options.pinchHandler=null] + * An optional handler for the pinch gesture. + * @param {OpenSeadragon.EventHandler} [options.keyDownHandler=null] + * An optional handler for keydown. + * @param {OpenSeadragon.EventHandler} [options.keyUpHandler=null] + * An optional handler for keyup. + * @param {OpenSeadragon.EventHandler} [options.keyHandler=null] + * An optional handler for keypress. + * @param {OpenSeadragon.EventHandler} [options.focusHandler=null] + * An optional handler for focus. + * @param {OpenSeadragon.EventHandler} [options.blurHandler=null] + * An optional handler for blur. + * @param {Object} [options.userData=null] + * Arbitrary object to be passed unchanged to any attached handler methods. + */ + $.MouseTracker = function ( options ) { + + MOUSETRACKERS.push( this ); + + var args = arguments; + + if ( !$.isPlainObject( options ) ) { + options = { + element: args[ 0 ], + clickTimeThreshold: args[ 1 ], + clickDistThreshold: args[ 2 ] + }; + } + + this.hash = Math.random(); // An unique hash for this tracker. + /** + * The element for which pointer events are being monitored. + * @member {Element} element + * @memberof OpenSeadragon.MouseTracker# + */ + this.element = $.getElement( options.element ); + /** + * The number of milliseconds within which a pointer down-up event combination + * will be treated as a click gesture. + * @member {Number} clickTimeThreshold + * @memberof OpenSeadragon.MouseTracker# + */ + this.clickTimeThreshold = options.clickTimeThreshold || $.DEFAULT_SETTINGS.clickTimeThreshold; + /** + * The maximum distance allowed between a pointer down event and a pointer up event + * to be treated as a click gesture. + * @member {Number} clickDistThreshold + * @memberof OpenSeadragon.MouseTracker# + */ + this.clickDistThreshold = options.clickDistThreshold || $.DEFAULT_SETTINGS.clickDistThreshold; + /** + * The number of milliseconds within which two pointer down-up event combinations + * will be treated as a double-click gesture. + * @member {Number} dblClickTimeThreshold + * @memberof OpenSeadragon.MouseTracker# + */ + this.dblClickTimeThreshold = options.dblClickTimeThreshold || $.DEFAULT_SETTINGS.dblClickTimeThreshold; + /** + * The maximum distance allowed between two pointer click events + * to be treated as a click gesture. + * @member {Number} clickDistThreshold + * @memberof OpenSeadragon.MouseTracker# + */ + this.dblClickDistThreshold = options.dblClickDistThreshold || $.DEFAULT_SETTINGS.dblClickDistThreshold; + this.userData = options.userData || null; + this.stopDelay = options.stopDelay || 50; + + this.enterHandler = options.enterHandler || null; + this.exitHandler = options.exitHandler || null; + this.pressHandler = options.pressHandler || null; + this.nonPrimaryPressHandler = options.nonPrimaryPressHandler || null; + this.releaseHandler = options.releaseHandler || null; + this.nonPrimaryReleaseHandler = options.nonPrimaryReleaseHandler || null; + this.moveHandler = options.moveHandler || null; + this.scrollHandler = options.scrollHandler || null; + this.clickHandler = options.clickHandler || null; + this.dblClickHandler = options.dblClickHandler || null; + this.dragHandler = options.dragHandler || null; + this.dragEndHandler = options.dragEndHandler || null; + this.pinchHandler = options.pinchHandler || null; + this.stopHandler = options.stopHandler || null; + this.keyDownHandler = options.keyDownHandler || null; + this.keyUpHandler = options.keyUpHandler || null; + this.keyHandler = options.keyHandler || null; + this.focusHandler = options.focusHandler || null; + this.blurHandler = options.blurHandler || null; + + //Store private properties in a scope sealed hash map + var _this = this; + + /** + * @private + * @property {Boolean} tracking + * Are we currently tracking pointer events for this element. + */ + THIS[ this.hash ] = { + click: function ( event ) { onClick( _this, event ); }, + dblclick: function ( event ) { onDblClick( _this, event ); }, + keydown: function ( event ) { onKeyDown( _this, event ); }, + keyup: function ( event ) { onKeyUp( _this, event ); }, + keypress: function ( event ) { onKeyPress( _this, event ); }, + focus: function ( event ) { onFocus( _this, event ); }, + blur: function ( event ) { onBlur( _this, event ); }, + + wheel: function ( event ) { onWheel( _this, event ); }, + mousewheel: function ( event ) { onMouseWheel( _this, event ); }, + DOMMouseScroll: function ( event ) { onMouseWheel( _this, event ); }, + MozMousePixelScroll: function ( event ) { onMouseWheel( _this, event ); }, + + mouseenter: function ( event ) { onMouseEnter( _this, event ); }, // Used on IE8 only + mouseleave: function ( event ) { onMouseLeave( _this, event ); }, // Used on IE8 only + mouseover: function ( event ) { onMouseOver( _this, event ); }, + mouseout: function ( event ) { onMouseOut( _this, event ); }, + mousedown: function ( event ) { onMouseDown( _this, event ); }, + mouseup: function ( event ) { onMouseUp( _this, event ); }, + mouseupcaptured: function ( event ) { onMouseUpCaptured( _this, event ); }, + mousemove: function ( event ) { onMouseMove( _this, event ); }, + mousemovecaptured: function ( event ) { onMouseMoveCaptured( _this, event ); }, + + touchstart: function ( event ) { onTouchStart( _this, event ); }, + touchend: function ( event ) { onTouchEnd( _this, event ); }, + touchendcaptured: function ( event ) { onTouchEndCaptured( _this, event ); }, + touchmove: function ( event ) { onTouchMove( _this, event ); }, + touchmovecaptured: function ( event ) { onTouchMoveCaptured( _this, event ); }, + touchcancel: function ( event ) { onTouchCancel( _this, event ); }, + + gesturestart: function ( event ) { onGestureStart( _this, event ); }, + gesturechange: function ( event ) { onGestureChange( _this, event ); }, + + pointerover: function ( event ) { onPointerOver( _this, event ); }, + MSPointerOver: function ( event ) { onPointerOver( _this, event ); }, + pointerout: function ( event ) { onPointerOut( _this, event ); }, + MSPointerOut: function ( event ) { onPointerOut( _this, event ); }, + pointerdown: function ( event ) { onPointerDown( _this, event ); }, + MSPointerDown: function ( event ) { onPointerDown( _this, event ); }, + pointerup: function ( event ) { onPointerUp( _this, event ); }, + MSPointerUp: function ( event ) { onPointerUp( _this, event ); }, + pointermove: function ( event ) { onPointerMove( _this, event ); }, + MSPointerMove: function ( event ) { onPointerMove( _this, event ); }, + pointercancel: function ( event ) { onPointerCancel( _this, event ); }, + MSPointerCancel: function ( event ) { onPointerCancel( _this, event ); }, + pointerupcaptured: function ( event ) { onPointerUpCaptured( _this, event ); }, + pointermovecaptured: function ( event ) { onPointerMoveCaptured( _this, event ); }, + + tracking: false, + + // Active pointers lists. Array of GesturePointList objects, one for each pointer device type. + // GesturePointList objects are added each time a pointer is tracked by a new pointer device type (see getActivePointersListByType()). + // Active pointers are any pointer being tracked for this element which are in the hit-test area + // of the element (for hover-capable devices) and/or have contact or a button press initiated in the element. + activePointersLists: [], + + // Tracking for double-click gesture + lastClickPos: null, + dblClickTimeOut: null, + + // Tracking for pinch gesture + pinchGPoints: [], + lastPinchDist: 0, + currentPinchDist: 0, + lastPinchCenter: null, + currentPinchCenter: null + }; + + if ( !options.startDisabled ) { + this.setTracking( true ); + } + }; + + /** @lends OpenSeadragon.MouseTracker.prototype */ + $.MouseTracker.prototype = { + + /** + * Clean up any events or objects created by the tracker. + * @function + */ + destroy: function () { + var i; + + stopTracking( this ); + this.element = null; + + for ( i = 0; i < MOUSETRACKERS.length; i++ ) { + if ( MOUSETRACKERS[ i ] === this ) { + MOUSETRACKERS.splice( i, 1 ); + break; + } + } + + THIS[ this.hash ] = null; + delete THIS[ this.hash ]; + }, + + /** + * Are we currently tracking events on this element. + * @deprecated Just use this.tracking + * @function + * @returns {Boolean} Are we currently tracking events on this element. + */ + isTracking: function () { + return THIS[ this.hash ].tracking; + }, + + /** + * Enable or disable whether or not we are tracking events on this element. + * @function + * @param {Boolean} track True to start tracking, false to stop tracking. + * @returns {OpenSeadragon.MouseTracker} Chainable. + */ + setTracking: function ( track ) { + if ( track ) { + startTracking( this ); + } else { + stopTracking( this ); + } + //chain + return this; + }, + + /** + * Returns the {@link OpenSeadragon.MouseTracker.GesturePointList|GesturePointList} for the given pointer device type, + * creating and caching a new {@link OpenSeadragon.MouseTracker.GesturePointList|GesturePointList} if one doesn't already exist for the type. + * @function + * @param {String} type - The pointer device type: "mouse", "touch", "pen", etc. + * @returns {OpenSeadragon.MouseTracker.GesturePointList} + */ + getActivePointersListByType: function ( type ) { + var delegate = THIS[ this.hash ], + i, + len = delegate.activePointersLists.length, + list; + + for ( i = 0; i < len; i++ ) { + if ( delegate.activePointersLists[ i ].type === type ) { + return delegate.activePointersLists[ i ]; + } + } + + list = new $.MouseTracker.GesturePointList( type ); + delegate.activePointersLists.push( list ); + return list; + }, + + /** + * Returns the total number of pointers currently active on the tracked element. + * @function + * @returns {Number} + */ + getActivePointerCount: function () { + var delegate = THIS[ this.hash ], + i, + len = delegate.activePointersLists.length, + count = 0; + + for ( i = 0; i < len; i++ ) { + count += delegate.activePointersLists[ i ].getLength(); + } + + return count; + }, + + /** + * Implement or assign implementation to these handlers during or after + * calling the constructor. + * @function + * @param {Object} event + * @param {OpenSeadragon.MouseTracker} event.eventSource + * A reference to the tracker instance. + * @param {String} event.pointerType + * "mouse", "touch", "pen", etc. + * @param {OpenSeadragon.Point} event.position + * The position of the event relative to the tracked element. + * @param {Number} event.buttons + * Current buttons pressed. + * Combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser. + * @param {Number} event.pointers + * Number of pointers (all types) active in the tracked element. + * @param {Boolean} event.insideElementPressed + * True if the left mouse button is currently being pressed and was + * initiated inside the tracked element, otherwise false. + * @param {Boolean} event.buttonDownAny + * Was the button down anywhere in the screen during the event. Deprecated. Use buttons instead. + * @param {Boolean} event.isTouchEvent + * True if the original event is a touch event, otherwise false. Deprecated. Use pointerType and/or originalEvent instead. + * @param {Object} event.originalEvent + * The original event object. + * @param {Boolean} event.preventDefaultAction + * Set to true to prevent the tracker subscriber from performing its default action (subscriber implementation dependent). Default: false. + * @param {Object} event.userData + * Arbitrary user-defined object. + */ + enterHandler: function () { }, + + /** + * Implement or assign implementation to these handlers during or after + * calling the constructor. + * @function + * @param {Object} event + * @param {OpenSeadragon.MouseTracker} event.eventSource + * A reference to the tracker instance. + * @param {String} event.pointerType + * "mouse", "touch", "pen", etc. + * @param {OpenSeadragon.Point} event.position + * The position of the event relative to the tracked element. + * @param {Number} event.buttons + * Current buttons pressed. + * Combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser. + * @param {Number} event.pointers + * Number of pointers (all types) active in the tracked element. + * @param {Boolean} event.insideElementPressed + * True if the left mouse button is currently being pressed and was + * initiated inside the tracked element, otherwise false. + * @param {Boolean} event.buttonDownAny + * Was the button down anywhere in the screen during the event. Deprecated. Use buttons instead. + * @param {Boolean} event.isTouchEvent + * True if the original event is a touch event, otherwise false. Deprecated. Use pointerType and/or originalEvent instead. + * @param {Object} event.originalEvent + * The original event object. + * @param {Boolean} event.preventDefaultAction + * Set to true to prevent the tracker subscriber from performing its default action (subscriber implementation dependent). Default: false. + * @param {Object} event.userData + * Arbitrary user-defined object. + */ + exitHandler: function () { }, + + /** + * Implement or assign implementation to these handlers during or after + * calling the constructor. + * @function + * @param {Object} event + * @param {OpenSeadragon.MouseTracker} event.eventSource + * A reference to the tracker instance. + * @param {String} event.pointerType + * "mouse", "touch", "pen", etc. + * @param {OpenSeadragon.Point} event.position + * The position of the event relative to the tracked element. + * @param {Number} event.buttons + * Current buttons pressed. + * Combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser. + * @param {Boolean} event.isTouchEvent + * True if the original event is a touch event, otherwise false. Deprecated. Use pointerType and/or originalEvent instead. + * @param {Object} event.originalEvent + * The original event object. + * @param {Boolean} event.preventDefaultAction + * Set to true to prevent the tracker subscriber from performing its default action (subscriber implementation dependent). Default: false. + * @param {Object} event.userData + * Arbitrary user-defined object. + */ + pressHandler: function () { }, + + /** + * Implement or assign implementation to these handlers during or after + * calling the constructor. + * @function + * @param {Object} event + * @param {OpenSeadragon.MouseTracker} event.eventSource + * A reference to the tracker instance. + * @param {String} event.pointerType + * "mouse", "touch", "pen", etc. + * @param {OpenSeadragon.Point} event.position + * The position of the event relative to the tracked element. + * @param {Number} event.button + * Button which caused the event. + * -1: none, 0: primary/left, 1: aux/middle, 2: secondary/right, 3: X1/back, 4: X2/forward, 5: pen eraser. + * @param {Number} event.buttons + * Current buttons pressed. + * Combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser. + * @param {Boolean} event.isTouchEvent + * True if the original event is a touch event, otherwise false. Deprecated. Use pointerType and/or originalEvent instead. + * @param {Object} event.originalEvent + * The original event object. + * @param {Boolean} event.preventDefaultAction + * Set to true to prevent the tracker subscriber from performing its default action (subscriber implementation dependent). Default: false. + * @param {Object} event.userData + * Arbitrary user-defined object. + */ + nonPrimaryPressHandler: function () { }, + + /** + * Implement or assign implementation to these handlers during or after + * calling the constructor. + * @function + * @param {Object} event + * @param {OpenSeadragon.MouseTracker} event.eventSource + * A reference to the tracker instance. + * @param {String} event.pointerType + * "mouse", "touch", "pen", etc. + * @param {OpenSeadragon.Point} event.position + * The position of the event relative to the tracked element. + * @param {Number} event.buttons + * Current buttons pressed. + * Combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser. + * @param {Boolean} event.insideElementPressed + * True if the left mouse button is currently being pressed and was + * initiated inside the tracked element, otherwise false. + * @param {Boolean} event.insideElementReleased + * True if the cursor inside the tracked element when the button was released. + * @param {Boolean} event.isTouchEvent + * True if the original event is a touch event, otherwise false. Deprecated. Use pointerType and/or originalEvent instead. + * @param {Object} event.originalEvent + * The original event object. + * @param {Boolean} event.preventDefaultAction + * Set to true to prevent the tracker subscriber from performing its default action (subscriber implementation dependent). Default: false. + * @param {Object} event.userData + * Arbitrary user-defined object. + */ + releaseHandler: function () { }, + + /** + * Implement or assign implementation to these handlers during or after + * calling the constructor. + * @function + * @param {Object} event + * @param {OpenSeadragon.MouseTracker} event.eventSource + * A reference to the tracker instance. + * @param {String} event.pointerType + * "mouse", "touch", "pen", etc. + * @param {OpenSeadragon.Point} event.position + * The position of the event relative to the tracked element. + * @param {Number} event.button + * Button which caused the event. + * -1: none, 0: primary/left, 1: aux/middle, 2: secondary/right, 3: X1/back, 4: X2/forward, 5: pen eraser. + * @param {Number} event.buttons + * Current buttons pressed. + * Combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser. + * @param {Boolean} event.isTouchEvent + * True if the original event is a touch event, otherwise false. Deprecated. Use pointerType and/or originalEvent instead. + * @param {Object} event.originalEvent + * The original event object. + * @param {Boolean} event.preventDefaultAction + * Set to true to prevent the tracker subscriber from performing its default action (subscriber implementation dependent). Default: false. + * @param {Object} event.userData + * Arbitrary user-defined object. + */ + nonPrimaryReleaseHandler: function () { }, + + /** + * Implement or assign implementation to these handlers during or after + * calling the constructor. + * @function + * @param {Object} event + * @param {OpenSeadragon.MouseTracker} event.eventSource + * A reference to the tracker instance. + * @param {String} event.pointerType + * "mouse", "touch", "pen", etc. + * @param {OpenSeadragon.Point} event.position + * The position of the event relative to the tracked element. + * @param {Number} event.buttons + * Current buttons pressed. + * Combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser. + * @param {Boolean} event.isTouchEvent + * True if the original event is a touch event, otherwise false. Deprecated. Use pointerType and/or originalEvent instead. + * @param {Object} event.originalEvent + * The original event object. + * @param {Boolean} event.preventDefaultAction + * Set to true to prevent the tracker subscriber from performing its default action (subscriber implementation dependent). Default: false. + * @param {Object} event.userData + * Arbitrary user-defined object. + */ + moveHandler: function () { }, + + /** + * Implement or assign implementation to these handlers during or after + * calling the constructor. + * @function + * @param {Object} event + * @param {OpenSeadragon.MouseTracker} event.eventSource + * A reference to the tracker instance. + * @param {String} event.pointerType + * "mouse", "touch", "pen", etc. + * @param {OpenSeadragon.Point} event.position + * The position of the event relative to the tracked element. + * @param {Number} event.scroll + * The scroll delta for the event. + * @param {Boolean} event.shift + * True if the shift key was pressed during this event. + * @param {Boolean} event.isTouchEvent + * True if the original event is a touch event, otherwise false. Deprecated. Use pointerType and/or originalEvent instead. Touch devices no longer generate scroll event. + * @param {Object} event.originalEvent + * The original event object. + * @param {Boolean} event.preventDefaultAction + * Set to true to prevent the tracker subscriber from performing its default action (subscriber implementation dependent). Default: false. + * @param {Object} event.userData + * Arbitrary user-defined object. + */ + scrollHandler: function () { }, + + /** + * Implement or assign implementation to these handlers during or after + * calling the constructor. + * @function + * @param {Object} event + * @param {OpenSeadragon.MouseTracker} event.eventSource + * A reference to the tracker instance. + * @param {String} event.pointerType + * "mouse", "touch", "pen", etc. + * @param {OpenSeadragon.Point} event.position + * The position of the event relative to the tracked element. + * @param {Boolean} event.quick + * True only if the clickDistThreshold and clickTimeThreshold are both passed. Useful for ignoring drag events. + * @param {Boolean} event.shift + * True if the shift key was pressed during this event. + * @param {Boolean} event.isTouchEvent + * True if the original event is a touch event, otherwise false. Deprecated. Use pointerType and/or originalEvent instead. + * @param {Object} event.originalEvent + * The original event object. + * @param {Boolean} event.preventDefaultAction + * Set to true to prevent the tracker subscriber from performing its default action (subscriber implementation dependent). Default: false. + * @param {Object} event.userData + * Arbitrary user-defined object. + */ + clickHandler: function () { }, + + /** + * Implement or assign implementation to these handlers during or after + * calling the constructor. + * @function + * @param {Object} event + * @param {OpenSeadragon.MouseTracker} event.eventSource + * A reference to the tracker instance. + * @param {String} event.pointerType + * "mouse", "touch", "pen", etc. + * @param {OpenSeadragon.Point} event.position + * The position of the event relative to the tracked element. + * @param {Boolean} event.shift + * True if the shift key was pressed during this event. + * @param {Boolean} event.isTouchEvent + * True if the original event is a touch event, otherwise false. Deprecated. Use pointerType and/or originalEvent instead. + * @param {Object} event.originalEvent + * The original event object. + * @param {Boolean} event.preventDefaultAction + * Set to true to prevent the tracker subscriber from performing its default action (subscriber implementation dependent). Default: false. + * @param {Object} event.userData + * Arbitrary user-defined object. + */ + dblClickHandler: function () { }, + + /** + * Implement or assign implementation to these handlers during or after + * calling the constructor. + * @function + * @param {Object} event + * @param {OpenSeadragon.MouseTracker} event.eventSource + * A reference to the tracker instance. + * @param {String} event.pointerType + * "mouse", "touch", "pen", etc. + * @param {OpenSeadragon.Point} event.position + * The position of the event relative to the tracked element. + * @param {Number} event.buttons + * Current buttons pressed. + * Combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser. + * @param {OpenSeadragon.Point} event.delta + * The x,y components of the difference between the current position and the last drag event position. Useful for ignoring or weighting the events. + * @param {Number} event.speed + * Current computed speed, in pixels per second. + * @param {Number} event.direction + * Current computed direction, expressed as an angle counterclockwise relative to the positive X axis (-pi to pi, in radians). Only valid if speed > 0. + * @param {Boolean} event.shift + * True if the shift key was pressed during this event. + * @param {Boolean} event.isTouchEvent + * True if the original event is a touch event, otherwise false. Deprecated. Use pointerType and/or originalEvent instead. + * @param {Object} event.originalEvent + * The original event object. + * @param {Boolean} event.preventDefaultAction + * Set to true to prevent the tracker subscriber from performing its default action (subscriber implementation dependent). Default: false. + * @param {Object} event.userData + * Arbitrary user-defined object. + */ + dragHandler: function () { }, + + /** + * Implement or assign implementation to these handlers during or after + * calling the constructor. + * @function + * @param {Object} event + * @param {OpenSeadragon.MouseTracker} event.eventSource + * A reference to the tracker instance. + * @param {String} event.pointerType + * "mouse", "touch", "pen", etc. + * @param {OpenSeadragon.Point} event.position + * The position of the event relative to the tracked element. + * @param {Number} event.speed + * Speed at the end of a drag gesture, in pixels per second. + * @param {Number} event.direction + * Direction at the end of a drag gesture, expressed as an angle counterclockwise relative to the positive X axis (-pi to pi, in radians). Only valid if speed > 0. + * @param {Boolean} event.shift + * True if the shift key was pressed during this event. + * @param {Boolean} event.isTouchEvent + * True if the original event is a touch event, otherwise false. Deprecated. Use pointerType and/or originalEvent instead. + * @param {Object} event.originalEvent + * The original event object. + * @param {Boolean} event.preventDefaultAction + * Set to true to prevent the tracker subscriber from performing its default action (subscriber implementation dependent). Default: false. + * @param {Object} event.userData + * Arbitrary user-defined object. + */ + dragEndHandler: function () { }, + + /** + * Implement or assign implementation to these handlers during or after + * calling the constructor. + * @function + * @param {Object} event + * @param {OpenSeadragon.MouseTracker} event.eventSource + * A reference to the tracker instance. + * @param {String} event.pointerType + * "mouse", "touch", "pen", etc. + * @param {Array.} event.gesturePoints + * Gesture points associated with the gesture. Velocity data can be found here. + * @param {OpenSeadragon.Point} event.lastCenter + * The previous center point of the two pinch contact points relative to the tracked element. + * @param {OpenSeadragon.Point} event.center + * The center point of the two pinch contact points relative to the tracked element. + * @param {Number} event.lastDistance + * The previous distance between the two pinch contact points in CSS pixels. + * @param {Number} event.distance + * The distance between the two pinch contact points in CSS pixels. + * @param {Boolean} event.shift + * True if the shift key was pressed during this event. + * @param {Object} event.originalEvent + * The original event object. + * @param {Boolean} event.preventDefaultAction + * Set to true to prevent the tracker subscriber from performing its default action (subscriber implementation dependent). Default: false. + * @param {Object} event.userData + * Arbitrary user-defined object. + */ + pinchHandler: function () { }, + + /** + * Implement or assign implementation to these handlers during or after + * calling the constructor. + * @function + * @param {Object} event + * @param {OpenSeadragon.MouseTracker} event.eventSource + * A reference to the tracker instance. + * @param {String} event.pointerType + * "mouse", "touch", "pen", etc. + * @param {OpenSeadragon.Point} event.position + * The position of the event relative to the tracked element. + * @param {Number} event.buttons + * Current buttons pressed. + * Combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser. + * @param {Boolean} event.isTouchEvent + * True if the original event is a touch event, otherwise false. Deprecated. Use pointerType and/or originalEvent instead. + * @param {Object} event.originalEvent + * The original event object. + * @param {Boolean} event.preventDefaultAction + * Set to true to prevent the tracker subscriber from performing its default action (subscriber implementation dependent). Default: false. + * @param {Object} event.userData + * Arbitrary user-defined object. + */ + stopHandler: function () { }, + + /** + * Implement or assign implementation to these handlers during or after + * calling the constructor. + * @function + * @param {Object} event + * @param {OpenSeadragon.MouseTracker} event.eventSource + * A reference to the tracker instance. + * @param {Number} event.keyCode + * The key code that was pressed. + * @param {Boolean} event.ctrl + * True if the ctrl key was pressed during this event. + * @param {Boolean} event.shift + * True if the shift key was pressed during this event. + * @param {Boolean} event.alt + * True if the alt key was pressed during this event. + * @param {Boolean} event.meta + * True if the meta key was pressed during this event. + * @param {Object} event.originalEvent + * The original event object. + * @param {Boolean} event.preventDefaultAction + * Set to true to prevent the tracker subscriber from performing its default action (subscriber implementation dependent). Default: false. + * @param {Object} event.userData + * Arbitrary user-defined object. + */ + keyDownHandler: function () { }, + + /** + * Implement or assign implementation to these handlers during or after + * calling the constructor. + * @function + * @param {Object} event + * @param {OpenSeadragon.MouseTracker} event.eventSource + * A reference to the tracker instance. + * @param {Number} event.keyCode + * The key code that was pressed. + * @param {Boolean} event.ctrl + * True if the ctrl key was pressed during this event. + * @param {Boolean} event.shift + * True if the shift key was pressed during this event. + * @param {Boolean} event.alt + * True if the alt key was pressed during this event. + * @param {Boolean} event.meta + * True if the meta key was pressed during this event. + * @param {Object} event.originalEvent + * The original event object. + * @param {Boolean} event.preventDefaultAction + * Set to true to prevent the tracker subscriber from performing its default action (subscriber implementation dependent). Default: false. + * @param {Object} event.userData + * Arbitrary user-defined object. + */ + keyUpHandler: function () { }, + + /** + * Implement or assign implementation to these handlers during or after + * calling the constructor. + * @function + * @param {Object} event + * @param {OpenSeadragon.MouseTracker} event.eventSource + * A reference to the tracker instance. + * @param {Number} event.keyCode + * The key code that was pressed. + * @param {Boolean} event.ctrl + * True if the ctrl key was pressed during this event. + * @param {Boolean} event.shift + * True if the shift key was pressed during this event. + * @param {Boolean} event.alt + * True if the alt key was pressed during this event. + * @param {Boolean} event.meta + * True if the meta key was pressed during this event. + * @param {Object} event.originalEvent + * The original event object. + * @param {Boolean} event.preventDefaultAction + * Set to true to prevent the tracker subscriber from performing its default action (subscriber implementation dependent). Default: false. + * @param {Object} event.userData + * Arbitrary user-defined object. + */ + keyHandler: function () { }, + + /** + * Implement or assign implementation to these handlers during or after + * calling the constructor. + * @function + * @param {Object} event + * @param {OpenSeadragon.MouseTracker} event.eventSource + * A reference to the tracker instance. + * @param {Object} event.originalEvent + * The original event object. + * @param {Boolean} event.preventDefaultAction + * Set to true to prevent the tracker subscriber from performing its default action (subscriber implementation dependent). Default: false. + * @param {Object} event.userData + * Arbitrary user-defined object. + */ + focusHandler: function () { }, + + /** + * Implement or assign implementation to these handlers during or after + * calling the constructor. + * @function + * @param {Object} event + * @param {OpenSeadragon.MouseTracker} event.eventSource + * A reference to the tracker instance. + * @param {Object} event.originalEvent + * The original event object. + * @param {Boolean} event.preventDefaultAction + * Set to true to prevent the tracker subscriber from performing its default action (subscriber implementation dependent). Default: false. + * @param {Object} event.userData + * Arbitrary user-defined object. + */ + blurHandler: function () { } + }; + + + /** + * Provides continuous computation of velocity (speed and direction) of active pointers. + * This is a singleton, used by all MouseTracker instances, as it is unlikely there will ever be more than + * two active gesture pointers at a time. + * + * @private + * @member gesturePointVelocityTracker + * @memberof OpenSeadragon.MouseTracker + */ + $.MouseTracker.gesturePointVelocityTracker = (function () { + var trackerPoints = [], + intervalId = 0, + lastTime = 0; + + // Generates a unique identifier for a tracked gesture point + var _generateGuid = function ( tracker, gPoint ) { + return tracker.hash.toString() + gPoint.type + gPoint.id.toString(); + }; + + // Interval timer callback. Computes velocity for all tracked gesture points. + var _doTracking = function () { + var i, + len = trackerPoints.length, + trackPoint, + gPoint, + now = $.now(), + elapsedTime, + distance, + speed; + + elapsedTime = now - lastTime; + lastTime = now; + + for ( i = 0; i < len; i++ ) { + trackPoint = trackerPoints[ i ]; + gPoint = trackPoint.gPoint; + // Math.atan2 gives us just what we need for a velocity vector, as we can simply + // use cos()/sin() to extract the x/y velocity components. + gPoint.direction = Math.atan2( gPoint.currentPos.y - trackPoint.lastPos.y, gPoint.currentPos.x - trackPoint.lastPos.x ); + // speed = distance / elapsed time + distance = trackPoint.lastPos.distanceTo( gPoint.currentPos ); + trackPoint.lastPos = gPoint.currentPos; + speed = 1000 * distance / ( elapsedTime + 1 ); + // Simple biased average, favors the most recent speed computation. Smooths out erratic gestures a bit. + gPoint.speed = 0.75 * speed + 0.25 * gPoint.speed; + } + }; + + // Public. Add a gesture point to be tracked + var addPoint = function ( tracker, gPoint ) { + var guid = _generateGuid( tracker, gPoint ); + + trackerPoints.push( + { + guid: guid, + gPoint: gPoint, + lastPos: gPoint.currentPos + } ); + + // Only fire up the interval timer when there's gesture pointers to track + if ( trackerPoints.length === 1 ) { + lastTime = $.now(); + intervalId = window.setInterval( _doTracking, 50 ); + } + }; + + // Public. Stop tracking a gesture point + var removePoint = function ( tracker, gPoint ) { + var guid = _generateGuid( tracker, gPoint ), + i, + len = trackerPoints.length; + for ( i = 0; i < len; i++ ) { + if ( trackerPoints[ i ].guid === guid ) { + trackerPoints.splice( i, 1 ); + // Only run the interval timer if theres gesture pointers to track + len--; + if ( len === 0 ) { + window.clearInterval( intervalId ); + } + break; + } + } + }; + + return { + addPoint: addPoint, + removePoint: removePoint + }; + } )(); + + +/////////////////////////////////////////////////////////////////////////////// +// Pointer event model and feature detection +/////////////////////////////////////////////////////////////////////////////// + + $.MouseTracker.captureElement = document; + + /** + * Detect available mouse wheel event name. + */ + $.MouseTracker.wheelEventName = ( $.Browser.vendor == $.BROWSERS.IE && $.Browser.version > 8 ) || + ( 'onwheel' in document.createElement( 'div' ) ) ? 'wheel' : // Modern browsers support 'wheel' + document.onmousewheel !== undefined ? 'mousewheel' : // Webkit and IE support at least 'mousewheel' + 'DOMMouseScroll'; // Assume old Firefox + + /** + * Detect legacy mouse capture support. + */ + $.MouseTracker.supportsMouseCapture = (function () { + var divElement = document.createElement( 'div' ); + return $.isFunction( divElement.setCapture ) && $.isFunction( divElement.releaseCapture ); + }()); + + /** + * Detect browser pointer device event model(s) and build appropriate list of events to subscribe to. + */ + $.MouseTracker.subscribeEvents = [ "click", "dblclick", "keydown", "keyup", "keypress", "focus", "blur", $.MouseTracker.wheelEventName ]; + + if( $.MouseTracker.wheelEventName == "DOMMouseScroll" ) { + // Older Firefox + $.MouseTracker.subscribeEvents.push( "MozMousePixelScroll" ); + } + + // Note: window.navigator.pointerEnable is deprecated on IE 11 and not part of W3C spec. + if ( window.PointerEvent && ( window.navigator.pointerEnabled || $.Browser.vendor !== $.BROWSERS.IE ) ) { + // IE11 and other W3C Pointer Event implementations (see http://www.w3.org/TR/pointerevents) + $.MouseTracker.havePointerEvents = true; + $.MouseTracker.subscribeEvents.push( "pointerover", "pointerout", "pointerdown", "pointerup", "pointermove", "pointercancel" ); + $.MouseTracker.unprefixedPointerEvents = true; + if( navigator.maxTouchPoints ) { + $.MouseTracker.maxTouchPoints = navigator.maxTouchPoints; + } else { + $.MouseTracker.maxTouchPoints = 0; + } + $.MouseTracker.haveMouseEnter = false; + } else if ( window.MSPointerEvent && window.navigator.msPointerEnabled ) { + // IE10 + $.MouseTracker.havePointerEvents = true; + $.MouseTracker.subscribeEvents.push( "MSPointerOver", "MSPointerOut", "MSPointerDown", "MSPointerUp", "MSPointerMove", "MSPointerCancel" ); + $.MouseTracker.unprefixedPointerEvents = false; + if( navigator.msMaxTouchPoints ) { + $.MouseTracker.maxTouchPoints = navigator.msMaxTouchPoints; + } else { + $.MouseTracker.maxTouchPoints = 0; + } + $.MouseTracker.haveMouseEnter = false; + } else { + // Legacy W3C mouse events + $.MouseTracker.havePointerEvents = false; + if ( $.Browser.vendor === $.BROWSERS.IE && $.Browser.version < 9 ) { + $.MouseTracker.subscribeEvents.push( "mouseenter", "mouseleave" ); + $.MouseTracker.haveMouseEnter = true; + } else { + $.MouseTracker.subscribeEvents.push( "mouseover", "mouseout" ); + $.MouseTracker.haveMouseEnter = false; + } + $.MouseTracker.subscribeEvents.push( "mousedown", "mouseup", "mousemove" ); + if ( 'ontouchstart' in window ) { + // iOS, Android, and other W3c Touch Event implementations + // (see http://www.w3.org/TR/touch-events/) + // (see https://developer.apple.com/library/ios/documentation/AppleApplications/Reference/SafariWebContent/HandlingEvents/HandlingEvents.html) + // (see https://developer.apple.com/library/safari/documentation/AppleApplications/Reference/SafariWebContent/HandlingEvents/HandlingEvents.html) + $.MouseTracker.subscribeEvents.push( "touchstart", "touchend", "touchmove", "touchcancel" ); + } + if ( 'ongesturestart' in window ) { + // iOS (see https://developer.apple.com/library/ios/documentation/AppleApplications/Reference/SafariWebContent/HandlingEvents/HandlingEvents.html) + // Subscribe to these to prevent default gesture handling + $.MouseTracker.subscribeEvents.push( "gesturestart", "gesturechange" ); + } + $.MouseTracker.mousePointerId = "legacy-mouse"; + $.MouseTracker.maxTouchPoints = 10; + } + + +/////////////////////////////////////////////////////////////////////////////// +// Classes and typedefs +/////////////////////////////////////////////////////////////////////////////// + + /** + * Represents a point of contact on the screen made by a mouse cursor, pen, touch, or other pointer device. + * + * @typedef {Object} GesturePoint + * @memberof OpenSeadragon.MouseTracker + * + * @property {Number} id + * Identifier unique from all other active GesturePoints for a given pointer device. + * @property {String} type + * The pointer device type: "mouse", "touch", "pen", etc. + * @property {Boolean} captured + * True if events for the gesture point are captured to the tracked element. + * @property {Boolean} isPrimary + * True if the gesture point is a master pointer amongst the set of active pointers for each pointer type. True for mouse and primary (first) touch/pen pointers. + * @property {Boolean} insideElementPressed + * True if button pressed or contact point initiated inside the screen area of the tracked element. + * @property {Boolean} insideElement + * True if pointer or contact point is currently inside the bounds of the tracked element. + * @property {Number} speed + * Current computed speed, in pixels per second. + * @property {Number} direction + * Current computed direction, expressed as an angle counterclockwise relative to the positive X axis (-pi to pi, in radians). Only valid if speed > 0. + * @property {OpenSeadragon.Point} contactPos + * The initial pointer contact position, relative to the page including any scrolling. Only valid if the pointer has contact (pressed, touch contact, pen contact). + * @property {Number} contactTime + * The initial pointer contact time, in milliseconds. Only valid if the pointer has contact (pressed, touch contact, pen contact). + * @property {OpenSeadragon.Point} lastPos + * The last pointer position, relative to the page including any scrolling. + * @property {Number} lastTime + * The last pointer contact time, in milliseconds. + * @property {OpenSeadragon.Point} currentPos + * The current pointer position, relative to the page including any scrolling. + * @property {Number} currentTime + * The current pointer contact time, in milliseconds. + */ + + + /** + * @class GesturePointList + * @classdesc Provides an abstraction for a set of active {@link OpenSeadragon.MouseTracker.GesturePoint|GesturePoint} objects for a given pointer device type. + * Active pointers are any pointer being tracked for this element which are in the hit-test area + * of the element (for hover-capable devices) and/or have contact or a button press initiated in the element. + * @memberof OpenSeadragon.MouseTracker + * @param {String} type - The pointer device type: "mouse", "touch", "pen", etc. + */ + $.MouseTracker.GesturePointList = function ( type ) { + this._gPoints = []; + /** + * The pointer device type: "mouse", "touch", "pen", etc. + * @member {String} type + * @memberof OpenSeadragon.MouseTracker.GesturePointList# + */ + this.type = type; + /** + * Current buttons pressed for the device. + * Combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser. + * @member {Number} buttons + * @memberof OpenSeadragon.MouseTracker.GesturePointList# + */ + this.buttons = 0; + /** + * Current number of contact points (touch points, mouse down, etc.) for the device. + * @member {Number} contacts + * @memberof OpenSeadragon.MouseTracker.GesturePointList# + */ + this.contacts = 0; + /** + * Current number of clicks for the device. Used for multiple click gesture tracking. + * @member {Number} clicks + * @memberof OpenSeadragon.MouseTracker.GesturePointList# + */ + this.clicks = 0; + /** + * Current number of captured pointers for the device. + * @member {Number} captureCount + * @memberof OpenSeadragon.MouseTracker.GesturePointList# + */ + this.captureCount = 0; + }; + + /** @lends OpenSeadragon.MouseTracker.GesturePointList.prototype */ + $.MouseTracker.GesturePointList.prototype = { + /** + * @function + * @returns {Number} Number of gesture points in the list. + */ + getLength: function () { + return this._gPoints.length; + }, + /** + * @function + * @returns {Array.} The list of gesture points in the list as an array (read-only). + */ + asArray: function () { + return this._gPoints; + }, + /** + * @function + * @param {OpenSeadragon.MouseTracker.GesturePoint} gesturePoint - A gesture point to add to the list. + * @returns {Number} Number of gesture points in the list. + */ + add: function ( gp ) { + return this._gPoints.push( gp ); + }, + /** + * @function + * @param {Number} id - The id of the gesture point to remove from the list. + * @returns {Number} Number of gesture points in the list. + */ + removeById: function ( id ) { + var i, + len = this._gPoints.length; + for ( i = 0; i < len; i++ ) { + if ( this._gPoints[ i ].id === id ) { + this._gPoints.splice( i, 1 ); + break; + } + } + return this._gPoints.length; + }, + /** + * @function + * @param {Number} index - The index of the gesture point to retrieve from the list. + * @returns {OpenSeadragon.MouseTracker.GesturePoint|null} The gesture point at the given index, or null if not found. + */ + getByIndex: function ( index ) { + if ( index < this._gPoints.length) { + return this._gPoints[ index ]; + } + + return null; + }, + /** + * @function + * @param {Number} id - The id of the gesture point to retrieve from the list. + * @returns {OpenSeadragon.MouseTracker.GesturePoint|null} The gesture point with the given id, or null if not found. + */ + getById: function ( id ) { + var i, + len = this._gPoints.length; + for ( i = 0; i < len; i++ ) { + if ( this._gPoints[ i ].id === id ) { + return this._gPoints[ i ]; + } + } + return null; + }, + /** + * @function + * @returns {OpenSeadragon.MouseTracker.GesturePoint|null} The primary gesture point in the list, or null if not found. + */ + getPrimary: function ( id ) { + var i, + len = this._gPoints.length; + for ( i = 0; i < len; i++ ) { + if ( this._gPoints[ i ].isPrimary ) { + return this._gPoints[ i ]; + } + } + return null; + } + }; + + +/////////////////////////////////////////////////////////////////////////////// +// Utility functions +/////////////////////////////////////////////////////////////////////////////// + + /** + * Removes all tracked pointers. + * @private + * @inner + */ + function clearTrackedPointers( tracker ) { + var delegate = THIS[ tracker.hash ], + i, + pointerListCount = delegate.activePointersLists.length; + + for ( i = 0; i < pointerListCount; i++ ) { + if ( delegate.activePointersLists[ i ].captureCount > 0 ) { + $.removeEvent( + $.MouseTracker.captureElement, + 'mousemove', + delegate.mousemovecaptured, + true + ); + $.removeEvent( + $.MouseTracker.captureElement, + 'mouseup', + delegate.mouseupcaptured, + true + ); + $.removeEvent( + $.MouseTracker.captureElement, + $.MouseTracker.unprefixedPointerEvents ? 'pointermove' : 'MSPointerMove', + delegate.pointermovecaptured, + true + ); + $.removeEvent( + $.MouseTracker.captureElement, + $.MouseTracker.unprefixedPointerEvents ? 'pointerup' : 'MSPointerUp', + delegate.pointerupcaptured, + true + ); + $.removeEvent( + $.MouseTracker.captureElement, + 'touchmove', + delegate.touchmovecaptured, + true + ); + $.removeEvent( + $.MouseTracker.captureElement, + 'touchend', + delegate.touchendcaptured, + true + ); + + delegate.activePointersLists[ i ].captureCount = 0; + } + } + + for ( i = 0; i < pointerListCount; i++ ) { + delegate.activePointersLists.pop(); + } + } + + /** + * Starts tracking pointer events on the tracked element. + * @private + * @inner + */ + function startTracking( tracker ) { + var delegate = THIS[ tracker.hash ], + event, + i; + + if ( !delegate.tracking ) { + for ( i = 0; i < $.MouseTracker.subscribeEvents.length; i++ ) { + event = $.MouseTracker.subscribeEvents[ i ]; + $.addEvent( + tracker.element, + event, + delegate[ event ], + false + ); + } + + clearTrackedPointers( tracker ); + + delegate.tracking = true; + } + } + + /** + * Stops tracking pointer events on the tracked element. + * @private + * @inner + */ + function stopTracking( tracker ) { + var delegate = THIS[ tracker.hash ], + event, + i; + + if ( delegate.tracking ) { + for ( i = 0; i < $.MouseTracker.subscribeEvents.length; i++ ) { + event = $.MouseTracker.subscribeEvents[ i ]; + $.removeEvent( + tracker.element, + event, + delegate[ event ], + false + ); + } + + clearTrackedPointers( tracker ); + + delegate.tracking = false; + } + } + + /** + * @private + * @inner + */ + function getCaptureEventParams( tracker, pointerType ) { + var delegate = THIS[ tracker.hash ]; + + if ( pointerType === 'pointerevent' ) { + return { + upName: $.MouseTracker.unprefixedPointerEvents ? 'pointerup' : 'MSPointerUp', + upHandler: delegate.pointerupcaptured, + moveName: $.MouseTracker.unprefixedPointerEvents ? 'pointermove' : 'MSPointerMove', + moveHandler: delegate.pointermovecaptured + }; + } else if ( pointerType === 'mouse' ) { + return { + upName: 'mouseup', + upHandler: delegate.mouseupcaptured, + moveName: 'mousemove', + moveHandler: delegate.mousemovecaptured + }; + } else if ( pointerType === 'touch' ) { + return { + upName: 'touchend', + upHandler: delegate.touchendcaptured, + moveName: 'touchmove', + moveHandler: delegate.touchmovecaptured + }; + } else { + throw new Error( "MouseTracker.getCaptureEventParams: Unknown pointer type." ); + } + } + + /** + * Begin capturing pointer events to the tracked element. + * @private + * @inner + */ + function capturePointer( tracker, pointerType, pointerCount ) { + var pointsList = tracker.getActivePointersListByType( pointerType ), + eventParams; + + pointsList.captureCount += (pointerCount || 1); + + if ( pointsList.captureCount === 1 ) { + if ( $.Browser.vendor === $.BROWSERS.IE && $.Browser.version < 9 ) { + tracker.element.setCapture( true ); + } else { + eventParams = getCaptureEventParams( tracker, $.MouseTracker.havePointerEvents ? 'pointerevent' : pointerType ); + // We emulate mouse capture by hanging listeners on the document object. + // (Note we listen on the capture phase so the captured handlers will get called first) + if (isInIframe && canAccessEvents(window.top)) { + $.addEvent( + window.top, + eventParams.upName, + eventParams.upHandler, + true + ); + } + $.addEvent( + $.MouseTracker.captureElement, + eventParams.upName, + eventParams.upHandler, + true + ); + $.addEvent( + $.MouseTracker.captureElement, + eventParams.moveName, + eventParams.moveHandler, + true + ); + } + } + } + + + /** + * Stop capturing pointer events to the tracked element. + * @private + * @inner + */ + function releasePointer( tracker, pointerType, pointerCount ) { + var pointsList = tracker.getActivePointersListByType( pointerType ), + eventParams; + + pointsList.captureCount -= (pointerCount || 1); + + if ( pointsList.captureCount === 0 ) { + if ( $.Browser.vendor === $.BROWSERS.IE && $.Browser.version < 9 ) { + tracker.element.releaseCapture(); + } else { + eventParams = getCaptureEventParams( tracker, $.MouseTracker.havePointerEvents ? 'pointerevent' : pointerType ); + // We emulate mouse capture by hanging listeners on the document object. + // (Note we listen on the capture phase so the captured handlers will get called first) + if (isInIframe && canAccessEvents(window.top)) { + $.removeEvent( + window.top, + eventParams.upName, + eventParams.upHandler, + true + ); + } + $.removeEvent( + $.MouseTracker.captureElement, + eventParams.moveName, + eventParams.moveHandler, + true + ); + $.removeEvent( + $.MouseTracker.captureElement, + eventParams.upName, + eventParams.upHandler, + true + ); + } + } + } + + + /** + * Gets a W3C Pointer Events model compatible pointer type string from a DOM pointer event. + * IE10 used a long integer value, but the W3C specification (and IE11+) use a string "mouse", "touch", "pen", etc. + * @private + * @inner + */ + function getPointerType( event ) { + var pointerTypeStr; + if ( $.MouseTracker.unprefixedPointerEvents ) { + pointerTypeStr = event.pointerType; + } else { + // IE10 + // MSPOINTER_TYPE_TOUCH: 0x00000002 + // MSPOINTER_TYPE_PEN: 0x00000003 + // MSPOINTER_TYPE_MOUSE: 0x00000004 + switch( event.pointerType ) + { + case 0x00000002: + pointerTypeStr = 'touch'; + break; + case 0x00000003: + pointerTypeStr = 'pen'; + break; + case 0x00000004: + pointerTypeStr = 'mouse'; + break; + default: + pointerTypeStr = ''; + } + } + return pointerTypeStr; + } + + + /** + * @private + * @inner + */ + function getMouseAbsolute( event ) { + return $.getMousePosition( event ); + } + + /** + * @private + * @inner + */ + function getMouseRelative( event, element ) { + return getPointRelativeToAbsolute( getMouseAbsolute( event ), element ); + } + + /** + * @private + * @inner + */ + function getPointRelativeToAbsolute( point, element ) { + var offset = $.getElementOffset( element ); + return point.minus( offset ); + } + + /** + * @private + * @inner + */ + function getCenterPoint( point1, point2 ) { + return new $.Point( ( point1.x + point2.x ) / 2, ( point1.y + point2.y ) / 2 ); + } + + +/////////////////////////////////////////////////////////////////////////////// +// Device-specific DOM event handlers +/////////////////////////////////////////////////////////////////////////////// + + /** + * @private + * @inner + */ + function onClick( tracker, event ) { + if ( tracker.clickHandler ) { + $.cancelEvent( event ); + } + } + + + /** + * @private + * @inner + */ + function onDblClick( tracker, event ) { + if ( tracker.dblClickHandler ) { + $.cancelEvent( event ); + } + } + + + /** + * @private + * @inner + */ + function onKeyDown( tracker, event ) { + //$.console.log( "keydown %s %s %s %s %s", event.keyCode, event.charCode, event.ctrlKey, event.shiftKey, event.altKey ); + var propagate; + if ( tracker.keyDownHandler ) { + event = $.getEvent( event ); + propagate = tracker.keyDownHandler( + { + eventSource: tracker, + keyCode: event.keyCode ? event.keyCode : event.charCode, + ctrl: event.ctrlKey, + shift: event.shiftKey, + alt: event.altKey, + meta: event.metaKey, + originalEvent: event, + preventDefaultAction: false, + userData: tracker.userData + } + ); + if ( !propagate ) { + $.cancelEvent( event ); + } + } + } + + + /** + * @private + * @inner + */ + function onKeyUp( tracker, event ) { + //$.console.log( "keyup %s %s %s %s %s", event.keyCode, event.charCode, event.ctrlKey, event.shiftKey, event.altKey ); + var propagate; + if ( tracker.keyUpHandler ) { + event = $.getEvent( event ); + propagate = tracker.keyUpHandler( + { + eventSource: tracker, + keyCode: event.keyCode ? event.keyCode : event.charCode, + ctrl: event.ctrlKey, + shift: event.shiftKey, + alt: event.altKey, + meta: event.metaKey, + originalEvent: event, + preventDefaultAction: false, + userData: tracker.userData + } + ); + if ( !propagate ) { + $.cancelEvent( event ); + } + } + } + + + /** + * @private + * @inner + */ + function onKeyPress( tracker, event ) { + //$.console.log( "keypress %s %s %s %s %s", event.keyCode, event.charCode, event.ctrlKey, event.shiftKey, event.altKey ); + var propagate; + if ( tracker.keyHandler ) { + event = $.getEvent( event ); + propagate = tracker.keyHandler( + { + eventSource: tracker, + keyCode: event.keyCode ? event.keyCode : event.charCode, + ctrl: event.ctrlKey, + shift: event.shiftKey, + alt: event.altKey, + meta: event.metaKey, + originalEvent: event, + preventDefaultAction: false, + userData: tracker.userData + } + ); + if ( !propagate ) { + $.cancelEvent( event ); + } + } + } + + + /** + * @private + * @inner + */ + function onFocus( tracker, event ) { + //console.log( "focus %s", event ); + var propagate; + if ( tracker.focusHandler ) { + event = $.getEvent( event ); + propagate = tracker.focusHandler( + { + eventSource: tracker, + originalEvent: event, + preventDefaultAction: false, + userData: tracker.userData + } + ); + if ( propagate === false ) { + $.cancelEvent( event ); + } + } + } + + + /** + * @private + * @inner + */ + function onBlur( tracker, event ) { + //console.log( "blur %s", event ); + var propagate; + if ( tracker.blurHandler ) { + event = $.getEvent( event ); + propagate = tracker.blurHandler( + { + eventSource: tracker, + originalEvent: event, + preventDefaultAction: false, + userData: tracker.userData + } + ); + if ( propagate === false ) { + $.cancelEvent( event ); + } + } + } + + + /** + * Handler for 'wheel' events + * + * @private + * @inner + */ + function onWheel( tracker, event ) { + handleWheelEvent( tracker, event, event ); + } + + + /** + * Handler for 'mousewheel', 'DOMMouseScroll', and 'MozMousePixelScroll' events + * + * @private + * @inner + */ + function onMouseWheel( tracker, event ) { + event = $.getEvent( event ); + + // Simulate a 'wheel' event + var simulatedEvent = { + target: event.target || event.srcElement, + type: "wheel", + shiftKey: event.shiftKey || false, + clientX: event.clientX, + clientY: event.clientY, + pageX: event.pageX ? event.pageX : event.clientX, + pageY: event.pageY ? event.pageY : event.clientY, + deltaMode: event.type == "MozMousePixelScroll" ? 0 : 1, // 0=pixel, 1=line, 2=page + deltaX: 0, + deltaZ: 0 + }; + + // Calculate deltaY + if ( $.MouseTracker.wheelEventName == "mousewheel" ) { + simulatedEvent.deltaY = - 1 / $.DEFAULT_SETTINGS.pixelsPerWheelLine * event.wheelDelta; + } else { + simulatedEvent.deltaY = event.detail; + } + + handleWheelEvent( tracker, simulatedEvent, event ); + } + + + /** + * Handles 'wheel' events. + * The event may be simulated by the legacy mouse wheel event handler (onMouseWheel()). + * + * @private + * @inner + */ + function handleWheelEvent( tracker, event, originalEvent ) { + var nDelta = 0, + propagate; + + // The nDelta variable is gated to provide smooth z-index scrolling + // since the mouse wheel allows for substantial deltas meant for rapid + // y-index scrolling. + // event.deltaMode: 0=pixel, 1=line, 2=page + // TODO: Deltas in pixel mode should be accumulated then a scroll value computed after $.DEFAULT_SETTINGS.pixelsPerWheelLine threshold reached + nDelta = event.deltaY < 0 ? 1 : -1; + + if ( tracker.scrollHandler ) { + propagate = tracker.scrollHandler( + { + eventSource: tracker, + pointerType: 'mouse', + position: getMouseRelative( event, tracker.element ), + scroll: nDelta, + shift: event.shiftKey, + isTouchEvent: false, + originalEvent: originalEvent, + preventDefaultAction: false, + userData: tracker.userData + } + ); + if ( propagate === false ) { + $.cancelEvent( originalEvent ); + } + } + } + + + /** + * @private + * @inner + */ + function isParentChild( parent, child ) + { + if ( parent === child ) { + return false; + } + while ( child && child !== parent ) { + child = child.parentNode; + } + return child === parent; + } + + + /** + * Only used on IE 8 + * + * @private + * @inner + */ + function onMouseEnter( tracker, event ) { + event = $.getEvent( event ); + + handleMouseEnter( tracker, event ); + } + + + /** + * @private + * @inner + */ + function onMouseOver( tracker, event ) { + event = $.getEvent( event ); + + if ( event.currentTarget === event.relatedTarget || isParentChild( event.currentTarget, event.relatedTarget ) ) { + return; + } + + handleMouseEnter( tracker, event ); + } + + + /** + * @private + * @inner + */ + function handleMouseEnter( tracker, event ) { + var gPoint = { + id: $.MouseTracker.mousePointerId, + type: 'mouse', + isPrimary: true, + currentPos: getMouseAbsolute( event ), + currentTime: $.now() + }; + + updatePointersEnter( tracker, event, [ gPoint ] ); + } + + + /** + * Only used on IE 8 + * + * @private + * @inner + */ + function onMouseLeave( tracker, event ) { + event = $.getEvent( event ); + + handleMouseExit( tracker, event ); + } + + + /** + * @private + * @inner + */ + function onMouseOut( tracker, event ) { + event = $.getEvent( event ); + + if ( event.currentTarget === event.relatedTarget || isParentChild( event.currentTarget, event.relatedTarget ) ) { + return; + } + + handleMouseExit( tracker, event ); + } + + + /** + * @private + * @inner + */ + function handleMouseExit( tracker, event ) { + var gPoint = { + id: $.MouseTracker.mousePointerId, + type: 'mouse', + isPrimary: true, + currentPos: getMouseAbsolute( event ), + currentTime: $.now() + }; + + updatePointersExit( tracker, event, [ gPoint ] ); + } + + + /** + * Returns a W3C DOM level 3 standard button value given an event.button property: + * -1 == none, 0 == primary/left, 1 == middle, 2 == secondary/right, 3 == X1/back, 4 == X2/forward, 5 == eraser (pen) + * @private + * @inner + */ + function getStandardizedButton( button ) { + if ( $.Browser.vendor === $.BROWSERS.IE && $.Browser.version < 9 ) { + // On IE 8, 0 == none, 1 == left, 2 == right, 3 == left and right, 4 == middle, 5 == left and middle, 6 == right and middle, 7 == all three + // TODO: Support chorded (multiple) button presses on IE 8? + if ( button === 1 ) { + return 0; + } else if ( button === 2 ) { + return 2; + } else if ( button === 4 ) { + return 1; + } else { + return -1; + } + } else { + return button; + } + } + + + /** + * @private + * @inner + */ + function onMouseDown( tracker, event ) { + var gPoint; + + event = $.getEvent( event ); + + gPoint = { + id: $.MouseTracker.mousePointerId, + type: 'mouse', + isPrimary: true, + currentPos: getMouseAbsolute( event ), + currentTime: $.now() + }; + + if ( updatePointersDown( tracker, event, [ gPoint ], getStandardizedButton( event.button ) ) ) { + $.stopEvent( event ); + capturePointer( tracker, 'mouse' ); + } + + if ( tracker.clickHandler || tracker.dblClickHandler || tracker.pressHandler || tracker.dragHandler || tracker.dragEndHandler ) { + $.cancelEvent( event ); + } + } + + + /** + * @private + * @inner + */ + function onMouseUp( tracker, event ) { + handleMouseUp( tracker, event ); + } + + /** + * This handler is attached to the window object (on the capture phase) to emulate mouse capture. + * onMouseUp is still attached to the tracked element, so stop propagation to avoid processing twice. + * + * @private + * @inner + */ + function onMouseUpCaptured( tracker, event ) { + handleMouseUp( tracker, event ); + $.stopEvent( event ); + } + + + /** + * @private + * @inner + */ + function handleMouseUp( tracker, event ) { + var gPoint; + + event = $.getEvent( event ); + + gPoint = { + id: $.MouseTracker.mousePointerId, + type: 'mouse', + isPrimary: true, + currentPos: getMouseAbsolute( event ), + currentTime: $.now() + }; + + if ( updatePointersUp( tracker, event, [ gPoint ], getStandardizedButton( event.button ) ) ) { + releasePointer( tracker, 'mouse' ); + } + } + + + /** + * @private + * @inner + */ + function onMouseMove( tracker, event ) { + handleMouseMove( tracker, event ); + } + + + /** + * This handler is attached to the window object (on the capture phase) to emulate mouse capture. + * onMouseMove is still attached to the tracked element, so stop propagation to avoid processing twice. + * + * @private + * @inner + */ + function onMouseMoveCaptured( tracker, event ) { + handleMouseMove( tracker, event ); + $.stopEvent( event ); + } + + + /** + * @private + * @inner + */ + function handleMouseMove( tracker, event ) { + var gPoint; + + event = $.getEvent( event ); + + gPoint = { + id: $.MouseTracker.mousePointerId, + type: 'mouse', + isPrimary: true, + currentPos: getMouseAbsolute( event ), + currentTime: $.now() + }; + + updatePointersMove( tracker, event, [ gPoint ] ); + } + + + /** + * @private + * @inner + */ + function abortTouchContacts( tracker, event, pointsList ) { + var i, + gPointCount = pointsList.getLength(), + abortGPoints = []; + + for ( i = 0; i < gPointCount; i++ ) { + abortGPoints.push( pointsList.getByIndex( i ) ); + } + + if ( abortGPoints.length > 0 ) { + // simulate touchend + updatePointersUp( tracker, event, abortGPoints, 0 ); // 0 means primary button press/release or touch contact + // release pointer capture + pointsList.captureCount = 1; + releasePointer( tracker, 'touch' ); + // simulate touchleave + updatePointersExit( tracker, event, abortGPoints ); + } + } + + + /** + * @private + * @inner + */ + function onTouchStart( tracker, event ) { + var time, + i, + j, + touchCount = event.changedTouches.length, + gPoints = [], + parentGPoints, + pointsList = tracker.getActivePointersListByType( 'touch' ); + + time = $.now(); + + if ( pointsList.getLength() > event.touches.length - touchCount ) { + $.console.warn('Tracked touch contact count doesn\'t match event.touches.length. Removing all tracked touch pointers.'); + abortTouchContacts( tracker, event, pointsList ); + } + + for ( i = 0; i < touchCount; i++ ) { + gPoints.push( { + id: event.changedTouches[ i ].identifier, + type: 'touch', + // isPrimary not set - let the updatePointers functions determine it + currentPos: getMouseAbsolute( event.changedTouches[ i ] ), + currentTime: time + } ); + } + + // simulate touchenter on our tracked element + updatePointersEnter( tracker, event, gPoints ); + + // simulate touchenter on our tracked element's tracked ancestor elements + for ( i = 0; i < MOUSETRACKERS.length; i++ ) { + if ( MOUSETRACKERS[ i ] !== tracker && MOUSETRACKERS[ i ].isTracking() && isParentChild( MOUSETRACKERS[ i ].element, tracker.element ) ) { + parentGPoints = []; + for ( j = 0; j < touchCount; j++ ) { + parentGPoints.push( { + id: event.changedTouches[ j ].identifier, + type: 'touch', + // isPrimary not set - let the updatePointers functions determine it + currentPos: getMouseAbsolute( event.changedTouches[ j ] ), + currentTime: time + } ); + } + updatePointersEnter( MOUSETRACKERS[ i ], event, parentGPoints ); + } + } + + if ( updatePointersDown( tracker, event, gPoints, 0 ) ) { // 0 means primary button press/release or touch contact + $.stopEvent( event ); + capturePointer( tracker, 'touch', touchCount ); + } + + $.cancelEvent( event ); + } + + + /** + * @private + * @inner + */ + function onTouchEnd( tracker, event ) { + handleTouchEnd( tracker, event ); + } + + + /** + * This handler is attached to the window object (on the capture phase) to emulate pointer capture. + * onTouchEnd is still attached to the tracked element, so stop propagation to avoid processing twice. + * + * @private + * @inner + */ + function onTouchEndCaptured( tracker, event ) { + handleTouchEnd( tracker, event ); + $.stopEvent( event ); + } + + + /** + * @private + * @inner + */ + function handleTouchEnd( tracker, event ) { + var time, + i, + j, + touchCount = event.changedTouches.length, + gPoints = [], + parentGPoints; + + time = $.now(); + + for ( i = 0; i < touchCount; i++ ) { + gPoints.push( { + id: event.changedTouches[ i ].identifier, + type: 'touch', + // isPrimary not set - let the updatePointers functions determine it + currentPos: getMouseAbsolute( event.changedTouches[ i ] ), + currentTime: time + } ); + } + + if ( updatePointersUp( tracker, event, gPoints, 0 ) ) { + releasePointer( tracker, 'touch', touchCount ); + } + + // simulate touchleave on our tracked element + updatePointersExit( tracker, event, gPoints ); + + // simulate touchleave on our tracked element's tracked ancestor elements + for ( i = 0; i < MOUSETRACKERS.length; i++ ) { + if ( MOUSETRACKERS[ i ] !== tracker && MOUSETRACKERS[ i ].isTracking() && isParentChild( MOUSETRACKERS[ i ].element, tracker.element ) ) { + parentGPoints = []; + for ( j = 0; j < touchCount; j++ ) { + parentGPoints.push( { + id: event.changedTouches[ j ].identifier, + type: 'touch', + // isPrimary not set - let the updatePointers functions determine it + currentPos: getMouseAbsolute( event.changedTouches[ j ] ), + currentTime: time + } ); + } + updatePointersExit( MOUSETRACKERS[ i ], event, parentGPoints ); + } + } + + $.cancelEvent( event ); + } + + + /** + * @private + * @inner + */ + function onTouchMove( tracker, event ) { + handleTouchMove( tracker, event ); + } + + + /** + * This handler is attached to the window object (on the capture phase) to emulate pointer capture. + * onTouchMove is still attached to the tracked element, so stop propagation to avoid processing twice. + * + * @private + * @inner + */ + function onTouchMoveCaptured( tracker, event ) { + handleTouchMove( tracker, event ); + $.stopEvent( event ); + } + + + /** + * @private + * @inner + */ + function handleTouchMove( tracker, event ) { + var i, + touchCount = event.changedTouches.length, + gPoints = []; + + for ( i = 0; i < touchCount; i++ ) { + gPoints.push( { + id: event.changedTouches[ i ].identifier, + type: 'touch', + // isPrimary not set - let the updatePointers functions determine it + currentPos: getMouseAbsolute( event.changedTouches[ i ] ), + currentTime: $.now() + } ); + } + + updatePointersMove( tracker, event, gPoints ); + + $.cancelEvent( event ); + } + + + /** + * @private + * @inner + */ + function onTouchCancel( tracker, event ) { + var i, + touchCount = event.changedTouches.length, + gPoints = [], + pointsList = tracker.getActivePointersListByType( 'touch' ); + + abortTouchContacts( tracker, event, pointsList ); + } + + + /** + * @private + * @inner + */ + function onGestureStart( tracker, event ) { + event.stopPropagation(); + event.preventDefault(); + return false; + } + + + /** + * @private + * @inner + */ + function onGestureChange( tracker, event ) { + event.stopPropagation(); + event.preventDefault(); + return false; + } + + + /** + * @private + * @inner + */ + function onPointerOver( tracker, event ) { + var gPoint; + + if ( event.currentTarget === event.relatedTarget || isParentChild( event.currentTarget, event.relatedTarget ) ) { + return; + } + + gPoint = { + id: event.pointerId, + type: getPointerType( event ), + isPrimary: event.isPrimary, + currentPos: getMouseAbsolute( event ), + currentTime: $.now() + }; + + updatePointersEnter( tracker, event, [ gPoint ] ); + } + + + /** + * @private + * @inner + */ + function onPointerOut( tracker, event ) { + var gPoint; + + if ( event.currentTarget === event.relatedTarget || isParentChild( event.currentTarget, event.relatedTarget ) ) { + return; + } + + gPoint = { + id: event.pointerId, + type: getPointerType( event ), + isPrimary: event.isPrimary, + currentPos: getMouseAbsolute( event ), + currentTime: $.now() + }; + + updatePointersExit( tracker, event, [ gPoint ] ); + } + + + /** + * @private + * @inner + */ + function onPointerDown( tracker, event ) { + var gPoint; + + gPoint = { + id: event.pointerId, + type: getPointerType( event ), + isPrimary: event.isPrimary, + currentPos: getMouseAbsolute( event ), + currentTime: $.now() + }; + + if ( updatePointersDown( tracker, event, [ gPoint ], event.button ) ) { + $.stopEvent( event ); + capturePointer( tracker, gPoint.type ); + } + + if ( tracker.clickHandler || tracker.dblClickHandler || tracker.pressHandler || tracker.dragHandler || tracker.dragEndHandler || tracker.pinchHandler ) { + $.cancelEvent( event ); + } + } + + + /** + * @private + * @inner + */ + function onPointerUp( tracker, event ) { + handlePointerUp( tracker, event ); + } + + + /** + * This handler is attached to the window object (on the capture phase) to emulate mouse capture. + * onPointerUp is still attached to the tracked element, so stop propagation to avoid processing twice. + * + * @private + * @inner + */ + function onPointerUpCaptured( tracker, event ) { + var pointsList = tracker.getActivePointersListByType( getPointerType( event ) ); + if ( pointsList.getById( event.pointerId ) ) { + handlePointerUp( tracker, event ); + } + $.stopEvent( event ); + } + + + /** + * @private + * @inner + */ + function handlePointerUp( tracker, event ) { + var gPoint; + + gPoint = { + id: event.pointerId, + type: getPointerType( event ), + isPrimary: event.isPrimary, + currentPos: getMouseAbsolute( event ), + currentTime: $.now() + }; + + if ( updatePointersUp( tracker, event, [ gPoint ], event.button ) ) { + releasePointer( tracker, gPoint.type ); + } + } + + + /** + * @private + * @inner + */ + function onPointerMove( tracker, event ) { + handlePointerMove( tracker, event ); + } + + + /** + * This handler is attached to the window object (on the capture phase) to emulate mouse capture. + * onPointerMove is still attached to the tracked element, so stop propagation to avoid processing twice. + * + * @private + * @inner + */ + function onPointerMoveCaptured( tracker, event ) { + var pointsList = tracker.getActivePointersListByType( getPointerType( event ) ); + if ( pointsList.getById( event.pointerId ) ) { + handlePointerMove( tracker, event ); + } + $.stopEvent( event ); + } + + + /** + * @private + * @inner + */ + function handlePointerMove( tracker, event ) { + // Pointer changed coordinates, button state, pressure, tilt, or contact geometry (e.g. width and height) + var gPoint; + + gPoint = { + id: event.pointerId, + type: getPointerType( event ), + isPrimary: event.isPrimary, + currentPos: getMouseAbsolute( event ), + currentTime: $.now() + }; + + updatePointersMove( tracker, event, [ gPoint ] ); + } + + + /** + * @private + * @inner + */ + function onPointerCancel( tracker, event ) { + var gPoint; + + gPoint = { + id: event.pointerId, + type: getPointerType( event ) + }; + + updatePointersCancel( tracker, event, [ gPoint ] ); + } + + +/////////////////////////////////////////////////////////////////////////////// +// Device-agnostic DOM event handlers +/////////////////////////////////////////////////////////////////////////////// + + /** + * @function + * @private + * @inner + * @param {OpenSeadragon.MouseTracker.GesturePointList} pointsList + * The GesturePointList to track the pointer in. + * @param {OpenSeadragon.MouseTracker.GesturePoint} gPoint + * Gesture point to track. + * @returns {Number} Number of gesture points in pointsList. + */ + function startTrackingPointer( pointsList, gPoint ) { + + // If isPrimary is not known for the pointer then set it according to our rules: + // true if the first pointer in the gesture, otherwise false + if ( !gPoint.hasOwnProperty( 'isPrimary' ) ) { + if ( pointsList.getLength() === 0 ) { + gPoint.isPrimary = true; + } else { + gPoint.isPrimary = false; + } + } + gPoint.speed = 0; + gPoint.direction = 0; + gPoint.contactPos = gPoint.currentPos; + gPoint.contactTime = gPoint.currentTime; + gPoint.lastPos = gPoint.currentPos; + gPoint.lastTime = gPoint.currentTime; + + return pointsList.add( gPoint ); + } + + + /** + * @function + * @private + * @inner + * @param {OpenSeadragon.MouseTracker.GesturePointList} pointsList + * The GesturePointList to stop tracking the pointer on. + * @param {OpenSeadragon.MouseTracker.GesturePoint} gPoint + * Gesture point to stop tracking. + * @returns {Number} Number of gesture points in pointsList. + */ + function stopTrackingPointer( pointsList, gPoint ) { + var listLength, + primaryPoint; + + if ( pointsList.getById( gPoint.id ) ) { + listLength = pointsList.removeById( gPoint.id ); + + // If isPrimary is not known for the pointer and we just removed the primary pointer from the list then we need to set another pointer as primary + if ( !gPoint.hasOwnProperty( 'isPrimary' ) ) { + primaryPoint = pointsList.getPrimary(); + if ( !primaryPoint ) { + primaryPoint = pointsList.getByIndex( 0 ); + if ( primaryPoint ) { + primaryPoint.isPrimary = true; + } + } + } + } else { + listLength = pointsList.getLength(); + } + + return listLength; + } + + + /** + * @function + * @private + * @inner + * @param {OpenSeadragon.MouseTracker} tracker + * A reference to the MouseTracker instance. + * @param {Object} event + * A reference to the originating DOM event. + * @param {Array.} gPoints + * Gesture points associated with the event. + */ + function updatePointersEnter( tracker, event, gPoints ) { + var pointsList = tracker.getActivePointersListByType( gPoints[ 0 ].type ), + i, + gPointCount = gPoints.length, + curGPoint, + updateGPoint, + propagate; + + for ( i = 0; i < gPointCount; i++ ) { + curGPoint = gPoints[ i ]; + updateGPoint = pointsList.getById( curGPoint.id ); + + if ( updateGPoint ) { + // Already tracking the pointer...update it + updateGPoint.insideElement = true; + updateGPoint.lastPos = updateGPoint.currentPos; + updateGPoint.lastTime = updateGPoint.currentTime; + updateGPoint.currentPos = curGPoint.currentPos; + updateGPoint.currentTime = curGPoint.currentTime; + + curGPoint = updateGPoint; + } else { + // Initialize for tracking and add to the tracking list + curGPoint.captured = false; + curGPoint.insideElementPressed = false; + curGPoint.insideElement = true; + startTrackingPointer( pointsList, curGPoint ); + } + + // Enter + if ( tracker.enterHandler ) { + propagate = tracker.enterHandler( + { + eventSource: tracker, + pointerType: curGPoint.type, + position: getPointRelativeToAbsolute( curGPoint.currentPos, tracker.element ), + buttons: pointsList.buttons, + pointers: tracker.getActivePointerCount(), + insideElementPressed: curGPoint.insideElementPressed, + buttonDownAny: pointsList.buttons !== 0, + isTouchEvent: curGPoint.type === 'touch', + originalEvent: event, + preventDefaultAction: false, + userData: tracker.userData + } + ); + if ( propagate === false ) { + $.cancelEvent( event ); + } + } + } + } + + + /** + * @function + * @private + * @inner + * @param {OpenSeadragon.MouseTracker} tracker + * A reference to the MouseTracker instance. + * @param {Object} event + * A reference to the originating DOM event. + * @param {Array.} gPoints + * Gesture points associated with the event. + */ + function updatePointersExit( tracker, event, gPoints ) { + var delegate = THIS[ tracker.hash ], + pointsList = tracker.getActivePointersListByType( gPoints[ 0 ].type ), + i, + gPointCount = gPoints.length, + curGPoint, + updateGPoint, + propagate; + + for ( i = 0; i < gPointCount; i++ ) { + curGPoint = gPoints[ i ]; + updateGPoint = pointsList.getById( curGPoint.id ); + + if ( updateGPoint ) { + // Already tracking the pointer. If captured then update it, else stop tracking it + if ( updateGPoint.captured ) { + updateGPoint.insideElement = false; + updateGPoint.lastPos = updateGPoint.currentPos; + updateGPoint.lastTime = updateGPoint.currentTime; + updateGPoint.currentPos = curGPoint.currentPos; + updateGPoint.currentTime = curGPoint.currentTime; + } else { + stopTrackingPointer( pointsList, updateGPoint ); + } + + curGPoint = updateGPoint; + } + + // Exit + if ( tracker.exitHandler ) { + propagate = tracker.exitHandler( + { + eventSource: tracker, + pointerType: curGPoint.type, + position: getPointRelativeToAbsolute( curGPoint.currentPos, tracker.element ), + buttons: pointsList.buttons, + pointers: tracker.getActivePointerCount(), + insideElementPressed: updateGPoint ? updateGPoint.insideElementPressed : false, + buttonDownAny: pointsList.buttons !== 0, + isTouchEvent: curGPoint.type === 'touch', + originalEvent: event, + preventDefaultAction: false, + userData: tracker.userData + } + ); + + if ( propagate === false ) { + $.cancelEvent( event ); + } + } + } + } + + + /** + * @function + * @private + * @inner + * @param {OpenSeadragon.MouseTracker} tracker + * A reference to the MouseTracker instance. + * @param {Object} event + * A reference to the originating DOM event. + * @param {Array.} gPoints + * Gesture points associated with the event. + * @param {Number} buttonChanged + * The button involved in the event: -1: none, 0: primary/left, 1: aux/middle, 2: secondary/right, 3: X1/back, 4: X2/forward, 5: pen eraser. + * Note on chorded button presses (a button pressed when another button is already pressed): In the W3C Pointer Events model, + * only one pointerdown/pointerup event combo is fired. Chorded button state changes instead fire pointermove events. + * + * @returns {Boolean} True if pointers should be captured to the tracked element, otherwise false. + */ + function updatePointersDown( tracker, event, gPoints, buttonChanged ) { + var delegate = THIS[ tracker.hash ], + propagate, + pointsList = tracker.getActivePointersListByType( gPoints[ 0 ].type ), + i, + gPointCount = gPoints.length, + curGPoint, + updateGPoint; + + if ( typeof event.buttons !== 'undefined' ) { + pointsList.buttons = event.buttons; + } else { + if ( $.Browser.vendor === $.BROWSERS.IE && $.Browser.version < 9 ) { + if ( buttonChanged === 0 ) { + // Primary + pointsList.buttons += 1; + } else if ( buttonChanged === 1 ) { + // Aux + pointsList.buttons += 4; + } else if ( buttonChanged === 2 ) { + // Secondary + pointsList.buttons += 2; + } else if ( buttonChanged === 3 ) { + // X1 (Back) + pointsList.buttons += 8; + } else if ( buttonChanged === 4 ) { + // X2 (Forward) + pointsList.buttons += 16; + } else if ( buttonChanged === 5 ) { + // Pen Eraser + pointsList.buttons += 32; + } + } else { + if ( buttonChanged === 0 ) { + // Primary + pointsList.buttons |= 1; + } else if ( buttonChanged === 1 ) { + // Aux + pointsList.buttons |= 4; + } else if ( buttonChanged === 2 ) { + // Secondary + pointsList.buttons |= 2; + } else if ( buttonChanged === 3 ) { + // X1 (Back) + pointsList.buttons |= 8; + } else if ( buttonChanged === 4 ) { + // X2 (Forward) + pointsList.buttons |= 16; + } else if ( buttonChanged === 5 ) { + // Pen Eraser + pointsList.buttons |= 32; + } + } + } + + // Only capture and track primary button, pen, and touch contacts + if ( buttonChanged !== 0 ) { + // Aux Press + if ( tracker.nonPrimaryPressHandler ) { + propagate = tracker.nonPrimaryPressHandler( + { + eventSource: tracker, + pointerType: gPoints[ 0 ].type, + position: getPointRelativeToAbsolute( gPoints[ 0 ].currentPos, tracker.element ), + button: buttonChanged, + buttons: pointsList.buttons, + isTouchEvent: gPoints[ 0 ].type === 'touch', + originalEvent: event, + preventDefaultAction: false, + userData: tracker.userData + } + ); + if ( propagate === false ) { + $.cancelEvent( event ); + } + } + + return false; + } + + for ( i = 0; i < gPointCount; i++ ) { + curGPoint = gPoints[ i ]; + updateGPoint = pointsList.getById( curGPoint.id ); + + if ( updateGPoint ) { + // Already tracking the pointer...update it + updateGPoint.captured = true; + updateGPoint.insideElementPressed = true; + updateGPoint.insideElement = true; + updateGPoint.contactPos = curGPoint.currentPos; + updateGPoint.contactTime = curGPoint.currentTime; + updateGPoint.lastPos = updateGPoint.currentPos; + updateGPoint.lastTime = updateGPoint.currentTime; + updateGPoint.currentPos = curGPoint.currentPos; + updateGPoint.currentTime = curGPoint.currentTime; + + curGPoint = updateGPoint; + } else { + // Initialize for tracking and add to the tracking list (no pointerover or pointermove event occurred before this) + curGPoint.captured = true; + curGPoint.insideElementPressed = true; + curGPoint.insideElement = true; + startTrackingPointer( pointsList, curGPoint ); + } + + pointsList.contacts++; + //$.console.log('contacts++ ', pointsList.contacts); + + if ( tracker.dragHandler || tracker.dragEndHandler || tracker.pinchHandler ) { + $.MouseTracker.gesturePointVelocityTracker.addPoint( tracker, curGPoint ); + } + + if ( pointsList.contacts === 1 ) { + // Press + if ( tracker.pressHandler ) { + propagate = tracker.pressHandler( + { + eventSource: tracker, + pointerType: curGPoint.type, + position: getPointRelativeToAbsolute( curGPoint.contactPos, tracker.element ), + buttons: pointsList.buttons, + isTouchEvent: curGPoint.type === 'touch', + originalEvent: event, + preventDefaultAction: false, + userData: tracker.userData + } + ); + if ( propagate === false ) { + $.cancelEvent( event ); + } + } + } else if ( pointsList.contacts === 2 ) { + if ( tracker.pinchHandler && curGPoint.type === 'touch' ) { + // Initialize for pinch + delegate.pinchGPoints = pointsList.asArray(); + delegate.lastPinchDist = delegate.currentPinchDist = delegate.pinchGPoints[ 0 ].currentPos.distanceTo( delegate.pinchGPoints[ 1 ].currentPos ); + delegate.lastPinchCenter = delegate.currentPinchCenter = getCenterPoint( delegate.pinchGPoints[ 0 ].currentPos, delegate.pinchGPoints[ 1 ].currentPos ); + } + } + } + + return true; + } + + + /** + * @function + * @private + * @inner + * @param {OpenSeadragon.MouseTracker} tracker + * A reference to the MouseTracker instance. + * @param {Object} event + * A reference to the originating DOM event. + * @param {Array.} gPoints + * Gesture points associated with the event. + * @param {Number} buttonChanged + * The button involved in the event: -1: none, 0: primary/left, 1: aux/middle, 2: secondary/right, 3: X1/back, 4: X2/forward, 5: pen eraser. + * Note on chorded button presses (a button pressed when another button is already pressed): In the W3C Pointer Events model, + * only one pointerdown/pointerup event combo is fired. Chorded button state changes instead fire pointermove events. + * + * @returns {Boolean} True if pointer capture should be released from the tracked element, otherwise false. + */ + function updatePointersUp( tracker, event, gPoints, buttonChanged ) { + var delegate = THIS[ tracker.hash ], + pointsList = tracker.getActivePointersListByType( gPoints[ 0 ].type ), + propagate, + insideElementReleased, + releasePoint, + releaseTime, + i, + gPointCount = gPoints.length, + curGPoint, + updateGPoint, + releaseCapture = false, + wasCaptured = false, + quick; + + if ( typeof event.buttons !== 'undefined' ) { + pointsList.buttons = event.buttons; + } else { + if ( $.Browser.vendor === $.BROWSERS.IE && $.Browser.version < 9 ) { + if ( buttonChanged === 0 ) { + // Primary + pointsList.buttons -= 1; + } else if ( buttonChanged === 1 ) { + // Aux + pointsList.buttons -= 4; + } else if ( buttonChanged === 2 ) { + // Secondary + pointsList.buttons -= 2; + } else if ( buttonChanged === 3 ) { + // X1 (Back) + pointsList.buttons -= 8; + } else if ( buttonChanged === 4 ) { + // X2 (Forward) + pointsList.buttons -= 16; + } else if ( buttonChanged === 5 ) { + // Pen Eraser + pointsList.buttons -= 32; + } + } else { + if ( buttonChanged === 0 ) { + // Primary + pointsList.buttons ^= ~1; + } else if ( buttonChanged === 1 ) { + // Aux + pointsList.buttons ^= ~4; + } else if ( buttonChanged === 2 ) { + // Secondary + pointsList.buttons ^= ~2; + } else if ( buttonChanged === 3 ) { + // X1 (Back) + pointsList.buttons ^= ~8; + } else if ( buttonChanged === 4 ) { + // X2 (Forward) + pointsList.buttons ^= ~16; + } else if ( buttonChanged === 5 ) { + // Pen Eraser + pointsList.buttons ^= ~32; + } + } + } + + // Only capture and track primary button, pen, and touch contacts + if ( buttonChanged !== 0 ) { + // Aux Release + if ( tracker.nonPrimaryReleaseHandler ) { + propagate = tracker.nonPrimaryReleaseHandler( + { + eventSource: tracker, + pointerType: gPoints[ 0 ].type, + position: getPointRelativeToAbsolute( gPoints[ 0 ].currentPos, tracker.element ), + button: buttonChanged, + buttons: pointsList.buttons, + isTouchEvent: gPoints[ 0 ].type === 'touch', + originalEvent: event, + preventDefaultAction: false, + userData: tracker.userData + } + ); + if ( propagate === false ) { + $.cancelEvent( event ); + } + } + + return false; + } + + for ( i = 0; i < gPointCount; i++ ) { + curGPoint = gPoints[ i ]; + updateGPoint = pointsList.getById( curGPoint.id ); + + if ( updateGPoint ) { + // Update the pointer, stop tracking it if not still in this element + if ( updateGPoint.captured ) { + updateGPoint.captured = false; + releaseCapture = true; + wasCaptured = true; + } + updateGPoint.lastPos = updateGPoint.currentPos; + updateGPoint.lastTime = updateGPoint.currentTime; + updateGPoint.currentPos = curGPoint.currentPos; + updateGPoint.currentTime = curGPoint.currentTime; + if ( !updateGPoint.insideElement ) { + stopTrackingPointer( pointsList, updateGPoint ); + } + + releasePoint = updateGPoint.currentPos; + releaseTime = updateGPoint.currentTime; + + if ( wasCaptured ) { + // Pointer was activated in our element but could have been removed in any element since events are captured to our element + + pointsList.contacts--; + //$.console.log('contacts-- ', pointsList.contacts); + + if ( tracker.dragHandler || tracker.dragEndHandler || tracker.pinchHandler ) { + $.MouseTracker.gesturePointVelocityTracker.removePoint( tracker, updateGPoint ); + } + + if ( pointsList.contacts === 0 ) { + + // Release (pressed in our element) + if ( tracker.releaseHandler ) { + propagate = tracker.releaseHandler( + { + eventSource: tracker, + pointerType: updateGPoint.type, + position: getPointRelativeToAbsolute( releasePoint, tracker.element ), + buttons: pointsList.buttons, + insideElementPressed: updateGPoint.insideElementPressed, + insideElementReleased: updateGPoint.insideElement, + isTouchEvent: updateGPoint.type === 'touch', + originalEvent: event, + preventDefaultAction: false, + userData: tracker.userData + } + ); + if ( propagate === false ) { + $.cancelEvent( event ); + } + } + + // Drag End + if ( tracker.dragEndHandler && !updateGPoint.currentPos.equals( updateGPoint.contactPos ) ) { + propagate = tracker.dragEndHandler( + { + eventSource: tracker, + pointerType: updateGPoint.type, + position: getPointRelativeToAbsolute( updateGPoint.currentPos, tracker.element ), + speed: updateGPoint.speed, + direction: updateGPoint.direction, + shift: event.shiftKey, + isTouchEvent: updateGPoint.type === 'touch', + originalEvent: event, + preventDefaultAction: false, + userData: tracker.userData + } + ); + if ( propagate === false ) { + $.cancelEvent( event ); + } + } + + // Click / Double-Click + if ( ( tracker.clickHandler || tracker.dblClickHandler ) && updateGPoint.insideElement ) { + quick = releaseTime - updateGPoint.contactTime <= tracker.clickTimeThreshold && + updateGPoint.contactPos.distanceTo( releasePoint ) <= tracker.clickDistThreshold; + + // Click + if ( tracker.clickHandler ) { + propagate = tracker.clickHandler( + { + eventSource: tracker, + pointerType: updateGPoint.type, + position: getPointRelativeToAbsolute( updateGPoint.currentPos, tracker.element ), + quick: quick, + shift: event.shiftKey, + isTouchEvent: updateGPoint.type === 'touch', + originalEvent: event, + preventDefaultAction: false, + userData: tracker.userData + } + ); + if ( propagate === false ) { + $.cancelEvent( event ); + } + } + + // Double-Click + if ( tracker.dblClickHandler && quick ) { + pointsList.clicks++; + if ( pointsList.clicks === 1 ) { + delegate.lastClickPos = releasePoint; + /*jshint loopfunc:true*/ + delegate.dblClickTimeOut = setTimeout( function() { + pointsList.clicks = 0; + }, tracker.dblClickTimeThreshold ); + /*jshint loopfunc:false*/ + } else if ( pointsList.clicks === 2 ) { + clearTimeout( delegate.dblClickTimeOut ); + pointsList.clicks = 0; + if ( delegate.lastClickPos.distanceTo( releasePoint ) <= tracker.dblClickDistThreshold ) { + propagate = tracker.dblClickHandler( + { + eventSource: tracker, + pointerType: updateGPoint.type, + position: getPointRelativeToAbsolute( updateGPoint.currentPos, tracker.element ), + shift: event.shiftKey, + isTouchEvent: updateGPoint.type === 'touch', + originalEvent: event, + preventDefaultAction: false, + userData: tracker.userData + } + ); + if ( propagate === false ) { + $.cancelEvent( event ); + } + } + delegate.lastClickPos = null; + } + } + } + } else if ( pointsList.contacts === 2 ) { + if ( tracker.pinchHandler && updateGPoint.type === 'touch' ) { + // Reset for pinch + delegate.pinchGPoints = pointsList.asArray(); + delegate.lastPinchDist = delegate.currentPinchDist = delegate.pinchGPoints[ 0 ].currentPos.distanceTo( delegate.pinchGPoints[ 1 ].currentPos ); + delegate.lastPinchCenter = delegate.currentPinchCenter = getCenterPoint( delegate.pinchGPoints[ 0 ].currentPos, delegate.pinchGPoints[ 1 ].currentPos ); + } + } + } else { + // Pointer was activated in another element but removed in our element + + // Release (pressed in another element) + if ( tracker.releaseHandler ) { + propagate = tracker.releaseHandler( + { + eventSource: tracker, + pointerType: updateGPoint.type, + position: getPointRelativeToAbsolute( releasePoint, tracker.element ), + buttons: pointsList.buttons, + insideElementPressed: updateGPoint.insideElementPressed, + insideElementReleased: updateGPoint.insideElement, + isTouchEvent: updateGPoint.type === 'touch', + originalEvent: event, + preventDefaultAction: false, + userData: tracker.userData + } + ); + if ( propagate === false ) { + $.cancelEvent( event ); + } + } + } + } + } + + return releaseCapture; + } + + + /** + * Call when pointer(s) change coordinates, button state, pressure, tilt, or contact geometry (e.g. width and height) + * + * @function + * @private + * @inner + * @param {OpenSeadragon.MouseTracker} tracker + * A reference to the MouseTracker instance. + * @param {Object} event + * A reference to the originating DOM event. + * @param {Array.} gPoints + * Gesture points associated with the event. + */ + function updatePointersMove( tracker, event, gPoints ) { + var delegate = THIS[ tracker.hash ], + pointsList = tracker.getActivePointersListByType( gPoints[ 0 ].type ), + i, + gPointCount = gPoints.length, + curGPoint, + updateGPoint, + gPointArray, + delta, + propagate; + + if ( typeof event.buttons !== 'undefined' ) { + pointsList.buttons = event.buttons; + } + + for ( i = 0; i < gPointCount; i++ ) { + curGPoint = gPoints[ i ]; + updateGPoint = pointsList.getById( curGPoint.id ); + + if ( updateGPoint ) { + // Already tracking the pointer...update it + if ( curGPoint.hasOwnProperty( 'isPrimary' ) ) { + updateGPoint.isPrimary = curGPoint.isPrimary; + } + updateGPoint.lastPos = updateGPoint.currentPos; + updateGPoint.lastTime = updateGPoint.currentTime; + updateGPoint.currentPos = curGPoint.currentPos; + updateGPoint.currentTime = curGPoint.currentTime; + } else { + // Initialize for tracking and add to the tracking list (no pointerover or pointerdown event occurred before this) + curGPoint.captured = false; + curGPoint.insideElementPressed = false; + curGPoint.insideElement = true; + startTrackingPointer( pointsList, curGPoint ); + } + } + + // Stop (mouse only) + if ( tracker.stopHandler && gPoints[ 0 ].type === 'mouse' ) { + clearTimeout( tracker.stopTimeOut ); + tracker.stopTimeOut = setTimeout( function() { + handlePointerStop( tracker, event, gPoints[ 0 ].type ); + }, tracker.stopDelay ); + } + + if ( pointsList.contacts === 0 ) { + // Move (no contacts: hovering mouse or other hover-capable device) + if ( tracker.moveHandler ) { + propagate = tracker.moveHandler( + { + eventSource: tracker, + pointerType: gPoints[ 0 ].type, + position: getPointRelativeToAbsolute( gPoints[ 0 ].currentPos, tracker.element ), + buttons: pointsList.buttons, + isTouchEvent: gPoints[ 0 ].type === 'touch', + originalEvent: event, + preventDefaultAction: false, + userData: tracker.userData + } + ); + if ( propagate === false ) { + $.cancelEvent( event ); + } + } + } else if ( pointsList.contacts === 1 ) { + // Move (1 contact) + if ( tracker.moveHandler ) { + updateGPoint = pointsList.asArray()[ 0 ]; + propagate = tracker.moveHandler( + { + eventSource: tracker, + pointerType: updateGPoint.type, + position: getPointRelativeToAbsolute( updateGPoint.currentPos, tracker.element ), + buttons: pointsList.buttons, + isTouchEvent: updateGPoint.type === 'touch', + originalEvent: event, + preventDefaultAction: false, + userData: tracker.userData + } + ); + if ( propagate === false ) { + $.cancelEvent( event ); + } + } + + // Drag + if ( tracker.dragHandler ) { + updateGPoint = pointsList.asArray()[ 0 ]; + delta = updateGPoint.currentPos.minus( updateGPoint.lastPos ); + propagate = tracker.dragHandler( + { + eventSource: tracker, + pointerType: updateGPoint.type, + position: getPointRelativeToAbsolute( updateGPoint.currentPos, tracker.element ), + buttons: pointsList.buttons, + delta: delta, + speed: updateGPoint.speed, + direction: updateGPoint.direction, + shift: event.shiftKey, + isTouchEvent: updateGPoint.type === 'touch', + originalEvent: event, + preventDefaultAction: false, + userData: tracker.userData + } + ); + if ( propagate === false ) { + $.cancelEvent( event ); + } + } + } else if ( pointsList.contacts === 2 ) { + // Move (2 contacts, use center) + if ( tracker.moveHandler ) { + gPointArray = pointsList.asArray(); + propagate = tracker.moveHandler( + { + eventSource: tracker, + pointerType: gPointArray[ 0 ].type, + position: getPointRelativeToAbsolute( getCenterPoint( gPointArray[ 0 ].currentPos, gPointArray[ 1 ].currentPos ), tracker.element ), + buttons: pointsList.buttons, + isTouchEvent: gPointArray[ 0 ].type === 'touch', + originalEvent: event, + preventDefaultAction: false, + userData: tracker.userData + } + ); + if ( propagate === false ) { + $.cancelEvent( event ); + } + } + + // Pinch + if ( tracker.pinchHandler && gPoints[ 0 ].type === 'touch' ) { + delta = delegate.pinchGPoints[ 0 ].currentPos.distanceTo( delegate.pinchGPoints[ 1 ].currentPos ); + if ( delta != delegate.currentPinchDist ) { + delegate.lastPinchDist = delegate.currentPinchDist; + delegate.currentPinchDist = delta; + delegate.lastPinchCenter = delegate.currentPinchCenter; + delegate.currentPinchCenter = getCenterPoint( delegate.pinchGPoints[ 0 ].currentPos, delegate.pinchGPoints[ 1 ].currentPos ); + propagate = tracker.pinchHandler( + { + eventSource: tracker, + pointerType: 'touch', + gesturePoints: delegate.pinchGPoints, + lastCenter: getPointRelativeToAbsolute( delegate.lastPinchCenter, tracker.element ), + center: getPointRelativeToAbsolute( delegate.currentPinchCenter, tracker.element ), + lastDistance: delegate.lastPinchDist, + distance: delegate.currentPinchDist, + shift: event.shiftKey, + originalEvent: event, + preventDefaultAction: false, + userData: tracker.userData + } + ); + if ( propagate === false ) { + $.cancelEvent( event ); + } + } + } + } + } + + + /** + * @function + * @private + * @inner + * @param {OpenSeadragon.MouseTracker} tracker + * A reference to the MouseTracker instance. + * @param {Object} event + * A reference to the originating DOM event. + * @param {Array.} gPoints + * Gesture points associated with the event. + */ + function updatePointersCancel( tracker, event, gPoints ) { + updatePointersUp( tracker, event, gPoints, 0 ); + updatePointersExit( tracker, event, gPoints ); + } + + + /** + * @private + * @inner + */ + function handlePointerStop( tracker, originalMoveEvent, pointerType ) { + if ( tracker.stopHandler ) { + tracker.stopHandler( { + eventSource: tracker, + pointerType: pointerType, + position: getMouseRelative( originalMoveEvent, tracker.element ), + buttons: tracker.getActivePointersListByType( pointerType ).buttons, + isTouchEvent: pointerType === 'touch', + originalEvent: originalMoveEvent, + preventDefaultAction: false, + userData: tracker.userData + } ); + } + } + + // True if inside an iframe, otherwise false. + // @member {Boolean} isInIframe + // @private + // @inner + var isInIframe = (function() { + try { + return window.self !== window.top; + } catch (e) { + return true; + } + })(); + + // @function + // @private + // @inner + // @returns {Boolean} True if the target has access rights to events, otherwise false. + function canAccessEvents (target) { + try { + return target.addEventListener && target.removeEventListener; + } catch (e) { + return false; + } + } + +} ( OpenSeadragon ) ); + +/* + * OpenSeadragon - Control + * + * Copyright (C) 2009 CodePlex Foundation + * Copyright (C) 2010-2013 OpenSeadragon contributors + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of CodePlex Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +(function( $ ){ + +/** + * An enumeration of supported locations where controls can be anchored. + * The anchoring is always relative to the container. + * @member ControlAnchor + * @memberof OpenSeadragon + * @static + * @type {Object} + * @property {Number} NONE + * @property {Number} TOP_LEFT + * @property {Number} TOP_RIGHT + * @property {Number} BOTTOM_LEFT + * @property {Number} BOTTOM_RIGHT + * @property {Number} ABSOLUTE + */ +$.ControlAnchor = { + NONE: 0, + TOP_LEFT: 1, + TOP_RIGHT: 2, + BOTTOM_RIGHT: 3, + BOTTOM_LEFT: 4, + ABSOLUTE: 5 +}; + +/** + * @class Control + * @classdesc A Control represents any interface element which is meant to allow the user + * to interact with the zoomable interface. Any control can be anchored to any + * element. + * + * @memberof OpenSeadragon + * @param {Element} element - the control element to be anchored in the container. + * @param {Object } options - All required and optional settings for configuring a control element. + * @param {OpenSeadragon.ControlAnchor} [options.anchor=OpenSeadragon.ControlAnchor.NONE] - the position of the control + * relative to the container. + * @param {Boolean} [options.attachToViewer=true] - Whether the control should be added directly to the viewer, or + * directly to the container + * @param {Boolean} [options.autoFade=true] - Whether the control should have the autofade behavior + * @param {Element} container - the element to control will be anchored too. + */ +$.Control = function ( element, options, container ) { + var parent = element.parentNode; + if (typeof options === 'number') + { + $.console.error("Passing an anchor directly into the OpenSeadragon.Control constructor is deprecated; " + + "please use an options object instead. " + + "Support for this deprecated variant is scheduled for removal in December 2013"); + options = {anchor: options}; + } + options.attachToViewer = (typeof options.attachToViewer === 'undefined') ? true : options.attachToViewer; + /** + * True if the control should have autofade behavior. + * @member {Boolean} autoFade + * @memberof OpenSeadragon.Control# + */ + this.autoFade = (typeof options.autoFade === 'undefined') ? true : options.autoFade; + /** + * The element providing the user interface with some type of control (e.g. a zoom-in button). + * @member {Element} element + * @memberof OpenSeadragon.Control# + */ + this.element = element; + /** + * The position of the Control relative to its container. + * @member {OpenSeadragon.ControlAnchor} anchor + * @memberof OpenSeadragon.Control# + */ + this.anchor = options.anchor; + /** + * The Control's containing element. + * @member {Element} container + * @memberof OpenSeadragon.Control# + */ + this.container = container; + /** + * A neutral element surrounding the control element. + * @member {Element} wrapper + * @memberof OpenSeadragon.Control# + */ + if ( this.anchor == $.ControlAnchor.ABSOLUTE ) { + this.wrapper = $.makeNeutralElement( "div" ); + this.wrapper.style.position = "absolute"; + this.wrapper.style.top = typeof ( options.top ) == "number" ? ( options.top + 'px' ) : options.top; + this.wrapper.style.left = typeof ( options.left ) == "number" ? (options.left + 'px' ) : options.left; + this.wrapper.style.height = typeof ( options.height ) == "number" ? ( options.height + 'px' ) : options.height; + this.wrapper.style.width = typeof ( options.width ) == "number" ? ( options.width + 'px' ) : options.width; + this.wrapper.style.margin = "0px"; + this.wrapper.style.padding = "0px"; + + this.element.style.position = "relative"; + this.element.style.top = "0px"; + this.element.style.left = "0px"; + this.element.style.height = "100%"; + this.element.style.width = "100%"; + } else { + this.wrapper = $.makeNeutralElement( "div" ); + this.wrapper.style.display = "inline-block"; + if ( this.anchor == $.ControlAnchor.NONE ) { + // IE6 fix + this.wrapper.style.width = this.wrapper.style.height = "100%"; + } + } + this.wrapper.appendChild( this.element ); + + if (options.attachToViewer ) { + if ( this.anchor == $.ControlAnchor.TOP_RIGHT || + this.anchor == $.ControlAnchor.BOTTOM_RIGHT ) { + this.container.insertBefore( + this.wrapper, + this.container.firstChild + ); + } else { + this.container.appendChild( this.wrapper ); + } + } else { + parent.appendChild( this.wrapper ); + } +}; + +/** @lends OpenSeadragon.Control.prototype */ +$.Control.prototype = { + + /** + * Removes the control from the container. + * @function + */ + destroy: function() { + this.wrapper.removeChild( this.element ); + this.container.removeChild( this.wrapper ); + }, + + /** + * Determines if the control is currently visible. + * @function + * @return {Boolean} true if currenly visible, false otherwise. + */ + isVisible: function() { + return this.wrapper.style.display != "none"; + }, + + /** + * Toggles the visibility of the control. + * @function + * @param {Boolean} visible - true to make visible, false to hide. + */ + setVisible: function( visible ) { + this.wrapper.style.display = visible ? + ( this.anchor == $.ControlAnchor.ABSOLUTE ? 'block' : 'inline-block' ) : + "none"; + }, + + /** + * Sets the opacity level for the control. + * @function + * @param {Number} opactiy - a value between 1 and 0 inclusively. + */ + setOpacity: function( opacity ) { + if ( this.element[ $.SIGNAL ] && $.Browser.vendor == $.BROWSERS.IE ) { + $.setElementOpacity( this.element, opacity, true ); + } else { + $.setElementOpacity( this.wrapper, opacity, true ); + } + } +}; + +}( OpenSeadragon )); + +/* + * OpenSeadragon - ControlDock + * + * Copyright (C) 2009 CodePlex Foundation + * Copyright (C) 2010-2013 OpenSeadragon contributors + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of CodePlex Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +(function( $ ){ + /** + * @class ControlDock + * @classdesc Provides a container element (a <form> element) with support for the layout of control elements. + * + * @memberof OpenSeadragon + */ + $.ControlDock = function( options ){ + var layouts = [ 'topleft', 'topright', 'bottomright', 'bottomleft'], + layout, + i; + + $.extend( true, this, { + id: 'controldock-'+$.now()+'-'+Math.floor(Math.random()*1000000), + container: $.makeNeutralElement( 'div' ), + controls: [] + }, options ); + + // Disable the form's submit; otherwise button clicks and return keys + // can trigger it. + this.container.onsubmit = function() { + return false; + }; + + if( this.element ){ + this.element = $.getElement( this.element ); + this.element.appendChild( this.container ); + this.element.style.position = 'relative'; + this.container.style.width = '100%'; + this.container.style.height = '100%'; + } + + for( i = 0; i < layouts.length; i++ ){ + layout = layouts[ i ]; + this.controls[ layout ] = $.makeNeutralElement( "div" ); + this.controls[ layout ].style.position = 'absolute'; + if ( layout.match( 'left' ) ){ + this.controls[ layout ].style.left = '0px'; + } + if ( layout.match( 'right' ) ){ + this.controls[ layout ].style.right = '0px'; + } + if ( layout.match( 'top' ) ){ + this.controls[ layout ].style.top = '0px'; + } + if ( layout.match( 'bottom' ) ){ + this.controls[ layout ].style.bottom = '0px'; + } + } + + this.container.appendChild( this.controls.topleft ); + this.container.appendChild( this.controls.topright ); + this.container.appendChild( this.controls.bottomright ); + this.container.appendChild( this.controls.bottomleft ); + }; + + /** @lends OpenSeadragon.ControlDock.prototype */ + $.ControlDock.prototype = { + + /** + * @function + */ + addControl: function ( element, controlOptions ) { + element = $.getElement( element ); + var div = null; + + if ( getControlIndex( this, element ) >= 0 ) { + return; // they're trying to add a duplicate control + } + + switch ( controlOptions.anchor ) { + case $.ControlAnchor.TOP_RIGHT: + div = this.controls.topright; + element.style.position = "relative"; + element.style.paddingRight = "0px"; + element.style.paddingTop = "0px"; + break; + case $.ControlAnchor.BOTTOM_RIGHT: + div = this.controls.bottomright; + element.style.position = "relative"; + element.style.paddingRight = "0px"; + element.style.paddingBottom = "0px"; + break; + case $.ControlAnchor.BOTTOM_LEFT: + div = this.controls.bottomleft; + element.style.position = "relative"; + element.style.paddingLeft = "0px"; + element.style.paddingBottom = "0px"; + break; + case $.ControlAnchor.TOP_LEFT: + div = this.controls.topleft; + element.style.position = "relative"; + element.style.paddingLeft = "0px"; + element.style.paddingTop = "0px"; + break; + case $.ControlAnchor.ABSOLUTE: + div = this.container; + element.style.margin = "0px"; + element.style.padding = "0px"; + break; + default: + case $.ControlAnchor.NONE: + div = this.container; + element.style.margin = "0px"; + element.style.padding = "0px"; + break; + } + + this.controls.push( + new $.Control( element, controlOptions, div ) + ); + element.style.display = "inline-block"; + }, + + + /** + * @function + * @return {OpenSeadragon.ControlDock} Chainable. + */ + removeControl: function ( element ) { + element = $.getElement( element ); + var i = getControlIndex( this, element ); + + if ( i >= 0 ) { + this.controls[ i ].destroy(); + this.controls.splice( i, 1 ); + } + + return this; + }, + + /** + * @function + * @return {OpenSeadragon.ControlDock} Chainable. + */ + clearControls: function () { + while ( this.controls.length > 0 ) { + this.controls.pop().destroy(); + } + + return this; + }, + + + /** + * @function + * @return {Boolean} + */ + areControlsEnabled: function () { + var i; + + for ( i = this.controls.length - 1; i >= 0; i-- ) { + if ( this.controls[ i ].isVisible() ) { + return true; + } + } + + return false; + }, + + + /** + * @function + * @return {OpenSeadragon.ControlDock} Chainable. + */ + setControlsEnabled: function( enabled ) { + var i; + + for ( i = this.controls.length - 1; i >= 0; i-- ) { + this.controls[ i ].setVisible( enabled ); + } + + return this; + } + + }; + + + /////////////////////////////////////////////////////////////////////////////// + // Utility methods + /////////////////////////////////////////////////////////////////////////////// + function getControlIndex( dock, element ) { + var controls = dock.controls, + i; + + for ( i = controls.length - 1; i >= 0; i-- ) { + if ( controls[ i ].element == element ) { + return i; + } + } + + return -1; + } + +}( OpenSeadragon )); + +/* + * OpenSeadragon - Placement + * + * Copyright (C) 2010-2016 OpenSeadragon contributors + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of CodePlex Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +(function($) { + + /** + * An enumeration of positions to anchor an element. + * @member Placement + * @memberOf OpenSeadragon + * @static + * @readonly + * @property {OpenSeadragon.Placement} CENTER + * @property {OpenSeadragon.Placement} TOP_LEFT + * @property {OpenSeadragon.Placement} TOP + * @property {OpenSeadragon.Placement} TOP_RIGHT + * @property {OpenSeadragon.Placement} RIGHT + * @property {OpenSeadragon.Placement} BOTTOM_RIGHT + * @property {OpenSeadragon.Placement} BOTTOM + * @property {OpenSeadragon.Placement} BOTTOM_LEFT + * @property {OpenSeadragon.Placement} LEFT + */ + $.Placement = $.freezeObject({ + CENTER: 0, + TOP_LEFT: 1, + TOP: 2, + TOP_RIGHT: 3, + RIGHT: 4, + BOTTOM_RIGHT: 5, + BOTTOM: 6, + BOTTOM_LEFT: 7, + LEFT: 8, + properties: { + 0: { + isLeft: false, + isHorizontallyCentered: true, + isRight: false, + isTop: false, + isVerticallyCentered: true, + isBottom: false + }, + 1: { + isLeft: true, + isHorizontallyCentered: false, + isRight: false, + isTop: true, + isVerticallyCentered: false, + isBottom: false + }, + 2: { + isLeft: false, + isHorizontallyCentered: true, + isRight: false, + isTop: true, + isVerticallyCentered: false, + isBottom: false + }, + 3: { + isLeft: false, + isHorizontallyCentered: false, + isRight: true, + isTop: true, + isVerticallyCentered: false, + isBottom: false + }, + 4: { + isLeft: false, + isHorizontallyCentered: false, + isRight: true, + isTop: false, + isVerticallyCentered: true, + isBottom: false + }, + 5: { + isLeft: false, + isHorizontallyCentered: false, + isRight: true, + isTop: false, + isVerticallyCentered: false, + isBottom: true + }, + 6: { + isLeft: false, + isHorizontallyCentered: true, + isRight: false, + isTop: false, + isVerticallyCentered: false, + isBottom: true + }, + 7: { + isLeft: true, + isHorizontallyCentered: false, + isRight: false, + isTop: false, + isVerticallyCentered: false, + isBottom: true + }, + 8: { + isLeft: true, + isHorizontallyCentered: false, + isRight: false, + isTop: false, + isVerticallyCentered: true, + isBottom: false + } + } + }); + +}(OpenSeadragon)); + +/* + * OpenSeadragon - Viewer + * + * Copyright (C) 2009 CodePlex Foundation + * Copyright (C) 2010-2013 OpenSeadragon contributors + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of CodePlex Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +(function( $ ){ + +// dictionary from hash to private properties +var THIS = {}; +var nextHash = 1; + +/** + * + * The main point of entry into creating a zoomable image on the page.
+ *
+ * We have provided an idiomatic javascript constructor which takes + * a single object, but still support the legacy positional arguments.
+ *
+ * The options below are given in order that they appeared in the constructor + * as arguments and we translate a positional call into an idiomatic call.
+ *
+ * To create a viewer, you can use either of this methods:
+ *
    + *
  • var viewer = new OpenSeadragon.Viewer(options);
  • + *
  • var viewer = OpenSeadragon(options);
  • + *
+ * @class Viewer + * @classdesc The main OpenSeadragon viewer class. + * + * @memberof OpenSeadragon + * @extends OpenSeadragon.EventSource + * @extends OpenSeadragon.ControlDock + * @param {OpenSeadragon.Options} options - Viewer options. + * + **/ +$.Viewer = function( options ) { + + var args = arguments, + _this = this, + i; + + + //backward compatibility for positional args while prefering more + //idiomatic javascript options object as the only argument + if( !$.isPlainObject( options ) ){ + options = { + id: args[ 0 ], + xmlPath: args.length > 1 ? args[ 1 ] : undefined, + prefixUrl: args.length > 2 ? args[ 2 ] : undefined, + controls: args.length > 3 ? args[ 3 ] : undefined, + overlays: args.length > 4 ? args[ 4 ] : undefined + }; + } + + //options.config and the general config argument are deprecated + //in favor of the more direct specification of optional settings + //being pass directly on the options object + if ( options.config ){ + $.extend( true, options, options.config ); + delete options.config; + } + + //Public properties + //Allow the options object to override global defaults + $.extend( true, this, { + + //internal state and dom identifiers + id: options.id, + hash: options.hash || nextHash++, + + //dom nodes + /** + * The parent element of this Viewer instance, passed in when the Viewer was created. + * @member {Element} element + * @memberof OpenSeadragon.Viewer# + */ + element: null, + /** + * A <div> element (provided by {@link OpenSeadragon.ControlDock}), the base element of this Viewer instance.

+ * Child element of {@link OpenSeadragon.Viewer#element}. + * @member {Element} container + * @memberof OpenSeadragon.Viewer# + */ + container: null, + /** + * A <div> element, the element where user-input events are handled for panning and zooming.

+ * Child element of {@link OpenSeadragon.Viewer#container}, + * positioned on top of {@link OpenSeadragon.Viewer#keyboardCommandArea}.

+ * The parent of {@link OpenSeadragon.Drawer#canvas} instances. + * @member {Element} canvas + * @memberof OpenSeadragon.Viewer# + */ + canvas: null, + + // Overlays list. An overlay allows to add html on top of the viewer. + overlays: [], + // Container inside the canvas where overlays are drawn. + overlaysContainer: null, + + //private state properties + previousBody: [], + + //This was originally initialized in the constructor and so could never + //have anything in it. now it can because we allow it to be specified + //in the options and is only empty by default if not specified. Also + //this array was returned from get_controls which I find confusing + //since this object has a controls property which is treated in other + //functions like clearControls. I'm removing the accessors. + customControls: [], + + //These are originally not part options but declared as members + //in initialize. It's still considered idiomatic to put them here + source: null, + /** + * Handles rendering of tiles in the viewer. Created for each TileSource opened. + * @member {OpenSeadragon.Drawer} drawer + * @memberof OpenSeadragon.Viewer# + */ + drawer: null, + world: null, + /** + * Handles coordinate-related functionality - zoom, pan, rotation, etc. Created for each TileSource opened. + * @member {OpenSeadragon.Viewport} viewport + * @memberof OpenSeadragon.Viewer# + */ + viewport: null, + /** + * @member {OpenSeadragon.Navigator} navigator + * @memberof OpenSeadragon.Viewer# + */ + navigator: null, + + //A collection viewport is a separate viewport used to provide + //simultaneous rendering of sets of tiles + collectionViewport: null, + collectionDrawer: null, + + //UI image resources + //TODO: rename navImages to uiImages + navImages: null, + + //interface button controls + buttons: null, + + //TODO: this is defunct so safely remove it + profiler: null + + }, $.DEFAULT_SETTINGS, options ); + + if ( typeof( this.hash) === "undefined" ) { + throw new Error("A hash must be defined, either by specifying options.id or options.hash."); + } + if ( typeof( THIS[ this.hash ] ) !== "undefined" ) { + // We don't want to throw an error here, as the user might have discarded + // the previous viewer with the same hash and now want to recreate it. + $.console.warn("Hash " + this.hash + " has already been used."); + } + + //Private state properties + THIS[ this.hash ] = { + "fsBoundsDelta": new $.Point( 1, 1 ), + "prevContainerSize": null, + "animating": false, + "forceRedraw": false, + "mouseInside": false, + "group": null, + // whether we should be continuously zooming + "zooming": false, + // how much we should be continuously zooming by + "zoomFactor": null, + "lastZoomTime": null, + "fullPage": false, + "onfullscreenchange": null + }; + + this._sequenceIndex = 0; + this._firstOpen = true; + this._updateRequestId = null; + this._loadQueue = []; + this.currentOverlays = []; + + this._lastScrollTime = $.now(); // variable used to help normalize the scroll event speed of different devices + + //Inherit some behaviors and properties + $.EventSource.call( this ); + + this.addHandler( 'open-failed', function ( event ) { + var msg = $.getString( "Errors.OpenFailed", event.eventSource, event.message); + _this._showMessage( msg ); + }); + + $.ControlDock.call( this, options ); + + //Deal with tile sources + if ( this.xmlPath ){ + //Deprecated option. Now it is preferred to use the tileSources option + this.tileSources = [ this.xmlPath ]; + } + + this.element = this.element || document.getElementById( this.id ); + this.canvas = $.makeNeutralElement( "div" ); + + this.canvas.className = "openseadragon-canvas"; + (function( style ){ + style.width = "100%"; + style.height = "100%"; + style.overflow = "hidden"; + style.position = "absolute"; + style.top = "0px"; + style.left = "0px"; + }(this.canvas.style)); + $.setElementTouchActionNone( this.canvas ); + if (options.tabIndex !== "") { + this.canvas.tabIndex = (options.tabIndex === undefined ? 0 : options.tabIndex); + } + + //the container is created through applying the ControlDock constructor above + this.container.className = "openseadragon-container"; + (function( style ){ + style.width = "100%"; + style.height = "100%"; + style.position = "relative"; + style.overflow = "hidden"; + style.left = "0px"; + style.top = "0px"; + style.textAlign = "left"; // needed to protect against + }( this.container.style )); + + this.container.insertBefore( this.canvas, this.container.firstChild ); + this.element.appendChild( this.container ); + + //Used for toggling between fullscreen and default container size + //TODO: these can be closure private and shared across Viewer + // instances. + this.bodyWidth = document.body.style.width; + this.bodyHeight = document.body.style.height; + this.bodyOverflow = document.body.style.overflow; + this.docOverflow = document.documentElement.style.overflow; + + this.innerTracker = new $.MouseTracker({ + element: this.canvas, + startDisabled: this.mouseNavEnabled ? false : true, + clickTimeThreshold: this.clickTimeThreshold, + clickDistThreshold: this.clickDistThreshold, + dblClickTimeThreshold: this.dblClickTimeThreshold, + dblClickDistThreshold: this.dblClickDistThreshold, + keyDownHandler: $.delegate( this, onCanvasKeyDown ), + keyHandler: $.delegate( this, onCanvasKeyPress ), + clickHandler: $.delegate( this, onCanvasClick ), + dblClickHandler: $.delegate( this, onCanvasDblClick ), + dragHandler: $.delegate( this, onCanvasDrag ), + dragEndHandler: $.delegate( this, onCanvasDragEnd ), + enterHandler: $.delegate( this, onCanvasEnter ), + exitHandler: $.delegate( this, onCanvasExit ), + pressHandler: $.delegate( this, onCanvasPress ), + releaseHandler: $.delegate( this, onCanvasRelease ), + nonPrimaryPressHandler: $.delegate( this, onCanvasNonPrimaryPress ), + nonPrimaryReleaseHandler: $.delegate( this, onCanvasNonPrimaryRelease ), + scrollHandler: $.delegate( this, onCanvasScroll ), + pinchHandler: $.delegate( this, onCanvasPinch ) + }); + + this.outerTracker = new $.MouseTracker({ + element: this.container, + startDisabled: this.mouseNavEnabled ? false : true, + clickTimeThreshold: this.clickTimeThreshold, + clickDistThreshold: this.clickDistThreshold, + dblClickTimeThreshold: this.dblClickTimeThreshold, + dblClickDistThreshold: this.dblClickDistThreshold, + enterHandler: $.delegate( this, onContainerEnter ), + exitHandler: $.delegate( this, onContainerExit ) + }); + + if( this.toolbar ){ + this.toolbar = new $.ControlDock({ element: this.toolbar }); + } + + this.bindStandardControls(); + + THIS[ this.hash ].prevContainerSize = _getSafeElemSize( this.container ); + + // Create the world + this.world = new $.World({ + viewer: this + }); + + this.world.addHandler('add-item', function(event) { + // For backwards compatibility, we maintain the source property + _this.source = _this.world.getItemAt(0).source; + + THIS[ _this.hash ].forceRedraw = true; + + if (!_this._updateRequestId) { + _this._updateRequestId = scheduleUpdate( _this, updateMulti ); + } + }); + + this.world.addHandler('remove-item', function(event) { + // For backwards compatibility, we maintain the source property + if (_this.world.getItemCount()) { + _this.source = _this.world.getItemAt(0).source; + } else { + _this.source = null; + } + + THIS[ _this.hash ].forceRedraw = true; + }); + + this.world.addHandler('metrics-change', function(event) { + if (_this.viewport) { + _this.viewport._setContentBounds(_this.world.getHomeBounds(), _this.world.getContentFactor()); + } + }); + + this.world.addHandler('item-index-change', function(event) { + // For backwards compatibility, we maintain the source property + _this.source = _this.world.getItemAt(0).source; + }); + + // Create the viewport + this.viewport = new $.Viewport({ + containerSize: THIS[ this.hash ].prevContainerSize, + springStiffness: this.springStiffness, + animationTime: this.animationTime, + minZoomImageRatio: this.minZoomImageRatio, + maxZoomPixelRatio: this.maxZoomPixelRatio, + visibilityRatio: this.visibilityRatio, + wrapHorizontal: this.wrapHorizontal, + wrapVertical: this.wrapVertical, + defaultZoomLevel: this.defaultZoomLevel, + minZoomLevel: this.minZoomLevel, + maxZoomLevel: this.maxZoomLevel, + viewer: this, + degrees: this.degrees, + navigatorRotate: this.navigatorRotate, + homeFillsViewer: this.homeFillsViewer, + margins: this.viewportMargins + }); + + this.viewport._setContentBounds(this.world.getHomeBounds(), this.world.getContentFactor()); + + // Create the image loader + this.imageLoader = new $.ImageLoader({ + jobLimit: this.imageLoaderLimit + }); + + // Create the tile cache + this.tileCache = new $.TileCache({ + maxImageCacheCount: this.maxImageCacheCount + }); + + // Create the drawer + this.drawer = new $.Drawer({ + viewer: this, + viewport: this.viewport, + element: this.canvas, + debugGridColor: this.debugGridColor + }); + + // Overlay container + this.overlaysContainer = $.makeNeutralElement( "div" ); + this.canvas.appendChild( this.overlaysContainer ); + + // Now that we have a drawer, see if it supports rotate. If not we need to remove the rotate buttons + if (!this.drawer.canRotate()) { + // Disable/remove the rotate left/right buttons since they aren't supported + if (this.rotateLeft) { + i = this.buttons.buttons.indexOf(this.rotateLeft); + this.buttons.buttons.splice(i, 1); + this.buttons.element.removeChild(this.rotateLeft.element); + } + if (this.rotateRight) { + i = this.buttons.buttons.indexOf(this.rotateRight); + this.buttons.buttons.splice(i, 1); + this.buttons.element.removeChild(this.rotateRight.element); + } + } + + //Instantiate a navigator if configured + if ( this.showNavigator){ + this.navigator = new $.Navigator({ + id: this.navigatorId, + position: this.navigatorPosition, + sizeRatio: this.navigatorSizeRatio, + maintainSizeRatio: this.navigatorMaintainSizeRatio, + top: this.navigatorTop, + left: this.navigatorLeft, + width: this.navigatorWidth, + height: this.navigatorHeight, + autoResize: this.navigatorAutoResize, + autoFade: this.navigatorAutoFade, + prefixUrl: this.prefixUrl, + viewer: this, + navigatorRotate: this.navigatorRotate, + crossOriginPolicy: this.crossOriginPolicy + }); + } + + // Sequence mode + if (this.sequenceMode) { + this.bindSequenceControls(); + } + + // Open initial tilesources + if (this.tileSources) { + this.open( this.tileSources ); + } + + // Add custom controls + for ( i = 0; i < this.customControls.length; i++ ) { + this.addControl( + this.customControls[ i ].id, + {anchor: this.customControls[ i ].anchor} + ); + } + + // Initial fade out + $.requestAnimationFrame( function(){ + beginControlsAutoHide( _this ); + } ); +}; + +$.extend( $.Viewer.prototype, $.EventSource.prototype, $.ControlDock.prototype, /** @lends OpenSeadragon.Viewer.prototype */{ + + + /** + * @function + * @return {Boolean} + */ + isOpen: function () { + return !!this.world.getItemCount(); + }, + + // deprecated + openDzi: function ( dzi ) { + $.console.error( "[Viewer.openDzi] this function is deprecated; use Viewer.open() instead." ); + return this.open( dzi ); + }, + + // deprecated + openTileSource: function ( tileSource ) { + $.console.error( "[Viewer.openTileSource] this function is deprecated; use Viewer.open() instead." ); + return this.open( tileSource ); + }, + + /** + * Open tiled images into the viewer, closing any others. + * @function + * @param {Array|String|Object|Function} tileSources - This can be a TiledImage + * specifier, a TileSource specifier, or an array of either. A TiledImage specifier + * is the same as the options parameter for {@link OpenSeadragon.Viewer#addTiledImage}, + * except for the index property; images are added in sequence. + * A TileSource specifier is anything you could pass as the tileSource property + * of the options parameter for {@link OpenSeadragon.Viewer#addTiledImage}. + * @return {OpenSeadragon.Viewer} Chainable. + * @fires OpenSeadragon.Viewer.event:open + * @fires OpenSeadragon.Viewer.event:open-failed + */ + open: function (tileSources) { + var _this = this; + + this.close(); + + if (!tileSources) { + return; + } + + if (this.sequenceMode && $.isArray(tileSources)) { + if (this.referenceStrip) { + this.referenceStrip.destroy(); + this.referenceStrip = null; + } + + this.tileSources = tileSources; + this._sequenceIndex = Math.max(0, Math.min(this.tileSources.length - 1, this.initialPage)); + if (this.tileSources.length) { + this.open(this.tileSources[this._sequenceIndex]); + + if ( this.showReferenceStrip ){ + this.referenceStrip = new $.ReferenceStrip({ + id: this.referenceStripElement, + position: this.referenceStripPosition, + sizeRatio: this.referenceStripSizeRatio, + scroll: this.referenceStripScroll, + height: this.referenceStripHeight, + width: this.referenceStripWidth, + tileSources: this.tileSources, + prefixUrl: this.prefixUrl, + viewer: this + }); + } + } + + this._updateSequenceButtons( this._sequenceIndex ); + return; + } + + if (!$.isArray(tileSources)) { + tileSources = [tileSources]; + } + + if (!tileSources.length) { + return; + } + + this._opening = true; + + var expected = tileSources.length; + var successes = 0; + var failures = 0; + var failEvent; + + var checkCompletion = function() { + if (successes + failures === expected) { + if (successes) { + if (_this._firstOpen || !_this.preserveViewport) { + _this.viewport.goHome( true ); + _this.viewport.update(); + } + + _this._firstOpen = false; + + var source = tileSources[0]; + if (source.tileSource) { + source = source.tileSource; + } + + // Global overlays + if( _this.overlays && !_this.preserveOverlays ){ + for ( var i = 0; i < _this.overlays.length; i++ ) { + _this.currentOverlays[ i ] = getOverlayObject( _this, _this.overlays[ i ] ); + } + } + + _this._drawOverlays(); + _this._opening = false; + + /** + * Raised when the viewer has opened and loaded one or more TileSources. + * + * @event open + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event. + * @property {OpenSeadragon.TileSource} source - The tile source that was opened. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + // TODO: what if there are multiple sources? + _this.raiseEvent( 'open', { source: source } ); + } else { + _this._opening = false; + + /** + * Raised when an error occurs loading a TileSource. + * + * @event open-failed + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event. + * @property {String} message - Information about what failed. + * @property {String} source - The tile source that failed. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + _this.raiseEvent( 'open-failed', failEvent ); + } + } + }; + + var doOne = function(options) { + if (!$.isPlainObject(options) || !options.tileSource) { + options = { + tileSource: options + }; + } + + if (options.index !== undefined) { + $.console.error('[Viewer.open] setting indexes here is not supported; use addTiledImage instead'); + delete options.index; + } + + if (options.collectionImmediately === undefined) { + options.collectionImmediately = true; + } + + var originalSuccess = options.success; + options.success = function(event) { + successes++; + + // TODO: now that options has other things besides tileSource, the overlays + // should probably be at the options level, not the tileSource level. + if (options.tileSource.overlays) { + for (var i = 0; i < options.tileSource.overlays.length; i++) { + _this.addOverlay(options.tileSource.overlays[i]); + } + } + + if (originalSuccess) { + originalSuccess(event); + } + + checkCompletion(); + }; + + var originalError = options.error; + options.error = function(event) { + failures++; + + if (!failEvent) { + failEvent = event; + } + + if (originalError) { + originalError(event); + } + + checkCompletion(); + }; + + _this.addTiledImage(options); + }; + + // TileSources + for (var i = 0; i < tileSources.length; i++) { + doOne(tileSources[i]); + } + + return this; + }, + + + /** + * @function + * @return {OpenSeadragon.Viewer} Chainable. + * @fires OpenSeadragon.Viewer.event:close + */ + close: function ( ) { + if ( !THIS[ this.hash ] ) { + //this viewer has already been destroyed: returning immediately + return this; + } + + this._opening = false; + + if ( this.navigator ) { + this.navigator.close(); + } + + if( ! this.preserveOverlays) { + this.clearOverlays(); + this.overlaysContainer.innerHTML = ""; + } + + THIS[ this.hash ].animating = false; + this.world.removeAll(); + this.imageLoader.clear(); + + /** + * Raised when the viewer is closed (see {@link OpenSeadragon.Viewer#close}). + * + * @event close + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + this.raiseEvent( 'close' ); + + return this; + }, + + + /** + * Function to destroy the viewer and clean up everything created by OpenSeadragon. + * + * Example: + * var viewer = OpenSeadragon({ + * [...] + * }); + * + * //when you are done with the viewer: + * viewer.destroy(); + * viewer = null; //important + * + * @function + */ + destroy: function( ) { + if ( !THIS[ this.hash ] ) { + //this viewer has already been destroyed: returning immediately + return; + } + + this.close(); + + this.clearOverlays(); + this.overlaysContainer.innerHTML = ""; + + //TODO: implement this... + //this.unbindSequenceControls() + //this.unbindStandardControls() + + if (this.referenceStrip) { + this.referenceStrip.destroy(); + this.referenceStrip = null; + } + + if ( this._updateRequestId !== null ) { + $.cancelAnimationFrame( this._updateRequestId ); + this._updateRequestId = null; + } + + if ( this.drawer ) { + this.drawer.destroy(); + } + + this.removeAllHandlers(); + + // Go through top element (passed to us) and remove all children + // Use removeChild to make sure it handles SVG or any non-html + // also it performs better - http://jsperf.com/innerhtml-vs-removechild/15 + if (this.element){ + while (this.element.firstChild) { + this.element.removeChild(this.element.firstChild); + } + } + + // destroy the mouse trackers + if (this.innerTracker){ + this.innerTracker.destroy(); + } + if (this.outerTracker){ + this.outerTracker.destroy(); + } + + THIS[ this.hash ] = null; + delete THIS[ this.hash ]; + + // clear all our references to dom objects + this.canvas = null; + this.container = null; + + // clear our reference to the main element - they will need to pass it in again, creating a new viewer + this.element = null; + }, + + /** + * @function + * @return {Boolean} + */ + isMouseNavEnabled: function () { + return this.innerTracker.isTracking(); + }, + + /** + * @function + * @param {Boolean} enabled - true to enable, false to disable + * @return {OpenSeadragon.Viewer} Chainable. + * @fires OpenSeadragon.Viewer.event:mouse-enabled + */ + setMouseNavEnabled: function( enabled ){ + this.innerTracker.setTracking( enabled ); + this.outerTracker.setTracking( enabled ); + /** + * Raised when mouse/touch navigation is enabled or disabled (see {@link OpenSeadragon.Viewer#setMouseNavEnabled}). + * + * @event mouse-enabled + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event. + * @property {Boolean} enabled + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + this.raiseEvent( 'mouse-enabled', { enabled: enabled } ); + return this; + }, + + + /** + * @function + * @return {Boolean} + */ + areControlsEnabled: function () { + var enabled = this.controls.length, + i; + for( i = 0; i < this.controls.length; i++ ){ + enabled = enabled && this.controls[ i ].isVisibile(); + } + return enabled; + }, + + + /** + * Shows or hides the controls (e.g. the default navigation buttons). + * + * @function + * @param {Boolean} true to show, false to hide. + * @return {OpenSeadragon.Viewer} Chainable. + * @fires OpenSeadragon.Viewer.event:controls-enabled + */ + setControlsEnabled: function( enabled ) { + if( enabled ){ + abortControlsAutoHide( this ); + } else { + beginControlsAutoHide( this ); + } + /** + * Raised when the navigation controls are shown or hidden (see {@link OpenSeadragon.Viewer#setControlsEnabled}). + * + * @event controls-enabled + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event. + * @property {Boolean} enabled + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + this.raiseEvent( 'controls-enabled', { enabled: enabled } ); + return this; + }, + + /** + * @function + * @return {Boolean} + */ + isFullPage: function () { + return THIS[ this.hash ].fullPage; + }, + + + /** + * Toggle full page mode. + * @function + * @param {Boolean} fullPage + * If true, enter full page mode. If false, exit full page mode. + * @return {OpenSeadragon.Viewer} Chainable. + * @fires OpenSeadragon.Viewer.event:pre-full-page + * @fires OpenSeadragon.Viewer.event:full-page + */ + setFullPage: function( fullPage ) { + + var body = document.body, + bodyStyle = body.style, + docStyle = document.documentElement.style, + _this = this, + hash, + nodes, + i; + + //dont bother modifying the DOM if we are already in full page mode. + if ( fullPage == this.isFullPage() ) { + return this; + } + + var fullPageEventArgs = { + fullPage: fullPage, + preventDefaultAction: false + }; + /** + * Raised when the viewer is about to change to/from full-page mode (see {@link OpenSeadragon.Viewer#setFullPage}). + * + * @event pre-full-page + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event. + * @property {Boolean} fullPage - True if entering full-page mode, false if exiting full-page mode. + * @property {Boolean} preventDefaultAction - Set to true to prevent full-page mode change. Default: false. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + this.raiseEvent( 'pre-full-page', fullPageEventArgs ); + if ( fullPageEventArgs.preventDefaultAction ) { + return this; + } + + if ( fullPage ) { + + this.elementSize = $.getElementSize( this.element ); + this.pageScroll = $.getPageScroll(); + + this.elementMargin = this.element.style.margin; + this.element.style.margin = "0"; + this.elementPadding = this.element.style.padding; + this.element.style.padding = "0"; + + this.bodyMargin = bodyStyle.margin; + this.docMargin = docStyle.margin; + bodyStyle.margin = "0"; + docStyle.margin = "0"; + + this.bodyPadding = bodyStyle.padding; + this.docPadding = docStyle.padding; + bodyStyle.padding = "0"; + docStyle.padding = "0"; + + this.bodyWidth = bodyStyle.width; + this.docWidth = docStyle.width; + bodyStyle.width = "100%"; + docStyle.width = "100%"; + + this.bodyHeight = bodyStyle.height; + this.docHeight = docStyle.height; + bodyStyle.height = "100%"; + docStyle.height = "100%"; + + //when entering full screen on the ipad it wasnt sufficient to leave + //the body intact as only only the top half of the screen would + //respond to touch events on the canvas, while the bottom half treated + //them as touch events on the document body. Thus we remove and store + //the bodies elements and replace them when we leave full screen. + this.previousBody = []; + THIS[ this.hash ].prevElementParent = this.element.parentNode; + THIS[ this.hash ].prevNextSibling = this.element.nextSibling; + THIS[ this.hash ].prevElementWidth = this.element.style.width; + THIS[ this.hash ].prevElementHeight = this.element.style.height; + nodes = body.childNodes.length; + for ( i = 0; i < nodes; i++ ) { + this.previousBody.push( body.childNodes[ 0 ] ); + body.removeChild( body.childNodes[ 0 ] ); + } + + //If we've got a toolbar, we need to enable the user to use css to + //preserve it in fullpage mode + if ( this.toolbar && this.toolbar.element ) { + //save a reference to the parent so we can put it back + //in the long run we need a better strategy + this.toolbar.parentNode = this.toolbar.element.parentNode; + this.toolbar.nextSibling = this.toolbar.element.nextSibling; + body.appendChild( this.toolbar.element ); + + //Make sure the user has some ability to style the toolbar based + //on the mode + $.addClass( this.toolbar.element, 'fullpage' ); + } + + $.addClass( this.element, 'fullpage' ); + body.appendChild( this.element ); + + this.element.style.height = $.getWindowSize().y + 'px'; + this.element.style.width = $.getWindowSize().x + 'px'; + + if ( this.toolbar && this.toolbar.element ) { + this.element.style.height = ( + $.getElementSize( this.element ).y - $.getElementSize( this.toolbar.element ).y + ) + 'px'; + } + + THIS[ this.hash ].fullPage = true; + + // mouse will be inside container now + $.delegate( this, onContainerEnter )( {} ); + + } else { + + this.element.style.margin = this.elementMargin; + this.element.style.padding = this.elementPadding; + + bodyStyle.margin = this.bodyMargin; + docStyle.margin = this.docMargin; + + bodyStyle.padding = this.bodyPadding; + docStyle.padding = this.docPadding; + + bodyStyle.width = this.bodyWidth; + docStyle.width = this.docWidth; + + bodyStyle.height = this.bodyHeight; + docStyle.height = this.docHeight; + + body.removeChild( this.element ); + nodes = this.previousBody.length; + for ( i = 0; i < nodes; i++ ) { + body.appendChild( this.previousBody.shift() ); + } + + $.removeClass( this.element, 'fullpage' ); + THIS[ this.hash ].prevElementParent.insertBefore( + this.element, + THIS[ this.hash ].prevNextSibling + ); + + //If we've got a toolbar, we need to enable the user to use css to + //reset it to its original state + if ( this.toolbar && this.toolbar.element ) { + body.removeChild( this.toolbar.element ); + + //Make sure the user has some ability to style the toolbar based + //on the mode + $.removeClass( this.toolbar.element, 'fullpage' ); + + this.toolbar.parentNode.insertBefore( + this.toolbar.element, + this.toolbar.nextSibling + ); + delete this.toolbar.parentNode; + delete this.toolbar.nextSibling; + } + + this.element.style.width = THIS[ this.hash ].prevElementWidth; + this.element.style.height = THIS[ this.hash ].prevElementHeight; + + // After exiting fullPage or fullScreen, it can take some time + // before the browser can actually set the scroll. + var restoreScrollCounter = 0; + var restoreScroll = function() { + $.setPageScroll( _this.pageScroll ); + var pageScroll = $.getPageScroll(); + restoreScrollCounter++; + if ( restoreScrollCounter < 10 && + pageScroll.x !== _this.pageScroll.x || + pageScroll.y !== _this.pageScroll.y ) { + $.requestAnimationFrame( restoreScroll ); + } + }; + $.requestAnimationFrame( restoreScroll ); + + THIS[ this.hash ].fullPage = false; + + // mouse will likely be outside now + $.delegate( this, onContainerExit )( { } ); + + } + + if ( this.navigator && this.viewport ) { + this.navigator.update( this.viewport ); + } + + /** + * Raised when the viewer has changed to/from full-page mode (see {@link OpenSeadragon.Viewer#setFullPage}). + * + * @event full-page + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event. + * @property {Boolean} fullPage - True if changed to full-page mode, false if exited full-page mode. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + this.raiseEvent( 'full-page', { fullPage: fullPage } ); + + return this; + }, + + /** + * Toggle full screen mode if supported. Toggle full page mode otherwise. + * @function + * @param {Boolean} fullScreen + * If true, enter full screen mode. If false, exit full screen mode. + * @return {OpenSeadragon.Viewer} Chainable. + * @fires OpenSeadragon.Viewer.event:pre-full-screen + * @fires OpenSeadragon.Viewer.event:full-screen + */ + setFullScreen: function( fullScreen ) { + var _this = this; + + if ( !$.supportsFullScreen ) { + return this.setFullPage( fullScreen ); + } + + if ( $.isFullScreen() === fullScreen ) { + return this; + } + + var fullScreeEventArgs = { + fullScreen: fullScreen, + preventDefaultAction: false + }; + /** + * Raised when the viewer is about to change to/from full-screen mode (see {@link OpenSeadragon.Viewer#setFullScreen}). + * Note: the pre-full-screen event is not raised when the user is exiting + * full-screen mode by pressing the Esc key. In that case, consider using + * the full-screen, pre-full-page or full-page events. + * + * @event pre-full-screen + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event. + * @property {Boolean} fullScreen - True if entering full-screen mode, false if exiting full-screen mode. + * @property {Boolean} preventDefaultAction - Set to true to prevent full-screen mode change. Default: false. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + this.raiseEvent( 'pre-full-screen', fullScreeEventArgs ); + if ( fullScreeEventArgs.preventDefaultAction ) { + return this; + } + + if ( fullScreen ) { + + this.setFullPage( true ); + // If the full page mode is not actually entered, we need to prevent + // the full screen mode. + if ( !this.isFullPage() ) { + return this; + } + + this.fullPageStyleWidth = this.element.style.width; + this.fullPageStyleHeight = this.element.style.height; + this.element.style.width = '100%'; + this.element.style.height = '100%'; + + var onFullScreenChange = function() { + var isFullScreen = $.isFullScreen(); + if ( !isFullScreen ) { + $.removeEvent( document, $.fullScreenEventName, onFullScreenChange ); + $.removeEvent( document, $.fullScreenErrorEventName, onFullScreenChange ); + + _this.setFullPage( false ); + if ( _this.isFullPage() ) { + _this.element.style.width = _this.fullPageStyleWidth; + _this.element.style.height = _this.fullPageStyleHeight; + } + } + if ( _this.navigator && _this.viewport ) { + _this.navigator.update( _this.viewport ); + } + /** + * Raised when the viewer has changed to/from full-screen mode (see {@link OpenSeadragon.Viewer#setFullScreen}). + * + * @event full-screen + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event. + * @property {Boolean} fullScreen - True if changed to full-screen mode, false if exited full-screen mode. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + _this.raiseEvent( 'full-screen', { fullScreen: isFullScreen } ); + }; + $.addEvent( document, $.fullScreenEventName, onFullScreenChange ); + $.addEvent( document, $.fullScreenErrorEventName, onFullScreenChange ); + + $.requestFullScreen( document.body ); + + } else { + $.exitFullScreen(); + } + return this; + }, + + /** + * @function + * @return {Boolean} + */ + isVisible: function () { + return this.container.style.visibility != "hidden"; + }, + + + /** + * @function + * @param {Boolean} visible + * @return {OpenSeadragon.Viewer} Chainable. + * @fires OpenSeadragon.Viewer.event:visible + */ + setVisible: function( visible ){ + this.container.style.visibility = visible ? "" : "hidden"; + /** + * Raised when the viewer is shown or hidden (see {@link OpenSeadragon.Viewer#setVisible}). + * + * @event visible + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event. + * @property {Boolean} visible + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + this.raiseEvent( 'visible', { visible: visible } ); + return this; + }, + + /** + * Add a tiled image to the viewer. + * options.tileSource can be anything that {@link OpenSeadragon.Viewer#open} + * supports except arrays of images. + * Note that you can specify options.width or options.height, but not both. + * The other dimension will be calculated according to the item's aspect ratio. + * If collectionMode is on (see {@link OpenSeadragon.Options}), the new image is + * automatically arranged with the others. + * @function + * @param {Object} options + * @param {String|Object|Function} options.tileSource - The TileSource specifier. + * A String implies a url used to determine the tileSource implementation + * based on the file extension of url. JSONP is implied by *.js, + * otherwise the url is retrieved as text and the resulting text is + * introspected to determine if its json, xml, or text and parsed. + * An Object implies an inline configuration which has a single + * property sufficient for being able to determine tileSource + * implementation. If the object has a property which is a function + * named 'getTileUrl', it is treated as a custom TileSource. + * @param {Number} [options.index] The index of the item. Added on top of + * all other items if not specified. + * @param {Boolean} [options.replace=false] If true, the item at options.index will be + * removed and the new item is added in its place. options.tileSource will be + * interpreted and fetched if necessary before the old item is removed to avoid leaving + * a gap in the world. + * @param {Number} [options.x=0] The X position for the image in viewport coordinates. + * @param {Number} [options.y=0] The Y position for the image in viewport coordinates. + * @param {Number} [options.width=1] The width for the image in viewport coordinates. + * @param {Number} [options.height] The height for the image in viewport coordinates. + * @param {OpenSeadragon.Rect} [options.fitBounds] The bounds in viewport coordinates + * to fit the image into. If specified, x, y, width and height get ignored. + * @param {OpenSeadragon.Placement} [options.fitBoundsPlacement=OpenSeadragon.Placement.CENTER] + * How to anchor the image in the bounds if options.fitBounds is set. + * @param {OpenSeadragon.Rect} [options.clip] - An area, in image pixels, to clip to + * (portions of the image outside of this area will not be visible). Only works on + * browsers that support the HTML5 canvas. + * @param {Number} [options.opacity] Opacity the tiled image should be drawn at by default. + * @param {String} [options.compositeOperation] How the image is composited onto other images. + * @param {Function} [options.success] A function that gets called when the image is + * successfully added. It's passed the event object which contains a single property: + * "item", the resulting TiledImage. + * @param {Function} [options.error] A function that gets called if the image is + * unable to be added. It's passed the error event object, which contains "message" + * and "source" properties. + * @param {Boolean} [options.collectionImmediately=false] If collectionMode is on, + * specifies whether to snap to the new arrangement immediately or to animate to it. + * @param {String|CanvasGradient|CanvasPattern|Function} [options.placeholderFillStyle] - See {@link OpenSeadragon.Options}. + * @fires OpenSeadragon.World.event:add-item + * @fires OpenSeadragon.Viewer.event:add-item-failed + */ + addTiledImage: function( options ) { + $.console.assert(options, "[Viewer.addTiledImage] options is required"); + $.console.assert(options.tileSource, "[Viewer.addTiledImage] options.tileSource is required"); + $.console.assert(!options.replace || (options.index > -1 && options.index < this.world.getItemCount()), + "[Viewer.addTiledImage] if options.replace is used, options.index must be a valid index in Viewer.world"); + + var _this = this; + + if (options.replace) { + options.replaceItem = _this.world.getItemAt(options.index); + } + + this._hideMessage(); + + if (options.placeholderFillStyle === undefined) { + options.placeholderFillStyle = this.placeholderFillStyle; + } + if (options.opacity === undefined) { + options.opacity = this.opacity; + } + if (options.compositeOperation === undefined) { + options.compositeOperation = this.compositeOperation; + } + + var myQueueItem = { + options: options + }; + + function raiseAddItemFailed( event ) { + for (var i = 0; i < _this._loadQueue.length; i++) { + if (_this._loadQueue[i] === myQueueItem) { + _this._loadQueue.splice(i, 1); + break; + } + } + + if (_this._loadQueue.length === 0) { + refreshWorld(myQueueItem); + } + + /** + * Raised when an error occurs while adding a item. + * @event add-item-failed + * @memberOf OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event. + * @property {String} message + * @property {String} source + * @property {Object} options The options passed to the addTiledImage method. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + _this.raiseEvent( 'add-item-failed', event ); + + if (options.error) { + options.error(event); + } + } + + function refreshWorld(theItem) { + if (_this.collectionMode) { + _this.world.arrange({ + immediately: theItem.options.collectionImmediately, + rows: _this.collectionRows, + columns: _this.collectionColumns, + layout: _this.collectionLayout, + tileSize: _this.collectionTileSize, + tileMargin: _this.collectionTileMargin + }); + _this.world.setAutoRefigureSizes(true); + } + } + + if ($.isArray(options.tileSource)) { + setTimeout(function() { + raiseAddItemFailed({ + message: "[Viewer.addTiledImage] Sequences can not be added; add them one at a time instead.", + source: options.tileSource, + options: options + }); + }); + return; + } + + this._loadQueue.push(myQueueItem); + + getTileSourceImplementation( this, options.tileSource, function( tileSource ) { + + myQueueItem.tileSource = tileSource; + + // add everybody at the front of the queue that's ready to go + var queueItem, tiledImage, optionsClone; + while (_this._loadQueue.length) { + queueItem = _this._loadQueue[0]; + if (!queueItem.tileSource) { + break; + } + + _this._loadQueue.splice(0, 1); + + if (queueItem.options.replace) { + var newIndex = _this.world.getIndexOfItem(queueItem.options.replaceItem); + if (newIndex != -1) { + queueItem.options.index = newIndex; + } + _this.world.removeItem(queueItem.options.replaceItem); + } + + tiledImage = new $.TiledImage({ + viewer: _this, + source: queueItem.tileSource, + viewport: _this.viewport, + drawer: _this.drawer, + tileCache: _this.tileCache, + imageLoader: _this.imageLoader, + x: queueItem.options.x, + y: queueItem.options.y, + width: queueItem.options.width, + height: queueItem.options.height, + fitBounds: queueItem.options.fitBounds, + fitBoundsPlacement: queueItem.options.fitBoundsPlacement, + clip: queueItem.options.clip, + placeholderFillStyle: queueItem.options.placeholderFillStyle, + opacity: queueItem.options.opacity, + compositeOperation: queueItem.options.compositeOperation, + springStiffness: _this.springStiffness, + animationTime: _this.animationTime, + minZoomImageRatio: _this.minZoomImageRatio, + wrapHorizontal: _this.wrapHorizontal, + wrapVertical: _this.wrapVertical, + immediateRender: _this.immediateRender, + blendTime: _this.blendTime, + alwaysBlend: _this.alwaysBlend, + minPixelRatio: _this.minPixelRatio, + smoothTileEdgesMinZoom: _this.smoothTileEdgesMinZoom, + iOSDevice: _this.iOSDevice, + crossOriginPolicy: _this.crossOriginPolicy, + debugMode: _this.debugMode + }); + + if (_this.collectionMode) { + _this.world.setAutoRefigureSizes(false); + } + _this.world.addItem( tiledImage, { + index: queueItem.options.index + }); + + if (_this._loadQueue.length === 0) { + //this restores the autoRefigureSizes flag to true. + refreshWorld(queueItem); + } + + if (_this.world.getItemCount() === 1 && !_this.preserveViewport) { + _this.viewport.goHome(true); + } + + if (_this.navigator) { + optionsClone = $.extend({}, queueItem.options, { + replace: false, // navigator already removed the layer, nothing to replace + originalTiledImage: tiledImage, + tileSource: queueItem.tileSource + }); + + _this.navigator.addTiledImage(optionsClone); + } + + if (queueItem.options.success) { + queueItem.options.success({ + item: tiledImage + }); + } + } + }, function( event ) { + event.options = options; + raiseAddItemFailed(event); + } ); + }, + + /** + * Add a simple image to the viewer. + * The options are the same as the ones in {@link OpenSeadragon.Viewer#addTiledImage} + * except for options.tileSource which is replaced by options.url. + * @function + * @param {Object} options - See {@link OpenSeadragon.Viewer#addTiledImage} + * for all the options + * @param {String} options.url - The URL of the image to add. + * @fires OpenSeadragon.World.event:add-item + * @fires OpenSeadragon.Viewer.event:add-item-failed + */ + addSimpleImage: function(options) { + $.console.assert(options, "[Viewer.addSimpleImage] options is required"); + $.console.assert(options.url, "[Viewer.addSimpleImage] options.url is required"); + + var opts = $.extend({}, options, { + tileSource: { + type: 'image', + url: options.url + } + }); + delete opts.url; + this.addTiledImage(opts); + }, + + // deprecated + addLayer: function( options ) { + var _this = this; + + $.console.error( "[Viewer.addLayer] this function is deprecated; use Viewer.addTiledImage() instead." ); + + var optionsClone = $.extend({}, options, { + success: function(event) { + _this.raiseEvent("add-layer", { + options: options, + drawer: event.item + }); + }, + error: function(event) { + _this.raiseEvent("add-layer-failed", event); + } + }); + + this.addTiledImage(optionsClone); + return this; + }, + + // deprecated + getLayerAtLevel: function( level ) { + $.console.error( "[Viewer.getLayerAtLevel] this function is deprecated; use World.getItemAt() instead." ); + return this.world.getItemAt(level); + }, + + // deprecated + getLevelOfLayer: function( drawer ) { + $.console.error( "[Viewer.getLevelOfLayer] this function is deprecated; use World.getIndexOfItem() instead." ); + return this.world.getIndexOfItem(drawer); + }, + + // deprecated + getLayersCount: function() { + $.console.error( "[Viewer.getLayersCount] this function is deprecated; use World.getItemCount() instead." ); + return this.world.getItemCount(); + }, + + // deprecated + setLayerLevel: function( drawer, level ) { + $.console.error( "[Viewer.setLayerLevel] this function is deprecated; use World.setItemIndex() instead." ); + return this.world.setItemIndex(drawer, level); + }, + + // deprecated + removeLayer: function( drawer ) { + $.console.error( "[Viewer.removeLayer] this function is deprecated; use World.removeItem() instead." ); + return this.world.removeItem(drawer); + }, + + /** + * Force the viewer to redraw its contents. + * @returns {OpenSeadragon.Viewer} Chainable. + */ + forceRedraw: function() { + THIS[ this.hash ].forceRedraw = true; + return this; + }, + + /** + * @function + * @return {OpenSeadragon.Viewer} Chainable. + */ + bindSequenceControls: function(){ + + ////////////////////////////////////////////////////////////////////////// + // Image Sequence Controls + ////////////////////////////////////////////////////////////////////////// + var onFocusHandler = $.delegate( this, onFocus ), + onBlurHandler = $.delegate( this, onBlur ), + onNextHandler = $.delegate( this, onNext ), + onPreviousHandler = $.delegate( this, onPrevious ), + navImages = this.navImages, + useGroup = true ; + + if( this.showSequenceControl ){ + + if( this.previousButton || this.nextButton ){ + //if we are binding to custom buttons then layout and + //grouping is the responsibility of the page author + useGroup = false; + } + + this.previousButton = new $.Button({ + element: this.previousButton ? $.getElement( this.previousButton ) : null, + clickTimeThreshold: this.clickTimeThreshold, + clickDistThreshold: this.clickDistThreshold, + tooltip: $.getString( "Tooltips.PreviousPage" ), + srcRest: resolveUrl( this.prefixUrl, navImages.previous.REST ), + srcGroup: resolveUrl( this.prefixUrl, navImages.previous.GROUP ), + srcHover: resolveUrl( this.prefixUrl, navImages.previous.HOVER ), + srcDown: resolveUrl( this.prefixUrl, navImages.previous.DOWN ), + onRelease: onPreviousHandler, + onFocus: onFocusHandler, + onBlur: onBlurHandler + }); + + this.nextButton = new $.Button({ + element: this.nextButton ? $.getElement( this.nextButton ) : null, + clickTimeThreshold: this.clickTimeThreshold, + clickDistThreshold: this.clickDistThreshold, + tooltip: $.getString( "Tooltips.NextPage" ), + srcRest: resolveUrl( this.prefixUrl, navImages.next.REST ), + srcGroup: resolveUrl( this.prefixUrl, navImages.next.GROUP ), + srcHover: resolveUrl( this.prefixUrl, navImages.next.HOVER ), + srcDown: resolveUrl( this.prefixUrl, navImages.next.DOWN ), + onRelease: onNextHandler, + onFocus: onFocusHandler, + onBlur: onBlurHandler + }); + + if( !this.navPrevNextWrap ){ + this.previousButton.disable(); + } + + if (!this.tileSources || !this.tileSources.length) { + this.nextButton.disable(); + } + + if( useGroup ){ + this.paging = new $.ButtonGroup({ + buttons: [ + this.previousButton, + this.nextButton + ], + clickTimeThreshold: this.clickTimeThreshold, + clickDistThreshold: this.clickDistThreshold + }); + + this.pagingControl = this.paging.element; + + if( this.toolbar ){ + this.toolbar.addControl( + this.pagingControl, + {anchor: $.ControlAnchor.BOTTOM_RIGHT} + ); + }else{ + this.addControl( + this.pagingControl, + {anchor: this.sequenceControlAnchor || $.ControlAnchor.TOP_LEFT} + ); + } + } + } + return this; + }, + + + /** + * @function + * @return {OpenSeadragon.Viewer} Chainable. + */ + bindStandardControls: function(){ + ////////////////////////////////////////////////////////////////////////// + // Navigation Controls + ////////////////////////////////////////////////////////////////////////// + var beginZoomingInHandler = $.delegate( this, beginZoomingIn ), + endZoomingHandler = $.delegate( this, endZooming ), + doSingleZoomInHandler = $.delegate( this, doSingleZoomIn ), + beginZoomingOutHandler = $.delegate( this, beginZoomingOut ), + doSingleZoomOutHandler = $.delegate( this, doSingleZoomOut ), + onHomeHandler = $.delegate( this, onHome ), + onFullScreenHandler = $.delegate( this, onFullScreen ), + onRotateLeftHandler = $.delegate( this, onRotateLeft ), + onRotateRightHandler = $.delegate( this, onRotateRight ), + onFocusHandler = $.delegate( this, onFocus ), + onBlurHandler = $.delegate( this, onBlur ), + navImages = this.navImages, + buttons = [], + useGroup = true ; + + + if ( this.showNavigationControl ) { + + if( this.zoomInButton || this.zoomOutButton || + this.homeButton || this.fullPageButton || + this.rotateLeftButton || this.rotateRightButton ) { + //if we are binding to custom buttons then layout and + //grouping is the responsibility of the page author + useGroup = false; + } + + if ( this.showZoomControl ) { + buttons.push( this.zoomInButton = new $.Button({ + element: this.zoomInButton ? $.getElement( this.zoomInButton ) : null, + clickTimeThreshold: this.clickTimeThreshold, + clickDistThreshold: this.clickDistThreshold, + tooltip: $.getString( "Tooltips.ZoomIn" ), + srcRest: resolveUrl( this.prefixUrl, navImages.zoomIn.REST ), + srcGroup: resolveUrl( this.prefixUrl, navImages.zoomIn.GROUP ), + srcHover: resolveUrl( this.prefixUrl, navImages.zoomIn.HOVER ), + srcDown: resolveUrl( this.prefixUrl, navImages.zoomIn.DOWN ), + onPress: beginZoomingInHandler, + onRelease: endZoomingHandler, + onClick: doSingleZoomInHandler, + onEnter: beginZoomingInHandler, + onExit: endZoomingHandler, + onFocus: onFocusHandler, + onBlur: onBlurHandler + })); + + buttons.push( this.zoomOutButton = new $.Button({ + element: this.zoomOutButton ? $.getElement( this.zoomOutButton ) : null, + clickTimeThreshold: this.clickTimeThreshold, + clickDistThreshold: this.clickDistThreshold, + tooltip: $.getString( "Tooltips.ZoomOut" ), + srcRest: resolveUrl( this.prefixUrl, navImages.zoomOut.REST ), + srcGroup: resolveUrl( this.prefixUrl, navImages.zoomOut.GROUP ), + srcHover: resolveUrl( this.prefixUrl, navImages.zoomOut.HOVER ), + srcDown: resolveUrl( this.prefixUrl, navImages.zoomOut.DOWN ), + onPress: beginZoomingOutHandler, + onRelease: endZoomingHandler, + onClick: doSingleZoomOutHandler, + onEnter: beginZoomingOutHandler, + onExit: endZoomingHandler, + onFocus: onFocusHandler, + onBlur: onBlurHandler + })); + } + + if ( this.showHomeControl ) { + buttons.push( this.homeButton = new $.Button({ + element: this.homeButton ? $.getElement( this.homeButton ) : null, + clickTimeThreshold: this.clickTimeThreshold, + clickDistThreshold: this.clickDistThreshold, + tooltip: $.getString( "Tooltips.Home" ), + srcRest: resolveUrl( this.prefixUrl, navImages.home.REST ), + srcGroup: resolveUrl( this.prefixUrl, navImages.home.GROUP ), + srcHover: resolveUrl( this.prefixUrl, navImages.home.HOVER ), + srcDown: resolveUrl( this.prefixUrl, navImages.home.DOWN ), + onRelease: onHomeHandler, + onFocus: onFocusHandler, + onBlur: onBlurHandler + })); + } + + if ( this.showFullPageControl ) { + buttons.push( this.fullPageButton = new $.Button({ + element: this.fullPageButton ? $.getElement( this.fullPageButton ) : null, + clickTimeThreshold: this.clickTimeThreshold, + clickDistThreshold: this.clickDistThreshold, + tooltip: $.getString( "Tooltips.FullPage" ), + srcRest: resolveUrl( this.prefixUrl, navImages.fullpage.REST ), + srcGroup: resolveUrl( this.prefixUrl, navImages.fullpage.GROUP ), + srcHover: resolveUrl( this.prefixUrl, navImages.fullpage.HOVER ), + srcDown: resolveUrl( this.prefixUrl, navImages.fullpage.DOWN ), + onRelease: onFullScreenHandler, + onFocus: onFocusHandler, + onBlur: onBlurHandler + })); + } + + if ( this.showRotationControl ) { + buttons.push( this.rotateLeftButton = new $.Button({ + element: this.rotateLeftButton ? $.getElement( this.rotateLeftButton ) : null, + clickTimeThreshold: this.clickTimeThreshold, + clickDistThreshold: this.clickDistThreshold, + tooltip: $.getString( "Tooltips.RotateLeft" ), + srcRest: resolveUrl( this.prefixUrl, navImages.rotateleft.REST ), + srcGroup: resolveUrl( this.prefixUrl, navImages.rotateleft.GROUP ), + srcHover: resolveUrl( this.prefixUrl, navImages.rotateleft.HOVER ), + srcDown: resolveUrl( this.prefixUrl, navImages.rotateleft.DOWN ), + onRelease: onRotateLeftHandler, + onFocus: onFocusHandler, + onBlur: onBlurHandler + })); + + buttons.push( this.rotateRightButton = new $.Button({ + element: this.rotateRightButton ? $.getElement( this.rotateRightButton ) : null, + clickTimeThreshold: this.clickTimeThreshold, + clickDistThreshold: this.clickDistThreshold, + tooltip: $.getString( "Tooltips.RotateRight" ), + srcRest: resolveUrl( this.prefixUrl, navImages.rotateright.REST ), + srcGroup: resolveUrl( this.prefixUrl, navImages.rotateright.GROUP ), + srcHover: resolveUrl( this.prefixUrl, navImages.rotateright.HOVER ), + srcDown: resolveUrl( this.prefixUrl, navImages.rotateright.DOWN ), + onRelease: onRotateRightHandler, + onFocus: onFocusHandler, + onBlur: onBlurHandler + })); + + } + + if ( useGroup ) { + this.buttons = new $.ButtonGroup({ + buttons: buttons, + clickTimeThreshold: this.clickTimeThreshold, + clickDistThreshold: this.clickDistThreshold + }); + + this.navControl = this.buttons.element; + this.addHandler( 'open', $.delegate( this, lightUp ) ); + + if( this.toolbar ){ + this.toolbar.addControl( + this.navControl, + {anchor: $.ControlAnchor.TOP_LEFT} + ); + } else { + this.addControl( + this.navControl, + {anchor: this.navigationControlAnchor || $.ControlAnchor.TOP_LEFT} + ); + } + } + + } + return this; + }, + + /** + * Gets the active page of a sequence + * @function + * @return {Number} + */ + currentPage: function() { + return this._sequenceIndex; + }, + + /** + * @function + * @return {OpenSeadragon.Viewer} Chainable. + * @fires OpenSeadragon.Viewer.event:page + */ + goToPage: function( page ){ + if( this.tileSources && page >= 0 && page < this.tileSources.length ){ + /** + * Raised when the page is changed on a viewer configured with multiple image sources (see {@link OpenSeadragon.Viewer#goToPage}). + * + * @event page + * @memberof OpenSeadragon.Viewer + * @type {Object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event. + * @property {Number} page - The page index. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + this.raiseEvent( 'page', { page: page } ); + + this._sequenceIndex = page; + + this._updateSequenceButtons( page ); + + this.open( this.tileSources[ page ] ); + + if( this.referenceStrip ){ + this.referenceStrip.setFocus( page ); + } + } + + return this; + }, + + /** + * Adds an html element as an overlay to the current viewport. Useful for + * highlighting words or areas of interest on an image or other zoomable + * interface. The overlays added via this method are removed when the viewport + * is closed which include when changing page. + * @method + * @param {Element|String|Object} element - A reference to an element or an id for + * the element which will be overlayed. Or an Object specifying the configuration for the overlay. + * If using an object, see {@link OpenSeadragon.Overlay} for a list of + * all available options. + * @param {OpenSeadragon.Point|OpenSeadragon.Rect} location - The point or + * rectangle which will be overlayed. This is a viewport relative location. + * @param {OpenSeadragon.Placement} placement - The position of the + * viewport which the location coordinates will be treated as relative + * to. + * @param {function} onDraw - If supplied the callback is called when the overlay + * needs to be drawn. It it the responsibility of the callback to do any drawing/positioning. + * It is passed position, size and element. + * @return {OpenSeadragon.Viewer} Chainable. + * @fires OpenSeadragon.Viewer.event:add-overlay + */ + addOverlay: function( element, location, placement, onDraw ) { + var options; + if( $.isPlainObject( element ) ){ + options = element; + } else { + options = { + element: element, + location: location, + placement: placement, + onDraw: onDraw + }; + } + + element = $.getElement( options.element ); + + if ( getOverlayIndex( this.currentOverlays, element ) >= 0 ) { + // they're trying to add a duplicate overlay + return this; + } + + var overlay = getOverlayObject( this, options); + this.currentOverlays.push(overlay); + overlay.drawHTML( this.overlaysContainer, this.viewport ); + + /** + * Raised when an overlay is added to the viewer (see {@link OpenSeadragon.Viewer#addOverlay}). + * + * @event add-overlay + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event. + * @property {Element} element - The overlay element. + * @property {OpenSeadragon.Point|OpenSeadragon.Rect} location + * @property {OpenSeadragon.Placement} placement + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + this.raiseEvent( 'add-overlay', { + element: element, + location: options.location, + placement: options.placement + }); + return this; + }, + + /** + * Updates the overlay represented by the reference to the element or + * element id moving it to the new location, relative to the new placement. + * @method + * @param {Element|String} element - A reference to an element or an id for + * the element which is overlayed. + * @param {OpenSeadragon.Point|OpenSeadragon.Rect} location - The point or + * rectangle which will be overlayed. This is a viewport relative location. + * @param {OpenSeadragon.Placement} placement - The position of the + * viewport which the location coordinates will be treated as relative + * to. + * @return {OpenSeadragon.Viewer} Chainable. + * @fires OpenSeadragon.Viewer.event:update-overlay + */ + updateOverlay: function( element, location, placement ) { + var i; + + element = $.getElement( element ); + i = getOverlayIndex( this.currentOverlays, element ); + + if ( i >= 0 ) { + this.currentOverlays[ i ].update( location, placement ); + THIS[ this.hash ].forceRedraw = true; + /** + * Raised when an overlay's location or placement changes + * (see {@link OpenSeadragon.Viewer#updateOverlay}). + * + * @event update-overlay + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the + * Viewer which raised the event. + * @property {Element} element + * @property {OpenSeadragon.Point|OpenSeadragon.Rect} location + * @property {OpenSeadragon.Placement} placement + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + this.raiseEvent( 'update-overlay', { + element: element, + location: location, + placement: placement + }); + } + return this; + }, + + /** + * Removes an overlay identified by the reference element or element id + * and schedules an update. + * @method + * @param {Element|String} element - A reference to the element or an + * element id which represent the ovelay content to be removed. + * @return {OpenSeadragon.Viewer} Chainable. + * @fires OpenSeadragon.Viewer.event:remove-overlay + */ + removeOverlay: function( element ) { + var i; + + element = $.getElement( element ); + i = getOverlayIndex( this.currentOverlays, element ); + + if ( i >= 0 ) { + this.currentOverlays[ i ].destroy(); + this.currentOverlays.splice( i, 1 ); + THIS[ this.hash ].forceRedraw = true; + /** + * Raised when an overlay is removed from the viewer + * (see {@link OpenSeadragon.Viewer#removeOverlay}). + * + * @event remove-overlay + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the + * Viewer which raised the event. + * @property {Element} element - The overlay element. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + this.raiseEvent( 'remove-overlay', { + element: element + }); + } + return this; + }, + + /** + * Removes all currently configured Overlays from this Viewer and schedules + * an update. + * @method + * @return {OpenSeadragon.Viewer} Chainable. + * @fires OpenSeadragon.Viewer.event:clear-overlay + */ + clearOverlays: function() { + while ( this.currentOverlays.length > 0 ) { + this.currentOverlays.pop().destroy(); + } + THIS[ this.hash ].forceRedraw = true; + /** + * Raised when all overlays are removed from the viewer (see {@link OpenSeadragon.Drawer#clearOverlays}). + * + * @event clear-overlay + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + this.raiseEvent( 'clear-overlay', {} ); + return this; + }, + + /** + * Finds an overlay identified by the reference element or element id + * and returns it as an object, return null if not found. + * @method + * @param {Element|String} element - A reference to the element or an + * element id which represents the overlay content. + * @return {OpenSeadragon.Overlay} the matching overlay or null if none found. + */ + getOverlayById: function( element ) { + var i; + + element = $.getElement( element ); + i = getOverlayIndex( this.currentOverlays, element ); + + if (i>=0) { + return this.currentOverlays[i]; + } else { + return null; + } + }, + + /** + * Updates the sequence buttons. + * @function OpenSeadragon.Viewer.prototype._updateSequenceButtons + * @private + * @param {Number} Sequence Value + */ + _updateSequenceButtons: function( page ) { + + if ( this.nextButton ) { + if(!this.tileSources || this.tileSources.length - 1 === page) { + //Disable next button + if ( !this.navPrevNextWrap ) { + this.nextButton.disable(); + } + } else { + this.nextButton.enable(); + } + } + if ( this.previousButton ) { + if ( page > 0 ) { + //Enable previous button + this.previousButton.enable(); + } else { + if ( !this.navPrevNextWrap ) { + this.previousButton.disable(); + } + } + } + }, + + /** + * Display a message in the viewport + * @function OpenSeadragon.Viewer.prototype._showMessage + * @private + * @param {String} text message + */ + _showMessage: function ( message ) { + this._hideMessage(); + + var div = $.makeNeutralElement( "div" ); + div.appendChild( document.createTextNode( message ) ); + + this.messageDiv = $.makeCenteredNode( div ); + + $.addClass(this.messageDiv, "openseadragon-message"); + + this.container.appendChild( this.messageDiv ); + }, + + /** + * Hide any currently displayed viewport message + * @function OpenSeadragon.Viewer.prototype._hideMessage + * @private + */ + _hideMessage: function () { + var div = this.messageDiv; + if (div) { + div.parentNode.removeChild(div); + delete this.messageDiv; + } + }, + + /** + * Gets this viewer's gesture settings for the given pointer device type. + * @method + * @param {String} type - The pointer device type to get the gesture settings for ("mouse", "touch", "pen", etc.). + * @return {OpenSeadragon.GestureSettings} + */ + gestureSettingsByDeviceType: function ( type ) { + switch ( type ) { + case 'mouse': + return this.gestureSettingsMouse; + case 'touch': + return this.gestureSettingsTouch; + case 'pen': + return this.gestureSettingsPen; + default: + return this.gestureSettingsUnknown; + } + }, + + // private + _drawOverlays: function() { + var i, + length = this.currentOverlays.length; + for ( i = 0; i < length; i++ ) { + this.currentOverlays[ i ].drawHTML( this.overlaysContainer, this.viewport ); + } + }, + + /** + * Cancel the "in flight" images. + */ + _cancelPendingImages: function() { + this._loadQueue = []; + } +}); + + +/** + * _getSafeElemSize is like getElementSize(), but refuses to return 0 for x or y, + * which was causing some calling operations to return NaN. + * @returns {Point} + * @private + */ +function _getSafeElemSize (oElement) { + oElement = $.getElement( oElement ); + + return new $.Point( + (oElement.clientWidth === 0 ? 1 : oElement.clientWidth), + (oElement.clientHeight === 0 ? 1 : oElement.clientHeight) + ); +} + +/** + * @function + * @private + */ +function getTileSourceImplementation( viewer, tileSource, successCallback, + failCallback ) { + var _this = viewer; + + //allow plain xml strings or json strings to be parsed here + if ( $.type( tileSource ) == 'string' ) { + if ( tileSource.match( /\s*<.*/ ) ) { + tileSource = $.parseXml( tileSource ); + } else if ( tileSource.match( /\s*[\{\[].*/ ) ) { + tileSource = $.parseJSON(tileSource); + } + } + + function waitUntilReady(tileSource, originalTileSource) { + if (tileSource.ready) { + successCallback(tileSource); + } else { + tileSource.addHandler('ready', function () { + successCallback(tileSource); + }); + tileSource.addHandler('open-failed', function (event) { + failCallback({ + message: event.message, + source: originalTileSource + }); + }); + } + } + + setTimeout( function() { + if ( $.type( tileSource ) == 'string' ) { + //If its still a string it means it must be a url at this point + tileSource = new $.TileSource({ + url: tileSource, + crossOriginPolicy: viewer.crossOriginPolicy, + ajaxWithCredentials: viewer.ajaxWithCredentials, + useCanvas: viewer.useCanvas, + success: function( event ) { + successCallback( event.tileSource ); + } + }); + tileSource.addHandler( 'open-failed', function( event ) { + failCallback( event ); + } ); + + } else if ($.isPlainObject(tileSource) || tileSource.nodeType) { + if (!tileSource.crossOriginPolicy && viewer.crossOriginPolicy) { + tileSource.crossOriginPolicy = viewer.crossOriginPolicy; + } + if (tileSource.ajaxWithCredentials === undefined) { + tileSource.ajaxWithCredentials = viewer.ajaxWithCredentials; + } + if (tileSource.useCanvas === undefined) { + tileSource.useCanvas = viewer.useCanvas; + } + + if ( $.isFunction( tileSource.getTileUrl ) ) { + //Custom tile source + var customTileSource = new $.TileSource( tileSource ); + customTileSource.getTileUrl = tileSource.getTileUrl; + successCallback( customTileSource ); + } else { + //inline configuration + var $TileSource = $.TileSource.determineType( _this, tileSource ); + if ( !$TileSource ) { + failCallback( { + message: "Unable to load TileSource", + source: tileSource + }); + return; + } + var options = $TileSource.prototype.configure.apply( _this, [ tileSource ] ); + waitUntilReady(new $TileSource(options), tileSource); + } + } else { + //can assume it's already a tile source implementation + waitUntilReady(tileSource, tileSource); + } + }); +} + +function getOverlayObject( viewer, overlay ) { + if ( overlay instanceof $.Overlay ) { + return overlay; + } + + var element = null; + if ( overlay.element ) { + element = $.getElement( overlay.element ); + } else { + var id = overlay.id ? + overlay.id : + "openseadragon-overlay-" + Math.floor( Math.random() * 10000000 ); + + element = $.getElement( overlay.id ); + if ( !element ) { + element = document.createElement( "a" ); + element.href = "#/overlay/" + id; + } + element.id = id; + $.addClass( element, overlay.className ? + overlay.className : + "openseadragon-overlay" + ); + } + + var location = overlay.location; + var width = overlay.width; + var height = overlay.height; + if (!location) { + var x = overlay.x; + var y = overlay.y; + if (overlay.px !== undefined) { + var rect = viewer.viewport.imageToViewportRectangle(new $.Rect( + overlay.px, + overlay.py, + width || 0, + height || 0)); + x = rect.x; + y = rect.y; + width = width !== undefined ? rect.width : undefined; + height = height !== undefined ? rect.height : undefined; + } + location = new $.Point(x, y); + } + + var placement = overlay.placement; + if (placement && $.type(placement) === "string") { + placement = $.Placement[overlay.placement.toUpperCase()]; + } + + return new $.Overlay({ + element: element, + location: location, + placement: placement, + onDraw: overlay.onDraw, + checkResize: overlay.checkResize, + width: width, + height: height, + rotationMode: overlay.rotationMode + }); +} + +/** + * @private + * @inner + * Determines the index of the given overlay in the given overlays array. + */ +function getOverlayIndex( overlays, element ) { + var i; + for ( i = overlays.length - 1; i >= 0; i-- ) { + if ( overlays[ i ].element === element ) { + return i; + } + } + + return -1; +} + +/////////////////////////////////////////////////////////////////////////////// +// Schedulers provide the general engine for animation +/////////////////////////////////////////////////////////////////////////////// +function scheduleUpdate( viewer, updateFunc ){ + return $.requestAnimationFrame( function(){ + updateFunc( viewer ); + } ); +} + + +//provides a sequence in the fade animation +function scheduleControlsFade( viewer ) { + $.requestAnimationFrame( function(){ + updateControlsFade( viewer ); + }); +} + + +//initiates an animation to hide the controls +function beginControlsAutoHide( viewer ) { + if ( !viewer.autoHideControls ) { + return; + } + viewer.controlsShouldFade = true; + viewer.controlsFadeBeginTime = + $.now() + + viewer.controlsFadeDelay; + + window.setTimeout( function(){ + scheduleControlsFade( viewer ); + }, viewer.controlsFadeDelay ); +} + + +//determines if fade animation is done or continues the animation +function updateControlsFade( viewer ) { + var currentTime, + deltaTime, + opacity, + i; + if ( viewer.controlsShouldFade ) { + currentTime = $.now(); + deltaTime = currentTime - viewer.controlsFadeBeginTime; + opacity = 1.0 - deltaTime / viewer.controlsFadeLength; + + opacity = Math.min( 1.0, opacity ); + opacity = Math.max( 0.0, opacity ); + + for ( i = viewer.controls.length - 1; i >= 0; i--) { + if (viewer.controls[ i ].autoFade) { + viewer.controls[ i ].setOpacity( opacity ); + } + } + + if ( opacity > 0 ) { + // fade again + scheduleControlsFade( viewer ); + } + } +} + + +//stop the fade animation on the controls and show them +function abortControlsAutoHide( viewer ) { + var i; + viewer.controlsShouldFade = false; + for ( i = viewer.controls.length - 1; i >= 0; i-- ) { + viewer.controls[ i ].setOpacity( 1.0 ); + } +} + + + +/////////////////////////////////////////////////////////////////////////////// +// Default view event handlers. +/////////////////////////////////////////////////////////////////////////////// +function onFocus(){ + abortControlsAutoHide( this ); +} + +function onBlur(){ + beginControlsAutoHide( this ); + +} + +function onCanvasKeyDown( event ) { + if ( !event.preventDefaultAction && !event.ctrl && !event.alt && !event.meta ) { + switch( event.keyCode ){ + case 38://up arrow + if ( event.shift ) { + this.viewport.zoomBy(1.1); + } else { + this.viewport.panBy(this.viewport.deltaPointsFromPixels(new $.Point(0, -40))); + } + this.viewport.applyConstraints(); + return false; + case 40://down arrow + if ( event.shift ) { + this.viewport.zoomBy(0.9); + } else { + this.viewport.panBy(this.viewport.deltaPointsFromPixels(new $.Point(0, 40))); + } + this.viewport.applyConstraints(); + return false; + case 37://left arrow + this.viewport.panBy(this.viewport.deltaPointsFromPixels(new $.Point(-40, 0))); + this.viewport.applyConstraints(); + return false; + case 39://right arrow + this.viewport.panBy(this.viewport.deltaPointsFromPixels(new $.Point(40, 0))); + this.viewport.applyConstraints(); + return false; + default: + //console.log( 'navigator keycode %s', event.keyCode ); + return true; + } + } else { + return true; + } +} + +function onCanvasKeyPress( event ) { + if ( !event.preventDefaultAction && !event.ctrl && !event.alt && !event.meta ) { + switch( event.keyCode ){ + case 43://=|+ + case 61://=|+ + this.viewport.zoomBy(1.1); + this.viewport.applyConstraints(); + return false; + case 45://-|_ + this.viewport.zoomBy(0.9); + this.viewport.applyConstraints(); + return false; + case 48://0|) + this.viewport.goHome(); + this.viewport.applyConstraints(); + return false; + case 119://w + case 87://W + if ( event.shift ) { + this.viewport.zoomBy(1.1); + } else { + this.viewport.panBy(this.viewport.deltaPointsFromPixels(new $.Point(0, -40))); + } + this.viewport.applyConstraints(); + return false; + case 115://s + case 83://S + if ( event.shift ) { + this.viewport.zoomBy(0.9); + } else { + this.viewport.panBy(this.viewport.deltaPointsFromPixels(new $.Point(0, 40))); + } + this.viewport.applyConstraints(); + return false; + case 97://a + this.viewport.panBy(this.viewport.deltaPointsFromPixels(new $.Point(-40, 0))); + this.viewport.applyConstraints(); + return false; + case 100://d + this.viewport.panBy(this.viewport.deltaPointsFromPixels(new $.Point(40, 0))); + this.viewport.applyConstraints(); + return false; + default: + //console.log( 'navigator keycode %s', event.keyCode ); + return true; + } + } else { + return true; + } +} + +function onCanvasClick( event ) { + var gestureSettings; + + var haveKeyboardFocus = document.activeElement == this.canvas; + + // If we don't have keyboard focus, request it. + if ( !haveKeyboardFocus ) { + this.canvas.focus(); + } + + if ( !event.preventDefaultAction && this.viewport && event.quick ) { + gestureSettings = this.gestureSettingsByDeviceType( event.pointerType ); + if ( gestureSettings.clickToZoom ) { + this.viewport.zoomBy( + event.shift ? 1.0 / this.zoomPerClick : this.zoomPerClick, + this.viewport.pointFromPixel( event.position, true ) + ); + this.viewport.applyConstraints(); + } + } + /** + * Raised when a mouse press/release or touch/remove occurs on the {@link OpenSeadragon.Viewer#canvas} element. + * + * @event canvas-click + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event. + * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event. + * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element. + * @property {Boolean} quick - True only if the clickDistThreshold and clickTimeThreshold are both passed. Useful for differentiating between clicks and drags. + * @property {Boolean} shift - True if the shift key was pressed during this event. + * @property {Object} originalEvent - The original DOM event. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + this.raiseEvent( 'canvas-click', { + tracker: event.eventSource, + position: event.position, + quick: event.quick, + shift: event.shift, + originalEvent: event.originalEvent + }); +} + +function onCanvasDblClick( event ) { + var gestureSettings; + + if ( !event.preventDefaultAction && this.viewport ) { + gestureSettings = this.gestureSettingsByDeviceType( event.pointerType ); + if ( gestureSettings.dblClickToZoom ) { + this.viewport.zoomBy( + event.shift ? 1.0 / this.zoomPerClick : this.zoomPerClick, + this.viewport.pointFromPixel( event.position, true ) + ); + this.viewport.applyConstraints(); + } + } + /** + * Raised when a double mouse press/release or touch/remove occurs on the {@link OpenSeadragon.Viewer#canvas} element. + * + * @event canvas-double-click + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event. + * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event. + * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element. + * @property {Boolean} shift - True if the shift key was pressed during this event. + * @property {Object} originalEvent - The original DOM event. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + this.raiseEvent( 'canvas-double-click', { + tracker: event.eventSource, + position: event.position, + shift: event.shift, + originalEvent: event.originalEvent + }); +} + +function onCanvasDrag( event ) { + var gestureSettings; + + if ( !event.preventDefaultAction && this.viewport ) { + gestureSettings = this.gestureSettingsByDeviceType( event.pointerType ); + if( !this.panHorizontal ){ + event.delta.x = 0; + } + if( !this.panVertical ){ + event.delta.y = 0; + } + this.viewport.panBy( this.viewport.deltaPointsFromPixels( event.delta.negate() ), gestureSettings.flickEnabled ); + if( this.constrainDuringPan ){ + this.viewport.applyConstraints(); + } + } + /** + * Raised when a mouse or touch drag operation occurs on the {@link OpenSeadragon.Viewer#canvas} element. + * + * @event canvas-drag + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event. + * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event. + * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element. + * @property {OpenSeadragon.Point} delta - The x,y components of the difference between start drag and end drag. + * @property {Number} speed - Current computed speed, in pixels per second. + * @property {Number} direction - Current computed direction, expressed as an angle counterclockwise relative to the positive X axis (-pi to pi, in radians). Only valid if speed > 0. + * @property {Boolean} shift - True if the shift key was pressed during this event. + * @property {Object} originalEvent - The original DOM event. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + this.raiseEvent( 'canvas-drag', { + tracker: event.eventSource, + position: event.position, + delta: event.delta, + speed: event.speed, + direction: event.direction, + shift: event.shift, + originalEvent: event.originalEvent + }); +} + +function onCanvasDragEnd( event ) { + if (!event.preventDefaultAction && this.viewport) { + var gestureSettings = this.gestureSettingsByDeviceType(event.pointerType); + if (gestureSettings.flickEnabled && + event.speed >= gestureSettings.flickMinSpeed) { + var amplitudeX = 0; + if (this.panHorizontal) { + amplitudeX = gestureSettings.flickMomentum * event.speed * + Math.cos(event.direction); + } + var amplitudeY = 0; + if (this.panVertical) { + amplitudeY = gestureSettings.flickMomentum * event.speed * + Math.sin(event.direction); + } + var center = this.viewport.pixelFromPoint( + this.viewport.getCenter(true)); + var target = this.viewport.pointFromPixel( + new $.Point(center.x - amplitudeX, center.y - amplitudeY)); + this.viewport.panTo(target, false); + } + this.viewport.applyConstraints(); + } + /** + * Raised when a mouse or touch drag operation ends on the {@link OpenSeadragon.Viewer#canvas} element. + * + * @event canvas-drag-end + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event. + * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event. + * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element. + * @property {Number} speed - Speed at the end of a drag gesture, in pixels per second. + * @property {Number} direction - Direction at the end of a drag gesture, expressed as an angle counterclockwise relative to the positive X axis (-pi to pi, in radians). Only valid if speed > 0. + * @property {Boolean} shift - True if the shift key was pressed during this event. + * @property {Object} originalEvent - The original DOM event. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + this.raiseEvent('canvas-drag-end', { + tracker: event.eventSource, + position: event.position, + speed: event.speed, + direction: event.direction, + shift: event.shift, + originalEvent: event.originalEvent + }); +} + +function onCanvasEnter( event ) { + /** + * Raised when a pointer enters the {@link OpenSeadragon.Viewer#canvas} element. + * + * @event canvas-enter + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event. + * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event. + * @property {String} pointerType - "mouse", "touch", "pen", etc. + * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element. + * @property {Number} buttons - Current buttons pressed. A combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser. + * @property {Number} pointers - Number of pointers (all types) active in the tracked element. + * @property {Boolean} insideElementPressed - True if the left mouse button is currently being pressed and was initiated inside the tracked element, otherwise false. + * @property {Boolean} buttonDownAny - Was the button down anywhere in the screen during the event. Deprecated. Use buttons instead. + * @property {Object} originalEvent - The original DOM event. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + this.raiseEvent( 'canvas-enter', { + tracker: event.eventSource, + pointerType: event.pointerType, + position: event.position, + buttons: event.buttons, + pointers: event.pointers, + insideElementPressed: event.insideElementPressed, + buttonDownAny: event.buttonDownAny, + originalEvent: event.originalEvent + }); +} + +function onCanvasExit( event ) { + /** + * Raised when a pointer leaves the {@link OpenSeadragon.Viewer#canvas} element. + * + * @event canvas-exit + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event. + * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event. + * @property {String} pointerType - "mouse", "touch", "pen", etc. + * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element. + * @property {Number} buttons - Current buttons pressed. A combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser. + * @property {Number} pointers - Number of pointers (all types) active in the tracked element. + * @property {Boolean} insideElementPressed - True if the left mouse button is currently being pressed and was initiated inside the tracked element, otherwise false. + * @property {Boolean} buttonDownAny - Was the button down anywhere in the screen during the event. Deprecated. Use buttons instead. + * @property {Object} originalEvent - The original DOM event. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + this.raiseEvent( 'canvas-exit', { + tracker: event.eventSource, + pointerType: event.pointerType, + position: event.position, + buttons: event.buttons, + pointers: event.pointers, + insideElementPressed: event.insideElementPressed, + buttonDownAny: event.buttonDownAny, + originalEvent: event.originalEvent + }); +} + +function onCanvasPress( event ) { + /** + * Raised when the primary mouse button is pressed or touch starts on the {@link OpenSeadragon.Viewer#canvas} element. + * + * @event canvas-press + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event. + * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event. + * @property {String} pointerType - "mouse", "touch", "pen", etc. + * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element. + * @property {Boolean} insideElementPressed - True if the left mouse button is currently being pressed and was initiated inside the tracked element, otherwise false. + * @property {Boolean} insideElementReleased - True if the cursor still inside the tracked element when the button was released. + * @property {Object} originalEvent - The original DOM event. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + this.raiseEvent( 'canvas-press', { + tracker: event.eventSource, + pointerType: event.pointerType, + position: event.position, + insideElementPressed: event.insideElementPressed, + insideElementReleased: event.insideElementReleased, + originalEvent: event.originalEvent + }); +} + +function onCanvasRelease( event ) { + /** + * Raised when the primary mouse button is released or touch ends on the {@link OpenSeadragon.Viewer#canvas} element. + * + * @event canvas-release + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event. + * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event. + * @property {String} pointerType - "mouse", "touch", "pen", etc. + * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element. + * @property {Boolean} insideElementPressed - True if the left mouse button is currently being pressed and was initiated inside the tracked element, otherwise false. + * @property {Boolean} insideElementReleased - True if the cursor still inside the tracked element when the button was released. + * @property {Object} originalEvent - The original DOM event. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + this.raiseEvent( 'canvas-release', { + tracker: event.eventSource, + pointerType: event.pointerType, + position: event.position, + insideElementPressed: event.insideElementPressed, + insideElementReleased: event.insideElementReleased, + originalEvent: event.originalEvent + }); +} + +function onCanvasNonPrimaryPress( event ) { + /** + * Raised when any non-primary pointer button is pressed on the {@link OpenSeadragon.Viewer#canvas} element. + * + * @event canvas-nonprimary-press + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event. + * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event. + * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element. + * @property {String} pointerType - "mouse", "touch", "pen", etc. + * @property {Number} button - Button which caused the event. + * -1: none, 0: primary/left, 1: aux/middle, 2: secondary/right, 3: X1/back, 4: X2/forward, 5: pen eraser. + * @property {Number} buttons - Current buttons pressed. + * Combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser. + * @property {Object} originalEvent - The original DOM event. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + this.raiseEvent( 'canvas-nonprimary-press', { + tracker: event.eventSource, + position: event.position, + pointerType: event.pointerType, + button: event.button, + buttons: event.buttons, + originalEvent: event.originalEvent + }); +} + +function onCanvasNonPrimaryRelease( event ) { + /** + * Raised when any non-primary pointer button is released on the {@link OpenSeadragon.Viewer#canvas} element. + * + * @event canvas-nonprimary-release + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event. + * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event. + * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element. + * @property {String} pointerType - "mouse", "touch", "pen", etc. + * @property {Number} button - Button which caused the event. + * -1: none, 0: primary/left, 1: aux/middle, 2: secondary/right, 3: X1/back, 4: X2/forward, 5: pen eraser. + * @property {Number} buttons - Current buttons pressed. + * Combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser. + * @property {Object} originalEvent - The original DOM event. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + this.raiseEvent( 'canvas-nonprimary-release', { + tracker: event.eventSource, + position: event.position, + pointerType: event.pointerType, + button: event.button, + buttons: event.buttons, + originalEvent: event.originalEvent + }); +} + +function onCanvasPinch( event ) { + var gestureSettings, + centerPt, + lastCenterPt, + panByPt; + + if ( !event.preventDefaultAction && this.viewport ) { + gestureSettings = this.gestureSettingsByDeviceType( event.pointerType ); + if ( gestureSettings.pinchToZoom ) { + centerPt = this.viewport.pointFromPixel( event.center, true ); + lastCenterPt = this.viewport.pointFromPixel( event.lastCenter, true ); + panByPt = lastCenterPt.minus( centerPt ); + if( !this.panHorizontal ) { + panByPt.x = 0; + } + if( !this.panVertical ) { + panByPt.y = 0; + } + this.viewport.zoomBy( event.distance / event.lastDistance, centerPt, true ); + this.viewport.panBy( panByPt, true ); + this.viewport.applyConstraints(); + } + if ( gestureSettings.pinchRotate ) { + // Pinch rotate + var angle1 = Math.atan2(event.gesturePoints[0].currentPos.y - event.gesturePoints[1].currentPos.y, + event.gesturePoints[0].currentPos.x - event.gesturePoints[1].currentPos.x); + var angle2 = Math.atan2(event.gesturePoints[0].lastPos.y - event.gesturePoints[1].lastPos.y, + event.gesturePoints[0].lastPos.x - event.gesturePoints[1].lastPos.x); + this.viewport.setRotation(this.viewport.getRotation() + ((angle1 - angle2) * (180 / Math.PI))); + } + } + /** + * Raised when a pinch event occurs on the {@link OpenSeadragon.Viewer#canvas} element. + * + * @event canvas-pinch + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event. + * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event. + * @property {Array.} gesturePoints - Gesture points associated with the gesture. Velocity data can be found here. + * @property {OpenSeadragon.Point} lastCenter - The previous center point of the two pinch contact points relative to the tracked element. + * @property {OpenSeadragon.Point} center - The center point of the two pinch contact points relative to the tracked element. + * @property {Number} lastDistance - The previous distance between the two pinch contact points in CSS pixels. + * @property {Number} distance - The distance between the two pinch contact points in CSS pixels. + * @property {Boolean} shift - True if the shift key was pressed during this event. + * @property {Object} originalEvent - The original DOM event. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + this.raiseEvent('canvas-pinch', { + tracker: event.eventSource, + gesturePoints: event.gesturePoints, + lastCenter: event.lastCenter, + center: event.center, + lastDistance: event.lastDistance, + distance: event.distance, + shift: event.shift, + originalEvent: event.originalEvent + }); + //cancels event + return false; +} + +function onCanvasScroll( event ) { + var gestureSettings, + factor, + thisScrollTime, + deltaScrollTime; + + /* Certain scroll devices fire the scroll event way too fast so we are injecting a simple adjustment to keep things + * partially normalized. If we have already fired an event within the last 'minScrollDelta' milliseconds we skip + * this one and wait for the next event. */ + thisScrollTime = $.now(); + deltaScrollTime = thisScrollTime - this._lastScrollTime; + if (deltaScrollTime > this.minScrollDeltaTime) { + this._lastScrollTime = thisScrollTime; + + if ( !event.preventDefaultAction && this.viewport ) { + gestureSettings = this.gestureSettingsByDeviceType( event.pointerType ); + if ( gestureSettings.scrollToZoom ) { + factor = Math.pow( this.zoomPerScroll, event.scroll ); + this.viewport.zoomBy( + factor, + this.viewport.pointFromPixel( event.position, true ) + ); + this.viewport.applyConstraints(); + } + } + /** + * Raised when a scroll event occurs on the {@link OpenSeadragon.Viewer#canvas} element (mouse wheel). + * + * @event canvas-scroll + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event. + * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event. + * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element. + * @property {Number} scroll - The scroll delta for the event. + * @property {Boolean} shift - True if the shift key was pressed during this event. + * @property {Object} originalEvent - The original DOM event. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + this.raiseEvent( 'canvas-scroll', { + tracker: event.eventSource, + position: event.position, + scroll: event.scroll, + shift: event.shift, + originalEvent: event.originalEvent + }); + if (gestureSettings && gestureSettings.scrollToZoom) { + //cancels event + return false; + } + } + else { + gestureSettings = this.gestureSettingsByDeviceType( event.pointerType ); + if (gestureSettings && gestureSettings.scrollToZoom) { + return false; // We are swallowing this event + } + } +} + +function onContainerEnter( event ) { + THIS[ this.hash ].mouseInside = true; + abortControlsAutoHide( this ); + /** + * Raised when the cursor enters the {@link OpenSeadragon.Viewer#container} element. + * + * @event container-enter + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event. + * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event. + * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element. + * @property {Number} buttons - Current buttons pressed. A combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser. + * @property {Number} pointers - Number of pointers (all types) active in the tracked element. + * @property {Boolean} insideElementPressed - True if the left mouse button is currently being pressed and was initiated inside the tracked element, otherwise false. + * @property {Boolean} buttonDownAny - Was the button down anywhere in the screen during the event. Deprecated. Use buttons instead. + * @property {Object} originalEvent - The original DOM event. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + this.raiseEvent( 'container-enter', { + tracker: event.eventSource, + position: event.position, + buttons: event.buttons, + pointers: event.pointers, + insideElementPressed: event.insideElementPressed, + buttonDownAny: event.buttonDownAny, + originalEvent: event.originalEvent + }); +} + +function onContainerExit( event ) { + if ( event.pointers < 1 ) { + THIS[ this.hash ].mouseInside = false; + if ( !THIS[ this.hash ].animating ) { + beginControlsAutoHide( this ); + } + } + /** + * Raised when the cursor leaves the {@link OpenSeadragon.Viewer#container} element. + * + * @event container-exit + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event. + * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event. + * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element. + * @property {Number} buttons - Current buttons pressed. A combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser. + * @property {Number} pointers - Number of pointers (all types) active in the tracked element. + * @property {Boolean} insideElementPressed - True if the left mouse button is currently being pressed and was initiated inside the tracked element, otherwise false. + * @property {Boolean} buttonDownAny - Was the button down anywhere in the screen during the event. Deprecated. Use buttons instead. + * @property {Object} originalEvent - The original DOM event. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + this.raiseEvent( 'container-exit', { + tracker: event.eventSource, + position: event.position, + buttons: event.buttons, + pointers: event.pointers, + insideElementPressed: event.insideElementPressed, + buttonDownAny: event.buttonDownAny, + originalEvent: event.originalEvent + }); +} + + +/////////////////////////////////////////////////////////////////////////////// +// Page update routines ( aka Views - for future reference ) +/////////////////////////////////////////////////////////////////////////////// + +function updateMulti( viewer ) { + updateOnce( viewer ); + + // Request the next frame, unless we've been closed + if ( viewer.isOpen() ) { + viewer._updateRequestId = scheduleUpdate( viewer, updateMulti ); + } else { + viewer._updateRequestId = false; + } +} + +function updateOnce( viewer ) { + + //viewer.profiler.beginUpdate(); + + if (viewer._opening) { + return; + } + + if (viewer.autoResize) { + var containerSize = _getSafeElemSize(viewer.container); + var prevContainerSize = THIS[viewer.hash].prevContainerSize; + if (!containerSize.equals(prevContainerSize)) { + var viewport = viewer.viewport; + if (viewer.preserveImageSizeOnResize) { + var resizeRatio = prevContainerSize.x / containerSize.x; + var zoom = viewport.getZoom() * resizeRatio; + var center = viewport.getCenter(); + viewport.resize(containerSize, false); + viewport.zoomTo(zoom, null, true); + viewport.panTo(center, true); + } else { + // maintain image position + var oldBounds = viewport.getBounds(); + viewport.resize(containerSize, true); + viewport.fitBoundsWithConstraints(oldBounds, true); + } + THIS[viewer.hash].prevContainerSize = containerSize; + THIS[viewer.hash].forceRedraw = true; + } + } + + var viewportChange = viewer.viewport.update(); + var animated = viewer.world.update() || viewportChange; + + if (viewportChange) { + /** + * Raised when any spring animation update occurs (zoom, pan, etc.), + * before the viewer has drawn the new location. + * + * @event viewport-change + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + viewer.raiseEvent('viewport-change'); + } + + if( viewer.referenceStrip ){ + animated = viewer.referenceStrip.update( viewer.viewport ) || animated; + } + + if ( !THIS[ viewer.hash ].animating && animated ) { + /** + * Raised when any spring animation starts (zoom, pan, etc.). + * + * @event animation-start + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + viewer.raiseEvent( "animation-start" ); + abortControlsAutoHide( viewer ); + } + + if ( animated || THIS[ viewer.hash ].forceRedraw || viewer.world.needsDraw() ) { + drawWorld( viewer ); + viewer._drawOverlays(); + if( viewer.navigator ){ + viewer.navigator.update( viewer.viewport ); + } + + THIS[ viewer.hash ].forceRedraw = false; + + if (animated) { + /** + * Raised when any spring animation update occurs (zoom, pan, etc.), + * after the viewer has drawn the new location. + * + * @event animation + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + viewer.raiseEvent( "animation" ); + } + } + + if ( THIS[ viewer.hash ].animating && !animated ) { + /** + * Raised when any spring animation ends (zoom, pan, etc.). + * + * @event animation-finish + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + viewer.raiseEvent( "animation-finish" ); + + if ( !THIS[ viewer.hash ].mouseInside ) { + beginControlsAutoHide( viewer ); + } + } + + THIS[ viewer.hash ].animating = animated; + + //viewer.profiler.endUpdate(); +} + +function drawWorld( viewer ) { + viewer.imageLoader.clear(); + viewer.drawer.clear(); + viewer.world.draw(); + + /** + * - Needs documentation - + * + * @event update-viewport + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + viewer.raiseEvent( 'update-viewport', {} ); +} + +/////////////////////////////////////////////////////////////////////////////// +// Navigation Controls +/////////////////////////////////////////////////////////////////////////////// +function resolveUrl( prefix, url ) { + return prefix ? prefix + url : url; +} + + + +function beginZoomingIn() { + THIS[ this.hash ].lastZoomTime = $.now(); + THIS[ this.hash ].zoomFactor = this.zoomPerSecond; + THIS[ this.hash ].zooming = true; + scheduleZoom( this ); +} + + +function beginZoomingOut() { + THIS[ this.hash ].lastZoomTime = $.now(); + THIS[ this.hash ].zoomFactor = 1.0 / this.zoomPerSecond; + THIS[ this.hash ].zooming = true; + scheduleZoom( this ); +} + + +function endZooming() { + THIS[ this.hash ].zooming = false; +} + + +function scheduleZoom( viewer ) { + $.requestAnimationFrame( $.delegate( viewer, doZoom ) ); +} + + +function doZoom() { + var currentTime, + deltaTime, + adjustedFactor; + + if ( THIS[ this.hash ].zooming && this.viewport) { + currentTime = $.now(); + deltaTime = currentTime - THIS[ this.hash ].lastZoomTime; + adjustedFactor = Math.pow( THIS[ this.hash ].zoomFactor, deltaTime / 1000 ); + + this.viewport.zoomBy( adjustedFactor ); + this.viewport.applyConstraints(); + THIS[ this.hash ].lastZoomTime = currentTime; + scheduleZoom( this ); + } +} + + +function doSingleZoomIn() { + if ( this.viewport ) { + THIS[ this.hash ].zooming = false; + this.viewport.zoomBy( + this.zoomPerClick / 1.0 + ); + this.viewport.applyConstraints(); + } +} + + +function doSingleZoomOut() { + if ( this.viewport ) { + THIS[ this.hash ].zooming = false; + this.viewport.zoomBy( + 1.0 / this.zoomPerClick + ); + this.viewport.applyConstraints(); + } +} + + +function lightUp() { + this.buttons.emulateEnter(); + this.buttons.emulateExit(); +} + + +function onHome() { + if ( this.viewport ) { + this.viewport.goHome(); + } +} + + +function onFullScreen() { + if ( this.isFullPage() && !$.isFullScreen() ) { + // Is fullPage but not fullScreen + this.setFullPage( false ); + } else { + this.setFullScreen( !this.isFullPage() ); + } + // correct for no mouseout event on change + if ( this.buttons ) { + this.buttons.emulateExit(); + } + this.fullPageButton.element.focus(); + if ( this.viewport ) { + this.viewport.applyConstraints(); + } +} + +/** + * Note: The current rotation feature is limited to 90 degree turns. + */ +function onRotateLeft() { + if ( this.viewport ) { + var currRotation = this.viewport.getRotation(); + if (currRotation === 0) { + currRotation = 270; + } + else { + currRotation -= 90; + } + this.viewport.setRotation(currRotation); + } +} + +/** + * Note: The current rotation feature is limited to 90 degree turns. + */ +function onRotateRight() { + if ( this.viewport ) { + var currRotation = this.viewport.getRotation(); + if (currRotation === 270) { + currRotation = 0; + } + else { + currRotation += 90; + } + this.viewport.setRotation(currRotation); + } +} + + +function onPrevious(){ + var previous = this._sequenceIndex - 1; + if(this.navPrevNextWrap && previous < 0){ + previous += this.tileSources.length; + } + this.goToPage( previous ); +} + + +function onNext(){ + var next = this._sequenceIndex + 1; + if(this.navPrevNextWrap && next >= this.tileSources.length){ + next = 0; + } + this.goToPage( next ); +} + + +}( OpenSeadragon )); + +/* + * OpenSeadragon - Navigator + * + * Copyright (C) 2009 CodePlex Foundation + * Copyright (C) 2010-2013 OpenSeadragon contributors + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of CodePlex Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +(function( $ ){ + +/** + * @class Navigator + * @classdesc The Navigator provides a small view of the current image as fixed + * while representing the viewport as a moving box serving as a frame + * of reference in the larger viewport as to which portion of the image + * is currently being examined. The navigator's viewport can be interacted + * with using the keyboard or the mouse. + * + * @memberof OpenSeadragon + * @extends OpenSeadragon.Viewer + * @extends OpenSeadragon.EventSource + * @param {Object} options + */ +$.Navigator = function( options ){ + + var viewer = options.viewer, + _this = this, + viewerSize, + navigatorSize; + + //We may need to create a new element and id if they did not + //provide the id for the existing element + if( !options.id ){ + options.id = 'navigator-' + $.now(); + this.element = $.makeNeutralElement( "div" ); + options.controlOptions = { + anchor: $.ControlAnchor.TOP_RIGHT, + attachToViewer: true, + autoFade: options.autoFade + }; + + if( options.position ){ + if( 'BOTTOM_RIGHT' == options.position ){ + options.controlOptions.anchor = $.ControlAnchor.BOTTOM_RIGHT; + } else if( 'BOTTOM_LEFT' == options.position ){ + options.controlOptions.anchor = $.ControlAnchor.BOTTOM_LEFT; + } else if( 'TOP_RIGHT' == options.position ){ + options.controlOptions.anchor = $.ControlAnchor.TOP_RIGHT; + } else if( 'TOP_LEFT' == options.position ){ + options.controlOptions.anchor = $.ControlAnchor.TOP_LEFT; + } else if( 'ABSOLUTE' == options.position ){ + options.controlOptions.anchor = $.ControlAnchor.ABSOLUTE; + options.controlOptions.top = options.top; + options.controlOptions.left = options.left; + options.controlOptions.height = options.height; + options.controlOptions.width = options.width; + } + } + + } else { + this.element = document.getElementById( options.id ); + options.controlOptions = { + anchor: $.ControlAnchor.NONE, + attachToViewer: false, + autoFade: false + }; + } + this.element.id = options.id; + this.element.className += ' navigator'; + + options = $.extend( true, { + sizeRatio: $.DEFAULT_SETTINGS.navigatorSizeRatio + }, options, { + element: this.element, + tabIndex: -1, // No keyboard navigation, omit from tab order + //These need to be overridden to prevent recursion since + //the navigator is a viewer and a viewer has a navigator + showNavigator: false, + mouseNavEnabled: false, + showNavigationControl: false, + showSequenceControl: false, + immediateRender: true, + blendTime: 0, + animationTime: 0, + autoResize: options.autoResize, + // prevent resizing the navigator from adding unwanted space around the image + minZoomImageRatio: 1.0 + }); + + options.minPixelRatio = this.minPixelRatio = viewer.minPixelRatio; + + $.setElementTouchActionNone( this.element ); + + this.borderWidth = 2; + //At some browser magnification levels the display regions lines up correctly, but at some there appears to + //be a one pixel gap. + this.fudge = new $.Point(1, 1); + this.totalBorderWidths = new $.Point(this.borderWidth*2, this.borderWidth*2).minus(this.fudge); + + + if ( options.controlOptions.anchor != $.ControlAnchor.NONE ) { + (function( style, borderWidth ){ + style.margin = '0px'; + style.border = borderWidth + 'px solid #555'; + style.padding = '0px'; + style.background = '#000'; + style.opacity = 0.8; + style.overflow = 'hidden'; + }( this.element.style, this.borderWidth)); + } + + this.displayRegion = $.makeNeutralElement( "div" ); + this.displayRegion.id = this.element.id + '-displayregion'; + this.displayRegion.className = 'displayregion'; + + (function( style, borderWidth ){ + style.position = 'relative'; + style.top = '0px'; + style.left = '0px'; + style.fontSize = '0px'; + style.overflow = 'hidden'; + style.border = borderWidth + 'px solid #900'; + style.margin = '0px'; + style.padding = '0px'; + //TODO: IE doesnt like this property being set + //try{ style.outline = '2px auto #909'; }catch(e){/*ignore*/} + + style.background = 'transparent'; + + // We use square bracket notation on the statement below, because float is a keyword. + // This is important for the Google Closure compiler, if nothing else. + /*jshint sub:true */ + style['float'] = 'left'; //Webkit + + style.cssFloat = 'left'; //Firefox + style.styleFloat = 'left'; //IE + style.zIndex = 999999999; + style.cursor = 'default'; + }( this.displayRegion.style, this.borderWidth )); + + this.displayRegionContainer = $.makeNeutralElement("div"); + this.displayRegionContainer.id = this.element.id + '-displayregioncontainer'; + this.displayRegionContainer.className = "displayregioncontainer"; + this.displayRegionContainer.style.width = "100%"; + this.displayRegionContainer.style.height = "100%"; + + viewer.addControl( + this.element, + options.controlOptions + ); + + this._resizeWithViewer = options.controlOptions.anchor != $.ControlAnchor.ABSOLUTE && + options.controlOptions.anchor != $.ControlAnchor.NONE; + + if ( this._resizeWithViewer ) { + if ( options.width && options.height ) { + this.element.style.height = typeof ( options.height ) == "number" ? ( options.height + 'px' ) : options.height; + this.element.style.width = typeof ( options.width ) == "number" ? ( options.width + 'px' ) : options.width; + } else { + viewerSize = $.getElementSize( viewer.element ); + this.element.style.height = Math.round( viewerSize.y * options.sizeRatio ) + 'px'; + this.element.style.width = Math.round( viewerSize.x * options.sizeRatio ) + 'px'; + this.oldViewerSize = viewerSize; + } + navigatorSize = $.getElementSize( this.element ); + this.elementArea = navigatorSize.x * navigatorSize.y; + } + + this.oldContainerSize = new $.Point( 0, 0 ); + + $.Viewer.apply( this, [ options ] ); + + this.displayRegionContainer.appendChild(this.displayRegion); + this.element.getElementsByTagName('div')[0].appendChild(this.displayRegionContainer); + + function rotate(degrees) { + _setTransformRotate(_this.displayRegionContainer, degrees); + _setTransformRotate(_this.displayRegion, -degrees); + _this.viewport.setRotation(degrees); + } + if (options.navigatorRotate) { + var degrees = options.viewer.viewport ? + options.viewer.viewport.getRotation() : + options.viewer.degrees || 0; + rotate(degrees); + options.viewer.addHandler("rotate", function (args) { + rotate(args.degrees); + }); + } + + // Remove the base class' (Viewer's) innerTracker and replace it with our own + this.innerTracker.destroy(); + this.innerTracker = new $.MouseTracker({ + element: this.element, + dragHandler: $.delegate( this, onCanvasDrag ), + clickHandler: $.delegate( this, onCanvasClick ), + releaseHandler: $.delegate( this, onCanvasRelease ), + scrollHandler: $.delegate( this, onCanvasScroll ) + }); + + this.addHandler("reset-size", function() { + if (_this.viewport) { + _this.viewport.goHome(true); + } + }); + + viewer.world.addHandler("item-index-change", function(event) { + var item = _this.world.getItemAt(event.previousIndex); + _this.world.setItemIndex(item, event.newIndex); + }); + + viewer.world.addHandler("remove-item", function(event) { + var theirItem = event.item; + var myItem = _this._getMatchingItem(theirItem); + if (myItem) { + _this.world.removeItem(myItem); + } + }); + + this.update(viewer.viewport); +}; + +$.extend( $.Navigator.prototype, $.EventSource.prototype, $.Viewer.prototype, /** @lends OpenSeadragon.Navigator.prototype */{ + + /** + * Used to notify the navigator when its size has changed. + * Especially useful when {@link OpenSeadragon.Options}.navigatorAutoResize is set to false and the navigator is resizable. + * @function + */ + updateSize: function () { + if ( this.viewport ) { + var containerSize = new $.Point( + (this.container.clientWidth === 0 ? 1 : this.container.clientWidth), + (this.container.clientHeight === 0 ? 1 : this.container.clientHeight) + ); + + if ( !containerSize.equals( this.oldContainerSize ) ) { + this.viewport.resize( containerSize, true ); + this.viewport.goHome(true); + this.oldContainerSize = containerSize; + this.drawer.clear(); + this.world.draw(); + } + } + }, + + /** + * Used to update the navigator minimap's viewport rectangle when a change in the viewer's viewport occurs. + * @function + * @param {OpenSeadragon.Viewport} The viewport this navigator is tracking. + */ + update: function( viewport ) { + + var viewerSize, + newWidth, + newHeight, + bounds, + topleft, + bottomright; + + viewerSize = $.getElementSize( this.viewer.element ); + if ( this._resizeWithViewer && viewerSize.x && viewerSize.y && !viewerSize.equals( this.oldViewerSize ) ) { + this.oldViewerSize = viewerSize; + + if ( this.maintainSizeRatio || !this.elementArea) { + newWidth = viewerSize.x * this.sizeRatio; + newHeight = viewerSize.y * this.sizeRatio; + } else { + newWidth = Math.sqrt(this.elementArea * (viewerSize.x / viewerSize.y)); + newHeight = this.elementArea / newWidth; + } + + this.element.style.width = Math.round( newWidth ) + 'px'; + this.element.style.height = Math.round( newHeight ) + 'px'; + + if (!this.elementArea) { + this.elementArea = newWidth * newHeight; + } + + this.updateSize(); + } + + if (viewport && this.viewport) { + bounds = viewport.getBoundsNoRotate(true); + topleft = this.viewport.pixelFromPointNoRotate(bounds.getTopLeft(), false); + bottomright = this.viewport.pixelFromPointNoRotate(bounds.getBottomRight(), false) + .minus( this.totalBorderWidths ); + + //update style for navigator-box + var style = this.displayRegion.style; + style.display = this.world.getItemCount() ? 'block' : 'none'; + + style.top = Math.round( topleft.y ) + 'px'; + style.left = Math.round( topleft.x ) + 'px'; + + var width = Math.abs( topleft.x - bottomright.x ); + var height = Math.abs( topleft.y - bottomright.y ); + // make sure width and height are non-negative so IE doesn't throw + style.width = Math.round( Math.max( width, 0 ) ) + 'px'; + style.height = Math.round( Math.max( height, 0 ) ) + 'px'; + } + + }, + + // overrides Viewer.addTiledImage + addTiledImage: function(options) { + var _this = this; + + var original = options.originalTiledImage; + delete options.original; + + var optionsClone = $.extend({}, options, { + success: function(event) { + var myItem = event.item; + myItem._originalForNavigator = original; + _this._matchBounds(myItem, original, true); + + original.addHandler('bounds-change', function() { + _this._matchBounds(myItem, original); + }); + } + }); + + return $.Viewer.prototype.addTiledImage.apply(this, [optionsClone]); + }, + + // private + _getMatchingItem: function(theirItem) { + var count = this.world.getItemCount(); + var item; + for (var i = 0; i < count; i++) { + item = this.world.getItemAt(i); + if (item._originalForNavigator === theirItem) { + return item; + } + } + + return null; + }, + + // private + _matchBounds: function(myItem, theirItem, immediately) { + var bounds = theirItem.getBounds(); + myItem.setPosition(bounds.getTopLeft(), immediately); + myItem.setWidth(bounds.width, immediately); + } +}); + +/** + * @private + * @inner + * @function + */ +function onCanvasClick( event ) { + if ( event.quick && this.viewer.viewport ) { + this.viewer.viewport.panTo(this.viewport.pointFromPixel(event.position)); + this.viewer.viewport.applyConstraints(); + } +} + +/** + * @private + * @inner + * @function + */ +function onCanvasDrag( event ) { + if ( this.viewer.viewport ) { + if( !this.panHorizontal ){ + event.delta.x = 0; + } + if( !this.panVertical ){ + event.delta.y = 0; + } + this.viewer.viewport.panBy( + this.viewport.deltaPointsFromPixels( + event.delta + ) + ); + } +} + + +/** + * @private + * @inner + * @function + */ +function onCanvasRelease( event ) { + if ( event.insideElementPressed && this.viewer.viewport ) { + this.viewer.viewport.applyConstraints(); + } +} + + +/** + * @private + * @inner + * @function + */ +function onCanvasScroll( event ) { + /** + * Raised when a scroll event occurs on the {@link OpenSeadragon.Viewer#navigator} element (mouse wheel, touch pinch, etc.). + * + * @event navigator-scroll + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event. + * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event. + * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element. + * @property {Number} scroll - The scroll delta for the event. + * @property {Boolean} shift - True if the shift key was pressed during this event. + * @property {Object} originalEvent - The original DOM event. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + this.viewer.raiseEvent( 'navigator-scroll', { + tracker: event.eventSource, + position: event.position, + scroll: event.scroll, + shift: event.shift, + originalEvent: event.originalEvent + }); + + //dont scroll the page up and down if the user is scrolling + //in the navigator + return false; +} + +/** + * @function + * @private + * @param {Object} element + * @param {Number} degrees + */ +function _setTransformRotate (element, degrees) { + element.style.webkitTransform = "rotate(" + degrees + "deg)"; + element.style.mozTransform = "rotate(" + degrees + "deg)"; + element.style.msTransform = "rotate(" + degrees + "deg)"; + element.style.oTransform = "rotate(" + degrees + "deg)"; + element.style.transform = "rotate(" + degrees + "deg)"; +} + +}( OpenSeadragon )); + +/* + * OpenSeadragon - getString/setString + * + * Copyright (C) 2009 CodePlex Foundation + * Copyright (C) 2010-2013 OpenSeadragon contributors + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of CodePlex Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +(function( $ ){ + +//TODO: I guess this is where the i18n needs to be reimplemented. I'll look +// into existing patterns for i18n in javascript but i think that mimicking +// pythons gettext might be a reasonable approach. +var I18N = { + Errors: { + Dzc: "Sorry, we don't support Deep Zoom Collections!", + Dzi: "Hmm, this doesn't appear to be a valid Deep Zoom Image.", + Xml: "Hmm, this doesn't appear to be a valid Deep Zoom Image.", + ImageFormat: "Sorry, we don't support {0}-based Deep Zoom Images.", + Security: "It looks like a security restriction stopped us from " + + "loading this Deep Zoom Image.", + Status: "This space unintentionally left blank ({0} {1}).", + OpenFailed: "Unable to open {0}: {1}" + }, + + Tooltips: { + FullPage: "Toggle full page", + Home: "Go home", + ZoomIn: "Zoom in", + ZoomOut: "Zoom out", + NextPage: "Next page", + PreviousPage: "Previous page", + RotateLeft: "Rotate left", + RotateRight: "Rotate right" + } +}; + +$.extend( $, /** @lends OpenSeadragon */{ + + /** + * @function + * @param {String} property + */ + getString: function( prop ) { + + var props = prop.split('.'), + string = null, + args = arguments, + container = I18N, + i; + + for ( i = 0; i < props.length-1; i++ ) { + // in case not a subproperty + container = container[ props[ i ] ] || {}; + } + string = container[ props[ i ] ]; + + if ( typeof( string ) != "string" ) { + $.console.debug( "Untranslated source string:", prop ); + string = ""; // FIXME: this breaks gettext()-style convention, which would return source + } + + return string.replace(/\{\d+\}/g, function(capture) { + var i = parseInt( capture.match( /\d+/ ), 10 ) + 1; + return i < args.length ? + args[ i ] : + ""; + }); + }, + + /** + * @function + * @param {String} property + * @param {*} value + */ + setString: function( prop, value ) { + + var props = prop.split('.'), + container = I18N, + i; + + for ( i = 0; i < props.length - 1; i++ ) { + if ( !container[ props[ i ] ] ) { + container[ props[ i ] ] = {}; + } + container = container[ props[ i ] ]; + } + + container[ props[ i ] ] = value; + } + +}); + +}( OpenSeadragon )); + +/* + * OpenSeadragon - Point + * + * Copyright (C) 2009 CodePlex Foundation + * Copyright (C) 2010-2013 OpenSeadragon contributors + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of CodePlex Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +(function( $ ){ + +/** + * @class Point + * @classdesc A Point is really used as a 2-dimensional vector, equally useful for + * representing a point on a plane, or the height and width of a plane + * not requiring any other frame of reference. + * + * @memberof OpenSeadragon + * @param {Number} [x] The vector component 'x'. Defaults to the origin at 0. + * @param {Number} [y] The vector component 'y'. Defaults to the origin at 0. + */ +$.Point = function( x, y ) { + /** + * The vector component 'x'. + * @member {Number} x + * @memberof OpenSeadragon.Point# + */ + this.x = typeof ( x ) == "number" ? x : 0; + /** + * The vector component 'y'. + * @member {Number} y + * @memberof OpenSeadragon.Point# + */ + this.y = typeof ( y ) == "number" ? y : 0; +}; + +/** @lends OpenSeadragon.Point.prototype */ +$.Point.prototype = { + /** + * @function + * @returns {OpenSeadragon.Point} a duplicate of this Point + */ + clone: function() { + return new $.Point(this.x, this.y); + }, + + /** + * Add another Point to this point and return a new Point. + * @function + * @param {OpenSeadragon.Point} point The point to add vector components. + * @returns {OpenSeadragon.Point} A new point representing the sum of the + * vector components + */ + plus: function( point ) { + return new $.Point( + this.x + point.x, + this.y + point.y + ); + }, + + /** + * Substract another Point to this point and return a new Point. + * @function + * @param {OpenSeadragon.Point} point The point to substract vector components. + * @returns {OpenSeadragon.Point} A new point representing the substraction of the + * vector components + */ + minus: function( point ) { + return new $.Point( + this.x - point.x, + this.y - point.y + ); + }, + + /** + * Multiply this point by a factor and return a new Point. + * @function + * @param {Number} factor The factor to multiply vector components. + * @returns {OpenSeadragon.Point} A new point representing the multiplication + * of the vector components by the factor + */ + times: function( factor ) { + return new $.Point( + this.x * factor, + this.y * factor + ); + }, + + /** + * Divide this point by a factor and return a new Point. + * @function + * @param {Number} factor The factor to divide vector components. + * @returns {OpenSeadragon.Point} A new point representing the division of the + * vector components by the factor + */ + divide: function( factor ) { + return new $.Point( + this.x / factor, + this.y / factor + ); + }, + + /** + * Compute the opposite of this point and return a new Point. + * @function + * @returns {OpenSeadragon.Point} A new point representing the opposite of the + * vector components + */ + negate: function() { + return new $.Point( -this.x, -this.y ); + }, + + /** + * Compute the distance between this point and another point. + * @function + * @param {OpenSeadragon.Point} point The point to compute the distance with. + * @returns {Number} The distance between the 2 points + */ + distanceTo: function( point ) { + return Math.sqrt( + Math.pow( this.x - point.x, 2 ) + + Math.pow( this.y - point.y, 2 ) + ); + }, + + /** + * Apply a function to each coordinate of this point and return a new point. + * @function + * @param {function} func The function to apply to each coordinate. + * @returns {OpenSeadragon.Point} A new point with the coordinates computed + * by the specified function + */ + apply: function( func ) { + return new $.Point( func( this.x ), func( this.y ) ); + }, + + /** + * Check if this point is equal to another one. + * @function + * @param {OpenSeadragon.Point} point The point to compare this point with. + * @returns {Boolean} true if they are equal, false otherwise. + */ + equals: function( point ) { + return ( + point instanceof $.Point + ) && ( + this.x === point.x + ) && ( + this.y === point.y + ); + }, + + /** + * Rotates the point around the specified pivot + * From http://stackoverflow.com/questions/4465931/rotate-rectangle-around-a-point + * @function + * @param {Number} degress to rotate around the pivot. + * @param {OpenSeadragon.Point} [pivot=(0,0)] Point around which to rotate. + * Defaults to the origin. + * @returns {OpenSeadragon.Point}. A new point representing the point rotated around the specified pivot + */ + rotate: function (degrees, pivot) { + pivot = pivot || new $.Point(0, 0); + var cos; + var sin; + // Avoid float computations when possible + if (degrees % 90 === 0) { + var d = degrees % 360; + if (d < 0) { + d += 360; + } + switch (d) { + case 0: + cos = 1; + sin = 0; + break; + case 90: + cos = 0; + sin = 1; + break; + case 180: + cos = -1; + sin = 0; + break; + case 270: + cos = 0; + sin = -1; + break; + } + } else { + var angle = degrees * Math.PI / 180.0; + cos = Math.cos(angle); + sin = Math.sin(angle); + } + var x = cos * (this.x - pivot.x) - sin * (this.y - pivot.y) + pivot.x; + var y = sin * (this.x - pivot.x) + cos * (this.y - pivot.y) + pivot.y; + return new $.Point(x, y); + }, + + /** + * Convert this point to a string in the format (x,y) where x and y are + * rounded to the nearest integer. + * @function + * @returns {String} A string representation of this point. + */ + toString: function() { + return "(" + (Math.round(this.x * 100) / 100) + "," + (Math.round(this.y * 100) / 100) + ")"; + } +}; + +}( OpenSeadragon )); + +/* + * OpenSeadragon - TileSource + * + * Copyright (C) 2009 CodePlex Foundation + * Copyright (C) 2010-2013 OpenSeadragon contributors + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of CodePlex Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +(function( $ ){ + + +/** + * @class TileSource + * @classdesc The TileSource contains the most basic implementation required to create a + * smooth transition between layers in an image pyramid. It has only a single key + * interface that must be implemented to complete its key functionality: + * 'getTileUrl'. It also has several optional interfaces that can be + * implemented if a new TileSource wishes to support configuration via a simple + * object or array ('configure') and if the tile source supports or requires + * configuration via retrieval of a document on the network ala AJAX or JSONP, + * ('getImageInfo'). + *
+ * By default the image pyramid is split into N layers where the image's longest + * side in M (in pixels), where N is the smallest integer which satisfies + * 2^(N+1) >= M. + * + * @memberof OpenSeadragon + * @extends OpenSeadragon.EventSource + * @param {Object} options + * You can either specify a URL, or literally define the TileSource (by specifying + * width, height, tileSize, tileOverlap, minLevel, and maxLevel). For the former, + * the extending class is expected to implement 'getImageInfo' and 'configure'. + * For the latter, the construction is assumed to occur through + * the extending classes implementation of 'configure'. + * @param {String} [options.url] + * The URL for the data necessary for this TileSource. + * @param {Function} [options.success] + * A function to be called upon successful creation. + * @param {Boolean} [options.ajaxWithCredentials] + * If this TileSource needs to make an AJAX call, this specifies whether to set + * the XHR's withCredentials (for accessing secure data). + * @param {Number} [options.width] + * Width of the source image at max resolution in pixels. + * @param {Number} [options.height] + * Height of the source image at max resolution in pixels. + * @param {Number} [options.tileSize] + * The size of the tiles to assumed to make up each pyramid layer in pixels. + * Tile size determines the point at which the image pyramid must be + * divided into a matrix of smaller images. + * Use options.tileWidth and options.tileHeight to support non-square tiles. + * @param {Number} [options.tileWidth] + * The width of the tiles to assumed to make up each pyramid layer in pixels. + * @param {Number} [options.tileHeight] + * The height of the tiles to assumed to make up each pyramid layer in pixels. + * @param {Number} [options.tileOverlap] + * The number of pixels each tile is expected to overlap touching tiles. + * @param {Number} [options.minLevel] + * The minimum level to attempt to load. + * @param {Number} [options.maxLevel] + * The maximum level to attempt to load. + */ +$.TileSource = function( width, height, tileSize, tileOverlap, minLevel, maxLevel ) { + var _this = this; + + var args = arguments, + options, + i; + + if( $.isPlainObject( width ) ){ + options = width; + }else{ + options = { + width: args[0], + height: args[1], + tileSize: args[2], + tileOverlap: args[3], + minLevel: args[4], + maxLevel: args[5] + }; + } + + //Tile sources supply some events, namely 'ready' when they must be configured + //by asynchronously fetching their configuration data. + $.EventSource.call( this ); + + //we allow options to override anything we dont treat as + //required via idiomatic options or which is functionally + //set depending on the state of the readiness of this tile + //source + $.extend( true, this, options ); + + if (!this.success) { + //Any functions that are passed as arguments are bound to the ready callback + for ( i = 0; i < arguments.length; i++ ) { + if ( $.isFunction( arguments[ i ] ) ) { + this.success = arguments[ i ]; + //only one callback per constructor + break; + } + } + } + + if (this.success) { + this.addHandler( 'ready', function ( event ) { + _this.success( event ); + } ); + } + + /** + * Ratio of width to height + * @member {Number} aspectRatio + * @memberof OpenSeadragon.TileSource# + */ + /** + * Vector storing x and y dimensions ( width and height respectively ). + * @member {OpenSeadragon.Point} dimensions + * @memberof OpenSeadragon.TileSource# + */ + /** + * The overlap in pixels each tile shares with its adjacent neighbors. + * @member {Number} tileOverlap + * @memberof OpenSeadragon.TileSource# + */ + /** + * The minimum pyramid level this tile source supports or should attempt to load. + * @member {Number} minLevel + * @memberof OpenSeadragon.TileSource# + */ + /** + * The maximum pyramid level this tile source supports or should attempt to load. + * @member {Number} maxLevel + * @memberof OpenSeadragon.TileSource# + */ + /** + * + * @member {Boolean} ready + * @memberof OpenSeadragon.TileSource# + */ + + if( 'string' == $.type( arguments[ 0 ] ) ){ + this.url = arguments[0]; + } + + if (this.url) { + //in case the getImageInfo method is overriden and/or implies an + //async mechanism set some safe defaults first + this.aspectRatio = 1; + this.dimensions = new $.Point( 10, 10 ); + this._tileWidth = 0; + this._tileHeight = 0; + this.tileOverlap = 0; + this.minLevel = 0; + this.maxLevel = 0; + this.ready = false; + //configuration via url implies the extending class + //implements and 'configure' + this.getImageInfo( this.url ); + + } else { + + //explicit configuration via positional args in constructor + //or the more idiomatic 'options' object + this.ready = true; + this.aspectRatio = ( options.width && options.height ) ? + ( options.width / options.height ) : 1; + this.dimensions = new $.Point( options.width, options.height ); + + if ( this.tileSize ){ + this._tileWidth = this._tileHeight = this.tileSize; + delete this.tileSize; + } else { + if( this.tileWidth ){ + // We were passed tileWidth in options, but we want to rename it + // with a leading underscore to make clear that it is not safe to directly modify it + this._tileWidth = this.tileWidth; + delete this.tileWidth; + } else { + this._tileWidth = 0; + } + + if( this.tileHeight ){ + // See note above about renaming this.tileWidth + this._tileHeight = this.tileHeight; + delete this.tileHeight; + } else { + this._tileHeight = 0; + } + } + + this.tileOverlap = options.tileOverlap ? options.tileOverlap : 0; + this.minLevel = options.minLevel ? options.minLevel : 0; + this.maxLevel = ( undefined !== options.maxLevel && null !== options.maxLevel ) ? + options.maxLevel : ( + ( options.width && options.height ) ? Math.ceil( + Math.log( Math.max( options.width, options.height ) ) / + Math.log( 2 ) + ) : 0 + ); + if( this.success && $.isFunction( this.success ) ){ + this.success( this ); + } + } + + +}; + +/** @lends OpenSeadragon.TileSource.prototype */ +$.TileSource.prototype = { + + getTileSize: function( level ) { + $.console.error( + "[TileSource.getTileSize] is deprecated." + + "Use TileSource.getTileWidth() and TileSource.getTileHeight() instead" + ); + return this._tileWidth; + }, + + /** + * Return the tileWidth for a given level. + * Subclasses should override this if tileWidth can be different at different levels + * such as in IIIFTileSource. Code should use this function rather than reading + * from ._tileWidth directly. + * @function + * @param {Number} level + */ + getTileWidth: function( level ) { + if (!this._tileWidth) { + return this.getTileSize(level); + } + return this._tileWidth; + }, + + /** + * Return the tileHeight for a given level. + * Subclasses should override this if tileHeight can be different at different levels + * such as in IIIFTileSource. Code should use this function rather than reading + * from ._tileHeight directly. + * @function + * @param {Number} level + */ + getTileHeight: function( level ) { + if (!this._tileHeight) { + return this.getTileSize(level); + } + return this._tileHeight; + }, + + /** + * @function + * @param {Number} level + */ + getLevelScale: function( level ) { + + // see https://github.com/openseadragon/openseadragon/issues/22 + // we use the tilesources implementation of getLevelScale to generate + // a memoized re-implementation + var levelScaleCache = {}, + i; + for( i = 0; i <= this.maxLevel; i++ ){ + levelScaleCache[ i ] = 1 / Math.pow(2, this.maxLevel - i); + } + this.getLevelScale = function( _level ){ + return levelScaleCache[ _level ]; + }; + return this.getLevelScale( level ); + }, + + /** + * @function + * @param {Number} level + */ + getNumTiles: function( level ) { + var scale = this.getLevelScale( level ), + x = Math.ceil( scale * this.dimensions.x / this.getTileWidth(level) ), + y = Math.ceil( scale * this.dimensions.y / this.getTileHeight(level) ); + + return new $.Point( x, y ); + }, + + /** + * @function + * @param {Number} level + */ + getPixelRatio: function( level ) { + var imageSizeScaled = this.dimensions.times( this.getLevelScale( level ) ), + rx = 1.0 / imageSizeScaled.x, + ry = 1.0 / imageSizeScaled.y; + + return new $.Point(rx, ry); + }, + + + /** + * @function + * @param {Number} level + */ + getClosestLevel: function( rect ) { + var i, + tilesPerSide, + tiles; + + for( i = this.minLevel; i < this.maxLevel; i++ ){ + tiles = this.getNumTiles( i ); + tilesPerSide = new $.Point( + Math.floor( rect.x / this.getTileWidth(i) ), + Math.floor( rect.y / this.getTileHeight(i) ) + ); + + if( tiles.x + 1 >= tilesPerSide.x && tiles.y + 1 >= tilesPerSide.y ){ + break; + } + } + return Math.max( 0, i - 1 ); + }, + + /** + * @function + * @param {Number} level + * @param {OpenSeadragon.Point} point + */ + getTileAtPoint: function( level, point ) { + var pixel = point.times( this.dimensions.x ).times( this.getLevelScale(level) ), + tx = Math.floor( pixel.x / this.getTileWidth(level) ), + ty = Math.floor( pixel.y / this.getTileHeight(level) ); + + return new $.Point( tx, ty ); + }, + + /** + * @function + * @param {Number} level + * @param {Number} x + * @param {Number} y + */ + getTileBounds: function( level, x, y ) { + var dimensionsScaled = this.dimensions.times( this.getLevelScale( level ) ), + tileWidth = this.getTileWidth(level), + tileHeight = this.getTileHeight(level), + px = ( x === 0 ) ? 0 : tileWidth * x - this.tileOverlap, + py = ( y === 0 ) ? 0 : tileHeight * y - this.tileOverlap, + sx = tileWidth + ( x === 0 ? 1 : 2 ) * this.tileOverlap, + sy = tileHeight + ( y === 0 ? 1 : 2 ) * this.tileOverlap, + scale = 1.0 / dimensionsScaled.x; + + sx = Math.min( sx, dimensionsScaled.x - px ); + sy = Math.min( sy, dimensionsScaled.y - py ); + + return new $.Rect( px * scale, py * scale, sx * scale, sy * scale ); + }, + + + /** + * Responsible for retrieving, and caching the + * image metadata pertinent to this TileSources implementation. + * @function + * @param {String} url + * @throws {Error} + */ + getImageInfo: function( url ) { + var _this = this, + callbackName, + callback, + readySource, + options, + urlParts, + filename, + lastDot; + + + if( url ) { + urlParts = url.split( '/' ); + filename = urlParts[ urlParts.length - 1 ]; + lastDot = filename.lastIndexOf( '.' ); + if ( lastDot > -1 ) { + urlParts[ urlParts.length - 1 ] = filename.slice( 0, lastDot ); + } + } + + callback = function( data ){ + if( typeof(data) === "string" ) { + data = $.parseXml( data ); + } + var $TileSource = $.TileSource.determineType( _this, data, url ); + if ( !$TileSource ) { + /** + * Raised when an error occurs loading a TileSource. + * + * @event open-failed + * @memberof OpenSeadragon.TileSource + * @type {object} + * @property {OpenSeadragon.TileSource} eventSource - A reference to the TileSource which raised the event. + * @property {String} message + * @property {String} source + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + _this.raiseEvent( 'open-failed', { message: "Unable to load TileSource", source: url } ); + return; + } + + options = $TileSource.prototype.configure.apply( _this, [ data, url ]); + if (options.ajaxWithCredentials === undefined) { + options.ajaxWithCredentials = _this.ajaxWithCredentials; + } + + readySource = new $TileSource( options ); + _this.ready = true; + /** + * Raised when a TileSource is opened and initialized. + * + * @event ready + * @memberof OpenSeadragon.TileSource + * @type {object} + * @property {OpenSeadragon.TileSource} eventSource - A reference to the TileSource which raised the event. + * @property {Object} tileSource + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + _this.raiseEvent( 'ready', { tileSource: readySource } ); + }; + + if( url.match(/\.js$/) ){ + //TODO: Its not very flexible to require tile sources to end jsonp + // request for info with a url that ends with '.js' but for + // now it's the only way I see to distinguish uniformly. + callbackName = url.split( '/' ).pop().replace('.js',''); + $.jsonp({ + url: url, + async: false, + callbackName: callbackName, + callback: callback + }); + } else { + // request info via xhr asynchronously. + $.makeAjaxRequest( { + url: url, + withCredentials: this.ajaxWithCredentials, + success: function( xhr ) { + var data = processResponse( xhr ); + callback( data ); + }, + error: function ( xhr, exc ) { + var msg; + + /* + IE < 10 will block XHR requests to different origins. Any property access on the request + object will raise an exception which we'll attempt to handle by formatting the original + exception rather than the second one raised when we try to access xhr.status + */ + try { + msg = "HTTP " + xhr.status + " attempting to load TileSource"; + } catch ( e ) { + var formattedExc; + if ( typeof( exc ) == "undefined" || !exc.toString ) { + formattedExc = "Unknown error"; + } else { + formattedExc = exc.toString(); + } + + msg = formattedExc + " attempting to load TileSource"; + } + + /*** + * Raised when an error occurs loading a TileSource. + * + * @event open-failed + * @memberof OpenSeadragon.TileSource + * @type {object} + * @property {OpenSeadragon.TileSource} eventSource - A reference to the TileSource which raised the event. + * @property {String} message + * @property {String} source + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + _this.raiseEvent( 'open-failed', { + message: msg, + source: url + }); + } + }); + } + + }, + + /** + * Responsible determining if a the particular TileSource supports the + * data format ( and allowed to apply logic against the url the data was + * loaded from, if any ). Overriding implementations are expected to do + * something smart with data and / or url to determine support. Also + * understand that iteration order of TileSources is not guarunteed so + * please make sure your data or url is expressive enough to ensure a simple + * and sufficient mechanisim for clear determination. + * @function + * @param {String|Object|Array|Document} data + * @param {String} url - the url the data was loaded + * from if any. + * @return {Boolean} + */ + supports: function( data, url ) { + return false; + }, + + /** + * Responsible for parsing and configuring the + * image metadata pertinent to this TileSources implementation. + * This method is not implemented by this class other than to throw an Error + * announcing you have to implement it. Because of the variety of tile + * server technologies, and various specifications for building image + * pyramids, this method is here to allow easy integration. + * @function + * @param {String|Object|Array|Document} data + * @param {String} url - the url the data was loaded + * from if any. + * @return {Object} options - A dictionary of keyword arguments sufficient + * to configure this tile sources constructor. + * @throws {Error} + */ + configure: function( data, url ) { + throw new Error( "Method not implemented." ); + }, + + /** + * Responsible for retriving the url which will return an image for the + * region specified by the given x, y, and level components. + * This method is not implemented by this class other than to throw an Error + * announcing you have to implement it. Because of the variety of tile + * server technologies, and various specifications for building image + * pyramids, this method is here to allow easy integration. + * @function + * @param {Number} level + * @param {Number} x + * @param {Number} y + * @throws {Error} + */ + getTileUrl: function( level, x, y ) { + throw new Error( "Method not implemented." ); + }, + + /** + * @function + * @param {Number} level + * @param {Number} x + * @param {Number} y + */ + tileExists: function( level, x, y ) { + var numTiles = this.getNumTiles( level ); + return level >= this.minLevel && + level <= this.maxLevel && + x >= 0 && + y >= 0 && + x < numTiles.x && + y < numTiles.y; + } +}; + + +$.extend( true, $.TileSource.prototype, $.EventSource.prototype ); + + +/** + * Decides whether to try to process the response as xml, json, or hand back + * the text + * @private + * @inner + * @function + * @param {XMLHttpRequest} xhr - the completed network request + */ +function processResponse( xhr ){ + var responseText = xhr.responseText, + status = xhr.status, + statusText, + data; + + if ( !xhr ) { + throw new Error( $.getString( "Errors.Security" ) ); + } else if ( xhr.status !== 200 && xhr.status !== 0 ) { + status = xhr.status; + statusText = ( status == 404 ) ? + "Not Found" : + xhr.statusText; + throw new Error( $.getString( "Errors.Status", status, statusText ) ); + } + + if( responseText.match(/\s*<.*/) ){ + try{ + data = ( xhr.responseXML && xhr.responseXML.documentElement ) ? + xhr.responseXML : + $.parseXml( responseText ); + } catch (e){ + data = xhr.responseText; + } + }else if( responseText.match(/\s*[\{\[].*/) ){ + data = $.parseJSON(responseText); + }else{ + data = responseText; + } + return data; +} + + +/** + * Determines the TileSource Implementation by introspection of OpenSeadragon + * namespace, calling each TileSource implementation of 'isType' + * @private + * @inner + * @function + * @param {Object|Array|Document} data - the tile source configuration object + * @param {String} url - the url where the tile source configuration object was + * loaded from, if any. + */ +$.TileSource.determineType = function( tileSource, data, url ){ + var property; + for( property in OpenSeadragon ){ + if( property.match(/.+TileSource$/) && + $.isFunction( OpenSeadragon[ property ] ) && + $.isFunction( OpenSeadragon[ property ].prototype.supports ) && + OpenSeadragon[ property ].prototype.supports.call( tileSource, data, url ) + ){ + return OpenSeadragon[ property ]; + } + } + + $.console.error( "No TileSource was able to open %s %s", url, data ); +}; + + +}( OpenSeadragon )); + +/* + * OpenSeadragon - DziTileSource + * + * Copyright (C) 2009 CodePlex Foundation + * Copyright (C) 2010-2013 OpenSeadragon contributors + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of CodePlex Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +(function( $ ){ + +/** + * @class DziTileSource + * @memberof OpenSeadragon + * @extends OpenSeadragon.TileSource + * @param {Number|Object} width - the pixel width of the image or the idiomatic + * options object which is used instead of positional arguments. + * @param {Number} height + * @param {Number} tileSize + * @param {Number} tileOverlap + * @param {String} tilesUrl + * @param {String} fileFormat + * @param {OpenSeadragon.DisplayRect[]} displayRects + * @property {String} tilesUrl + * @property {String} fileFormat + * @property {OpenSeadragon.DisplayRect[]} displayRects + */ +$.DziTileSource = function( width, height, tileSize, tileOverlap, tilesUrl, fileFormat, displayRects, minLevel, maxLevel ) { + var i, + rect, + level, + options; + + if( $.isPlainObject( width ) ){ + options = width; + }else{ + options = { + width: arguments[ 0 ], + height: arguments[ 1 ], + tileSize: arguments[ 2 ], + tileOverlap: arguments[ 3 ], + tilesUrl: arguments[ 4 ], + fileFormat: arguments[ 5 ], + displayRects: arguments[ 6 ], + minLevel: arguments[ 7 ], + maxLevel: arguments[ 8 ] + }; + } + + this._levelRects = {}; + this.tilesUrl = options.tilesUrl; + this.fileFormat = options.fileFormat; + this.displayRects = options.displayRects; + + if ( this.displayRects ) { + for ( i = this.displayRects.length - 1; i >= 0; i-- ) { + rect = this.displayRects[ i ]; + for ( level = rect.minLevel; level <= rect.maxLevel; level++ ) { + if ( !this._levelRects[ level ] ) { + this._levelRects[ level ] = []; + } + this._levelRects[ level ].push( rect ); + } + } + } + + $.TileSource.apply( this, [ options ] ); + +}; + +$.extend( $.DziTileSource.prototype, $.TileSource.prototype, /** @lends OpenSeadragon.DziTileSource.prototype */{ + + + /** + * Determine if the data and/or url imply the image service is supported by + * this tile source. + * @function + * @param {Object|Array} data + * @param {String} optional - url + */ + supports: function( data, url ){ + var ns; + if ( data.Image ) { + ns = data.Image.xmlns; + } else if ( data.documentElement) { + if ("Image" == data.documentElement.localName || "Image" == data.documentElement.tagName) { + ns = data.documentElement.namespaceURI; + } + } + + return ( "http://schemas.microsoft.com/deepzoom/2008" == ns || + "http://schemas.microsoft.com/deepzoom/2009" == ns ); + }, + + /** + * + * @function + * @param {Object|XMLDocument} data - the raw configuration + * @param {String} url - the url the data was retreived from if any. + * @return {Object} options - A dictionary of keyword arguments sufficient + * to configure this tile sources constructor. + */ + configure: function( data, url ){ + + var options; + + if( !$.isPlainObject(data) ){ + + options = configureFromXML( this, data ); + + }else{ + + options = configureFromObject( this, data ); + } + + if (url && !options.tilesUrl) { + options.tilesUrl = url.replace( + /([^\/]+?)(\.(dzi|xml|js))?\/?(\?.*)?$/, '$1_files/'); + + if (url.search(/\.(dzi|xml|js)\?/) != -1) { + options.queryParams = url.match(/\?.*/); + }else{ + options.queryParams = ''; + } + } + + return options; + }, + + + /** + * @function + * @param {Number} level + * @param {Number} x + * @param {Number} y + */ + getTileUrl: function( level, x, y ) { + return [ this.tilesUrl, level, '/', x, '_', y, '.', this.fileFormat, this.queryParams ].join( '' ); + }, + + + /** + * @function + * @param {Number} level + * @param {Number} x + * @param {Number} y + */ + tileExists: function( level, x, y ) { + var rects = this._levelRects[ level ], + rect, + scale, + xMin, + yMin, + xMax, + yMax, + i; + + if ( !rects || !rects.length ) { + return true; + } + + for ( i = rects.length - 1; i >= 0; i-- ) { + rect = rects[ i ]; + + if ( level < rect.minLevel || level > rect.maxLevel ) { + continue; + } + + scale = this.getLevelScale( level ); + xMin = rect.x * scale; + yMin = rect.y * scale; + xMax = xMin + rect.width * scale; + yMax = yMin + rect.height * scale; + + xMin = Math.floor( xMin / this.tileSize ); + yMin = Math.floor( yMin / this.tileSize ); + xMax = Math.ceil( xMax / this.tileSize ); + yMax = Math.ceil( yMax / this.tileSize ); + + if ( xMin <= x && x < xMax && yMin <= y && y < yMax ) { + return true; + } + } + + return false; + } +}); + + +/** + * @private + * @inner + * @function + */ +function configureFromXML( tileSource, xmlDoc ){ + + if ( !xmlDoc || !xmlDoc.documentElement ) { + throw new Error( $.getString( "Errors.Xml" ) ); + } + + var root = xmlDoc.documentElement, + rootName = root.localName || root.tagName, + ns = xmlDoc.documentElement.namespaceURI, + configuration = null, + displayRects = [], + dispRectNodes, + dispRectNode, + rectNode, + sizeNode, + i; + + if ( rootName == "Image" ) { + + try { + sizeNode = root.getElementsByTagName("Size" )[ 0 ]; + if (sizeNode === undefined) { + sizeNode = root.getElementsByTagNameNS(ns, "Size" )[ 0 ]; + } + + configuration = { + Image: { + xmlns: "http://schemas.microsoft.com/deepzoom/2008", + Url: root.getAttribute( "Url" ), + Format: root.getAttribute( "Format" ), + DisplayRect: null, + Overlap: parseInt( root.getAttribute( "Overlap" ), 10 ), + TileSize: parseInt( root.getAttribute( "TileSize" ), 10 ), + Size: { + Height: parseInt( sizeNode.getAttribute( "Height" ), 10 ), + Width: parseInt( sizeNode.getAttribute( "Width" ), 10 ) + } + } + }; + + if ( !$.imageFormatSupported( configuration.Image.Format ) ) { + throw new Error( + $.getString( "Errors.ImageFormat", configuration.Image.Format.toUpperCase() ) + ); + } + + dispRectNodes = root.getElementsByTagName("DisplayRect" ); + if (dispRectNodes === undefined) { + dispRectNodes = root.getElementsByTagNameNS(ns, "DisplayRect" )[ 0 ]; + } + + for ( i = 0; i < dispRectNodes.length; i++ ) { + dispRectNode = dispRectNodes[ i ]; + rectNode = dispRectNode.getElementsByTagName("Rect" )[ 0 ]; + if (rectNode === undefined) { + rectNode = dispRectNode.getElementsByTagNameNS(ns, "Rect" )[ 0 ]; + } + + displayRects.push({ + Rect: { + X: parseInt( rectNode.getAttribute( "X" ), 10 ), + Y: parseInt( rectNode.getAttribute( "Y" ), 10 ), + Width: parseInt( rectNode.getAttribute( "Width" ), 10 ), + Height: parseInt( rectNode.getAttribute( "Height" ), 10 ), + MinLevel: parseInt( dispRectNode.getAttribute( "MinLevel" ), 10 ), + MaxLevel: parseInt( dispRectNode.getAttribute( "MaxLevel" ), 10 ) + } + }); + } + + if( displayRects.length ){ + configuration.Image.DisplayRect = displayRects; + } + + return configureFromObject( tileSource, configuration ); + + } catch ( e ) { + throw (e instanceof Error) ? + e : + new Error( $.getString("Errors.Dzi") ); + } + } else if ( rootName == "Collection" ) { + throw new Error( $.getString( "Errors.Dzc" ) ); + } else if ( rootName == "Error" ) { + var messageNode = root.getElementsByTagName("Message")[0]; + var message = messageNode.firstChild.nodeValue; + throw new Error(message); + } + + throw new Error( $.getString( "Errors.Dzi" ) ); +} + +/** + * @private + * @inner + * @function + */ +function configureFromObject( tileSource, configuration ){ + var imageData = configuration.Image, + tilesUrl = imageData.Url, + fileFormat = imageData.Format, + sizeData = imageData.Size, + dispRectData = imageData.DisplayRect || [], + width = parseInt( sizeData.Width, 10 ), + height = parseInt( sizeData.Height, 10 ), + tileSize = parseInt( imageData.TileSize, 10 ), + tileOverlap = parseInt( imageData.Overlap, 10 ), + displayRects = [], + rectData, + i; + + //TODO: need to figure out out to better handle image format compatibility + // which actually includes additional file formats like xml and pdf + // and plain text for various tilesource implementations to avoid low + // level errors. + // + // For now, just don't perform the check. + // + /*if ( !imageFormatSupported( fileFormat ) ) { + throw new Error( + $.getString( "Errors.ImageFormat", fileFormat.toUpperCase() ) + ); + }*/ + + for ( i = 0; i < dispRectData.length; i++ ) { + rectData = dispRectData[ i ].Rect; + + displayRects.push( new $.DisplayRect( + parseInt( rectData.X, 10 ), + parseInt( rectData.Y, 10 ), + parseInt( rectData.Width, 10 ), + parseInt( rectData.Height, 10 ), + parseInt( rectData.MinLevel, 10 ), + parseInt( rectData.MaxLevel, 10 ) + )); + } + + return $.extend(true, { + width: width, /* width *required */ + height: height, /* height *required */ + tileSize: tileSize, /* tileSize *required */ + tileOverlap: tileOverlap, /* tileOverlap *required */ + minLevel: null, /* minLevel */ + maxLevel: null, /* maxLevel */ + tilesUrl: tilesUrl, /* tilesUrl */ + fileFormat: fileFormat, /* fileFormat */ + displayRects: displayRects /* displayRects */ + }, configuration ); + +} + +}( OpenSeadragon )); + +/* + * OpenSeadragon - IIIFTileSource + * + * Copyright (C) 2009 CodePlex Foundation + * Copyright (C) 2010-2013 OpenSeadragon contributors + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of CodePlex Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +(function( $ ){ + +/** + * @class IIIFTileSource + * @classdesc A client implementation of the International Image Interoperability Framework + * Format: Image API 1.0 - 2.1 + * + * @memberof OpenSeadragon + * @extends OpenSeadragon.TileSource + * @see http://iiif.io/api/image/ + */ +$.IIIFTileSource = function( options ){ + + + $.extend( true, this, options ); + + if ( !( this.height && this.width && this['@id'] ) ) { + throw new Error( 'IIIF required parameters not provided.' ); + } + + options.tileSizePerScaleFactor = {}; + + // N.B. 2.0 renamed scale_factors to scaleFactors + if ( this.tile_width && this.tile_height ) { + options.tileWidth = this.tile_width; + options.tileHeight = this.tile_height; + } else if ( this.tile_width ) { + options.tileSize = this.tile_width; + } else if ( this.tile_height ) { + options.tileSize = this.tile_height; + } else if ( this.tiles ) { + // Version 2.0 forwards + if ( this.tiles.length == 1 ) { + options.tileWidth = this.tiles[0].width; + // Use height if provided, otherwise assume square tiles and use width. + options.tileHeight = this.tiles[0].height || this.tiles[0].width; + this.scale_factors = this.tiles[0].scaleFactors; + } else { + // Multiple tile sizes at different levels + this.scale_factors = []; + for (var t = 0; t < this.tiles.length; t++ ) { + for (var sf = 0; sf < this.tiles[t].scaleFactors.length; sf++) { + var scaleFactor = this.tiles[t].scaleFactors[sf]; + this.scale_factors.push(scaleFactor); + options.tileSizePerScaleFactor[scaleFactor] = { + width: this.tiles[t].width, + height: this.tiles[t].height || this.tiles[t].width + }; + } + } + } + } else if ( canBeTiled(options.profile) ) { + // use the largest of tileOptions that is smaller than the short dimension + var shortDim = Math.min( this.height, this.width ), + tileOptions = [256,512,1024], + smallerTiles = []; + + for ( var c = 0; c < tileOptions.length; c++ ) { + if ( tileOptions[c] <= shortDim ) { + smallerTiles.push( tileOptions[c] ); + } + } + + if ( smallerTiles.length > 0 ) { + options.tileSize = Math.max.apply( null, smallerTiles ); + } else { + // If we're smaller than 256, just use the short side. + options.tileSize = shortDim; + } + } else if (this.sizes && this.sizes.length > 0) { + // This info.json can't be tiled, but we can still construct a legacy pyramid from the sizes array. + // In this mode, IIIFTileSource will call functions from the abstract baseTileSource or the + // LegacyTileSource instead of performing IIIF tiling. + this.emulateLegacyImagePyramid = true; + + options.levels = constructLevels( this ); + // use the largest available size to define tiles + $.extend( true, options, { + width: options.levels[ options.levels.length - 1 ].width, + height: options.levels[ options.levels.length - 1 ].height, + tileSize: Math.max( options.height, options.width ), + tileOverlap: 0, + minLevel: 0, + maxLevel: options.levels.length - 1 + }); + this.levels = options.levels; + } else { + $.console.error("Nothing in the info.json to construct image pyramids from"); + } + + if (!options.maxLevel && !this.emulateLegacyImagePyramid) { + if (!this.scale_factors) { + options.maxLevel = Number(Math.ceil(Math.log(Math.max(this.width, this.height), 2))); + } else { + options.maxLevel = Math.floor(Math.pow(Math.max.apply(null, this.scale_factors), 0.5)); + } + } + + $.TileSource.apply( this, [ options ] ); +}; + +$.extend( $.IIIFTileSource.prototype, $.TileSource.prototype, /** @lends OpenSeadragon.IIIFTileSource.prototype */{ + /** + * Determine if the data and/or url imply the image service is supported by + * this tile source. + * @function + * @param {Object|Array} data + * @param {String} optional - url + */ + + supports: function( data, url ) { + // Version 2.0 and forwards + if (data.protocol && data.protocol == 'http://iiif.io/api/image') { + return true; + // Version 1.1 + } else if ( data['@context'] && ( + data['@context'] == "http://library.stanford.edu/iiif/image-api/1.1/context.json" || + data['@context'] == "http://iiif.io/api/image/1/context.json") ) { + // N.B. the iiif.io context is wrong, but where the representation lives so likely to be used + return true; + + // Version 1.0 + } else if ( data.profile && + data.profile.indexOf("http://library.stanford.edu/iiif/image-api/compliance.html") === 0) { + return true; + } else if ( data.identifier && data.width && data.height ) { + return true; + } else if ( data.documentElement && + "info" == data.documentElement.tagName && + "http://library.stanford.edu/iiif/image-api/ns/" == + data.documentElement.namespaceURI) { + return true; + + // Not IIIF + } else { + return false; + } + }, + + /** + * + * @function + * @param {Object} data - the raw configuration + * @example IIIF 1.1 Info Looks like this + * { + * "@context" : "http://library.stanford.edu/iiif/image-api/1.1/context.json", + * "@id" : "http://iiif.example.com/prefix/1E34750D-38DB-4825-A38A-B60A345E591C", + * "width" : 6000, + * "height" : 4000, + * "scale_factors" : [ 1, 2, 4 ], + * "tile_width" : 1024, + * "tile_height" : 1024, + * "formats" : [ "jpg", "png" ], + * "qualities" : [ "native", "grey" ], + * "profile" : "http://library.stanford.edu/iiif/image-api/1.1/compliance.html#level0" + * } + */ + configure: function( data, url ){ + // Try to deduce our version and fake it upwards if needed + if ( !$.isPlainObject(data) ) { + var options = configureFromXml10( data ); + options['@context'] = "http://iiif.io/api/image/1.0/context.json"; + options['@id'] = url.replace('/info.xml', ''); + return options; + } else if ( !data['@context'] ) { + data['@context'] = 'http://iiif.io/api/image/1.0/context.json'; + data['@id'] = url.replace('/info.json', ''); + return data; + } else { + return data; + } + }, + + /** + * Return the tileWidth for the given level. + * @function + * @param {Number} level + */ + getTileWidth: function( level ) { + + if(this.emulateLegacyImagePyramid) { + return $.TileSource.prototype.getTileWidth.call(this, level); + } + + var scaleFactor = Math.pow(2, this.maxLevel - level); + + if (this.tileSizePerScaleFactor && this.tileSizePerScaleFactor[scaleFactor]) { + return this.tileSizePerScaleFactor[scaleFactor].width; + } + return this._tileWidth; + }, + + /** + * Return the tileHeight for the given level. + * @function + * @param {Number} level + */ + getTileHeight: function( level ) { + + if(this.emulateLegacyImagePyramid) { + return $.TileSource.prototype.getTileHeight.call(this, level); + } + + var scaleFactor = Math.pow(2, this.maxLevel - level); + + if (this.tileSizePerScaleFactor && this.tileSizePerScaleFactor[scaleFactor]) { + return this.tileSizePerScaleFactor[scaleFactor].height; + } + return this._tileHeight; + }, + + /** + * @function + * @param {Number} level + */ + getLevelScale: function ( level ) { + + if(this.emulateLegacyImagePyramid) { + var levelScale = NaN; + if (this.levels.length > 0 && level >= this.minLevel && level <= this.maxLevel) { + levelScale = + this.levels[level].width / + this.levels[this.maxLevel].width; + } + return levelScale; + } + + return $.TileSource.prototype.getLevelScale.call(this, level); + }, + + /** + * @function + * @param {Number} level + */ + getNumTiles: function( level ) { + + if(this.emulateLegacyImagePyramid) { + var scale = this.getLevelScale(level); + if (scale) { + return new $.Point(1, 1); + } else { + return new $.Point(0, 0); + } + } + + return $.TileSource.prototype.getNumTiles.call(this, level); + }, + + + /** + * @function + * @param {Number} level + * @param {OpenSeadragon.Point} point + */ + getTileAtPoint: function( level, point ) { + + if(this.emulateLegacyImagePyramid) { + return new $.Point(0, 0); + } + + return $.TileSource.prototype.getTileAtPoint.call(this, level, point); + }, + + + /** + * Responsible for retrieving the url which will return an image for the + * region specified by the given x, y, and level components. + * @function + * @param {Number} level - z index + * @param {Number} x + * @param {Number} y + * @throws {Error} + */ + getTileUrl: function( level, x, y ){ + + if(this.emulateLegacyImagePyramid) { + var url = null; + if ( this.levels.length > 0 && level >= this.minLevel && level <= this.maxLevel ) { + url = this.levels[ level ].url; + } + return url; + } + + //# constants + var IIIF_ROTATION = '0', + //## get the scale (level as a decimal) + scale = Math.pow( 0.5, this.maxLevel - level ), + + //# image dimensions at this level + levelWidth = Math.ceil( this.width * scale ), + levelHeight = Math.ceil( this.height * scale ), + + //## iiif region + tileWidth, + tileHeight, + iiifTileSizeWidth, + iiifTileSizeHeight, + iiifRegion, + iiifTileX, + iiifTileY, + iiifTileW, + iiifTileH, + iiifSize, + iiifQuality, + uri; + + tileWidth = this.getTileWidth(level); + tileHeight = this.getTileHeight(level); + iiifTileSizeWidth = Math.ceil( tileWidth / scale ); + iiifTileSizeHeight = Math.ceil( tileHeight / scale ); + + if ( this['@context'].indexOf('/1.0/context.json') > -1 || + this['@context'].indexOf('/1.1/context.json') > -1 || + this['@context'].indexOf('/1/context.json') > -1 ) { + iiifQuality = "native.jpg"; + } else { + iiifQuality = "default.jpg"; + } + + if ( levelWidth < tileWidth && levelHeight < tileHeight ){ + iiifSize = levelWidth + ","; + iiifRegion = 'full'; + } else { + iiifTileX = x * iiifTileSizeWidth; + iiifTileY = y * iiifTileSizeHeight; + iiifTileW = Math.min( iiifTileSizeWidth, this.width - iiifTileX ); + iiifTileH = Math.min( iiifTileSizeHeight, this.height - iiifTileY ); + iiifSize = Math.ceil( iiifTileW * scale ) + ","; + iiifRegion = [ iiifTileX, iiifTileY, iiifTileW, iiifTileH ].join( ',' ); + } + uri = [ this['@id'], iiifRegion, iiifSize, IIIF_ROTATION, iiifQuality ].join( '/' ); + + return uri; + } + + }); + + /** + * Determine whether arbitrary tile requests can be made against a service with the given profile + * @function + * @param {object} profile - IIIF profile object + * @throws {Error} + */ + function canBeTiled (profile ) { + var level0Profiles = [ + "http://library.stanford.edu/iiif/image-api/compliance.html#level0", + "http://library.stanford.edu/iiif/image-api/1.1/compliance.html#level0", + "http://iiif.io/api/image/2/level0.json" + ]; + var isLevel0 = (level0Profiles.indexOf(profile[0]) != -1); + return !isLevel0 || (profile.indexOf("sizeByW") != -1); + } + + /** + * Build the legacy pyramid URLs (one tile per level) + * @function + * @param {object} options - infoJson + * @throws {Error} + */ + function constructLevels(options) { + var levels = []; + for(var i=0; i. Rainer Simon has contributed + * the included code to the OpenSeadragon project under the New BSD license; + * see . + */ + + +(function( $ ){ + +/** + * @class OsmTileSource + * @classdesc A tilesource implementation for OpenStreetMap.

+ * + * Note 1. Zoomlevels. Deep Zoom and OSM define zoom levels differently. In Deep + * Zoom, level 0 equals an image of 1x1 pixels. In OSM, level 0 equals an image of + * 256x256 levels (see http://gasi.ch/blog/inside-deep-zoom-2). I.e. there is a + * difference of log2(256)=8 levels.

+ * + * Note 2. Image dimension. According to the OSM Wiki + * (http://wiki.openstreetmap.org/wiki/Slippy_map_tilenames#Zoom_levels) + * the highest Mapnik zoom level has 256.144x256.144 tiles, with a 256x256 + * pixel size. I.e. the Deep Zoom image dimension is 65.572.864x65.572.864 + * pixels. + * + * @memberof OpenSeadragon + * @extends OpenSeadragon.TileSource + * @param {Number|Object} width - the pixel width of the image or the idiomatic + * options object which is used instead of positional arguments. + * @param {Number} height + * @param {Number} tileSize + * @param {Number} tileOverlap + * @param {String} tilesUrl + */ +$.OsmTileSource = function( width, height, tileSize, tileOverlap, tilesUrl ) { + var options; + + if( $.isPlainObject( width ) ){ + options = width; + }else{ + options = { + width: arguments[0], + height: arguments[1], + tileSize: arguments[2], + tileOverlap: arguments[3], + tilesUrl: arguments[4] + }; + } + //apply default setting for standard public OpenStreatMaps service + //but allow them to be specified so fliks can host there own instance + //or apply against other services supportting the same standard + if( !options.width || !options.height ){ + options.width = 65572864; + options.height = 65572864; + } + if( !options.tileSize ){ + options.tileSize = 256; + options.tileOverlap = 0; + } + if( !options.tilesUrl ){ + options.tilesUrl = "http://tile.openstreetmap.org/"; + } + options.minLevel = 8; + + $.TileSource.apply( this, [ options ] ); + +}; + +$.extend( $.OsmTileSource.prototype, $.TileSource.prototype, /** @lends OpenSeadragon.OsmTileSource.prototype */{ + + + /** + * Determine if the data and/or url imply the image service is supported by + * this tile source. + * @function + * @param {Object|Array} data + * @param {String} optional - url + */ + supports: function( data, url ){ + return ( + data.type && + "openstreetmaps" == data.type + ); + }, + + /** + * + * @function + * @param {Object} data - the raw configuration + * @param {String} url - the url the data was retreived from if any. + * @return {Object} options - A dictionary of keyword arguments sufficient + * to configure this tile sources constructor. + */ + configure: function( data, url ){ + return data; + }, + + + /** + * @function + * @param {Number} level + * @param {Number} x + * @param {Number} y + */ + getTileUrl: function( level, x, y ) { + return this.tilesUrl + (level - 8) + "/" + x + "/" + y + ".png"; + } +}); + + +}( OpenSeadragon )); + +/* + * OpenSeadragon - TmsTileSource + * + * Copyright (C) 2009 CodePlex Foundation + * Copyright (C) 2010-2013 OpenSeadragon contributors + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of CodePlex Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * Derived from the TMS tile source in Rainer Simon's seajax-utils project + * . Rainer Simon has contributed + * the included code to the OpenSeadragon project under the New BSD license; + * see . + */ + + +(function( $ ){ + +/** + * @class TmsTileSource + * @classdesc A tilesource implementation for Tiled Map Services (TMS). + * TMS tile scheme ( [ as supported by OpenLayers ] is described here + * ( http://openlayers.org/dev/examples/tms.html ). + * + * @memberof OpenSeadragon + * @extends OpenSeadragon.TileSource + * @param {Number|Object} width - the pixel width of the image or the idiomatic + * options object which is used instead of positional arguments. + * @param {Number} height + * @param {Number} tileSize + * @param {Number} tileOverlap + * @param {String} tilesUrl + */ +$.TmsTileSource = function( width, height, tileSize, tileOverlap, tilesUrl ) { + var options; + + if( $.isPlainObject( width ) ){ + options = width; + }else{ + options = { + width: arguments[0], + height: arguments[1], + tileSize: arguments[2], + tileOverlap: arguments[3], + tilesUrl: arguments[4] + }; + } + // TMS has integer multiples of 256 for width/height and adds buffer + // if necessary -> account for this! + var bufferedWidth = Math.ceil(options.width / 256) * 256, + bufferedHeight = Math.ceil(options.height / 256) * 256, + max; + + // Compute number of zoomlevels in this tileset + if (bufferedWidth > bufferedHeight) { + max = bufferedWidth / 256; + } else { + max = bufferedHeight / 256; + } + options.maxLevel = Math.ceil(Math.log(max)/Math.log(2)) - 1; + options.tileSize = 256; + options.width = bufferedWidth; + options.height = bufferedHeight; + + $.TileSource.apply( this, [ options ] ); + +}; + +$.extend( $.TmsTileSource.prototype, $.TileSource.prototype, /** @lends OpenSeadragon.TmsTileSource.prototype */{ + + + /** + * Determine if the data and/or url imply the image service is supported by + * this tile source. + * @function + * @param {Object|Array} data + * @param {String} optional - url + */ + supports: function( data, url ){ + return ( data.type && "tiledmapservice" == data.type ); + }, + + /** + * + * @function + * @param {Object} data - the raw configuration + * @param {String} url - the url the data was retreived from if any. + * @return {Object} options - A dictionary of keyword arguments sufficient + * to configure this tile sources constructor. + */ + configure: function( data, url ){ + return data; + }, + + + /** + * @function + * @param {Number} level + * @param {Number} x + * @param {Number} y + */ + getTileUrl: function( level, x, y ) { + // Convert from Deep Zoom definition to TMS zoom definition + var yTiles = this.getNumTiles( level ).y - 1; + + return this.tilesUrl + level + "/" + x + "/" + (yTiles - y) + ".png"; + } +}); + + +}( OpenSeadragon )); + +/* + * OpenSeadragon - LegacyTileSource + * + * Copyright (C) 2009 CodePlex Foundation + * Copyright (C) 2010-2013 OpenSeadragon contributors + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of CodePlex Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +(function( $ ){ + +/** + * @class LegacyTileSource + * @classdesc The LegacyTileSource allows simple, traditional image pyramids to be loaded + * into an OpenSeadragon Viewer. Basically, this translates to the historically + * common practice of starting with a 'master' image, maybe a tiff for example, + * and generating a set of 'service' images like one or more thumbnails, a medium + * resolution image and a high resolution image in standard web formats like + * png or jpg. + * + * @memberof OpenSeadragon + * @extends OpenSeadragon.TileSource + * @param {Array} levels An array of file descriptions, each is an object with + * a 'url', a 'width', and a 'height'. Overriding classes can expect more + * properties but these properties are sufficient for this implementation. + * Additionally, the levels are required to be listed in order from + * smallest to largest. + * @property {Number} aspectRatio + * @property {Number} dimensions + * @property {Number} tileSize + * @property {Number} tileOverlap + * @property {Number} minLevel + * @property {Number} maxLevel + * @property {Array} levels + */ +$.LegacyTileSource = function( levels ) { + + var options, + width, + height; + + if( $.isArray( levels ) ){ + options = { + type: 'legacy-image-pyramid', + levels: levels + }; + } + + //clean up the levels to make sure we support all formats + options.levels = filterFiles( options.levels ); + + if ( options.levels.length > 0 ) { + width = options.levels[ options.levels.length - 1 ].width; + height = options.levels[ options.levels.length - 1 ].height; + } + else { + width = 0; + height = 0; + $.console.error( "No supported image formats found" ); + } + + $.extend( true, options, { + width: width, + height: height, + tileSize: Math.max( height, width ), + tileOverlap: 0, + minLevel: 0, + maxLevel: options.levels.length > 0 ? options.levels.length - 1 : 0 + } ); + + $.TileSource.apply( this, [ options ] ); + + this.levels = options.levels; +}; + +$.extend( $.LegacyTileSource.prototype, $.TileSource.prototype, /** @lends OpenSeadragon.LegacyTileSource.prototype */{ + /** + * Determine if the data and/or url imply the image service is supported by + * this tile source. + * @function + * @param {Object|Array} data + * @param {String} optional - url + */ + supports: function( data, url ){ + return ( + data.type && + "legacy-image-pyramid" == data.type + ) || ( + data.documentElement && + "legacy-image-pyramid" == data.documentElement.getAttribute('type') + ); + }, + + + /** + * + * @function + * @param {Object|XMLDocument} configuration - the raw configuration + * @param {String} dataUrl - the url the data was retreived from if any. + * @return {Object} options - A dictionary of keyword arguments sufficient + * to configure this tile sources constructor. + */ + configure: function( configuration, dataUrl ){ + + var options; + + if( !$.isPlainObject(configuration) ){ + + options = configureFromXML( this, configuration ); + + }else{ + + options = configureFromObject( this, configuration ); + } + + return options; + + }, + + /** + * @function + * @param {Number} level + */ + getLevelScale: function ( level ) { + var levelScale = NaN; + if ( this.levels.length > 0 && level >= this.minLevel && level <= this.maxLevel ) { + levelScale = + this.levels[ level ].width / + this.levels[ this.maxLevel ].width; + } + return levelScale; + }, + + /** + * @function + * @param {Number} level + */ + getNumTiles: function( level ) { + var scale = this.getLevelScale( level ); + if ( scale ){ + return new $.Point( 1, 1 ); + } else { + return new $.Point( 0, 0 ); + } + }, + + /** + * @function + * @param {Number} level + * @param {OpenSeadragon.Point} point + */ + getTileAtPoint: function( level, point ) { + return new $.Point( 0, 0 ); + }, + + + /** + * This method is not implemented by this class other than to throw an Error + * announcing you have to implement it. Because of the variety of tile + * server technologies, and various specifications for building image + * pyramids, this method is here to allow easy integration. + * @function + * @param {Number} level + * @param {Number} x + * @param {Number} y + * @throws {Error} + */ + getTileUrl: function ( level, x, y ) { + var url = null; + if ( this.levels.length > 0 && level >= this.minLevel && level <= this.maxLevel ) { + url = this.levels[ level ].url; + } + return url; + } +} ); + +/** + * This method removes any files from the Array which dont conform to our + * basic requirements for a 'level' in the LegacyTileSource. + * @private + * @inner + * @function + */ +function filterFiles( files ){ + var filtered = [], + file, + i; + for( i = 0; i < files.length; i++ ){ + file = files[ i ]; + if( file.height && + file.width && + file.url && ( + file.url.toLowerCase().match(/^.*\.(png|jpg|jpeg|gif)(?:\?.*)?$/) || ( + file.mimetype && + file.mimetype.toLowerCase().match(/^.*\/(png|jpg|jpeg|gif)$/) + ) + ) ){ + //This is sufficient to serve as a level + filtered.push({ + url: file.url, + width: Number( file.width ), + height: Number( file.height ) + }); + } + else { + $.console.error( 'Unsupported image format: %s', file.url ? file.url : '' ); + } + } + + return filtered.sort(function(a,b){ + return a.height - b.height; + }); + +} + +/** + * @private + * @inner + * @function + */ +function configureFromXML( tileSource, xmlDoc ){ + + if ( !xmlDoc || !xmlDoc.documentElement ) { + throw new Error( $.getString( "Errors.Xml" ) ); + } + + var root = xmlDoc.documentElement, + rootName = root.tagName, + conf = null, + levels = [], + level, + i; + + if ( rootName == "image" ) { + + try { + conf = { + type: root.getAttribute( "type" ), + levels: [] + }; + + levels = root.getElementsByTagName( "level" ); + for ( i = 0; i < levels.length; i++ ) { + level = levels[ i ]; + + conf.levels .push({ + url: level.getAttribute( "url" ), + width: parseInt( level.getAttribute( "width" ), 10 ), + height: parseInt( level.getAttribute( "height" ), 10 ) + }); + } + + return configureFromObject( tileSource, conf ); + + } catch ( e ) { + throw (e instanceof Error) ? + e : + new Error( 'Unknown error parsing Legacy Image Pyramid XML.' ); + } + } else if ( rootName == "collection" ) { + throw new Error( 'Legacy Image Pyramid Collections not yet supported.' ); + } else if ( rootName == "error" ) { + throw new Error( 'Error: ' + xmlDoc ); + } + + throw new Error( 'Unknown element ' + rootName ); +} + +/** + * @private + * @inner + * @function + */ +function configureFromObject( tileSource, configuration ){ + + return configuration.levels; + +} + +}( OpenSeadragon )); + +/* + * OpenSeadragon - ImageTileSource + * + * Copyright (C) 2009 CodePlex Foundation + * Copyright (C) 2010-2013 OpenSeadragon contributors + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of CodePlex Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +(function ($) { + + /** + * @class ImageTileSource + * @classdesc The ImageTileSource allows a simple image to be loaded + * into an OpenSeadragon Viewer. + * There are 2 ways to open an ImageTileSource: + * 1. viewer.open({type: 'image', url: fooUrl}); + * 2. viewer.open(new OpenSeadragon.ImageTileSource({url: fooUrl})); + * + * With the first syntax, the crossOriginPolicy, ajaxWithCredentials and + * useCanvas options are inherited from the viewer if they are not + * specified directly in the options object. + * + * @memberof OpenSeadragon + * @extends OpenSeadragon.TileSource + * @param {Object} options Options object. + * @param {String} options.url URL of the image + * @param {Boolean} [options.buildPyramid=true] If set to true (default), a + * pyramid will be built internally to provide a better downsampling. + * @param {String|Boolean} [options.crossOriginPolicy=false] Valid values are + * 'Anonymous', 'use-credentials', and false. If false, image requests will + * not use CORS preventing internal pyramid building for images from other + * domains. + * @param {String|Boolean} [options.ajaxWithCredentials=false] Whether to set + * the withCredentials XHR flag for AJAX requests (when loading tile sources). + * @param {Boolean} [options.useCanvas=true] Set to false to prevent any use + * of the canvas API. + */ + $.ImageTileSource = function (options) { + + options = $.extend({ + buildPyramid: true, + crossOriginPolicy: false, + ajaxWithCredentials: false, + useCanvas: true + }, options); + $.TileSource.apply(this, [options]); + + }; + + $.extend($.ImageTileSource.prototype, $.TileSource.prototype, /** @lends OpenSeadragon.ImageTileSource.prototype */{ + /** + * Determine if the data and/or url imply the image service is supported by + * this tile source. + * @function + * @param {Object|Array} data + * @param {String} optional - url + */ + supports: function (data, url) { + return data.type && data.type === "image"; + }, + /** + * + * @function + * @param {Object} options - the options + * @param {String} dataUrl - the url the image was retreived from, if any. + * @return {Object} options - A dictionary of keyword arguments sufficient + * to configure this tile sources constructor. + */ + configure: function (options, dataUrl) { + return options; + }, + /** + * Responsible for retrieving, and caching the + * image metadata pertinent to this TileSources implementation. + * @function + * @param {String} url + * @throws {Error} + */ + getImageInfo: function (url) { + var image = this._image = new Image(); + var _this = this; + + if (this.crossOriginPolicy) { + image.crossOrigin = this.crossOriginPolicy; + } + if (this.ajaxWithCredentials) { + image.useCredentials = this.ajaxWithCredentials; + } + + $.addEvent(image, 'load', function () { + _this.width = image.naturalWidth; + _this.height = image.naturalHeight; + _this.aspectRatio = _this.width / _this.height; + _this.dimensions = new $.Point(_this.width, _this.height); + _this._tileWidth = _this.width; + _this._tileHeight = _this.height; + _this.tileOverlap = 0; + _this.minLevel = 0; + _this.levels = _this._buildLevels(); + _this.maxLevel = _this.levels.length - 1; + + _this.ready = true; + + // Note: this event is documented elsewhere, in TileSource + _this.raiseEvent('ready', {tileSource: _this}); + }); + + $.addEvent(image, 'error', function () { + // Note: this event is documented elsewhere, in TileSource + _this.raiseEvent('open-failed', { + message: "Error loading image at " + url, + source: url + }); + }); + + image.src = url; + }, + /** + * @function + * @param {Number} level + */ + getLevelScale: function (level) { + var levelScale = NaN; + if (level >= this.minLevel && level <= this.maxLevel) { + levelScale = + this.levels[level].width / + this.levels[this.maxLevel].width; + } + return levelScale; + }, + /** + * @function + * @param {Number} level + */ + getNumTiles: function (level) { + var scale = this.getLevelScale(level); + if (scale) { + return new $.Point(1, 1); + } else { + return new $.Point(0, 0); + } + }, + /** + * @function + * @param {Number} level + * @param {OpenSeadragon.Point} point + */ + getTileAtPoint: function (level, point) { + return new $.Point(0, 0); + }, + /** + * Retrieves a tile url + * @function + * @param {Number} level Level of the tile + * @param {Number} x x coordinate of the tile + * @param {Number} y y coordinate of the tile + */ + getTileUrl: function (level, x, y) { + var url = null; + if (level >= this.minLevel && level <= this.maxLevel) { + url = this.levels[level].url; + } + return url; + }, + /** + * Retrieves a tile context 2D + * @function + * @param {Number} level Level of the tile + * @param {Number} x x coordinate of the tile + * @param {Number} y y coordinate of the tile + */ + getContext2D: function (level, x, y) { + var context = null; + if (level >= this.minLevel && level <= this.maxLevel) { + context = this.levels[level].context2D; + } + return context; + }, + + // private + // + // Builds the differents levels of the pyramid if possible + // (i.e. if canvas API enabled and no canvas tainting issue). + _buildLevels: function () { + var levels = [{ + url: this._image.src, + width: this._image.naturalWidth, + height: this._image.naturalHeight + }]; + + if (!this.buildPyramid || !$.supportsCanvas || !this.useCanvas) { + // We don't need the image anymore. Allows it to be GC. + delete this._image; + return levels; + } + + var currentWidth = this._image.naturalWidth; + var currentHeight = this._image.naturalHeight; + + var bigCanvas = document.createElement("canvas"); + var bigContext = bigCanvas.getContext("2d"); + + bigCanvas.width = currentWidth; + bigCanvas.height = currentHeight; + bigContext.drawImage(this._image, 0, 0, currentWidth, currentHeight); + // We cache the context of the highest level because the browser + // is a lot faster at downsampling something it already has + // downsampled before. + levels[0].context2D = bigContext; + // We don't need the image anymore. Allows it to be GC. + delete this._image; + + if ($.isCanvasTainted(bigCanvas)) { + // If the canvas is tainted, we can't compute the pyramid. + return levels; + } + + // We build smaller levels until either width or height becomes + // 1 pixel wide. + while (currentWidth >= 2 && currentHeight >= 2) { + currentWidth = Math.floor(currentWidth / 2); + currentHeight = Math.floor(currentHeight / 2); + var smallCanvas = document.createElement("canvas"); + var smallContext = smallCanvas.getContext("2d"); + smallCanvas.width = currentWidth; + smallCanvas.height = currentHeight; + smallContext.drawImage(bigCanvas, 0, 0, currentWidth, currentHeight); + + levels.splice(0, 0, { + context2D: smallContext, + width: currentWidth, + height: currentHeight + }); + + bigCanvas = smallCanvas; + bigContext = smallContext; + } + return levels; + } + }); + +}(OpenSeadragon)); + +/* + * OpenSeadragon - TileSourceCollection + * + * Copyright (C) 2009 CodePlex Foundation + * Copyright (C) 2010-2013 OpenSeadragon contributors + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of CodePlex Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +(function( $ ){ + +// deprecated +$.TileSourceCollection = function( tileSize, tileSources, rows, layout ) { + $.console.error('TileSourceCollection is deprecated; use World instead'); +}; + +}( OpenSeadragon )); + +/* + * OpenSeadragon - Button + * + * Copyright (C) 2009 CodePlex Foundation + * Copyright (C) 2010-2013 OpenSeadragon contributors + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of CodePlex Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +(function( $ ){ + +/** + * An enumeration of button states + * @member ButtonState + * @memberof OpenSeadragon + * @static + * @type {Object} + * @property {Number} REST + * @property {Number} GROUP + * @property {Number} HOVER + * @property {Number} DOWN + */ +$.ButtonState = { + REST: 0, + GROUP: 1, + HOVER: 2, + DOWN: 3 +}; + +/** + * @class Button + * @classdesc Manages events, hover states for individual buttons, tool-tips, as well + * as fading the buttons out when the user has not interacted with them + * for a specified period. + * + * @memberof OpenSeadragon + * @extends OpenSeadragon.EventSource + * @param {Object} options + * @param {Element} [options.element=null] Element to use as the button. If not specified, an HTML <button> element is created. + * @param {String} [options.tooltip=null] Provides context help for the button when the + * user hovers over it. + * @param {String} [options.srcRest=null] URL of image to use in 'rest' state. + * @param {String} [options.srcGroup=null] URL of image to use in 'up' state. + * @param {String} [options.srcHover=null] URL of image to use in 'hover' state. + * @param {String} [options.srcDown=null] URL of image to use in 'down' state. + * @param {Number} [options.fadeDelay=0] How long to wait before fading. + * @param {Number} [options.fadeLength=2000] How long should it take to fade the button. + * @param {OpenSeadragon.EventHandler} [options.onPress=null] Event handler callback for {@link OpenSeadragon.Button.event:press}. + * @param {OpenSeadragon.EventHandler} [options.onRelease=null] Event handler callback for {@link OpenSeadragon.Button.event:release}. + * @param {OpenSeadragon.EventHandler} [options.onClick=null] Event handler callback for {@link OpenSeadragon.Button.event:click}. + * @param {OpenSeadragon.EventHandler} [options.onEnter=null] Event handler callback for {@link OpenSeadragon.Button.event:enter}. + * @param {OpenSeadragon.EventHandler} [options.onExit=null] Event handler callback for {@link OpenSeadragon.Button.event:exit}. + * @param {OpenSeadragon.EventHandler} [options.onFocus=null] Event handler callback for {@link OpenSeadragon.Button.event:focus}. + * @param {OpenSeadragon.EventHandler} [options.onBlur=null] Event handler callback for {@link OpenSeadragon.Button.event:blur}. + */ +$.Button = function( options ) { + + var _this = this; + + $.EventSource.call( this ); + + $.extend( true, this, { + + tooltip: null, + srcRest: null, + srcGroup: null, + srcHover: null, + srcDown: null, + clickTimeThreshold: $.DEFAULT_SETTINGS.clickTimeThreshold, + clickDistThreshold: $.DEFAULT_SETTINGS.clickDistThreshold, + /** + * How long to wait before fading. + * @member {Number} fadeDelay + * @memberof OpenSeadragon.Button# + */ + fadeDelay: 0, + /** + * How long should it take to fade the button. + * @member {Number} fadeLength + * @memberof OpenSeadragon.Button# + */ + fadeLength: 2000, + onPress: null, + onRelease: null, + onClick: null, + onEnter: null, + onExit: null, + onFocus: null, + onBlur: null + + }, options ); + + /** + * The button element. + * @member {Element} element + * @memberof OpenSeadragon.Button# + */ + this.element = options.element || $.makeNeutralElement( "div" ); + + //if the user has specified the element to bind the control to explicitly + //then do not add the default control images + if ( !options.element ) { + this.imgRest = $.makeTransparentImage( this.srcRest ); + this.imgGroup = $.makeTransparentImage( this.srcGroup ); + this.imgHover = $.makeTransparentImage( this.srcHover ); + this.imgDown = $.makeTransparentImage( this.srcDown ); + + this.imgRest.alt = + this.imgGroup.alt = + this.imgHover.alt = + this.imgDown.alt = + this.tooltip; + + this.element.style.position = "relative"; + $.setElementTouchActionNone( this.element ); + + this.imgGroup.style.position = + this.imgHover.style.position = + this.imgDown.style.position = + "absolute"; + + this.imgGroup.style.top = + this.imgHover.style.top = + this.imgDown.style.top = + "0px"; + + this.imgGroup.style.left = + this.imgHover.style.left = + this.imgDown.style.left = + "0px"; + + this.imgHover.style.visibility = + this.imgDown.style.visibility = + "hidden"; + + if ( $.Browser.vendor == $.BROWSERS.FIREFOX && $.Browser.version < 3 ){ + this.imgGroup.style.top = + this.imgHover.style.top = + this.imgDown.style.top = + ""; + } + + this.element.appendChild( this.imgRest ); + this.element.appendChild( this.imgGroup ); + this.element.appendChild( this.imgHover ); + this.element.appendChild( this.imgDown ); + } + + + this.addHandler( "press", this.onPress ); + this.addHandler( "release", this.onRelease ); + this.addHandler( "click", this.onClick ); + this.addHandler( "enter", this.onEnter ); + this.addHandler( "exit", this.onExit ); + this.addHandler( "focus", this.onFocus ); + this.addHandler( "blur", this.onBlur ); + + /** + * The button's current state. + * @member {OpenSeadragon.ButtonState} currentState + * @memberof OpenSeadragon.Button# + */ + this.currentState = $.ButtonState.GROUP; + + // When the button last began to fade. + this.fadeBeginTime = null; + // Whether this button should fade after user stops interacting with the viewport. + this.shouldFade = false; + + this.element.style.display = "inline-block"; + this.element.style.position = "relative"; + this.element.title = this.tooltip; + + /** + * Tracks mouse/touch/key events on the button. + * @member {OpenSeadragon.MouseTracker} tracker + * @memberof OpenSeadragon.Button# + */ + this.tracker = new $.MouseTracker({ + + element: this.element, + clickTimeThreshold: this.clickTimeThreshold, + clickDistThreshold: this.clickDistThreshold, + + enterHandler: function( event ) { + if ( event.insideElementPressed ) { + inTo( _this, $.ButtonState.DOWN ); + /** + * Raised when the cursor enters the Button element. + * + * @event enter + * @memberof OpenSeadragon.Button + * @type {object} + * @property {OpenSeadragon.Button} eventSource - A reference to the Button which raised the event. + * @property {Object} originalEvent - The original DOM event. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + _this.raiseEvent( "enter", { originalEvent: event.originalEvent } ); + } else if ( !event.buttonDownAny ) { + inTo( _this, $.ButtonState.HOVER ); + } + }, + + focusHandler: function ( event ) { + this.enterHandler( event ); + /** + * Raised when the Button element receives focus. + * + * @event focus + * @memberof OpenSeadragon.Button + * @type {object} + * @property {OpenSeadragon.Button} eventSource - A reference to the Button which raised the event. + * @property {Object} originalEvent - The original DOM event. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + _this.raiseEvent( "focus", { originalEvent: event.originalEvent } ); + }, + + exitHandler: function( event ) { + outTo( _this, $.ButtonState.GROUP ); + if ( event.insideElementPressed ) { + /** + * Raised when the cursor leaves the Button element. + * + * @event exit + * @memberof OpenSeadragon.Button + * @type {object} + * @property {OpenSeadragon.Button} eventSource - A reference to the Button which raised the event. + * @property {Object} originalEvent - The original DOM event. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + _this.raiseEvent( "exit", { originalEvent: event.originalEvent } ); + } + }, + + blurHandler: function ( event ) { + this.exitHandler( event ); + /** + * Raised when the Button element loses focus. + * + * @event blur + * @memberof OpenSeadragon.Button + * @type {object} + * @property {OpenSeadragon.Button} eventSource - A reference to the Button which raised the event. + * @property {Object} originalEvent - The original DOM event. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + _this.raiseEvent( "blur", { originalEvent: event.originalEvent } ); + }, + + pressHandler: function ( event ) { + inTo( _this, $.ButtonState.DOWN ); + /** + * Raised when a mouse button is pressed or touch occurs in the Button element. + * + * @event press + * @memberof OpenSeadragon.Button + * @type {object} + * @property {OpenSeadragon.Button} eventSource - A reference to the Button which raised the event. + * @property {Object} originalEvent - The original DOM event. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + _this.raiseEvent( "press", { originalEvent: event.originalEvent } ); + }, + + releaseHandler: function( event ) { + if ( event.insideElementPressed && event.insideElementReleased ) { + outTo( _this, $.ButtonState.HOVER ); + /** + * Raised when the mouse button is released or touch ends in the Button element. + * + * @event release + * @memberof OpenSeadragon.Button + * @type {object} + * @property {OpenSeadragon.Button} eventSource - A reference to the Button which raised the event. + * @property {Object} originalEvent - The original DOM event. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + _this.raiseEvent( "release", { originalEvent: event.originalEvent } ); + } else if ( event.insideElementPressed ) { + outTo( _this, $.ButtonState.GROUP ); + } else { + inTo( _this, $.ButtonState.HOVER ); + } + }, + + clickHandler: function( event ) { + if ( event.quick ) { + /** + * Raised when a mouse button is pressed and released or touch is initiated and ended in the Button element within the time and distance threshold. + * + * @event click + * @memberof OpenSeadragon.Button + * @type {object} + * @property {OpenSeadragon.Button} eventSource - A reference to the Button which raised the event. + * @property {Object} originalEvent - The original DOM event. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + _this.raiseEvent("click", { originalEvent: event.originalEvent }); + } + }, + + keyHandler: function( event ){ + //console.log( "%s : handling key %s!", _this.tooltip, event.keyCode); + if( 13 === event.keyCode ){ + /*** + * Raised when a mouse button is pressed and released or touch is initiated and ended in the Button element within the time and distance threshold. + * + * @event click + * @memberof OpenSeadragon.Button + * @type {object} + * @property {OpenSeadragon.Button} eventSource - A reference to the Button which raised the event. + * @property {Object} originalEvent - The original DOM event. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + _this.raiseEvent( "click", { originalEvent: event.originalEvent } ); + /*** + * Raised when the mouse button is released or touch ends in the Button element. + * + * @event release + * @memberof OpenSeadragon.Button + * @type {object} + * @property {OpenSeadragon.Button} eventSource - A reference to the Button which raised the event. + * @property {Object} originalEvent - The original DOM event. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + _this.raiseEvent( "release", { originalEvent: event.originalEvent } ); + return false; + } + return true; + } + + }); + + outTo( this, $.ButtonState.REST ); +}; + +$.extend( $.Button.prototype, $.EventSource.prototype, /** @lends OpenSeadragon.Button.prototype */{ + + /** + * TODO: Determine what this function is intended to do and if it's actually + * useful as an API point. + * @function + */ + notifyGroupEnter: function() { + inTo( this, $.ButtonState.GROUP ); + }, + + /** + * TODO: Determine what this function is intended to do and if it's actually + * useful as an API point. + * @function + */ + notifyGroupExit: function() { + outTo( this, $.ButtonState.REST ); + }, + + /** + * @function + */ + disable: function(){ + this.notifyGroupExit(); + this.element.disabled = true; + $.setElementOpacity( this.element, 0.2, true ); + }, + + /** + * @function + */ + enable: function(){ + this.element.disabled = false; + $.setElementOpacity( this.element, 1.0, true ); + this.notifyGroupEnter(); + } + +}); + + +function scheduleFade( button ) { + $.requestAnimationFrame(function(){ + updateFade( button ); + }); +} + +function updateFade( button ) { + var currentTime, + deltaTime, + opacity; + + if ( button.shouldFade ) { + currentTime = $.now(); + deltaTime = currentTime - button.fadeBeginTime; + opacity = 1.0 - deltaTime / button.fadeLength; + opacity = Math.min( 1.0, opacity ); + opacity = Math.max( 0.0, opacity ); + + if( button.imgGroup ){ + $.setElementOpacity( button.imgGroup, opacity, true ); + } + if ( opacity > 0 ) { + // fade again + scheduleFade( button ); + } + } +} + +function beginFading( button ) { + button.shouldFade = true; + button.fadeBeginTime = $.now() + button.fadeDelay; + window.setTimeout( function(){ + scheduleFade( button ); + }, button.fadeDelay ); +} + +function stopFading( button ) { + button.shouldFade = false; + if( button.imgGroup ){ + $.setElementOpacity( button.imgGroup, 1.0, true ); + } +} + +function inTo( button, newState ) { + + if( button.element.disabled ){ + return; + } + + if ( newState >= $.ButtonState.GROUP && + button.currentState == $.ButtonState.REST ) { + stopFading( button ); + button.currentState = $.ButtonState.GROUP; + } + + if ( newState >= $.ButtonState.HOVER && + button.currentState == $.ButtonState.GROUP ) { + if( button.imgHover ){ + button.imgHover.style.visibility = ""; + } + button.currentState = $.ButtonState.HOVER; + } + + if ( newState >= $.ButtonState.DOWN && + button.currentState == $.ButtonState.HOVER ) { + if( button.imgDown ){ + button.imgDown.style.visibility = ""; + } + button.currentState = $.ButtonState.DOWN; + } +} + + +function outTo( button, newState ) { + + if( button.element.disabled ){ + return; + } + + if ( newState <= $.ButtonState.HOVER && + button.currentState == $.ButtonState.DOWN ) { + if( button.imgDown ){ + button.imgDown.style.visibility = "hidden"; + } + button.currentState = $.ButtonState.HOVER; + } + + if ( newState <= $.ButtonState.GROUP && + button.currentState == $.ButtonState.HOVER ) { + if( button.imgHover ){ + button.imgHover.style.visibility = "hidden"; + } + button.currentState = $.ButtonState.GROUP; + } + + if ( newState <= $.ButtonState.REST && + button.currentState == $.ButtonState.GROUP ) { + beginFading( button ); + button.currentState = $.ButtonState.REST; + } +} + + + +}( OpenSeadragon )); + +/* + * OpenSeadragon - ButtonGroup + * + * Copyright (C) 2009 CodePlex Foundation + * Copyright (C) 2010-2013 OpenSeadragon contributors + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of CodePlex Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +(function( $ ){ +/** + * @class ButtonGroup + * @classdesc Manages events on groups of buttons. + * + * @memberof OpenSeadragon + * @param {Object} options - A dictionary of settings applied against the entire group of buttons. + * @param {Array} options.buttons Array of buttons + * @param {Element} [options.element] Element to use as the container + **/ +$.ButtonGroup = function( options ) { + + $.extend( true, this, { + /** + * An array containing the buttons themselves. + * @member {Array} buttons + * @memberof OpenSeadragon.ButtonGroup# + */ + buttons: [], + clickTimeThreshold: $.DEFAULT_SETTINGS.clickTimeThreshold, + clickDistThreshold: $.DEFAULT_SETTINGS.clickDistThreshold, + labelText: "" + }, options ); + + // copy the button elements TODO: Why? + var buttons = this.buttons.concat([]), + _this = this, + i; + + /** + * The shared container for the buttons. + * @member {Element} element + * @memberof OpenSeadragon.ButtonGroup# + */ + this.element = options.element || $.makeNeutralElement( "div" ); + + // TODO What if there IS an options.group specified? + if( !options.group ){ + this.label = $.makeNeutralElement( "label" ); + //TODO: support labels for ButtonGroups + //this.label.innerHTML = this.labelText; + this.element.style.display = "inline-block"; + this.element.appendChild( this.label ); + for ( i = 0; i < buttons.length; i++ ) { + this.element.appendChild( buttons[ i ].element ); + } + } + + $.setElementTouchActionNone( this.element ); + + /** + * Tracks mouse/touch/key events accross the group of buttons. + * @member {OpenSeadragon.MouseTracker} tracker + * @memberof OpenSeadragon.ButtonGroup# + */ + this.tracker = new $.MouseTracker({ + element: this.element, + clickTimeThreshold: this.clickTimeThreshold, + clickDistThreshold: this.clickDistThreshold, + enterHandler: function ( event ) { + var i; + for ( i = 0; i < _this.buttons.length; i++ ) { + _this.buttons[ i ].notifyGroupEnter(); + } + }, + exitHandler: function ( event ) { + var i; + if ( !event.insideElementPressed ) { + for ( i = 0; i < _this.buttons.length; i++ ) { + _this.buttons[ i ].notifyGroupExit(); + } + } + }, + }); +}; + +/** @lends OpenSeadragon.ButtonGroup.prototype */ +$.ButtonGroup.prototype = { + + /** + * TODO: Figure out why this is used on the public API and if a more useful + * api can be created. + * @function + * @private + */ + emulateEnter: function() { + this.tracker.enterHandler( { eventSource: this.tracker } ); + }, + + /** + * TODO: Figure out why this is used on the public API and if a more useful + * api can be created. + * @function + * @private + */ + emulateExit: function() { + this.tracker.exitHandler( { eventSource: this.tracker } ); + } +}; + + +}( OpenSeadragon )); + +/* + * OpenSeadragon - Rect + * + * Copyright (C) 2009 CodePlex Foundation + * Copyright (C) 2010-2013 OpenSeadragon contributors + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of CodePlex Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +(function($) { + +/** + * @class Rect + * @classdesc A Rectangle is described by it top left coordinates (x, y), width, + * height and degrees of rotation around (x, y). + * Note that the coordinate system used is the one commonly used with images: + * x increases when going to the right + * y increases when going to the bottom + * degrees increases clockwise with 0 being the horizontal + * + * The constructor normalizes the rectangle to always have 0 <= degrees < 90 + * + * @memberof OpenSeadragon + * @param {Number} [x=0] The vector component 'x'. + * @param {Number} [y=0] The vector component 'y'. + * @param {Number} [width=0] The vector component 'width'. + * @param {Number} [height=0] The vector component 'height'. + * @param {Number} [degrees=0] Rotation of the rectangle around (x,y) in degrees. + */ +$.Rect = function(x, y, width, height, degrees) { + /** + * The vector component 'x'. + * @member {Number} x + * @memberof OpenSeadragon.Rect# + */ + this.x = typeof(x) === "number" ? x : 0; + /** + * The vector component 'y'. + * @member {Number} y + * @memberof OpenSeadragon.Rect# + */ + this.y = typeof(y) === "number" ? y : 0; + /** + * The vector component 'width'. + * @member {Number} width + * @memberof OpenSeadragon.Rect# + */ + this.width = typeof(width) === "number" ? width : 0; + /** + * The vector component 'height'. + * @member {Number} height + * @memberof OpenSeadragon.Rect# + */ + this.height = typeof(height) === "number" ? height : 0; + + this.degrees = typeof(degrees) === "number" ? degrees : 0; + + // Normalizes the rectangle. + this.degrees = this.degrees % 360; + if (this.degrees < 0) { + this.degrees += 360; + } + var newTopLeft, newWidth; + if (this.degrees >= 270) { + newTopLeft = this.getTopRight(); + this.x = newTopLeft.x; + this.y = newTopLeft.y; + newWidth = this.height; + this.height = this.width; + this.width = newWidth; + this.degrees -= 270; + } else if (this.degrees >= 180) { + newTopLeft = this.getBottomRight(); + this.x = newTopLeft.x; + this.y = newTopLeft.y; + this.degrees -= 180; + } else if (this.degrees >= 90) { + newTopLeft = this.getBottomLeft(); + this.x = newTopLeft.x; + this.y = newTopLeft.y; + newWidth = this.height; + this.height = this.width; + this.width = newWidth; + this.degrees -= 90; + } +}; + +/** + * Builds a rectangle having the 3 specified points as summits. + * @static + * @memberof OpenSeadragon.Rect + * @param {OpenSeadragon.Point} topLeft + * @param {OpenSeadragon.Point} topRight + * @param {OpenSeadragon.Point} bottomLeft + * @returns {OpenSeadragon.Rect} + */ +$.Rect.fromSummits = function(topLeft, topRight, bottomLeft) { + var width = topLeft.distanceTo(topRight); + var height = topLeft.distanceTo(bottomLeft); + var diff = topRight.minus(topLeft); + var radians = Math.atan(diff.y / diff.x); + if (diff.x < 0) { + radians += Math.PI; + } else if (diff.y < 0) { + radians += 2 * Math.PI; + } + return new $.Rect( + topLeft.x, + topLeft.y, + width, + height, + radians / Math.PI * 180); +}; + +/** @lends OpenSeadragon.Rect.prototype */ +$.Rect.prototype = { + /** + * @function + * @returns {OpenSeadragon.Rect} a duplicate of this Rect + */ + clone: function() { + return new $.Rect( + this.x, + this.y, + this.width, + this.height, + this.degrees); + }, + + /** + * The aspect ratio is simply the ratio of width to height. + * @function + * @returns {Number} The ratio of width to height. + */ + getAspectRatio: function() { + return this.width / this.height; + }, + + /** + * Provides the coordinates of the upper-left corner of the rectangle as a + * point. + * @function + * @returns {OpenSeadragon.Point} The coordinate of the upper-left corner of + * the rectangle. + */ + getTopLeft: function() { + return new $.Point( + this.x, + this.y + ); + }, + + /** + * Provides the coordinates of the bottom-right corner of the rectangle as a + * point. + * @function + * @returns {OpenSeadragon.Point} The coordinate of the bottom-right corner of + * the rectangle. + */ + getBottomRight: function() { + return new $.Point(this.x + this.width, this.y + this.height) + .rotate(this.degrees, this.getTopLeft()); + }, + + /** + * Provides the coordinates of the top-right corner of the rectangle as a + * point. + * @function + * @returns {OpenSeadragon.Point} The coordinate of the top-right corner of + * the rectangle. + */ + getTopRight: function() { + return new $.Point(this.x + this.width, this.y) + .rotate(this.degrees, this.getTopLeft()); + }, + + /** + * Provides the coordinates of the bottom-left corner of the rectangle as a + * point. + * @function + * @returns {OpenSeadragon.Point} The coordinate of the bottom-left corner of + * the rectangle. + */ + getBottomLeft: function() { + return new $.Point(this.x, this.y + this.height) + .rotate(this.degrees, this.getTopLeft()); + }, + + /** + * Computes the center of the rectangle. + * @function + * @returns {OpenSeadragon.Point} The center of the rectangle as represented + * as represented by a 2-dimensional vector (x,y) + */ + getCenter: function() { + return new $.Point( + this.x + this.width / 2.0, + this.y + this.height / 2.0 + ).rotate(this.degrees, this.getTopLeft()); + }, + + /** + * Returns the width and height component as a vector OpenSeadragon.Point + * @function + * @returns {OpenSeadragon.Point} The 2 dimensional vector representing the + * the width and height of the rectangle. + */ + getSize: function() { + return new $.Point(this.width, this.height); + }, + + /** + * Determines if two Rectangles have equivalent components. + * @function + * @param {OpenSeadragon.Rect} rectangle The Rectangle to compare to. + * @return {Boolean} 'true' if all components are equal, otherwise 'false'. + */ + equals: function(other) { + return (other instanceof $.Rect) && + this.x === other.x && + this.y === other.y && + this.width === other.width && + this.height === other.height && + this.degrees === other.degrees; + }, + + /** + * Multiply all dimensions (except degrees) in this Rect by a factor and + * return a new Rect. + * @function + * @param {Number} factor The factor to multiply vector components. + * @returns {OpenSeadragon.Rect} A new rect representing the multiplication + * of the vector components by the factor + */ + times: function(factor) { + return new $.Rect( + this.x * factor, + this.y * factor, + this.width * factor, + this.height * factor, + this.degrees); + }, + + /** + * Translate/move this Rect by a vector and return new Rect. + * @function + * @param {OpenSeadragon.Point} delta The translation vector. + * @returns {OpenSeadragon.Rect} A new rect with altered position + */ + translate: function(delta) { + return new $.Rect( + this.x + delta.x, + this.y + delta.y, + this.width, + this.height, + this.degrees); + }, + + /** + * Returns the smallest rectangle that will contain this and the given + * rectangle bounding boxes. + * @param {OpenSeadragon.Rect} rect + * @return {OpenSeadragon.Rect} The new rectangle. + */ + union: function(rect) { + var thisBoundingBox = this.getBoundingBox(); + var otherBoundingBox = rect.getBoundingBox(); + + var left = Math.min(thisBoundingBox.x, otherBoundingBox.x); + var top = Math.min(thisBoundingBox.y, otherBoundingBox.y); + var right = Math.max( + thisBoundingBox.x + thisBoundingBox.width, + otherBoundingBox.x + otherBoundingBox.width); + var bottom = Math.max( + thisBoundingBox.y + thisBoundingBox.height, + otherBoundingBox.y + otherBoundingBox.height); + + return new $.Rect( + left, + top, + right - left, + bottom - top); + }, + + /** + * Returns the bounding box of the intersection of this rectangle with the + * given rectangle. + * @param {OpenSeadragon.Rect} rect + * @return {OpenSeadragon.Rect} the bounding box of the intersection + * or null if the rectangles don't intersect. + */ + intersection: function(rect) { + // Simplified version of Weiler Atherton clipping algorithm + // https://en.wikipedia.org/wiki/Weiler%E2%80%93Atherton_clipping_algorithm + // Because we just want the bounding box of the intersection, + // we can just compute the bounding box of: + // 1. all the summits of this which are inside rect + // 2. all the summits of rect which are inside this + // 3. all the intersections of rect and this + var EPSILON = 0.0000000001; + + var intersectionPoints = []; + + var thisTopLeft = this.getTopLeft(); + if (rect.containsPoint(thisTopLeft, EPSILON)) { + intersectionPoints.push(thisTopLeft); + } + var thisTopRight = this.getTopRight(); + if (rect.containsPoint(thisTopRight, EPSILON)) { + intersectionPoints.push(thisTopRight); + } + var thisBottomLeft = this.getBottomLeft(); + if (rect.containsPoint(thisBottomLeft, EPSILON)) { + intersectionPoints.push(thisBottomLeft); + } + var thisBottomRight = this.getBottomRight(); + if (rect.containsPoint(thisBottomRight, EPSILON)) { + intersectionPoints.push(thisBottomRight); + } + + var rectTopLeft = rect.getTopLeft(); + if (this.containsPoint(rectTopLeft, EPSILON)) { + intersectionPoints.push(rectTopLeft); + } + var rectTopRight = rect.getTopRight(); + if (this.containsPoint(rectTopRight, EPSILON)) { + intersectionPoints.push(rectTopRight); + } + var rectBottomLeft = rect.getBottomLeft(); + if (this.containsPoint(rectBottomLeft, EPSILON)) { + intersectionPoints.push(rectBottomLeft); + } + var rectBottomRight = rect.getBottomRight(); + if (this.containsPoint(rectBottomRight, EPSILON)) { + intersectionPoints.push(rectBottomRight); + } + + var thisSegments = this._getSegments(); + var rectSegments = rect._getSegments(); + for (var i = 0; i < thisSegments.length; i++) { + var thisSegment = thisSegments[i]; + for (var j = 0; j < rectSegments.length; j++) { + var rectSegment = rectSegments[j]; + var intersect = getIntersection(thisSegment[0], thisSegment[1], + rectSegment[0], rectSegment[1]); + if (intersect) { + intersectionPoints.push(intersect); + } + } + } + + // Get intersection point of segments [a,b] and [c,d] + function getIntersection(a, b, c, d) { + // http://stackoverflow.com/a/1968345/1440403 + var abVector = b.minus(a); + var cdVector = d.minus(c); + + var denom = -cdVector.x * abVector.y + abVector.x * cdVector.y; + if (denom === 0) { + return null; + } + + var s = (abVector.x * (a.y - c.y) - abVector.y * (a.x - c.x)) / denom; + var t = (cdVector.x * (a.y - c.y) - cdVector.y * (a.x - c.x)) / denom; + + if (-EPSILON <= s && s <= 1 - EPSILON && + -EPSILON <= t && t <= 1 - EPSILON) { + return new $.Point(a.x + t * abVector.x, a.y + t * abVector.y); + } + return null; + } + + if (intersectionPoints.length === 0) { + return null; + } + + var minX = intersectionPoints[0].x; + var maxX = intersectionPoints[0].x; + var minY = intersectionPoints[0].y; + var maxY = intersectionPoints[0].y; + for (var k = 1; k < intersectionPoints.length; k++) { + var point = intersectionPoints[k]; + if (point.x < minX) { + minX = point.x; + } + if (point.x > maxX) { + maxX = point.x; + } + if (point.y < minY) { + minY = point.y; + } + if (point.y > maxY) { + maxY = point.y; + } + } + return new $.Rect(minX, minY, maxX - minX, maxY - minY); + }, + + // private + _getSegments: function() { + var topLeft = this.getTopLeft(); + var topRight = this.getTopRight(); + var bottomLeft = this.getBottomLeft(); + var bottomRight = this.getBottomRight(); + return [[topLeft, topRight], + [topRight, bottomRight], + [bottomRight, bottomLeft], + [bottomLeft, topLeft]]; + }, + + /** + * Rotates a rectangle around a point. + * @function + * @param {Number} degrees The angle in degrees to rotate. + * @param {OpenSeadragon.Point} [pivot] The point about which to rotate. + * Defaults to the center of the rectangle. + * @return {OpenSeadragon.Rect} + */ + rotate: function(degrees, pivot) { + degrees = degrees % 360; + if (degrees === 0) { + return this.clone(); + } + if (degrees < 0) { + degrees += 360; + } + + pivot = pivot || this.getCenter(); + var newTopLeft = this.getTopLeft().rotate(degrees, pivot); + var newTopRight = this.getTopRight().rotate(degrees, pivot); + + var diff = newTopRight.minus(newTopLeft); + var radians = Math.atan(diff.y / diff.x); + if (diff.x < 0) { + radians += Math.PI; + } else if (diff.y < 0) { + radians += 2 * Math.PI; + } + return new $.Rect( + newTopLeft.x, + newTopLeft.y, + this.width, + this.height, + radians / Math.PI * 180); + }, + + /** + * Retrieves the smallest horizontal (degrees=0) rectangle which contains + * this rectangle. + * @returns {OpenSeadragon.Rect} + */ + getBoundingBox: function() { + if (this.degrees === 0) { + return this.clone(); + } + var topLeft = this.getTopLeft(); + var topRight = this.getTopRight(); + var bottomLeft = this.getBottomLeft(); + var bottomRight = this.getBottomRight(); + var minX = Math.min(topLeft.x, topRight.x, bottomLeft.x, bottomRight.x); + var maxX = Math.max(topLeft.x, topRight.x, bottomLeft.x, bottomRight.x); + var minY = Math.min(topLeft.y, topRight.y, bottomLeft.y, bottomRight.y); + var maxY = Math.max(topLeft.y, topRight.y, bottomLeft.y, bottomRight.y); + return new $.Rect( + minX, + minY, + maxX - minX, + maxY - minY); + }, + + /** + * Retrieves the smallest horizontal (degrees=0) rectangle which contains + * this rectangle and has integers x, y, width and height + * @returns {OpenSeadragon.Rect} + */ + getIntegerBoundingBox: function() { + var boundingBox = this.getBoundingBox(); + var x = Math.floor(boundingBox.x); + var y = Math.floor(boundingBox.y); + var width = Math.ceil(boundingBox.width + boundingBox.x - x); + var height = Math.ceil(boundingBox.height + boundingBox.y - y); + return new $.Rect(x, y, width, height); + }, + + /** + * Determines whether a point is inside this rectangle (edge included). + * @function + * @param {OpenSeadragon.Point} point + * @param {Number} [epsilon=0] the margin of error allowed + * @returns {Boolean} true if the point is inside this rectangle, false + * otherwise. + */ + containsPoint: function(point, epsilon) { + epsilon = epsilon || 0; + + // See http://stackoverflow.com/a/2752754/1440403 for explanation + var topLeft = this.getTopLeft(); + var topRight = this.getTopRight(); + var bottomLeft = this.getBottomLeft(); + var topDiff = topRight.minus(topLeft); + var leftDiff = bottomLeft.minus(topLeft); + + return ((point.x - topLeft.x) * topDiff.x + + (point.y - topLeft.y) * topDiff.y >= -epsilon) && + + ((point.x - topRight.x) * topDiff.x + + (point.y - topRight.y) * topDiff.y <= epsilon) && + + ((point.x - topLeft.x) * leftDiff.x + + (point.y - topLeft.y) * leftDiff.y >= -epsilon) && + + ((point.x - bottomLeft.x) * leftDiff.x + + (point.y - bottomLeft.y) * leftDiff.y <= epsilon); + }, + + /** + * Provides a string representation of the rectangle which is useful for + * debugging. + * @function + * @returns {String} A string representation of the rectangle. + */ + toString: function() { + return "[" + + (Math.round(this.x * 100) / 100) + ", " + + (Math.round(this.y * 100) / 100) + ", " + + (Math.round(this.width * 100) / 100) + "x" + + (Math.round(this.height * 100) / 100) + ", " + + (Math.round(this.degrees * 100) / 100) + "deg" + + "]"; + } +}; + + +}(OpenSeadragon)); + +/* + * OpenSeadragon - ReferenceStrip + * + * Copyright (C) 2009 CodePlex Foundation + * Copyright (C) 2010-2013 OpenSeadragon contributors + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of CodePlex Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +(function ( $ ) { + +// dictionary from id to private properties +var THIS = {}; + +/** + * The CollectionDrawer is a reimplementation if the Drawer API that + * focuses on allowing a viewport to be redefined as a collection + * of smaller viewports, defined by a clear number of rows and / or + * columns of which each item in the matrix of viewports has its own + * source. + * + * This idea is a reexpression of the idea of dzi collections + * which allows a clearer algorithm to reuse the tile sources already + * supported by OpenSeadragon, in heterogenious or homogenious + * sequences just like mixed groups already supported by the viewer + * for the purpose of image sequnces. + * + * TODO: The difficult part of this feature is figuring out how to express + * this functionality as a combination of the functionality already + * provided by Drawer, Viewport, TileSource, and Navigator. It may + * require better abstraction at those points in order to effeciently + * reuse those paradigms. + */ +/** + * @class ReferenceStrip + * @memberof OpenSeadragon + * @param {Object} options + */ +$.ReferenceStrip = function ( options ) { + + var _this = this, + viewer = options.viewer, + viewerSize = $.getElementSize( viewer.element ), + element, + style, + i; + + //We may need to create a new element and id if they did not + //provide the id for the existing element + if ( !options.id ) { + options.id = 'referencestrip-' + $.now(); + this.element = $.makeNeutralElement( "div" ); + this.element.id = options.id; + this.element.className = 'referencestrip'; + } + + options = $.extend( true, { + sizeRatio: $.DEFAULT_SETTINGS.referenceStripSizeRatio, + position: $.DEFAULT_SETTINGS.referenceStripPosition, + scroll: $.DEFAULT_SETTINGS.referenceStripScroll, + clickTimeThreshold: $.DEFAULT_SETTINGS.clickTimeThreshold + }, options, { + //required overrides + element: this.element, + //These need to be overridden to prevent recursion since + //the navigator is a viewer and a viewer has a navigator + showNavigator: false, + mouseNavEnabled: false, + showNavigationControl: false, + showSequenceControl: false + } ); + + $.extend( this, options ); + //Private state properties + THIS[this.id] = { + "animating": false + }; + + this.minPixelRatio = this.viewer.minPixelRatio; + + style = this.element.style; + style.marginTop = '0px'; + style.marginRight = '0px'; + style.marginBottom = '0px'; + style.marginLeft = '0px'; + style.left = '0px'; + style.bottom = '0px'; + style.border = '0px'; + style.background = '#000'; + style.position = 'relative'; + + $.setElementTouchActionNone( this.element ); + + $.setElementOpacity( this.element, 0.8 ); + + this.viewer = viewer; + this.innerTracker = new $.MouseTracker( { + element: this.element, + dragHandler: $.delegate( this, onStripDrag ), + scrollHandler: $.delegate( this, onStripScroll ), + enterHandler: $.delegate( this, onStripEnter ), + exitHandler: $.delegate( this, onStripExit ), + keyDownHandler: $.delegate( this, onKeyDown ), + keyHandler: $.delegate( this, onKeyPress ) + } ); + + //Controls the position and orientation of the reference strip and sets the + //appropriate width and height + if ( options.width && options.height ) { + this.element.style.width = options.width + 'px'; + this.element.style.height = options.height + 'px'; + viewer.addControl( + this.element, + { anchor: $.ControlAnchor.BOTTOM_LEFT } + ); + } else { + if ( "horizontal" == options.scroll ) { + this.element.style.width = ( + viewerSize.x * + options.sizeRatio * + viewer.tileSources.length + ) + ( 12 * viewer.tileSources.length ) + 'px'; + + this.element.style.height = ( + viewerSize.y * + options.sizeRatio + ) + 'px'; + + viewer.addControl( + this.element, + { anchor: $.ControlAnchor.BOTTOM_LEFT } + ); + } else { + this.element.style.height = ( + viewerSize.y * + options.sizeRatio * + viewer.tileSources.length + ) + ( 12 * viewer.tileSources.length ) + 'px'; + + this.element.style.width = ( + viewerSize.x * + options.sizeRatio + ) + 'px'; + + viewer.addControl( + this.element, + { anchor: $.ControlAnchor.TOP_LEFT } + ); + + } + } + + this.panelWidth = ( viewerSize.x * this.sizeRatio ) + 8; + this.panelHeight = ( viewerSize.y * this.sizeRatio ) + 8; + this.panels = []; + + /*jshint loopfunc:true*/ + for ( i = 0; i < viewer.tileSources.length; i++ ) { + + element = $.makeNeutralElement( 'div' ); + element.id = this.element.id + "-" + i; + + element.style.width = _this.panelWidth + 'px'; + element.style.height = _this.panelHeight + 'px'; + element.style.display = 'inline'; + element.style.float = 'left'; //Webkit + element.style.cssFloat = 'left'; //Firefox + element.style.styleFloat = 'left'; //IE + element.style.padding = '2px'; + $.setElementTouchActionNone( element ); + + element.innerTracker = new $.MouseTracker( { + element: element, + clickTimeThreshold: this.clickTimeThreshold, + clickDistThreshold: this.clickDistThreshold, + pressHandler: function ( event ) { + event.eventSource.dragging = $.now(); + }, + releaseHandler: function ( event ) { + var tracker = event.eventSource, + id = tracker.element.id, + page = Number( id.split( '-' )[2] ), + now = $.now(); + + if ( event.insideElementPressed && + event.insideElementReleased && + tracker.dragging && + ( now - tracker.dragging ) < tracker.clickTimeThreshold ) { + tracker.dragging = null; + viewer.goToPage( page ); + } + } + } ); + + this.element.appendChild( element ); + + element.activePanel = false; + + this.panels.push( element ); + + } + loadPanels( this, this.scroll == 'vertical' ? viewerSize.y : viewerSize.x, 0 ); + this.setFocus( 0 ); + +}; + +$.extend( $.ReferenceStrip.prototype, $.EventSource.prototype, $.Viewer.prototype, /** @lends OpenSeadragon.ReferenceStrip.prototype */{ + + /** + * @function + */ + setFocus: function ( page ) { + var element = $.getElement( this.element.id + '-' + page ), + viewerSize = $.getElementSize( this.viewer.canvas ), + scrollWidth = Number( this.element.style.width.replace( 'px', '' ) ), + scrollHeight = Number( this.element.style.height.replace( 'px', '' ) ), + offsetLeft = -Number( this.element.style.marginLeft.replace( 'px', '' ) ), + offsetTop = -Number( this.element.style.marginTop.replace( 'px', '' ) ), + offset; + + if ( this.currentSelected !== element ) { + if ( this.currentSelected ) { + this.currentSelected.style.background = '#000'; + } + this.currentSelected = element; + this.currentSelected.style.background = '#999'; + + if ( 'horizontal' == this.scroll ) { + //right left + offset = ( Number( page ) ) * ( this.panelWidth + 3 ); + if ( offset > offsetLeft + viewerSize.x - this.panelWidth ) { + offset = Math.min( offset, ( scrollWidth - viewerSize.x ) ); + this.element.style.marginLeft = -offset + 'px'; + loadPanels( this, viewerSize.x, -offset ); + } else if ( offset < offsetLeft ) { + offset = Math.max( 0, offset - viewerSize.x / 2 ); + this.element.style.marginLeft = -offset + 'px'; + loadPanels( this, viewerSize.x, -offset ); + } + } else { + offset = ( Number( page ) ) * ( this.panelHeight + 3 ); + if ( offset > offsetTop + viewerSize.y - this.panelHeight ) { + offset = Math.min( offset, ( scrollHeight - viewerSize.y ) ); + this.element.style.marginTop = -offset + 'px'; + loadPanels( this, viewerSize.y, -offset ); + } else if ( offset < offsetTop ) { + offset = Math.max( 0, offset - viewerSize.y / 2 ); + this.element.style.marginTop = -offset + 'px'; + loadPanels( this, viewerSize.y, -offset ); + } + } + + this.currentPage = page; + onStripEnter.call( this, { eventSource: this.innerTracker } ); + } + }, + + /** + * @function + */ + update: function () { + if ( THIS[this.id].animating ) { + $.console.log( 'image reference strip update' ); + return true; + } + return false; + }, + + // Overrides Viewer.destroy + destroy: function() { + if (this.element) { + this.element.parentNode.removeChild(this.element); + } + } + +} ); + + + + +/** + * @private + * @inner + * @function + */ +function onStripDrag( event ) { + + var offsetLeft = Number( this.element.style.marginLeft.replace( 'px', '' ) ), + offsetTop = Number( this.element.style.marginTop.replace( 'px', '' ) ), + scrollWidth = Number( this.element.style.width.replace( 'px', '' ) ), + scrollHeight = Number( this.element.style.height.replace( 'px', '' ) ), + viewerSize = $.getElementSize( this.viewer.canvas ); + this.dragging = true; + if ( this.element ) { + if ( 'horizontal' == this.scroll ) { + if ( -event.delta.x > 0 ) { + //forward + if ( offsetLeft > -( scrollWidth - viewerSize.x ) ) { + this.element.style.marginLeft = ( offsetLeft + ( event.delta.x * 2 ) ) + 'px'; + loadPanels( this, viewerSize.x, offsetLeft + ( event.delta.x * 2 ) ); + } + } else if ( -event.delta.x < 0 ) { + //reverse + if ( offsetLeft < 0 ) { + this.element.style.marginLeft = ( offsetLeft + ( event.delta.x * 2 ) ) + 'px'; + loadPanels( this, viewerSize.x, offsetLeft + ( event.delta.x * 2 ) ); + } + } + } else { + if ( -event.delta.y > 0 ) { + //forward + if ( offsetTop > -( scrollHeight - viewerSize.y ) ) { + this.element.style.marginTop = ( offsetTop + ( event.delta.y * 2 ) ) + 'px'; + loadPanels( this, viewerSize.y, offsetTop + ( event.delta.y * 2 ) ); + } + } else if ( -event.delta.y < 0 ) { + //reverse + if ( offsetTop < 0 ) { + this.element.style.marginTop = ( offsetTop + ( event.delta.y * 2 ) ) + 'px'; + loadPanels( this, viewerSize.y, offsetTop + ( event.delta.y * 2 ) ); + } + } + } + } + return false; + +} + + + +/** + * @private + * @inner + * @function + */ +function onStripScroll( event ) { + var offsetLeft = Number( this.element.style.marginLeft.replace( 'px', '' ) ), + offsetTop = Number( this.element.style.marginTop.replace( 'px', '' ) ), + scrollWidth = Number( this.element.style.width.replace( 'px', '' ) ), + scrollHeight = Number( this.element.style.height.replace( 'px', '' ) ), + viewerSize = $.getElementSize( this.viewer.canvas ); + if ( this.element ) { + if ( 'horizontal' == this.scroll ) { + if ( event.scroll > 0 ) { + //forward + if ( offsetLeft > -( scrollWidth - viewerSize.x ) ) { + this.element.style.marginLeft = ( offsetLeft - ( event.scroll * 60 ) ) + 'px'; + loadPanels( this, viewerSize.x, offsetLeft - ( event.scroll * 60 ) ); + } + } else if ( event.scroll < 0 ) { + //reverse + if ( offsetLeft < 0 ) { + this.element.style.marginLeft = ( offsetLeft - ( event.scroll * 60 ) ) + 'px'; + loadPanels( this, viewerSize.x, offsetLeft - ( event.scroll * 60 ) ); + } + } + } else { + if ( event.scroll < 0 ) { + //scroll up + if ( offsetTop > viewerSize.y - scrollHeight ) { + this.element.style.marginTop = ( offsetTop + ( event.scroll * 60 ) ) + 'px'; + loadPanels( this, viewerSize.y, offsetTop + ( event.scroll * 60 ) ); + } + } else if ( event.scroll > 0 ) { + //scroll dowm + if ( offsetTop < 0 ) { + this.element.style.marginTop = ( offsetTop + ( event.scroll * 60 ) ) + 'px'; + loadPanels( this, viewerSize.y, offsetTop + ( event.scroll * 60 ) ); + } + } + } + } + //cancels event + return false; +} + + +function loadPanels( strip, viewerSize, scroll ) { + var panelSize, + activePanelsStart, + activePanelsEnd, + miniViewer, + style, + i, + element; + if ( 'horizontal' == strip.scroll ) { + panelSize = strip.panelWidth; + } else { + panelSize = strip.panelHeight; + } + activePanelsStart = Math.ceil( viewerSize / panelSize ) + 5; + activePanelsEnd = Math.ceil( ( Math.abs( scroll ) + viewerSize ) / panelSize ) + 1; + activePanelsStart = activePanelsEnd - activePanelsStart; + activePanelsStart = activePanelsStart < 0 ? 0 : activePanelsStart; + + for ( i = activePanelsStart; i < activePanelsEnd && i < strip.panels.length; i++ ) { + element = strip.panels[i]; + if ( !element.activePanel ) { + miniViewer = new $.Viewer( { + id: element.id, + tileSources: [strip.viewer.tileSources[i]], + element: element, + navigatorSizeRatio: strip.sizeRatio, + showNavigator: false, + mouseNavEnabled: false, + showNavigationControl: false, + showSequenceControl: false, + immediateRender: true, + blendTime: 0, + animationTime: 0 + } ); + + miniViewer.displayRegion = $.makeNeutralElement( "div" ); + miniViewer.displayRegion.id = element.id + '-displayregion'; + miniViewer.displayRegion.className = 'displayregion'; + + style = miniViewer.displayRegion.style; + style.position = 'relative'; + style.top = '0px'; + style.left = '0px'; + style.fontSize = '0px'; + style.overflow = 'hidden'; + style.float = 'left'; //Webkit + style.cssFloat = 'left'; //Firefox + style.styleFloat = 'left'; //IE + style.zIndex = 999999999; + style.cursor = 'default'; + style.width = ( strip.panelWidth - 4 ) + 'px'; + style.height = ( strip.panelHeight - 4 ) + 'px'; + + // TODO: What is this for? Future keyboard navigation support? + miniViewer.displayRegion.innerTracker = new $.MouseTracker( { + element: miniViewer.displayRegion, + startDisabled: true + } ); + + element.getElementsByTagName( 'div' )[0].appendChild( + miniViewer.displayRegion + ); + + element.activePanel = true; + } + } +} + + +/** + * @private + * @inner + * @function + */ +function onStripEnter( event ) { + var element = event.eventSource.element; + + //$.setElementOpacity(element, 0.8); + + //element.style.border = '1px solid #555'; + //element.style.background = '#000'; + + if ( 'horizontal' == this.scroll ) { + + //element.style.paddingTop = "0px"; + element.style.marginBottom = "0px"; + + } else { + + //element.style.paddingRight = "0px"; + element.style.marginLeft = "0px"; + + } + return false; +} + + +/** + * @private + * @inner + * @function + */ +function onStripExit( event ) { + var element = event.eventSource.element; + + if ( 'horizontal' == this.scroll ) { + + //element.style.paddingTop = "10px"; + element.style.marginBottom = "-" + ( $.getElementSize( element ).y / 2 ) + "px"; + + } else { + + //element.style.paddingRight = "10px"; + element.style.marginLeft = "-" + ( $.getElementSize( element ).x / 2 ) + "px"; + + } + return false; +} + + +/** + * @private + * @inner + * @function + */ +function onKeyDown( event ) { + //console.log( event.keyCode ); + + if ( !event.preventDefaultAction && !event.ctrl && !event.alt && !event.meta ) { + switch ( event.keyCode ) { + case 38: //up arrow + onStripScroll.call( this, { eventSource: this.tracker, position: null, scroll: 1, shift: null } ); + return false; + case 40: //down arrow + onStripScroll.call( this, { eventSource: this.tracker, position: null, scroll: -1, shift: null } ); + return false; + case 37: //left arrow + onStripScroll.call( this, { eventSource: this.tracker, position: null, scroll: -1, shift: null } ); + return false; + case 39: //right arrow + onStripScroll.call( this, { eventSource: this.tracker, position: null, scroll: 1, shift: null } ); + return false; + default: + //console.log( 'navigator keycode %s', event.keyCode ); + return true; + } + } else { + return true; + } +} + + +/** + * @private + * @inner + * @function + */ +function onKeyPress( event ) { + //console.log( event.keyCode ); + + if ( !event.preventDefaultAction && !event.ctrl && !event.alt && !event.meta ) { + switch ( event.keyCode ) { + case 61: //=|+ + onStripScroll.call( this, { eventSource: this.tracker, position: null, scroll: 1, shift: null } ); + return false; + case 45: //-|_ + onStripScroll.call( this, { eventSource: this.tracker, position: null, scroll: -1, shift: null } ); + return false; + case 48: //0|) + case 119: //w + case 87: //W + onStripScroll.call( this, { eventSource: this.tracker, position: null, scroll: 1, shift: null } ); + return false; + case 115: //s + case 83: //S + onStripScroll.call( this, { eventSource: this.tracker, position: null, scroll: -1, shift: null } ); + return false; + case 97: //a + onStripScroll.call( this, { eventSource: this.tracker, position: null, scroll: -1, shift: null } ); + return false; + case 100: //d + onStripScroll.call( this, { eventSource: this.tracker, position: null, scroll: 1, shift: null } ); + return false; + default: + //console.log( 'navigator keycode %s', event.keyCode ); + return true; + } + } else { + return true; + } +} + + + +} ( OpenSeadragon ) ); + +/* + * OpenSeadragon - DisplayRect + * + * Copyright (C) 2009 CodePlex Foundation + * Copyright (C) 2010-2013 OpenSeadragon contributors + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of CodePlex Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +(function( $ ){ + +/** + * @class DisplayRect + * @classdesc A display rectangle is very similar to {@link OpenSeadragon.Rect} but adds two + * fields, 'minLevel' and 'maxLevel' which denote the supported zoom levels + * for this rectangle. + * + * @memberof OpenSeadragon + * @extends OpenSeadragon.Rect + * @param {Number} x The vector component 'x'. + * @param {Number} y The vector component 'y'. + * @param {Number} width The vector component 'height'. + * @param {Number} height The vector component 'width'. + * @param {Number} minLevel The lowest zoom level supported. + * @param {Number} maxLevel The highest zoom level supported. + */ +$.DisplayRect = function( x, y, width, height, minLevel, maxLevel ) { + $.Rect.apply( this, [ x, y, width, height ] ); + + /** + * The lowest zoom level supported. + * @member {Number} minLevel + * @memberof OpenSeadragon.DisplayRect# + */ + this.minLevel = minLevel; + /** + * The highest zoom level supported. + * @member {Number} maxLevel + * @memberof OpenSeadragon.DisplayRect# + */ + this.maxLevel = maxLevel; +}; + +$.extend( $.DisplayRect.prototype, $.Rect.prototype ); + +}( OpenSeadragon )); + +/* + * OpenSeadragon - Spring + * + * Copyright (C) 2009 CodePlex Foundation + * Copyright (C) 2010-2013 OpenSeadragon contributors + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of CodePlex Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +(function( $ ){ + +/** + * @class Spring + * @memberof OpenSeadragon + * @param {Object} options - Spring configuration settings. + * @param {Number} options.springStiffness - Spring stiffness. Must be greater than zero. + * The closer to zero, the closer to linear animation. + * @param {Number} options.animationTime - Animation duration per spring, in seconds. + * Must be zero or greater. + * @param {Number} [options.initial=0] - Initial value of spring. + * @param {Boolean} [options.exponential=false] - Whether this spring represents + * an exponential scale (such as zoom) and should be animated accordingly. Note that + * exponential springs must have non-zero values. + */ +$.Spring = function( options ) { + var args = arguments; + + if( typeof( options ) != 'object' ){ + //allows backward compatible use of ( initialValue, config ) as + //constructor parameters + options = { + initial: args.length && typeof ( args[ 0 ] ) == "number" ? + args[ 0 ] : + undefined, + /** + * Spring stiffness. + * @member {Number} springStiffness + * @memberof OpenSeadragon.Spring# + */ + springStiffness: args.length > 1 ? + args[ 1 ].springStiffness : + 5.0, + /** + * Animation duration per spring. + * @member {Number} animationTime + * @memberof OpenSeadragon.Spring# + */ + animationTime: args.length > 1 ? + args[ 1 ].animationTime : + 1.5 + }; + } + + $.console.assert(typeof options.springStiffness === "number" && options.springStiffness !== 0, + "[OpenSeadragon.Spring] options.springStiffness must be a non-zero number"); + + $.console.assert(typeof options.animationTime === "number" && options.animationTime >= 0, + "[OpenSeadragon.Spring] options.animationTime must be a number greater than or equal to 0"); + + if (options.exponential) { + this._exponential = true; + delete options.exponential; + } + + $.extend( true, this, options); + + /** + * @member {Object} current + * @memberof OpenSeadragon.Spring# + * @property {Number} value + * @property {Number} time + */ + this.current = { + value: typeof ( this.initial ) == "number" ? + this.initial : + (this._exponential ? 0 : 1), + time: $.now() // always work in milliseconds + }; + + $.console.assert(!this._exponential || this.current.value !== 0, + "[OpenSeadragon.Spring] value must be non-zero for exponential springs"); + + /** + * @member {Object} start + * @memberof OpenSeadragon.Spring# + * @property {Number} value + * @property {Number} time + */ + this.start = { + value: this.current.value, + time: this.current.time + }; + + /** + * @member {Object} target + * @memberof OpenSeadragon.Spring# + * @property {Number} value + * @property {Number} time + */ + this.target = { + value: this.current.value, + time: this.current.time + }; + + if (this._exponential) { + this.start._logValue = Math.log(this.start.value); + this.target._logValue = Math.log(this.target.value); + this.current._logValue = Math.log(this.current.value); + } +}; + +/** @lends OpenSeadragon.Spring.prototype */ +$.Spring.prototype = { + + /** + * @function + * @param {Number} target + */ + resetTo: function( target ) { + $.console.assert(!this._exponential || target !== 0, + "[OpenSeadragon.Spring.resetTo] target must be non-zero for exponential springs"); + + this.start.value = this.target.value = this.current.value = target; + this.start.time = this.target.time = this.current.time = $.now(); + + if (this._exponential) { + this.start._logValue = Math.log(this.start.value); + this.target._logValue = Math.log(this.target.value); + this.current._logValue = Math.log(this.current.value); + } + }, + + /** + * @function + * @param {Number} target + */ + springTo: function( target ) { + $.console.assert(!this._exponential || target !== 0, + "[OpenSeadragon.Spring.springTo] target must be non-zero for exponential springs"); + + this.start.value = this.current.value; + this.start.time = this.current.time; + this.target.value = target; + this.target.time = this.start.time + 1000 * this.animationTime; + + if (this._exponential) { + this.start._logValue = Math.log(this.start.value); + this.target._logValue = Math.log(this.target.value); + } + }, + + /** + * @function + * @param {Number} delta + */ + shiftBy: function( delta ) { + this.start.value += delta; + this.target.value += delta; + + if (this._exponential) { + $.console.assert(this.target.value !== 0 && this.start.value !== 0, + "[OpenSeadragon.Spring.shiftBy] spring value must be non-zero for exponential springs"); + + this.start._logValue = Math.log(this.start.value); + this.target._logValue = Math.log(this.target.value); + } + }, + + setExponential: function(value) { + this._exponential = value; + + if (this._exponential) { + $.console.assert(this.current.value !== 0 && this.target.value !== 0 && this.start.value !== 0, + "[OpenSeadragon.Spring.setExponential] spring value must be non-zero for exponential springs"); + + this.start._logValue = Math.log(this.start.value); + this.target._logValue = Math.log(this.target.value); + this.current._logValue = Math.log(this.current.value); + } + }, + + /** + * @function + */ + update: function() { + this.current.time = $.now(); + + var startValue, targetValue; + if (this._exponential) { + startValue = this.start._logValue; + targetValue = this.target._logValue; + } else { + startValue = this.start.value; + targetValue = this.target.value; + } + + var currentValue = (this.current.time >= this.target.time) ? + targetValue : + startValue + + ( targetValue - startValue ) * + transform( + this.springStiffness, + ( this.current.time - this.start.time ) / + ( this.target.time - this.start.time ) + ); + + if (this._exponential) { + this.current.value = Math.exp(currentValue); + } else { + this.current.value = currentValue; + } + }, + + /** + * Returns whether the spring is at the target value + * @function + * @returns {Boolean} True if at target value, false otherwise + */ + isAtTargetValue: function() { + return this.current.value === this.target.value; + } +}; + +/** + * @private + */ +function transform( stiffness, x ) { + return ( 1.0 - Math.exp( stiffness * -x ) ) / + ( 1.0 - Math.exp( -stiffness ) ); +} + +}( OpenSeadragon )); + +/* + * OpenSeadragon - ImageLoader + * + * Copyright (C) 2009 CodePlex Foundation + * Copyright (C) 2010-2013 OpenSeadragon contributors + + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of CodePlex Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +(function( $ ){ + +// private class +function ImageJob ( options ) { + + $.extend( true, this, { + timeout: $.DEFAULT_SETTINGS.timeout, + jobId: null + }, options ); + + /** + * Image object which will contain downloaded image. + * @member {Image} image + * @memberof OpenSeadragon.ImageJob# + */ + this.image = null; +} + +ImageJob.prototype = { + errorMsg: null, + start: function(){ + var _this = this; + + this.image = new Image(); + + if ( this.crossOriginPolicy !== false ) { + this.image.crossOrigin = this.crossOriginPolicy; + } + + this.image.onload = function(){ + _this.finish( true ); + }; + this.image.onabort = this.image.onerror = function(){ + _this.errorMsg = "Image load aborted"; + _this.finish( false ); + }; + + this.jobId = window.setTimeout( function(){ + _this.errorMsg = "Image load exceeded timeout"; + _this.finish( false ); + }, this.timeout); + + this.image.src = this.src; + }, + + finish: function( successful ) { + this.image.onload = this.image.onerror = this.image.onabort = null; + if (!successful) { + this.image = null; + } + + if ( this.jobId ) { + window.clearTimeout( this.jobId ); + } + + this.callback( this ); + } + +}; + +/** + * @class ImageLoader + * @memberof OpenSeadragon + * @classdesc Handles downloading of a set of images using asynchronous queue pattern. + * You generally won't have to interact with the ImageLoader directly. + * @param {Object} options - Options for this ImageLoader. + * @param {Number} [options.jobLimit] - The number of concurrent image requests. See imageLoaderLimit in {@link OpenSeadragon.Options} for details. + */ +$.ImageLoader = function( options ) { + + $.extend( true, this, { + jobLimit: $.DEFAULT_SETTINGS.imageLoaderLimit, + jobQueue: [], + jobsInProgress: 0 + }, options ); + +}; + +/** @lends OpenSeadragon.ImageLoader.prototype */ +$.ImageLoader.prototype = { + + /** + * Add an unloaded image to the loader queue. + * @method + * @param {String} src - URL of image to download. + * @param {String} crossOriginPolicy - CORS policy to use for downloads + * @param {Function} callback - Called once image has been downloaded. + */ + addJob: function( options ) { + var _this = this, + complete = function( job ) { + completeJob( _this, job, options.callback ); + }, + jobOptions = { + src: options.src, + crossOriginPolicy: options.crossOriginPolicy, + callback: complete, + abort: options.abort + }, + newJob = new ImageJob( jobOptions ); + + if ( !this.jobLimit || this.jobsInProgress < this.jobLimit ) { + newJob.start(); + this.jobsInProgress++; + } + else { + this.jobQueue.push( newJob ); + } + }, + + /** + * Clear any unstarted image loading jobs from the queue. + * @method + */ + clear: function() { + for( var i = 0; i < this.jobQueue.length; i++ ) { + var job = this.jobQueue[i]; + if ( typeof job.abort === "function" ) { + job.abort(); + } + } + + this.jobQueue = []; + } +}; + +/** + * Cleans up ImageJob once completed. + * @method + * @private + * @param loader - ImageLoader used to start job. + * @param job - The ImageJob that has completed. + * @param callback - Called once cleanup is finished. + */ +function completeJob( loader, job, callback ) { + var nextJob; + + loader.jobsInProgress--; + + if ( (!loader.jobLimit || loader.jobsInProgress < loader.jobLimit) && loader.jobQueue.length > 0) { + nextJob = loader.jobQueue.shift(); + nextJob.start(); + loader.jobsInProgress++; + } + + callback( job.image, job.errorMsg ); +} + +}( OpenSeadragon )); + +/* + * OpenSeadragon - Tile + * + * Copyright (C) 2009 CodePlex Foundation + * Copyright (C) 2010-2013 OpenSeadragon contributors + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of CodePlex Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +(function( $ ){ + +/** + * @class Tile + * @memberof OpenSeadragon + * @param {Number} level The zoom level this tile belongs to. + * @param {Number} x The vector component 'x'. + * @param {Number} y The vector component 'y'. + * @param {OpenSeadragon.Point} bounds Where this tile fits, in normalized + * coordinates. + * @param {Boolean} exists Is this tile a part of a sparse image? ( Also has + * this tile failed to load? ) + * @param {String} url The URL of this tile's image. + * @param {CanvasRenderingContext2D} context2D The context2D of this tile if it + * is provided directly by the tile source. + */ +$.Tile = function(level, x, y, bounds, exists, url, context2D) { + /** + * The zoom level this tile belongs to. + * @member {Number} level + * @memberof OpenSeadragon.Tile# + */ + this.level = level; + /** + * The vector component 'x'. + * @member {Number} x + * @memberof OpenSeadragon.Tile# + */ + this.x = x; + /** + * The vector component 'y'. + * @member {Number} y + * @memberof OpenSeadragon.Tile# + */ + this.y = y; + /** + * Where this tile fits, in normalized coordinates + * @member {OpenSeadragon.Rect} bounds + * @memberof OpenSeadragon.Tile# + */ + this.bounds = bounds; + /** + * Is this tile a part of a sparse image? Also has this tile failed to load? + * @member {Boolean} exists + * @memberof OpenSeadragon.Tile# + */ + this.exists = exists; + /** + * The URL of this tile's image. + * @member {String} url + * @memberof OpenSeadragon.Tile# + */ + this.url = url; + /** + * The context2D of this tile if it is provided directly by the tile source. + * @member {CanvasRenderingContext2D} context2D + * @memberOf OpenSeadragon.Tile# + */ + this.context2D = context2D; + /** + * Is this tile loaded? + * @member {Boolean} loaded + * @memberof OpenSeadragon.Tile# + */ + this.loaded = false; + /** + * Is this tile loading? + * @member {Boolean} loading + * @memberof OpenSeadragon.Tile# + */ + this.loading = false; + + /** + * The HTML div element for this tile + * @member {Element} element + * @memberof OpenSeadragon.Tile# + */ + this.element = null; + /** + * The HTML img element for this tile. + * @member {Element} imgElement + * @memberof OpenSeadragon.Tile# + */ + this.imgElement = null; + /** + * The Image object for this tile. + * @member {Object} image + * @memberof OpenSeadragon.Tile# + */ + this.image = null; + + /** + * The alias of this.element.style. + * @member {String} style + * @memberof OpenSeadragon.Tile# + */ + this.style = null; + /** + * This tile's position on screen, in pixels. + * @member {OpenSeadragon.Point} position + * @memberof OpenSeadragon.Tile# + */ + this.position = null; + /** + * This tile's size on screen, in pixels. + * @member {OpenSeadragon.Point} size + * @memberof OpenSeadragon.Tile# + */ + this.size = null; + /** + * The start time of this tile's blending. + * @member {Number} blendStart + * @memberof OpenSeadragon.Tile# + */ + this.blendStart = null; + /** + * The current opacity this tile should be. + * @member {Number} opacity + * @memberof OpenSeadragon.Tile# + */ + this.opacity = null; + /** + * The distance of this tile to the viewport center. + * @member {Number} distance + * @memberof OpenSeadragon.Tile# + */ + this.distance = null; + /** + * The visibility score of this tile. + * @member {Number} visibility + * @memberof OpenSeadragon.Tile# + */ + this.visibility = null; + + /** + * Whether this tile is currently being drawn. + * @member {Boolean} beingDrawn + * @memberof OpenSeadragon.Tile# + */ + this.beingDrawn = false; + /** + * Timestamp the tile was last touched. + * @member {Number} lastTouchTime + * @memberof OpenSeadragon.Tile# + */ + this.lastTouchTime = 0; +}; + +/** @lends OpenSeadragon.Tile.prototype */ +$.Tile.prototype = { + + /** + * Provides a string representation of this tiles level and (x,y) + * components. + * @function + * @returns {String} + */ + toString: function() { + return this.level + "/" + this.x + "_" + this.y; + }, + + // private + _hasTransparencyChannel: function() { + return !!this.context2D || this.url.match('.png'); + }, + + /** + * Renders the tile in an html container. + * @function + * @param {Element} container + */ + drawHTML: function( container ) { + if (!this.cacheImageRecord) { + $.console.warn( + '[Tile.drawHTML] attempting to draw tile %s when it\'s not cached', + this.toString()); + return; + } + + if ( !this.loaded ) { + $.console.warn( + "Attempting to draw tile %s when it's not yet loaded.", + this.toString() + ); + return; + } + + //EXPERIMENTAL - trying to figure out how to scale the container + // content during animation of the container size. + + if ( !this.element ) { + this.element = $.makeNeutralElement( "div" ); + this.imgElement = this.cacheImageRecord.getImage().cloneNode(); + this.imgElement.style.msInterpolationMode = "nearest-neighbor"; + this.imgElement.style.width = "100%"; + this.imgElement.style.height = "100%"; + + this.style = this.element.style; + this.style.position = "absolute"; + } + if ( this.element.parentNode != container ) { + container.appendChild( this.element ); + } + if ( this.imgElement.parentNode != this.element ) { + this.element.appendChild( this.imgElement ); + } + + this.style.top = this.position.y + "px"; + this.style.left = this.position.x + "px"; + this.style.height = this.size.y + "px"; + this.style.width = this.size.x + "px"; + + $.setElementOpacity( this.element, this.opacity ); + }, + + /** + * Renders the tile in a canvas-based context. + * @function + * @param {Canvas} context + * @param {Function} drawingHandler - Method for firing the drawing event. + * drawingHandler({context, tile, rendered}) + * where rendered is the context with the pre-drawn image. + * @param {Number} [scale=1] - Apply a scale to position and size + * @param {OpenSeadragon.Point} [translate] - A translation vector + */ + drawCanvas: function( context, drawingHandler, scale, translate ) { + + var position = this.position.times($.pixelDensityRatio), + size = this.size.times($.pixelDensityRatio), + rendered; + + if (!this.context2D && !this.cacheImageRecord) { + $.console.warn( + '[Tile.drawCanvas] attempting to draw tile %s when it\'s not cached', + this.toString()); + return; + } + + rendered = this.context2D || this.cacheImageRecord.getRenderedContext(); + + if ( !this.loaded || !rendered ){ + $.console.warn( + "Attempting to draw tile %s when it's not yet loaded.", + this.toString() + ); + + return; + } + + context.save(); + + context.globalAlpha = this.opacity; + + if (typeof scale === 'number' && scale !== 1) { + // draw tile at a different scale + position = position.times(scale); + size = size.times(scale); + } + + if (translate instanceof $.Point) { + // shift tile position slightly + position = position.plus(translate); + } + + //if we are supposed to be rendering fully opaque rectangle, + //ie its done fading or fading is turned off, and if we are drawing + //an image with an alpha channel, then the only way + //to avoid seeing the tile underneath is to clear the rectangle + if (context.globalAlpha === 1 && this._hasTransparencyChannel()) { + //clearing only the inside of the rectangle occupied + //by the png prevents edge flikering + context.clearRect( + position.x + 1, + position.y + 1, + size.x - 2, + size.y - 2 + ); + } + + // This gives the application a chance to make image manipulation + // changes as we are rendering the image + drawingHandler({context: context, tile: this, rendered: rendered}); + + context.drawImage( + rendered.canvas, + 0, + 0, + rendered.canvas.width, + rendered.canvas.height, + position.x, + position.y, + size.x, + size.y + ); + + context.restore(); + }, + + /** + * Get the ratio between current and original size. + * @function + * @return {Float} + */ + getScaleForEdgeSmoothing: function() { + var context; + if (this.cacheImageRecord) { + context = this.cacheImageRecord.getRenderedContext(); + } else if (this.context2D) { + context = this.context2D; + } else { + $.console.warn( + '[Tile.drawCanvas] attempting to get tile scale %s when tile\'s not cached', + this.toString()); + return 1; + } + return context.canvas.width / (this.size.x * $.pixelDensityRatio); + }, + + /** + * Get a translation vector that when applied to the tile position produces integer coordinates. + * Needed to avoid swimming and twitching. + * @function + * @param {Number} [scale=1] - Scale to be applied to position. + * @return {OpenSeadragon.Point} + */ + getTranslationForEdgeSmoothing: function(scale, canvasSize, sketchCanvasSize) { + // The translation vector must have positive values, otherwise the image goes a bit off + // the sketch canvas to the top and left and we must use negative coordinates to repaint it + // to the main canvas. In that case, some browsers throw: + // INDEX_SIZE_ERR: DOM Exception 1: Index or size was negative, or greater than the allowed value. + var x = Math.max(1, Math.ceil((sketchCanvasSize.x - canvasSize.x) / 2)); + var y = Math.max(1, Math.ceil((sketchCanvasSize.y - canvasSize.y) / 2)); + return new $.Point(x, y).minus( + this.position + .times($.pixelDensityRatio) + .times(scale || 1) + .apply(function(x) { + return x % 1; + }) + ); + }, + + /** + * Removes tile from its container. + * @function + */ + unload: function() { + if ( this.imgElement && this.imgElement.parentNode ) { + this.imgElement.parentNode.removeChild( this.imgElement ); + } + if ( this.element && this.element.parentNode ) { + this.element.parentNode.removeChild( this.element ); + } + + this.element = null; + this.imgElement = null; + this.loaded = false; + this.loading = false; + } +}; + +}( OpenSeadragon )); + +/* + * OpenSeadragon - Overlay + * + * Copyright (C) 2009 CodePlex Foundation + * Copyright (C) 2010-2013 OpenSeadragon contributors + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of CodePlex Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +(function($) { + + /** + * An enumeration of positions that an overlay may be assigned relative to + * the viewport. + * It is identical to OpenSeadragon.Placement but is kept for backward + * compatibility. + * @member OverlayPlacement + * @memberof OpenSeadragon + * @static + * @readonly + * @type {Object} + * @property {Number} CENTER + * @property {Number} TOP_LEFT + * @property {Number} TOP + * @property {Number} TOP_RIGHT + * @property {Number} RIGHT + * @property {Number} BOTTOM_RIGHT + * @property {Number} BOTTOM + * @property {Number} BOTTOM_LEFT + * @property {Number} LEFT + */ + $.OverlayPlacement = $.Placement; + + /** + * An enumeration of possible ways to handle overlays rotation + * @member OverlayRotationMode + * @memberOf OpenSeadragon + * @static + * @readonly + * @property {Number} NO_ROTATION The overlay ignore the viewport rotation. + * @property {Number} EXACT The overlay use CSS 3 transforms to rotate with + * the viewport. If the overlay contains text, it will get rotated as well. + * @property {Number} BOUNDING_BOX The overlay adjusts for rotation by + * taking the size of the bounding box of the rotated bounds. + * Only valid for overlays with Rect location and scalable in both directions. + */ + $.OverlayRotationMode = $.freezeObject({ + NO_ROTATION: 1, + EXACT: 2, + BOUNDING_BOX: 3 + }); + + /** + * @class Overlay + * @classdesc Provides a way to float an HTML element on top of the viewer element. + * + * @memberof OpenSeadragon + * @param {Object} options + * @param {Element} options.element + * @param {OpenSeadragon.Point|OpenSeadragon.Rect} options.location - The + * location of the overlay on the image. If a {@link OpenSeadragon.Point} + * is specified, the overlay will be located at this location with respect + * to the placement option. If a {@link OpenSeadragon.Rect} is specified, + * the overlay will be placed at this location with the corresponding width + * and height and placement TOP_LEFT. + * @param {OpenSeadragon.Placement} [options.placement=OpenSeadragon.Placement.TOP_LEFT] + * Defines what part of the overlay should be at the specified options.location + * @param {OpenSeadragon.Overlay.OnDrawCallback} [options.onDraw] + * @param {Boolean} [options.checkResize=true] Set to false to avoid to + * check the size of the overlay everytime it is drawn in the directions + * which are not scaled. It will improve performances but will cause a + * misalignment if the overlay size changes. + * @param {Number} [options.width] The width of the overlay in viewport + * coordinates. If specified, the width of the overlay will be adjusted when + * the zoom changes. + * @param {Number} [options.height] The height of the overlay in viewport + * coordinates. If specified, the height of the overlay will be adjusted when + * the zoom changes. + * @param {Boolean} [options.rotationMode=OpenSeadragon.OverlayRotationMode.EXACT] + * How to handle the rotation of the viewport. + */ + $.Overlay = function(element, location, placement) { + + /** + * onDraw callback signature used by {@link OpenSeadragon.Overlay}. + * + * @callback OnDrawCallback + * @memberof OpenSeadragon.Overlay + * @param {OpenSeadragon.Point} position + * @param {OpenSeadragon.Point} size + * @param {Element} element + */ + + var options; + if ($.isPlainObject(element)) { + options = element; + } else { + options = { + element: element, + location: location, + placement: placement + }; + } + + this.element = options.element; + this.style = options.element.style; + this._init(options); + }; + + /** @lends OpenSeadragon.Overlay.prototype */ + $.Overlay.prototype = { + + // private + _init: function(options) { + this.location = options.location; + this.placement = options.placement === undefined ? + $.Placement.TOP_LEFT : options.placement; + this.onDraw = options.onDraw; + this.checkResize = options.checkResize === undefined ? + true : options.checkResize; + + // When this.width is not null, the overlay get scaled horizontally + this.width = options.width === undefined ? null : options.width; + + // When this.height is not null, the overlay get scaled vertically + this.height = options.height === undefined ? null : options.height; + + this.rotationMode = options.rotationMode || $.OverlayRotationMode.EXACT; + + // Having a rect as location is a syntactic sugar + if (this.location instanceof $.Rect) { + this.width = this.location.width; + this.height = this.location.height; + this.location = this.location.getTopLeft(); + this.placement = $.Placement.TOP_LEFT; + } + + // Deprecated properties kept for backward compatibility. + this.scales = this.width !== null && this.height !== null; + this.bounds = new $.Rect( + this.location.x, this.location.y, this.width, this.height); + this.position = this.location; + }, + + /** + * Internal function to adjust the position of an overlay + * depending on it size and placement. + * @function + * @param {OpenSeadragon.Point} position + * @param {OpenSeadragon.Point} size + */ + adjust: function(position, size) { + var properties = $.Placement.properties[this.placement]; + if (!properties) { + return; + } + if (properties.isHorizontallyCentered) { + position.x -= size.x / 2; + } else if (properties.isRight) { + position.x -= size.x; + } + if (properties.isVerticallyCentered) { + position.y -= size.y / 2; + } else if (properties.isBottom) { + position.y -= size.y; + } + }, + + /** + * @function + */ + destroy: function() { + var element = this.element; + var style = this.style; + + if (element.parentNode) { + element.parentNode.removeChild(element); + //this should allow us to preserve overlays when required between + //pages + if (element.prevElementParent) { + style.display = 'none'; + //element.prevElementParent.insertBefore( + // element, + // element.prevNextSibling + //); + document.body.appendChild(element); + } + } + + // clear the onDraw callback + this.onDraw = null; + + style.top = ""; + style.left = ""; + style.position = ""; + + if (this.width !== null) { + style.width = ""; + } + if (this.height !== null) { + style.height = ""; + } + var transformOriginProp = $.getCssPropertyWithVendorPrefix( + 'transformOrigin'); + var transformProp = $.getCssPropertyWithVendorPrefix( + 'transform'); + if (transformOriginProp && transformProp) { + style[transformOriginProp] = ""; + style[transformProp] = ""; + } + }, + + /** + * @function + * @param {Element} container + */ + drawHTML: function(container, viewport) { + var element = this.element; + if (element.parentNode !== container) { + //save the source parent for later if we need it + element.prevElementParent = element.parentNode; + element.prevNextSibling = element.nextSibling; + container.appendChild(element); + + // this.size is used by overlays which don't get scaled in at + // least one direction when this.checkResize is set to false. + this.size = $.getElementSize(element); + } + + var positionAndSize = this._getOverlayPositionAndSize(viewport); + + var position = positionAndSize.position; + var size = this.size = positionAndSize.size; + var rotate = positionAndSize.rotate; + + // call the onDraw callback if it exists to allow one to overwrite + // the drawing/positioning/sizing of the overlay + if (this.onDraw) { + this.onDraw(position, size, this.element); + } else { + var style = this.style; + style.left = position.x + "px"; + style.top = position.y + "px"; + if (this.width !== null) { + style.width = size.x + "px"; + } + if (this.height !== null) { + style.height = size.y + "px"; + } + var transformOriginProp = $.getCssPropertyWithVendorPrefix( + 'transformOrigin'); + var transformProp = $.getCssPropertyWithVendorPrefix( + 'transform'); + if (transformOriginProp && transformProp) { + if (rotate) { + style[transformOriginProp] = this._getTransformOrigin(); + style[transformProp] = "rotate(" + rotate + "deg)"; + } else { + style[transformOriginProp] = ""; + style[transformProp] = ""; + } + } + style.position = "absolute"; + + if (style.display !== 'none') { + style.display = 'block'; + } + } + }, + + // private + _getOverlayPositionAndSize: function(viewport) { + var position = viewport.pixelFromPoint(this.location, true); + var size = this._getSizeInPixels(viewport); + this.adjust(position, size); + + var rotate = 0; + if (viewport.degrees && + this.rotationMode !== $.OverlayRotationMode.NO_ROTATION) { + // BOUNDING_BOX is only valid if both directions get scaled. + // Get replaced by EXACT otherwise. + if (this.rotationMode === $.OverlayRotationMode.BOUNDING_BOX && + this.width !== null && this.height !== null) { + var rect = new $.Rect(position.x, position.y, size.x, size.y); + var boundingBox = this._getBoundingBox(rect, viewport.degrees); + position = boundingBox.getTopLeft(); + size = boundingBox.getSize(); + } else { + rotate = viewport.degrees; + } + } + + return { + position: position, + size: size, + rotate: rotate + }; + }, + + // private + _getSizeInPixels: function(viewport) { + var width = this.size.x; + var height = this.size.y; + if (this.width !== null || this.height !== null) { + var scaledSize = viewport.deltaPixelsFromPointsNoRotate( + new $.Point(this.width || 0, this.height || 0), true); + if (this.width !== null) { + width = scaledSize.x; + } + if (this.height !== null) { + height = scaledSize.y; + } + } + if (this.checkResize && + (this.width === null || this.height === null)) { + var eltSize = this.size = $.getElementSize(this.element); + if (this.width === null) { + width = eltSize.x; + } + if (this.height === null) { + height = eltSize.y; + } + } + return new $.Point(width, height); + }, + + // private + _getBoundingBox: function(rect, degrees) { + var refPoint = this._getPlacementPoint(rect); + return rect.rotate(degrees, refPoint).getBoundingBox(); + }, + + // private + _getPlacementPoint: function(rect) { + var result = new $.Point(rect.x, rect.y); + var properties = $.Placement.properties[this.placement]; + if (properties) { + if (properties.isHorizontallyCentered) { + result.x += rect.width / 2; + } else if (properties.isRight) { + result.x += rect.width; + } + if (properties.isVerticallyCentered) { + result.y += rect.height / 2; + } else if (properties.isBottom) { + result.y += rect.height; + } + } + return result; + }, + + // private + _getTransformOrigin: function() { + var result = ""; + var properties = $.Placement.properties[this.placement]; + if (!properties) { + return result; + } + if (properties.isLeft) { + result = "left"; + } else if (properties.isRight) { + result = "right"; + } + if (properties.isTop) { + result += " top"; + } else if (properties.isBottom) { + result += " bottom"; + } + return result; + }, + + /** + * Changes the overlay settings. + * @function + * @param {OpenSeadragon.Point|OpenSeadragon.Rect|Object} location + * If an object is specified, the options are the same than the constructor + * except for the element which can not be changed. + * @param {OpenSeadragon.Placement} position + */ + update: function(location, placement) { + var options = $.isPlainObject(location) ? location : { + location: location, + placement: placement + }; + this._init({ + location: options.location || this.location, + placement: options.placement !== undefined ? + options.placement : this.placement, + onDraw: options.onDraw || this.onDraw, + checkResize: options.checkResize || this.checkResize, + width: options.width !== undefined ? options.width : this.width, + height: options.height !== undefined ? options.height : this.height, + rotationMode: options.rotationMode || this.rotationMode + }); + }, + + /** + * Returns the current bounds of the overlay in viewport coordinates + * @function + * @param {OpenSeadragon.Viewport} viewport the viewport + * @returns {OpenSeadragon.Rect} overlay bounds + */ + getBounds: function(viewport) { + $.console.assert(viewport, + 'A viewport must now be passed to Overlay.getBounds.'); + var width = this.width; + var height = this.height; + if (width === null || height === null) { + var size = viewport.deltaPointsFromPixelsNoRotate(this.size, true); + if (width === null) { + width = size.x; + } + if (height === null) { + height = size.y; + } + } + var location = this.location.clone(); + this.adjust(location, new $.Point(width, height)); + return this._adjustBoundsForRotation( + viewport, new $.Rect(location.x, location.y, width, height)); + }, + + // private + _adjustBoundsForRotation: function(viewport, bounds) { + if (!viewport || + viewport.degrees === 0 || + this.rotationMode === $.OverlayRotationMode.EXACT) { + return bounds; + } + if (this.rotationMode === $.OverlayRotationMode.BOUNDING_BOX) { + // If overlay not fully scalable, BOUNDING_BOX falls back to EXACT + if (this.width === null || this.height === null) { + return bounds; + } + // It is easier to just compute the position and size and + // convert to viewport coordinates. + var positionAndSize = this._getOverlayPositionAndSize(viewport); + return viewport.viewerElementToViewportRectangle(new $.Rect( + positionAndSize.position.x, + positionAndSize.position.y, + positionAndSize.size.x, + positionAndSize.size.y)); + } + + // NO_ROTATION case + return bounds.rotate(-viewport.degrees, + this._getPlacementPoint(bounds)); + } + }; + +}(OpenSeadragon)); + +/* + * OpenSeadragon - Drawer + * + * Copyright (C) 2009 CodePlex Foundation + * Copyright (C) 2010-2013 OpenSeadragon contributors + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of CodePlex Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +(function( $ ){ + +/** + * @class Drawer + * @memberof OpenSeadragon + * @classdesc Handles rendering of tiles for an {@link OpenSeadragon.Viewer}. + * @param {Object} options - Options for this Drawer. + * @param {OpenSeadragon.Viewer} options.viewer - The Viewer that owns this Drawer. + * @param {OpenSeadragon.Viewport} options.viewport - Reference to Viewer viewport. + * @param {Element} options.element - Parent element. + * @param {Number} [options.debugGridColor] - See debugGridColor in {@link OpenSeadragon.Options} for details. + */ +$.Drawer = function( options ) { + + $.console.assert( options.viewer, "[Drawer] options.viewer is required" ); + + //backward compatibility for positional args while prefering more + //idiomatic javascript options object as the only argument + var args = arguments; + + if( !$.isPlainObject( options ) ){ + options = { + source: args[ 0 ], // Reference to Viewer tile source. + viewport: args[ 1 ], // Reference to Viewer viewport. + element: args[ 2 ] // Parent element. + }; + } + + $.console.assert( options.viewport, "[Drawer] options.viewport is required" ); + $.console.assert( options.element, "[Drawer] options.element is required" ); + + if ( options.source ) { + $.console.error( "[Drawer] options.source is no longer accepted; use TiledImage instead" ); + } + + this.viewer = options.viewer; + this.viewport = options.viewport; + this.debugGridColor = options.debugGridColor || $.DEFAULT_SETTINGS.debugGridColor; + if (options.opacity) { + $.console.error( "[Drawer] options.opacity is no longer accepted; set the opacity on the TiledImage instead" ); + } + + this.useCanvas = $.supportsCanvas && ( this.viewer ? this.viewer.useCanvas : true ); + /** + * The parent element of this Drawer instance, passed in when the Drawer was created. + * The parent of {@link OpenSeadragon.Drawer#canvas}. + * @member {Element} container + * @memberof OpenSeadragon.Drawer# + */ + this.container = $.getElement( options.element ); + /** + * A <canvas> element if the browser supports them, otherwise a <div> element. + * Child element of {@link OpenSeadragon.Drawer#container}. + * @member {Element} canvas + * @memberof OpenSeadragon.Drawer# + */ + this.canvas = $.makeNeutralElement( this.useCanvas ? "canvas" : "div" ); + /** + * 2d drawing context for {@link OpenSeadragon.Drawer#canvas} if it's a <canvas> element, otherwise null. + * @member {Object} context + * @memberof OpenSeadragon.Drawer# + */ + this.context = this.useCanvas ? this.canvas.getContext( "2d" ) : null; + + /** + * Sketch canvas used to temporarily draw tiles which cannot be drawn directly + * to the main canvas due to opacity. Lazily initialized. + */ + this.sketchCanvas = null; + this.sketchContext = null; + + /** + * @member {Element} element + * @memberof OpenSeadragon.Drawer# + * @deprecated Alias for {@link OpenSeadragon.Drawer#container}. + */ + this.element = this.container; + + // We force our container to ltr because our drawing math doesn't work in rtl. + // This issue only affects our canvas renderer, but we do it always for consistency. + // Note that this means overlays you want to be rtl need to be explicitly set to rtl. + this.container.dir = 'ltr'; + + // check canvas available width and height, set canvas width and height such that the canvas backing store is set to the proper pixel density + if (this.useCanvas) { + var viewportSize = this._calculateCanvasSize(); + this.canvas.width = viewportSize.x; + this.canvas.height = viewportSize.y; + } + + this.canvas.style.width = "100%"; + this.canvas.style.height = "100%"; + this.canvas.style.position = "absolute"; + $.setElementOpacity( this.canvas, this.opacity, true ); + + // explicit left-align + this.container.style.textAlign = "left"; + this.container.appendChild( this.canvas ); +}; + +/** @lends OpenSeadragon.Drawer.prototype */ +$.Drawer.prototype = { + // deprecated + addOverlay: function( element, location, placement, onDraw ) { + $.console.error("drawer.addOverlay is deprecated. Use viewer.addOverlay instead."); + this.viewer.addOverlay( element, location, placement, onDraw ); + return this; + }, + + // deprecated + updateOverlay: function( element, location, placement ) { + $.console.error("drawer.updateOverlay is deprecated. Use viewer.updateOverlay instead."); + this.viewer.updateOverlay( element, location, placement ); + return this; + }, + + // deprecated + removeOverlay: function( element ) { + $.console.error("drawer.removeOverlay is deprecated. Use viewer.removeOverlay instead."); + this.viewer.removeOverlay( element ); + return this; + }, + + // deprecated + clearOverlays: function() { + $.console.error("drawer.clearOverlays is deprecated. Use viewer.clearOverlays instead."); + this.viewer.clearOverlays(); + return this; + }, + + /** + * Set the opacity of the drawer. + * @param {Number} opacity + * @return {OpenSeadragon.Drawer} Chainable. + */ + setOpacity: function( opacity ) { + $.console.error("drawer.setOpacity is deprecated. Use tiledImage.setOpacity instead."); + var world = this.viewer.world; + for (var i = 0; i < world.getItemCount(); i++) { + world.getItemAt( i ).setOpacity( opacity ); + } + return this; + }, + + /** + * Get the opacity of the drawer. + * @returns {Number} + */ + getOpacity: function() { + $.console.error("drawer.getOpacity is deprecated. Use tiledImage.getOpacity instead."); + var world = this.viewer.world; + var maxOpacity = 0; + for (var i = 0; i < world.getItemCount(); i++) { + var opacity = world.getItemAt( i ).getOpacity(); + if ( opacity > maxOpacity ) { + maxOpacity = opacity; + } + } + return maxOpacity; + }, + + // deprecated + needsUpdate: function() { + $.console.error( "[Drawer.needsUpdate] this function is deprecated. Use World.needsDraw instead." ); + return this.viewer.world.needsDraw(); + }, + + // deprecated + numTilesLoaded: function() { + $.console.error( "[Drawer.numTilesLoaded] this function is deprecated. Use TileCache.numTilesLoaded instead." ); + return this.viewer.tileCache.numTilesLoaded(); + }, + + // deprecated + reset: function() { + $.console.error( "[Drawer.reset] this function is deprecated. Use World.resetItems instead." ); + this.viewer.world.resetItems(); + return this; + }, + + // deprecated + update: function() { + $.console.error( "[Drawer.update] this function is deprecated. Use Drawer.clear and World.draw instead." ); + this.clear(); + this.viewer.world.draw(); + return this; + }, + + /** + * @return {Boolean} True if rotation is supported. + */ + canRotate: function() { + return this.useCanvas; + }, + + /** + * Destroy the drawer (unload current loaded tiles) + */ + destroy: function() { + //force unloading of current canvas (1x1 will be gc later, trick not necessarily needed) + this.canvas.width = 1; + this.canvas.height = 1; + this.sketchCanvas = null; + this.sketchContext = null; + }, + + /** + * Clears the Drawer so it's ready to draw another frame. + */ + clear: function() { + this.canvas.innerHTML = ""; + if ( this.useCanvas ) { + var viewportSize = this._calculateCanvasSize(); + if( this.canvas.width != viewportSize.x || + this.canvas.height != viewportSize.y ) { + this.canvas.width = viewportSize.x; + this.canvas.height = viewportSize.y; + if ( this.sketchCanvas !== null ) { + var sketchCanvasSize = this._calculateSketchCanvasSize(); + this.sketchCanvas.width = sketchCanvasSize.x; + this.sketchCanvas.height = sketchCanvasSize.y; + } + } + this._clear(); + } + }, + + _clear: function (useSketch, bounds) { + if (!this.useCanvas) { + return; + } + var context = this._getContext(useSketch); + if (bounds) { + context.clearRect(bounds.x, bounds.y, bounds.width, bounds.height); + } else { + var canvas = context.canvas; + context.clearRect(0, 0, canvas.width, canvas.height); + } + }, + + /** + * Scale from OpenSeadragon viewer rectangle to drawer rectangle + * (ignoring rotation) + * @param {OpenSeadragon.Rect} rectangle - The rectangle in viewport coordinate system. + * @return {OpenSeadragon.Rect} Rectangle in drawer coordinate system. + */ + viewportToDrawerRectangle: function(rectangle) { + var topLeft = this.viewport.pixelFromPointNoRotate(rectangle.getTopLeft(), true); + var size = this.viewport.deltaPixelsFromPointsNoRotate(rectangle.getSize(), true); + + return new $.Rect( + topLeft.x * $.pixelDensityRatio, + topLeft.y * $.pixelDensityRatio, + size.x * $.pixelDensityRatio, + size.y * $.pixelDensityRatio + ); + }, + + /** + * Draws the given tile. + * @param {OpenSeadragon.Tile} tile - The tile to draw. + * @param {Function} drawingHandler - Method for firing the drawing event if using canvas. + * drawingHandler({context, tile, rendered}) + * @param {Boolean} useSketch - Whether to use the sketch canvas or not. + * where rendered is the context with the pre-drawn image. + * @param {Float} [scale=1] - Apply a scale to tile position and size. Defaults to 1. + * @param {OpenSeadragon.Point} [translate] A translation vector to offset tile position + */ + drawTile: function(tile, drawingHandler, useSketch, scale, translate) { + $.console.assert(tile, '[Drawer.drawTile] tile is required'); + $.console.assert(drawingHandler, '[Drawer.drawTile] drawingHandler is required'); + + if (this.useCanvas) { + var context = this._getContext(useSketch); + scale = scale || 1; + tile.drawCanvas(context, drawingHandler, scale, translate); + } else { + tile.drawHTML( this.canvas ); + } + }, + + _getContext: function( useSketch ) { + var context = this.context; + if ( useSketch ) { + if (this.sketchCanvas === null) { + this.sketchCanvas = document.createElement( "canvas" ); + var sketchCanvasSize = this._calculateSketchCanvasSize(); + this.sketchCanvas.width = sketchCanvasSize.x; + this.sketchCanvas.height = sketchCanvasSize.y; + this.sketchContext = this.sketchCanvas.getContext( "2d" ); + + // If the viewport is not currently rotated, the sketchCanvas + // will have the same size as the main canvas. However, if + // the viewport get rotated later on, we will need to resize it. + if (this.viewport.getRotation() === 0) { + var self = this; + this.viewer.addHandler('rotate', function resizeSketchCanvas() { + self.viewer.removeHandler('rotate', resizeSketchCanvas); + var sketchCanvasSize = self._calculateSketchCanvasSize(); + self.sketchCanvas.width = sketchCanvasSize.x; + self.sketchCanvas.height = sketchCanvasSize.y; + }); + } + } + context = this.sketchContext; + } + return context; + }, + + // private + saveContext: function( useSketch ) { + if (!this.useCanvas) { + return; + } + + this._getContext( useSketch ).save(); + }, + + // private + restoreContext: function( useSketch ) { + if (!this.useCanvas) { + return; + } + + this._getContext( useSketch ).restore(); + }, + + // private + setClip: function(rect, useSketch) { + if (!this.useCanvas) { + return; + } + + var context = this._getContext( useSketch ); + context.beginPath(); + context.rect(rect.x, rect.y, rect.width, rect.height); + context.clip(); + }, + + // private + drawRectangle: function(rect, fillStyle, useSketch) { + if (!this.useCanvas) { + return; + } + + var context = this._getContext( useSketch ); + context.save(); + context.fillStyle = fillStyle; + context.fillRect(rect.x, rect.y, rect.width, rect.height); + context.restore(); + }, + + /** + * Blends the sketch canvas in the main canvas. + * @param {Object} options The options + * @param {Float} options.opacity The opacity of the blending. + * @param {Float} [options.scale=1] The scale at which tiles were drawn on + * the sketch. Default is 1. + * Use scale to draw at a lower scale and then enlarge onto the main canvas. + * @param {OpenSeadragon.Point} [options.translate] A translation vector + * that was used to draw the tiles + * @param {String} [options.compositeOperation] - How the image is + * composited onto other images; see compositeOperation in + * {@link OpenSeadragon.Options} for possible values. + * @param {OpenSeadragon.Rect} [options.bounds] The part of the sketch + * canvas to blend in the main canvas. If specified, options.scale and + * options.translate get ignored. + */ + blendSketch: function(opacity, scale, translate, compositeOperation) { + var options = opacity; + if (!$.isPlainObject(options)) { + options = { + opacity: opacity, + scale: scale, + translate: translate, + compositeOperation: compositeOperation + }; + } + if (!this.useCanvas || !this.sketchCanvas) { + return; + } + opacity = options.opacity; + compositeOperation = options.compositeOperation; + var bounds = options.bounds; + + this.context.save(); + this.context.globalAlpha = opacity; + if (compositeOperation) { + this.context.globalCompositeOperation = compositeOperation; + } + if (bounds) { + this.context.drawImage( + this.sketchCanvas, + bounds.x, + bounds.y, + bounds.width, + bounds.height, + bounds.x, + bounds.y, + bounds.width, + bounds.height + ); + } else { + scale = options.scale || 1; + translate = options.translate; + var position = translate instanceof $.Point ? + translate : new $.Point(0, 0); + + var widthExt = 0; + var heightExt = 0; + if (translate) { + var widthDiff = this.sketchCanvas.width - this.canvas.width; + var heightDiff = this.sketchCanvas.height - this.canvas.height; + widthExt = Math.round(widthDiff / 2); + heightExt = Math.round(heightDiff / 2); + } + this.context.drawImage( + this.sketchCanvas, + position.x - widthExt * scale, + position.y - heightExt * scale, + (this.canvas.width + 2 * widthExt) * scale, + (this.canvas.height + 2 * heightExt) * scale, + -widthExt, + -heightExt, + this.canvas.width + 2 * widthExt, + this.canvas.height + 2 * heightExt + ); + } + this.context.restore(); + }, + + // private + drawDebugInfo: function( tile, count, i ){ + if ( !this.useCanvas ) { + return; + } + + var context = this.context; + context.save(); + context.lineWidth = 2 * $.pixelDensityRatio; + context.font = 'small-caps bold ' + (13 * $.pixelDensityRatio) + 'px arial'; + context.strokeStyle = this.debugGridColor; + context.fillStyle = this.debugGridColor; + + if ( this.viewport.degrees !== 0 ) { + this._offsetForRotation(this.viewport.degrees); + } + + context.strokeRect( + tile.position.x * $.pixelDensityRatio, + tile.position.y * $.pixelDensityRatio, + tile.size.x * $.pixelDensityRatio, + tile.size.y * $.pixelDensityRatio + ); + + var tileCenterX = (tile.position.x + (tile.size.x / 2)) * $.pixelDensityRatio; + var tileCenterY = (tile.position.y + (tile.size.y / 2)) * $.pixelDensityRatio; + + // Rotate the text the right way around. + context.translate( tileCenterX, tileCenterY ); + context.rotate( Math.PI / 180 * -this.viewport.degrees ); + context.translate( -tileCenterX, -tileCenterY ); + + if( tile.x === 0 && tile.y === 0 ){ + context.fillText( + "Zoom: " + this.viewport.getZoom(), + tile.position.x * $.pixelDensityRatio, + (tile.position.y - 30) * $.pixelDensityRatio + ); + context.fillText( + "Pan: " + this.viewport.getBounds().toString(), + tile.position.x * $.pixelDensityRatio, + (tile.position.y - 20) * $.pixelDensityRatio + ); + } + context.fillText( + "Level: " + tile.level, + (tile.position.x + 10) * $.pixelDensityRatio, + (tile.position.y + 20) * $.pixelDensityRatio + ); + context.fillText( + "Column: " + tile.x, + (tile.position.x + 10) * $.pixelDensityRatio, + (tile.position.y + 30) * $.pixelDensityRatio + ); + context.fillText( + "Row: " + tile.y, + (tile.position.x + 10) * $.pixelDensityRatio, + (tile.position.y + 40) * $.pixelDensityRatio + ); + context.fillText( + "Order: " + i + " of " + count, + (tile.position.x + 10) * $.pixelDensityRatio, + (tile.position.y + 50) * $.pixelDensityRatio + ); + context.fillText( + "Size: " + tile.size.toString(), + (tile.position.x + 10) * $.pixelDensityRatio, + (tile.position.y + 60) * $.pixelDensityRatio + ); + context.fillText( + "Position: " + tile.position.toString(), + (tile.position.x + 10) * $.pixelDensityRatio, + (tile.position.y + 70) * $.pixelDensityRatio + ); + + if ( this.viewport.degrees !== 0 ) { + this._restoreRotationChanges(); + } + context.restore(); + }, + + // private + debugRect: function(rect) { + if ( this.useCanvas ) { + var context = this.context; + context.save(); + context.lineWidth = 2 * $.pixelDensityRatio; + context.strokeStyle = this.debugGridColor; + context.fillStyle = this.debugGridColor; + + context.strokeRect( + rect.x * $.pixelDensityRatio, + rect.y * $.pixelDensityRatio, + rect.width * $.pixelDensityRatio, + rect.height * $.pixelDensityRatio + ); + + context.restore(); + } + }, + + /** + * Get the canvas size + * @param {Boolean} sketch If set to true return the size of the sketch canvas + * @returns {OpenSeadragon.Point} The size of the canvas + */ + getCanvasSize: function(sketch) { + var canvas = this._getContext(sketch).canvas; + return new $.Point(canvas.width, canvas.height); + }, + + // private + _offsetForRotation: function(degrees, useSketch) { + var cx = this.canvas.width / 2; + var cy = this.canvas.height / 2; + + var context = this._getContext(useSketch); + context.save(); + + context.translate(cx, cy); + context.rotate(Math.PI / 180 * degrees); + context.translate(-cx, -cy); + }, + + // private + _restoreRotationChanges: function(useSketch) { + var context = this._getContext(useSketch); + context.restore(); + }, + + // private + _calculateCanvasSize: function() { + var pixelDensityRatio = $.pixelDensityRatio; + var viewportSize = this.viewport.getContainerSize(); + return { + x: viewportSize.x * pixelDensityRatio, + y: viewportSize.y * pixelDensityRatio + }; + }, + + // private + _calculateSketchCanvasSize: function() { + var canvasSize = this._calculateCanvasSize(); + if (this.viewport.getRotation() === 0) { + return canvasSize; + } + // If the viewport is rotated, we need a larger sketch canvas in order + // to support edge smoothing. + var sketchCanvasSize = Math.ceil(Math.sqrt( + canvasSize.x * canvasSize.x + + canvasSize.y * canvasSize.y)); + return { + x: sketchCanvasSize, + y: sketchCanvasSize + }; + } +}; + +}( OpenSeadragon )); + +/* + * OpenSeadragon - Viewport + * + * Copyright (C) 2009 CodePlex Foundation + * Copyright (C) 2010-2013 OpenSeadragon contributors + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of CodePlex Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +(function( $ ){ + + +/** + * @class Viewport + * @memberof OpenSeadragon + * @classdesc Handles coordinate-related functionality (zoom, pan, rotation, etc.) + * for an {@link OpenSeadragon.Viewer}. + * @param {Object} options - Options for this Viewport. + * @param {Object} [options.margins] - See viewportMargins in {@link OpenSeadragon.Options}. + * @param {Number} [options.springStiffness] - See springStiffness in {@link OpenSeadragon.Options}. + * @param {Number} [options.animationTime] - See animationTime in {@link OpenSeadragon.Options}. + * @param {Number} [options.minZoomImageRatio] - See minZoomImageRatio in {@link OpenSeadragon.Options}. + * @param {Number} [options.maxZoomPixelRatio] - See maxZoomPixelRatio in {@link OpenSeadragon.Options}. + * @param {Number} [options.visibilityRatio] - See visibilityRatio in {@link OpenSeadragon.Options}. + * @param {Boolean} [options.wrapHorizontal] - See wrapHorizontal in {@link OpenSeadragon.Options}. + * @param {Boolean} [options.wrapVertical] - See wrapVertical in {@link OpenSeadragon.Options}. + * @param {Number} [options.defaultZoomLevel] - See defaultZoomLevel in {@link OpenSeadragon.Options}. + * @param {Number} [options.minZoomLevel] - See minZoomLevel in {@link OpenSeadragon.Options}. + * @param {Number} [options.maxZoomLevel] - See maxZoomLevel in {@link OpenSeadragon.Options}. + * @param {Number} [options.degrees] - See degrees in {@link OpenSeadragon.Options}. + * @param {Boolean} [options.homeFillsViewer] - See homeFillsViewer in {@link OpenSeadragon.Options}. + */ +$.Viewport = function( options ) { + + //backward compatibility for positional args while prefering more + //idiomatic javascript options object as the only argument + var args = arguments; + if( args.length && args[ 0 ] instanceof $.Point ){ + options = { + containerSize: args[ 0 ], + contentSize: args[ 1 ], + config: args[ 2 ] + }; + } + + //options.config and the general config argument are deprecated + //in favor of the more direct specification of optional settings + //being passed directly on the options object + if ( options.config ){ + $.extend( true, options, options.config ); + delete options.config; + } + + this._margins = $.extend({ + left: 0, + top: 0, + right: 0, + bottom: 0 + }, options.margins || {}); + + delete options.margins; + + $.extend( true, this, { + + //required settings + containerSize: null, + contentSize: null, + + //internal state properties + zoomPoint: null, + viewer: null, + + //configurable options + springStiffness: $.DEFAULT_SETTINGS.springStiffness, + animationTime: $.DEFAULT_SETTINGS.animationTime, + minZoomImageRatio: $.DEFAULT_SETTINGS.minZoomImageRatio, + maxZoomPixelRatio: $.DEFAULT_SETTINGS.maxZoomPixelRatio, + visibilityRatio: $.DEFAULT_SETTINGS.visibilityRatio, + wrapHorizontal: $.DEFAULT_SETTINGS.wrapHorizontal, + wrapVertical: $.DEFAULT_SETTINGS.wrapVertical, + defaultZoomLevel: $.DEFAULT_SETTINGS.defaultZoomLevel, + minZoomLevel: $.DEFAULT_SETTINGS.minZoomLevel, + maxZoomLevel: $.DEFAULT_SETTINGS.maxZoomLevel, + degrees: $.DEFAULT_SETTINGS.degrees, + homeFillsViewer: $.DEFAULT_SETTINGS.homeFillsViewer + + }, options ); + + this._updateContainerInnerSize(); + + this.centerSpringX = new $.Spring({ + initial: 0, + springStiffness: this.springStiffness, + animationTime: this.animationTime + }); + this.centerSpringY = new $.Spring({ + initial: 0, + springStiffness: this.springStiffness, + animationTime: this.animationTime + }); + this.zoomSpring = new $.Spring({ + exponential: true, + initial: 1, + springStiffness: this.springStiffness, + animationTime: this.animationTime + }); + + this._oldCenterX = this.centerSpringX.current.value; + this._oldCenterY = this.centerSpringY.current.value; + this._oldZoom = this.zoomSpring.current.value; + + this._setContentBounds(new $.Rect(0, 0, 1, 1), 1); + + this.goHome(true); + this.update(); +}; + +/** @lends OpenSeadragon.Viewport.prototype */ +$.Viewport.prototype = { + /** + * Updates the viewport's home bounds and constraints for the given content size. + * @function + * @param {OpenSeadragon.Point} contentSize - size of the content in content units + * @return {OpenSeadragon.Viewport} Chainable. + * @fires OpenSeadragon.Viewer.event:reset-size + */ + resetContentSize: function(contentSize) { + $.console.assert(contentSize, "[Viewport.resetContentSize] contentSize is required"); + $.console.assert(contentSize instanceof $.Point, "[Viewport.resetContentSize] contentSize must be an OpenSeadragon.Point"); + $.console.assert(contentSize.x > 0, "[Viewport.resetContentSize] contentSize.x must be greater than 0"); + $.console.assert(contentSize.y > 0, "[Viewport.resetContentSize] contentSize.y must be greater than 0"); + + this._setContentBounds(new $.Rect(0, 0, 1, contentSize.y / contentSize.x), contentSize.x); + return this; + }, + + // deprecated + setHomeBounds: function(bounds, contentFactor) { + $.console.error("[Viewport.setHomeBounds] this function is deprecated; The content bounds should not be set manually."); + this._setContentBounds(bounds, contentFactor); + }, + + // Set the viewport's content bounds + // @param {OpenSeadragon.Rect} bounds - the new bounds in viewport coordinates + // without rotation + // @param {Number} contentFactor - how many content units per viewport unit + // @fires OpenSeadragon.Viewer.event:reset-size + // @private + _setContentBounds: function(bounds, contentFactor) { + $.console.assert(bounds, "[Viewport._setContentBounds] bounds is required"); + $.console.assert(bounds instanceof $.Rect, "[Viewport._setContentBounds] bounds must be an OpenSeadragon.Rect"); + $.console.assert(bounds.width > 0, "[Viewport._setContentBounds] bounds.width must be greater than 0"); + $.console.assert(bounds.height > 0, "[Viewport._setContentBounds] bounds.height must be greater than 0"); + + this._contentBoundsNoRotate = bounds.clone(); + this._contentSizeNoRotate = this._contentBoundsNoRotate.getSize().times( + contentFactor); + + this._contentBounds = bounds.rotate(this.degrees).getBoundingBox(); + this._contentSize = this._contentBounds.getSize().times(contentFactor); + this._contentAspectRatio = this._contentSize.x / this._contentSize.y; + + if (this.viewer) { + /** + * Raised when the viewer's content size or home bounds are reset + * (see {@link OpenSeadragon.Viewport#resetContentSize}). + * + * @event reset-size + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event. + * @property {OpenSeadragon.Point} contentSize + * @property {OpenSeadragon.Rect} contentBounds - Content bounds. + * @property {OpenSeadragon.Rect} homeBounds - Content bounds. + * Deprecated use contentBounds instead. + * @property {Number} contentFactor + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + this.viewer.raiseEvent('reset-size', { + contentSize: this._contentSizeNoRotate.clone(), + contentFactor: contentFactor, + homeBounds: this._contentBoundsNoRotate.clone(), + contentBounds: this._contentBounds.clone() + }); + } + }, + + /** + * Returns the home zoom in "viewport zoom" value. + * @function + * @returns {Number} The home zoom in "viewport zoom". + */ + getHomeZoom: function() { + if (this.defaultZoomLevel) { + return this.defaultZoomLevel; + } + + var aspectFactor = this._contentAspectRatio / this.getAspectRatio(); + var output; + if (this.homeFillsViewer) { // fill the viewer and clip the image + output = aspectFactor >= 1 ? aspectFactor : 1; + } else { + output = aspectFactor >= 1 ? 1 : aspectFactor; + } + + return output / this._contentBounds.width; + }, + + /** + * Returns the home bounds in viewport coordinates. + * @function + * @returns {OpenSeadragon.Rect} The home bounds in vewport coordinates. + */ + getHomeBounds: function() { + return this.getHomeBoundsNoRotate().rotate(-this.getRotation()); + }, + + /** + * Returns the home bounds in viewport coordinates. + * This method ignores the viewport rotation. Use + * {@link OpenSeadragon.Viewport#getHomeBounds} to take it into account. + * @function + * @returns {OpenSeadragon.Rect} The home bounds in vewport coordinates. + */ + getHomeBoundsNoRotate: function() { + var center = this._contentBounds.getCenter(); + var width = 1.0 / this.getHomeZoom(); + var height = width / this.getAspectRatio(); + + return new $.Rect( + center.x - (width / 2.0), + center.y - (height / 2.0), + width, + height + ); + }, + + /** + * @function + * @param {Boolean} immediately + * @fires OpenSeadragon.Viewer.event:home + */ + goHome: function(immediately) { + if (this.viewer) { + /** + * Raised when the "home" operation occurs (see {@link OpenSeadragon.Viewport#goHome}). + * + * @event home + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event. + * @property {Boolean} immediately + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + this.viewer.raiseEvent('home', { + immediately: immediately + }); + } + return this.fitBounds(this.getHomeBounds(), immediately); + }, + + /** + * @function + */ + getMinZoom: function() { + var homeZoom = this.getHomeZoom(), + zoom = this.minZoomLevel ? + this.minZoomLevel : + this.minZoomImageRatio * homeZoom; + + return zoom; + }, + + /** + * @function + */ + getMaxZoom: function() { + var zoom = this.maxZoomLevel; + if (!zoom) { + zoom = this._contentSize.x * this.maxZoomPixelRatio / this._containerInnerSize.x; + zoom /= this._contentBounds.width; + } + + return Math.max( zoom, this.getHomeZoom() ); + }, + + /** + * @function + */ + getAspectRatio: function() { + return this._containerInnerSize.x / this._containerInnerSize.y; + }, + + /** + * @function + * @returns {OpenSeadragon.Point} The size of the container, in screen coordinates. + */ + getContainerSize: function() { + return new $.Point( + this.containerSize.x, + this.containerSize.y + ); + }, + + /** + * The margins push the "home" region in from the sides by the specified amounts. + * @function + * @returns {Object} Properties (Numbers, in screen coordinates): left, top, right, bottom. + */ + getMargins: function() { + return $.extend({}, this._margins); // Make a copy so we are not returning our original + }, + + /** + * The margins push the "home" region in from the sides by the specified amounts. + * @function + * @param {Object} margins - Properties (Numbers, in screen coordinates): left, top, right, bottom. + */ + setMargins: function(margins) { + $.console.assert($.type(margins) === 'object', '[Viewport.setMargins] margins must be an object'); + + this._margins = $.extend({ + left: 0, + top: 0, + right: 0, + bottom: 0 + }, margins); + + this._updateContainerInnerSize(); + if (this.viewer) { + this.viewer.forceRedraw(); + } + }, + + /** + * Returns the bounds of the visible area in viewport coordinates. + * @function + * @param {Boolean} current - Pass true for the current location; defaults to false (target location). + * @returns {OpenSeadragon.Rect} The location you are zoomed/panned to, in viewport coordinates. + */ + getBounds: function(current) { + return this.getBoundsNoRotate(current).rotate(-this.getRotation()); + }, + + /** + * Returns the bounds of the visible area in viewport coordinates. + * This method ignores the viewport rotation. Use + * {@link OpenSeadragon.Viewport#getBounds} to take it into account. + * @function + * @param {Boolean} current - Pass true for the current location; defaults to false (target location). + * @returns {OpenSeadragon.Rect} The location you are zoomed/panned to, in viewport coordinates. + */ + getBoundsNoRotate: function(current) { + var center = this.getCenter(current); + var width = 1.0 / this.getZoom(current); + var height = width / this.getAspectRatio(); + + return new $.Rect( + center.x - (width / 2.0), + center.y - (height / 2.0), + width, + height + ); + }, + + /** + * @function + * @param {Boolean} current - Pass true for the current location; defaults to false (target location). + * @returns {OpenSeadragon.Rect} The location you are zoomed/panned to, + * including the space taken by margins, in viewport coordinates. + */ + getBoundsWithMargins: function(current) { + return this.getBoundsNoRotateWithMargins(current).rotate( + -this.getRotation(), this.getCenter(current)); + }, + + /** + * @function + * @param {Boolean} current - Pass true for the current location; defaults to false (target location). + * @returns {OpenSeadragon.Rect} The location you are zoomed/panned to, + * including the space taken by margins, in viewport coordinates. + */ + getBoundsNoRotateWithMargins: function(current) { + var bounds = this.getBoundsNoRotate(current); + var factor = this._containerInnerSize.x * this.getZoom(current); + bounds.x -= this._margins.left / factor; + bounds.y -= this._margins.top / factor; + bounds.width += (this._margins.left + this._margins.right) / factor; + bounds.height += (this._margins.top + this._margins.bottom) / factor; + return bounds; + }, + + /** + * @function + * @param {Boolean} current - Pass true for the current location; defaults to false (target location). + */ + getCenter: function( current ) { + var centerCurrent = new $.Point( + this.centerSpringX.current.value, + this.centerSpringY.current.value + ), + centerTarget = new $.Point( + this.centerSpringX.target.value, + this.centerSpringY.target.value + ), + oldZoomPixel, + zoom, + width, + height, + bounds, + newZoomPixel, + deltaZoomPixels, + deltaZoomPoints; + + if ( current ) { + return centerCurrent; + } else if ( !this.zoomPoint ) { + return centerTarget; + } + + oldZoomPixel = this.pixelFromPoint(this.zoomPoint, true); + + zoom = this.getZoom(); + width = 1.0 / zoom; + height = width / this.getAspectRatio(); + bounds = new $.Rect( + centerCurrent.x - width / 2.0, + centerCurrent.y - height / 2.0, + width, + height + ); + + newZoomPixel = this._pixelFromPoint(this.zoomPoint, bounds); + deltaZoomPixels = newZoomPixel.minus( oldZoomPixel ); + deltaZoomPoints = deltaZoomPixels.divide( this._containerInnerSize.x * zoom ); + + return centerTarget.plus( deltaZoomPoints ); + }, + + /** + * @function + * @param {Boolean} current - Pass true for the current location; defaults to false (target location). + */ + getZoom: function( current ) { + if ( current ) { + return this.zoomSpring.current.value; + } else { + return this.zoomSpring.target.value; + } + }, + + // private + _applyZoomConstraints: function(zoom) { + return Math.max( + Math.min(zoom, this.getMaxZoom()), + this.getMinZoom()); + }, + + /** + * @function + * @private + * @param {OpenSeadragon.Rect} bounds + * @param {Boolean} immediately + * @return {OpenSeadragon.Rect} constrained bounds. + */ + _applyBoundaryConstraints: function(bounds, immediately) { + var newBounds = new $.Rect( + bounds.x, + bounds.y, + bounds.width, + bounds.height); + + if (this.wrapHorizontal) { + //do nothing + } else { + var horizontalThreshold = this.visibilityRatio * newBounds.width; + var boundsRight = newBounds.x + newBounds.width; + var contentRight = this._contentBoundsNoRotate.x + this._contentBoundsNoRotate.width; + var leftDx = this._contentBoundsNoRotate.x - boundsRight + horizontalThreshold; + var rightDx = contentRight - newBounds.x - horizontalThreshold; + + if (horizontalThreshold > this._contentBoundsNoRotate.width) { + newBounds.x += (leftDx + rightDx) / 2; + } else if (rightDx < 0) { + newBounds.x += rightDx; + } else if (leftDx > 0) { + newBounds.x += leftDx; + } + } + + if (this.wrapVertical) { + //do nothing + } else { + var verticalThreshold = this.visibilityRatio * newBounds.height; + var boundsBottom = newBounds.y + newBounds.height; + var contentBottom = this._contentBoundsNoRotate.y + this._contentBoundsNoRotate.height; + var topDy = this._contentBoundsNoRotate.y - boundsBottom + verticalThreshold; + var bottomDy = contentBottom - newBounds.y - verticalThreshold; + + if (verticalThreshold > this._contentBoundsNoRotate.height) { + newBounds.y += (topDy + bottomDy) / 2; + } else if (bottomDy < 0) { + newBounds.y += bottomDy; + } else if (topDy > 0) { + newBounds.y += topDy; + } + } + + if (this.viewer) { + /** + * Raised when the viewport constraints are applied (see {@link OpenSeadragon.Viewport#applyConstraints}). + * + * @event constrain + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event. + * @property {Boolean} immediately + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + this.viewer.raiseEvent( 'constrain', { + immediately: immediately + }); + } + + return newBounds; + }, + + /** + * Enforces the minZoom, maxZoom and visibilityRatio constraints by + * zooming and panning to the closest acceptable zoom and location. + * @function + * @param {Boolean} [immediately=false] + * @return {OpenSeadragon.Viewport} Chainable. + * @fires OpenSeadragon.Viewer.event:constrain + */ + applyConstraints: function(immediately) { + var actualZoom = this.getZoom(); + var constrainedZoom = this._applyZoomConstraints(actualZoom); + + if (actualZoom !== constrainedZoom) { + this.zoomTo(constrainedZoom, this.zoomPoint, immediately); + } + + var bounds = this.getBoundsNoRotate(); + var constrainedBounds = this._applyBoundaryConstraints( + bounds, immediately); + + if (bounds.x !== constrainedBounds.x || + bounds.y !== constrainedBounds.y || + immediately) { + this.fitBounds( + constrainedBounds.rotate(-this.getRotation()), + immediately); + } + return this; + }, + + /** + * Equivalent to {@link OpenSeadragon.Viewport#applyConstraints} + * @function + * @param {Boolean} [immediately=false] + * @return {OpenSeadragon.Viewport} Chainable. + * @fires OpenSeadragon.Viewer.event:constrain + */ + ensureVisible: function(immediately) { + return this.applyConstraints(immediately); + }, + + /** + * @function + * @private + * @param {OpenSeadragon.Rect} bounds + * @param {Object} options (immediately=false, constraints=false) + * @return {OpenSeadragon.Viewport} Chainable. + */ + _fitBounds: function(bounds, options) { + options = options || {}; + var immediately = options.immediately || false; + var constraints = options.constraints || false; + + var aspect = this.getAspectRatio(); + var center = bounds.getCenter(); + + // Compute width and height of bounding box. + var newBounds = new $.Rect( + bounds.x, + bounds.y, + bounds.width, + bounds.height, + bounds.degrees + this.getRotation()) + .getBoundingBox(); + + if (newBounds.getAspectRatio() >= aspect) { + newBounds.height = newBounds.width / aspect; + } else { + newBounds.width = newBounds.height * aspect; + } + + // Compute x and y from width, height and center position + newBounds.x = center.x - newBounds.width / 2; + newBounds.y = center.y - newBounds.height / 2; + var newZoom = 1.0 / newBounds.width; + + if (constraints) { + var newBoundsAspectRatio = newBounds.getAspectRatio(); + var newConstrainedZoom = this._applyZoomConstraints(newZoom); + + if (newZoom !== newConstrainedZoom) { + newZoom = newConstrainedZoom; + newBounds.width = 1.0 / newZoom; + newBounds.x = center.x - newBounds.width / 2; + newBounds.height = newBounds.width / newBoundsAspectRatio; + newBounds.y = center.y - newBounds.height / 2; + } + + newBounds = this._applyBoundaryConstraints(newBounds, immediately); + center = newBounds.getCenter(); + } + + if (immediately) { + this.panTo(center, true); + return this.zoomTo(newZoom, null, true); + } + + this.panTo(this.getCenter(true), true); + this.zoomTo(this.getZoom(true), null, true); + + var oldBounds = this.getBounds(); + var oldZoom = this.getZoom(); + + if (oldZoom === 0 || Math.abs(newZoom / oldZoom - 1) < 0.00000001) { + this.zoomTo(newZoom, true); + return this.panTo(center, immediately); + } + + newBounds = newBounds.rotate(-this.getRotation()); + var referencePoint = newBounds.getTopLeft().times(newZoom) + .minus(oldBounds.getTopLeft().times(oldZoom)) + .divide(newZoom - oldZoom); + + return this.zoomTo(newZoom, referencePoint, immediately); + }, + + /** + * Makes the viewport zoom and pan so that the specified bounds take + * as much space as possible in the viewport. + * Note: this method ignores the constraints (minZoom, maxZoom and + * visibilityRatio). + * Use {@link OpenSeadragon.Viewport#fitBoundsWithConstraints} to enforce + * them. + * @function + * @param {OpenSeadragon.Rect} bounds + * @param {Boolean} [immediately=false] + * @return {OpenSeadragon.Viewport} Chainable. + */ + fitBounds: function(bounds, immediately) { + return this._fitBounds(bounds, { + immediately: immediately, + constraints: false + }); + }, + + /** + * Makes the viewport zoom and pan so that the specified bounds take + * as much space as possible in the viewport while enforcing the constraints + * (minZoom, maxZoom and visibilityRatio). + * Note: because this method enforces the constraints, part of the + * provided bounds may end up outside of the viewport. + * Use {@link OpenSeadragon.Viewport#fitBounds} to ignore them. + * @function + * @param {OpenSeadragon.Rect} bounds + * @param {Boolean} [immediately=false] + * @return {OpenSeadragon.Viewport} Chainable. + */ + fitBoundsWithConstraints: function(bounds, immediately) { + return this._fitBounds(bounds, { + immediately: immediately, + constraints: true + }); + }, + + /** + * Zooms so the image just fills the viewer vertically. + * @param {Boolean} immediately + * @return {OpenSeadragon.Viewport} Chainable. + */ + fitVertically: function(immediately) { + var box = new $.Rect( + this._contentBounds.x + (this._contentBounds.width / 2), + this._contentBounds.y, + 0, + this._contentBounds.height); + return this.fitBounds(box, immediately); + }, + + /** + * Zooms so the image just fills the viewer horizontally. + * @param {Boolean} immediately + * @return {OpenSeadragon.Viewport} Chainable. + */ + fitHorizontally: function(immediately) { + var box = new $.Rect( + this._contentBounds.x, + this._contentBounds.y + (this._contentBounds.height / 2), + this._contentBounds.width, + 0); + return this.fitBounds(box, immediately); + }, + + + /** + * @function + * @param {OpenSeadragon.Point} delta + * @param {Boolean} immediately + * @return {OpenSeadragon.Viewport} Chainable. + * @fires OpenSeadragon.Viewer.event:pan + */ + panBy: function( delta, immediately ) { + var center = new $.Point( + this.centerSpringX.target.value, + this.centerSpringY.target.value + ); + return this.panTo( center.plus( delta ), immediately ); + }, + + /** + * @function + * @param {OpenSeadragon.Point} center + * @param {Boolean} immediately + * @return {OpenSeadragon.Viewport} Chainable. + * @fires OpenSeadragon.Viewer.event:pan + */ + panTo: function( center, immediately ) { + if ( immediately ) { + this.centerSpringX.resetTo( center.x ); + this.centerSpringY.resetTo( center.y ); + } else { + this.centerSpringX.springTo( center.x ); + this.centerSpringY.springTo( center.y ); + } + + if( this.viewer ){ + /** + * Raised when the viewport is panned (see {@link OpenSeadragon.Viewport#panBy} and {@link OpenSeadragon.Viewport#panTo}). + * + * @event pan + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event. + * @property {OpenSeadragon.Point} center + * @property {Boolean} immediately + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + this.viewer.raiseEvent( 'pan', { + center: center, + immediately: immediately + }); + } + + return this; + }, + + /** + * @function + * @return {OpenSeadragon.Viewport} Chainable. + * @fires OpenSeadragon.Viewer.event:zoom + */ + zoomBy: function(factor, refPoint, immediately) { + return this.zoomTo( + this.zoomSpring.target.value * factor, refPoint, immediately); + }, + + /** + * Zooms to the specified zoom level + * @function + * @param {Number} zoom The zoom level to zoom to. + * @param {OpenSeadragon.Point} [refPoint] The point which will stay at + * the same screen location. Defaults to the viewport center. + * @param {Boolean} [immediately=false] + * @return {OpenSeadragon.Viewport} Chainable. + * @fires OpenSeadragon.Viewer.event:zoom + */ + zoomTo: function( zoom, refPoint, immediately ) { + + this.zoomPoint = refPoint instanceof $.Point && + !isNaN(refPoint.x) && + !isNaN(refPoint.y) ? + refPoint : + null; + + if ( immediately ) { + this.zoomSpring.resetTo( zoom ); + } else { + this.zoomSpring.springTo( zoom ); + } + + if( this.viewer ){ + /** + * Raised when the viewport zoom level changes (see {@link OpenSeadragon.Viewport#zoomBy} and {@link OpenSeadragon.Viewport#zoomTo}). + * + * @event zoom + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event. + * @property {Number} zoom + * @property {OpenSeadragon.Point} refPoint + * @property {Boolean} immediately + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + this.viewer.raiseEvent( 'zoom', { + zoom: zoom, + refPoint: refPoint, + immediately: immediately + }); + } + + return this; + }, + + /** + * Rotates this viewport to the angle specified. + * @function + * @return {OpenSeadragon.Viewport} Chainable. + */ + setRotation: function(degrees) { + if (!this.viewer || !this.viewer.drawer.canRotate()) { + return this; + } + + degrees = degrees % 360; + if (degrees < 0) { + degrees += 360; + } + this.degrees = degrees; + this._setContentBounds( + this.viewer.world.getHomeBounds(), + this.viewer.world.getContentFactor()); + this.viewer.forceRedraw(); + + /** + * Raised when rotation has been changed. + * + * @event rotate + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event. + * @property {Number} degrees - The number of degrees the rotation was set to. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + this.viewer.raiseEvent('rotate', {"degrees": degrees}); + return this; + }, + + /** + * Gets the current rotation in degrees. + * @function + * @return {Number} The current rotation in degrees. + */ + getRotation: function() { + return this.degrees; + }, + + /** + * @function + * @return {OpenSeadragon.Viewport} Chainable. + * @fires OpenSeadragon.Viewer.event:resize + */ + resize: function( newContainerSize, maintain ) { + var oldBounds = this.getBoundsNoRotate(), + newBounds = oldBounds, + widthDeltaFactor; + + this.containerSize.x = newContainerSize.x; + this.containerSize.y = newContainerSize.y; + + this._updateContainerInnerSize(); + + if ( maintain ) { + // TODO: widthDeltaFactor will always be 1; probably not what's intended + widthDeltaFactor = newContainerSize.x / this.containerSize.x; + newBounds.width = oldBounds.width * widthDeltaFactor; + newBounds.height = newBounds.width / this.getAspectRatio(); + } + + if( this.viewer ){ + /** + * Raised when the viewer is resized (see {@link OpenSeadragon.Viewport#resize}). + * + * @event resize + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event. + * @property {OpenSeadragon.Point} newContainerSize + * @property {Boolean} maintain + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + this.viewer.raiseEvent( 'resize', { + newContainerSize: newContainerSize, + maintain: maintain + }); + } + + return this.fitBounds( newBounds, true ); + }, + + // private + _updateContainerInnerSize: function() { + this._containerInnerSize = new $.Point( + Math.max(1, this.containerSize.x - (this._margins.left + this._margins.right)), + Math.max(1, this.containerSize.y - (this._margins.top + this._margins.bottom)) + ); + }, + + /** + * Update the zoom and center (X and Y) springs. + * @function + * @returns {Boolean} True if any change has been made, false otherwise. + */ + update: function() { + + if (this.zoomPoint) { + var oldZoomPixel = this.pixelFromPoint(this.zoomPoint, true); + this.zoomSpring.update(); + var newZoomPixel = this.pixelFromPoint(this.zoomPoint, true); + + var deltaZoomPixels = newZoomPixel.minus(oldZoomPixel); + var deltaZoomPoints = this.deltaPointsFromPixels( + deltaZoomPixels, true); + + this.centerSpringX.shiftBy(deltaZoomPoints.x); + this.centerSpringY.shiftBy(deltaZoomPoints.y); + + if (this.zoomSpring.isAtTargetValue()) { + this.zoomPoint = null; + } + } else { + this.zoomSpring.update(); + } + + this.centerSpringX.update(); + this.centerSpringY.update(); + + var changed = this.centerSpringX.current.value !== this._oldCenterX || + this.centerSpringY.current.value !== this._oldCenterY || + this.zoomSpring.current.value !== this._oldZoom; + + this._oldCenterX = this.centerSpringX.current.value; + this._oldCenterY = this.centerSpringY.current.value; + this._oldZoom = this.zoomSpring.current.value; + + return changed; + }, + + /** + * Convert a delta (translation vector) from viewport coordinates to pixels + * coordinates. This method does not take rotation into account. + * Consider using deltaPixelsFromPoints if you need to account for rotation. + * @param {OpenSeadragon.Point} deltaPoints - The translation vector to convert. + * @param {Boolean} [current=false] - Pass true for the current location; + * defaults to false (target location). + * @returns {OpenSeadragon.Point} + */ + deltaPixelsFromPointsNoRotate: function(deltaPoints, current) { + return deltaPoints.times( + this._containerInnerSize.x * this.getZoom(current) + ); + }, + + /** + * Convert a delta (translation vector) from viewport coordinates to pixels + * coordinates. + * @param {OpenSeadragon.Point} deltaPoints - The translation vector to convert. + * @param {Boolean} [current=false] - Pass true for the current location; + * defaults to false (target location). + * @returns {OpenSeadragon.Point} + */ + deltaPixelsFromPoints: function(deltaPoints, current) { + return this.deltaPixelsFromPointsNoRotate( + deltaPoints.rotate(this.getRotation()), + current); + }, + + /** + * Convert a delta (translation vector) from pixels coordinates to viewport + * coordinates. This method does not take rotation into account. + * Consider using deltaPointsFromPixels if you need to account for rotation. + * @param {OpenSeadragon.Point} deltaPixels - The translation vector to convert. + * @param {Boolean} [current=false] - Pass true for the current location; + * defaults to false (target location). + * @returns {OpenSeadragon.Point} + */ + deltaPointsFromPixelsNoRotate: function(deltaPixels, current) { + return deltaPixels.divide( + this._containerInnerSize.x * this.getZoom(current) + ); + }, + + /** + * Convert a delta (translation vector) from pixels coordinates to viewport + * coordinates. + * @param {OpenSeadragon.Point} deltaPixels - The translation vector to convert. + * @param {Boolean} [current=false] - Pass true for the current location; + * defaults to false (target location). + * @returns {OpenSeadragon.Point} + */ + deltaPointsFromPixels: function(deltaPixels, current) { + return this.deltaPointsFromPixelsNoRotate(deltaPixels, current) + .rotate(-this.getRotation()); + }, + + /** + * Convert viewport coordinates to pixels coordinates. + * This method does not take rotation into account. + * Consider using pixelFromPoint if you need to account for rotation. + * @param {OpenSeadragon.Point} point the viewport coordinates + * @param {Boolean} [current=false] - Pass true for the current location; + * defaults to false (target location). + * @returns {OpenSeadragon.Point} + */ + pixelFromPointNoRotate: function(point, current) { + return this._pixelFromPointNoRotate( + point, this.getBoundsNoRotate(current)); + }, + + /** + * Convert viewport coordinates to pixel coordinates. + * @param {OpenSeadragon.Point} point the viewport coordinates + * @param {Boolean} [current=false] - Pass true for the current location; + * defaults to false (target location). + * @returns {OpenSeadragon.Point} + */ + pixelFromPoint: function(point, current) { + return this._pixelFromPoint(point, this.getBoundsNoRotate(current)); + }, + + // private + _pixelFromPointNoRotate: function(point, bounds) { + return point.minus( + bounds.getTopLeft() + ).times( + this._containerInnerSize.x / bounds.width + ).plus( + new $.Point(this._margins.left, this._margins.top) + ); + }, + + // private + _pixelFromPoint: function(point, bounds) { + return this._pixelFromPointNoRotate( + point.rotate(this.getRotation(), this.getCenter(true)), + bounds); + }, + + /** + * Convert pixel coordinates to viewport coordinates. + * This method does not take rotation into account. + * Consider using pointFromPixel if you need to account for rotation. + * @param {OpenSeadragon.Point} pixel Pixel coordinates + * @param {Boolean} [current=false] - Pass true for the current location; + * defaults to false (target location). + * @returns {OpenSeadragon.Point} + */ + pointFromPixelNoRotate: function(pixel, current) { + var bounds = this.getBoundsNoRotate(current); + return pixel.minus( + new $.Point(this._margins.left, this._margins.top) + ).divide( + this._containerInnerSize.x / bounds.width + ).plus( + bounds.getTopLeft() + ); + }, + + /** + * Convert pixel coordinates to viewport coordinates. + * @param {OpenSeadragon.Point} pixel Pixel coordinates + * @param {Boolean} [current=false] - Pass true for the current location; + * defaults to false (target location). + * @returns {OpenSeadragon.Point} + */ + pointFromPixel: function(pixel, current) { + return this.pointFromPixelNoRotate(pixel, current).rotate( + -this.getRotation(), + this.getCenter(true) + ); + }, + + // private + _viewportToImageDelta: function( viewerX, viewerY ) { + var scale = this._contentBoundsNoRotate.width; + return new $.Point( + viewerX * this._contentSizeNoRotate.x / scale, + viewerY * this._contentSizeNoRotate.x / scale); + }, + + /** + * Translates from OpenSeadragon viewer coordinate system to image coordinate system. + * This method can be called either by passing X,Y coordinates or an + * OpenSeadragon.Point + * Note: not accurate with multi-image; use TiledImage.viewportToImageCoordinates instead. + * @function + * @param {(OpenSeadragon.Point|Number)} viewerX either a point or the X + * coordinate in viewport coordinate system. + * @param {Number} [viewerY] Y coordinate in viewport coordinate system. + * @return {OpenSeadragon.Point} a point representing the coordinates in the image. + */ + viewportToImageCoordinates: function(viewerX, viewerY) { + if (viewerX instanceof $.Point) { + //they passed a point instead of individual components + return this.viewportToImageCoordinates(viewerX.x, viewerX.y); + } + + if (this.viewer) { + var count = this.viewer.world.getItemCount(); + if (count > 1) { + $.console.error('[Viewport.viewportToImageCoordinates] is not accurate ' + + 'with multi-image; use TiledImage.viewportToImageCoordinates instead.'); + } else if (count === 1) { + // It is better to use TiledImage.viewportToImageCoordinates + // because this._contentBoundsNoRotate can not be relied on + // with clipping. + var item = this.viewer.world.getItemAt(0); + return item.viewportToImageCoordinates(viewerX, viewerY, true); + } + } + + return this._viewportToImageDelta( + viewerX - this._contentBoundsNoRotate.x, + viewerY - this._contentBoundsNoRotate.y); + }, + + // private + _imageToViewportDelta: function( imageX, imageY ) { + var scale = this._contentBoundsNoRotate.width; + return new $.Point( + imageX / this._contentSizeNoRotate.x * scale, + imageY / this._contentSizeNoRotate.x * scale); + }, + + /** + * Translates from image coordinate system to OpenSeadragon viewer coordinate system + * This method can be called either by passing X,Y coordinates or an + * OpenSeadragon.Point + * Note: not accurate with multi-image; use TiledImage.imageToViewportCoordinates instead. + * @function + * @param {(OpenSeadragon.Point | Number)} imageX the point or the + * X coordinate in image coordinate system. + * @param {Number} [imageY] Y coordinate in image coordinate system. + * @return {OpenSeadragon.Point} a point representing the coordinates in the viewport. + */ + imageToViewportCoordinates: function(imageX, imageY) { + if (imageX instanceof $.Point) { + //they passed a point instead of individual components + return this.imageToViewportCoordinates(imageX.x, imageX.y); + } + + if (this.viewer) { + var count = this.viewer.world.getItemCount(); + if (count > 1) { + $.console.error('[Viewport.imageToViewportCoordinates] is not accurate ' + + 'with multi-image; use TiledImage.imageToViewportCoordinates instead.'); + } else if (count === 1) { + // It is better to use TiledImage.viewportToImageCoordinates + // because this._contentBoundsNoRotate can not be relied on + // with clipping. + var item = this.viewer.world.getItemAt(0); + return item.imageToViewportCoordinates(imageX, imageY, true); + } + } + + var point = this._imageToViewportDelta(imageX, imageY); + point.x += this._contentBoundsNoRotate.x; + point.y += this._contentBoundsNoRotate.y; + return point; + }, + + /** + * Translates from a rectangle which describes a portion of the image in + * pixel coordinates to OpenSeadragon viewport rectangle coordinates. + * This method can be called either by passing X,Y,width,height or an + * OpenSeadragon.Rect + * Note: not accurate with multi-image; use TiledImage.imageToViewportRectangle instead. + * @function + * @param {(OpenSeadragon.Rect | Number)} imageX the rectangle or the X + * coordinate of the top left corner of the rectangle in image coordinate system. + * @param {Number} [imageY] the Y coordinate of the top left corner of the rectangle + * in image coordinate system. + * @param {Number} [pixelWidth] the width in pixel of the rectangle. + * @param {Number} [pixelHeight] the height in pixel of the rectangle. + */ + imageToViewportRectangle: function(imageX, imageY, pixelWidth, pixelHeight) { + var rect = imageX; + if (!(rect instanceof $.Rect)) { + //they passed individual components instead of a rectangle + rect = new $.Rect(imageX, imageY, pixelWidth, pixelHeight); + } + + if (this.viewer) { + var count = this.viewer.world.getItemCount(); + if (count > 1) { + $.console.error('[Viewport.imageToViewportRectangle] is not accurate ' + + 'with multi-image; use TiledImage.imageToViewportRectangle instead.'); + } else if (count === 1) { + // It is better to use TiledImage.imageToViewportRectangle + // because this._contentBoundsNoRotate can not be relied on + // with clipping. + var item = this.viewer.world.getItemAt(0); + return item.imageToViewportRectangle( + imageX, imageY, pixelWidth, pixelHeight, true); + } + } + + var coordA = this.imageToViewportCoordinates(rect.x, rect.y); + var coordB = this._imageToViewportDelta(rect.width, rect.height); + return new $.Rect( + coordA.x, + coordA.y, + coordB.x, + coordB.y, + rect.degrees + ); + }, + + /** + * Translates from a rectangle which describes a portion of + * the viewport in point coordinates to image rectangle coordinates. + * This method can be called either by passing X,Y,width,height or an + * OpenSeadragon.Rect + * Note: not accurate with multi-image; use TiledImage.viewportToImageRectangle instead. + * @function + * @param {(OpenSeadragon.Rect | Number)} viewerX either a rectangle or + * the X coordinate of the top left corner of the rectangle in viewport + * coordinate system. + * @param {Number} [viewerY] the Y coordinate of the top left corner of the rectangle + * in viewport coordinate system. + * @param {Number} [pointWidth] the width of the rectangle in viewport coordinate system. + * @param {Number} [pointHeight] the height of the rectangle in viewport coordinate system. + */ + viewportToImageRectangle: function(viewerX, viewerY, pointWidth, pointHeight) { + var rect = viewerX; + if (!(rect instanceof $.Rect)) { + //they passed individual components instead of a rectangle + rect = new $.Rect(viewerX, viewerY, pointWidth, pointHeight); + } + + if (this.viewer) { + var count = this.viewer.world.getItemCount(); + if (count > 1) { + $.console.error('[Viewport.viewportToImageRectangle] is not accurate ' + + 'with multi-image; use TiledImage.viewportToImageRectangle instead.'); + } else if (count === 1) { + // It is better to use TiledImage.viewportToImageCoordinates + // because this._contentBoundsNoRotate can not be relied on + // with clipping. + var item = this.viewer.world.getItemAt(0); + return item.viewportToImageRectangle( + viewerX, viewerY, pointWidth, pointHeight, true); + } + } + + var coordA = this.viewportToImageCoordinates(rect.x, rect.y); + var coordB = this._viewportToImageDelta(rect.width, rect.height); + return new $.Rect( + coordA.x, + coordA.y, + coordB.x, + coordB.y, + rect.degrees + ); + }, + + /** + * Convert pixel coordinates relative to the viewer element to image + * coordinates. + * Note: not accurate with multi-image. + * @param {OpenSeadragon.Point} pixel + * @returns {OpenSeadragon.Point} + */ + viewerElementToImageCoordinates: function( pixel ) { + var point = this.pointFromPixel( pixel, true ); + return this.viewportToImageCoordinates( point ); + }, + + /** + * Convert pixel coordinates relative to the image to + * viewer element coordinates. + * Note: not accurate with multi-image. + * @param {OpenSeadragon.Point} pixel + * @returns {OpenSeadragon.Point} + */ + imageToViewerElementCoordinates: function( pixel ) { + var point = this.imageToViewportCoordinates( pixel ); + return this.pixelFromPoint( point, true ); + }, + + /** + * Convert pixel coordinates relative to the window to image coordinates. + * Note: not accurate with multi-image. + * @param {OpenSeadragon.Point} pixel + * @returns {OpenSeadragon.Point} + */ + windowToImageCoordinates: function(pixel) { + $.console.assert(this.viewer, + "[Viewport.windowToImageCoordinates] the viewport must have a viewer."); + var viewerCoordinates = pixel.minus( + $.getElementPosition(this.viewer.element)); + return this.viewerElementToImageCoordinates(viewerCoordinates); + }, + + /** + * Convert image coordinates to pixel coordinates relative to the window. + * Note: not accurate with multi-image. + * @param {OpenSeadragon.Point} pixel + * @returns {OpenSeadragon.Point} + */ + imageToWindowCoordinates: function(pixel) { + $.console.assert(this.viewer, + "[Viewport.imageToWindowCoordinates] the viewport must have a viewer."); + var viewerCoordinates = this.imageToViewerElementCoordinates(pixel); + return viewerCoordinates.plus( + $.getElementPosition(this.viewer.element)); + }, + + /** + * Convert pixel coordinates relative to the viewer element to viewport + * coordinates. + * @param {OpenSeadragon.Point} pixel + * @returns {OpenSeadragon.Point} + */ + viewerElementToViewportCoordinates: function( pixel ) { + return this.pointFromPixel( pixel, true ); + }, + + /** + * Convert viewport coordinates to pixel coordinates relative to the + * viewer element. + * @param {OpenSeadragon.Point} point + * @returns {OpenSeadragon.Point} + */ + viewportToViewerElementCoordinates: function( point ) { + return this.pixelFromPoint( point, true ); + }, + + /** + * Convert a rectangle in pixel coordinates relative to the viewer element + * to viewport coordinates. + * @param {OpenSeadragon.Rect} rectangle the rectangle to convert + * @returns {OpenSeadragon.Rect} the converted rectangle + */ + viewerElementToViewportRectangle: function(rectangle) { + return $.Rect.fromSummits( + this.pointFromPixel(rectangle.getTopLeft(), true), + this.pointFromPixel(rectangle.getTopRight(), true), + this.pointFromPixel(rectangle.getBottomLeft(), true) + ); + }, + + /** + * Convert a rectangle in viewport coordinates to pixel coordinates relative + * to the viewer element. + * @param {OpenSeadragon.Rect} rectangle the rectangle to convert + * @returns {OpenSeadragon.Rect} the converted rectangle + */ + viewportToViewerElementRectangle: function(rectangle) { + return $.Rect.fromSummits( + this.pixelFromPoint(rectangle.getTopLeft(), true), + this.pixelFromPoint(rectangle.getTopRight(), true), + this.pixelFromPoint(rectangle.getBottomLeft(), true) + ); + }, + + /** + * Convert pixel coordinates relative to the window to viewport coordinates. + * @param {OpenSeadragon.Point} pixel + * @returns {OpenSeadragon.Point} + */ + windowToViewportCoordinates: function(pixel) { + $.console.assert(this.viewer, + "[Viewport.windowToViewportCoordinates] the viewport must have a viewer."); + var viewerCoordinates = pixel.minus( + $.getElementPosition(this.viewer.element)); + return this.viewerElementToViewportCoordinates(viewerCoordinates); + }, + + /** + * Convert viewport coordinates to pixel coordinates relative to the window. + * @param {OpenSeadragon.Point} point + * @returns {OpenSeadragon.Point} + */ + viewportToWindowCoordinates: function(point) { + $.console.assert(this.viewer, + "[Viewport.viewportToWindowCoordinates] the viewport must have a viewer."); + var viewerCoordinates = this.viewportToViewerElementCoordinates(point); + return viewerCoordinates.plus( + $.getElementPosition(this.viewer.element)); + }, + + /** + * Convert a viewport zoom to an image zoom. + * Image zoom: ratio of the original image size to displayed image size. + * 1 means original image size, 0.5 half size... + * Viewport zoom: ratio of the displayed image's width to viewport's width. + * 1 means identical width, 2 means image's width is twice the viewport's width... + * Note: not accurate with multi-image. + * @function + * @param {Number} viewportZoom The viewport zoom + * target zoom. + * @returns {Number} imageZoom The image zoom + */ + viewportToImageZoom: function(viewportZoom) { + if (this.viewer) { + var count = this.viewer.world.getItemCount(); + if (count > 1) { + $.console.error('[Viewport.viewportToImageZoom] is not ' + + 'accurate with multi-image.'); + } else if (count === 1) { + // It is better to use TiledImage.viewportToImageZoom + // because this._contentBoundsNoRotate can not be relied on + // with clipping. + var item = this.viewer.world.getItemAt(0); + return item.viewportToImageZoom(viewportZoom); + } + } + + var imageWidth = this._contentSizeNoRotate.x; + var containerWidth = this._containerInnerSize.x; + var scale = this._contentBoundsNoRotate.width; + var viewportToImageZoomRatio = (containerWidth / imageWidth) * scale; + return viewportZoom * viewportToImageZoomRatio; + }, + + /** + * Convert an image zoom to a viewport zoom. + * Image zoom: ratio of the original image size to displayed image size. + * 1 means original image size, 0.5 half size... + * Viewport zoom: ratio of the displayed image's width to viewport's width. + * 1 means identical width, 2 means image's width is twice the viewport's width... + * Note: not accurate with multi-image. + * @function + * @param {Number} imageZoom The image zoom + * target zoom. + * @returns {Number} viewportZoom The viewport zoom + */ + imageToViewportZoom: function(imageZoom) { + if (this.viewer) { + var count = this.viewer.world.getItemCount(); + if (count > 1) { + $.console.error('[Viewport.imageToViewportZoom] is not accurate ' + + 'with multi-image.'); + } else if (count === 1) { + // It is better to use TiledImage.imageToViewportZoom + // because this._contentBoundsNoRotate can not be relied on + // with clipping. + var item = this.viewer.world.getItemAt(0); + return item.imageToViewportZoom(imageZoom); + } + } + + var imageWidth = this._contentSizeNoRotate.x; + var containerWidth = this._containerInnerSize.x; + var scale = this._contentBoundsNoRotate.width; + var viewportToImageZoomRatio = (imageWidth / containerWidth) / scale; + return imageZoom * viewportToImageZoomRatio; + } +}; + +}( OpenSeadragon )); + +/* + * OpenSeadragon - TiledImage + * + * Copyright (C) 2009 CodePlex Foundation + * Copyright (C) 2010-2013 OpenSeadragon contributors + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of CodePlex Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +(function( $ ){ + +/** + * You shouldn't have to create a TiledImage directly; use {@link OpenSeadragon.Viewer#open} + * or {@link OpenSeadragon.Viewer#addTiledImage} instead. + * @class TiledImage + * @memberof OpenSeadragon + * @extends OpenSeadragon.EventSource + * @classdesc Handles rendering of tiles for an {@link OpenSeadragon.Viewer}. + * A new instance is created for each TileSource opened. + * @param {Object} options - Configuration for this TiledImage. + * @param {OpenSeadragon.TileSource} options.source - The TileSource that defines this TiledImage. + * @param {OpenSeadragon.Viewer} options.viewer - The Viewer that owns this TiledImage. + * @param {OpenSeadragon.TileCache} options.tileCache - The TileCache for this TiledImage to use. + * @param {OpenSeadragon.Drawer} options.drawer - The Drawer for this TiledImage to draw onto. + * @param {OpenSeadragon.ImageLoader} options.imageLoader - The ImageLoader for this TiledImage to use. + * @param {Number} [options.x=0] - Left position, in viewport coordinates. + * @param {Number} [options.y=0] - Top position, in viewport coordinates. + * @param {Number} [options.width=1] - Width, in viewport coordinates. + * @param {Number} [options.height] - Height, in viewport coordinates. + * @param {OpenSeadragon.Rect} [options.fitBounds] The bounds in viewport coordinates + * to fit the image into. If specified, x, y, width and height get ignored. + * @param {OpenSeadragon.Placement} [options.fitBoundsPlacement=OpenSeadragon.Placement.CENTER] + * How to anchor the image in the bounds if options.fitBounds is set. + * @param {OpenSeadragon.Rect} [options.clip] - An area, in image pixels, to clip to + * (portions of the image outside of this area will not be visible). Only works on + * browsers that support the HTML5 canvas. + * @param {Number} [options.springStiffness] - See {@link OpenSeadragon.Options}. + * @param {Boolean} [options.animationTime] - See {@link OpenSeadragon.Options}. + * @param {Number} [options.minZoomImageRatio] - See {@link OpenSeadragon.Options}. + * @param {Boolean} [options.wrapHorizontal] - See {@link OpenSeadragon.Options}. + * @param {Boolean} [options.wrapVertical] - See {@link OpenSeadragon.Options}. + * @param {Boolean} [options.immediateRender] - See {@link OpenSeadragon.Options}. + * @param {Number} [options.blendTime] - See {@link OpenSeadragon.Options}. + * @param {Boolean} [options.alwaysBlend] - See {@link OpenSeadragon.Options}. + * @param {Number} [options.minPixelRatio] - See {@link OpenSeadragon.Options}. + * @param {Number} [options.smoothTileEdgesMinZoom] - See {@link OpenSeadragon.Options}. + * @param {Boolean} [options.iOSDevice] - See {@link OpenSeadragon.Options}. + * @param {Number} [options.opacity=1] - Opacity the tiled image should be drawn at. + * @param {String} [options.compositeOperation] - How the image is composited onto other images; see compositeOperation in {@link OpenSeadragon.Options} for possible values. + * @param {Boolean} [options.debugMode] - See {@link OpenSeadragon.Options}. + * @param {String|CanvasGradient|CanvasPattern|Function} [options.placeholderFillStyle] - See {@link OpenSeadragon.Options}. + * @param {String|Boolean} [options.crossOriginPolicy] - See {@link OpenSeadragon.Options}. + */ +$.TiledImage = function( options ) { + var _this = this; + + $.console.assert( options.tileCache, "[TiledImage] options.tileCache is required" ); + $.console.assert( options.drawer, "[TiledImage] options.drawer is required" ); + $.console.assert( options.viewer, "[TiledImage] options.viewer is required" ); + $.console.assert( options.imageLoader, "[TiledImage] options.imageLoader is required" ); + $.console.assert( options.source, "[TiledImage] options.source is required" ); + $.console.assert(!options.clip || options.clip instanceof $.Rect, + "[TiledImage] options.clip must be an OpenSeadragon.Rect if present"); + + $.EventSource.call( this ); + + this._tileCache = options.tileCache; + delete options.tileCache; + + this._drawer = options.drawer; + delete options.drawer; + + this._imageLoader = options.imageLoader; + delete options.imageLoader; + + if (options.clip instanceof $.Rect) { + this._clip = options.clip.clone(); + } + + delete options.clip; + + var x = options.x || 0; + delete options.x; + var y = options.y || 0; + delete options.y; + + // Ratio of zoomable image height to width. + this.normHeight = options.source.dimensions.y / options.source.dimensions.x; + this.contentAspectX = options.source.dimensions.x / options.source.dimensions.y; + + var scale = 1; + if ( options.width ) { + scale = options.width; + delete options.width; + + if ( options.height ) { + $.console.error( "specifying both width and height to a tiledImage is not supported" ); + delete options.height; + } + } else if ( options.height ) { + scale = options.height / this.normHeight; + delete options.height; + } + + var fitBounds = options.fitBounds; + delete options.fitBounds; + var fitBoundsPlacement = options.fitBoundsPlacement || OpenSeadragon.Placement.CENTER; + delete options.fitBoundsPlacement; + + $.extend( true, this, { + + //internal state properties + viewer: null, + tilesMatrix: {}, // A '3d' dictionary [level][x][y] --> Tile. + coverage: {}, // A '3d' dictionary [level][x][y] --> Boolean. + lastDrawn: [], // An unordered list of Tiles drawn last frame. + lastResetTime: 0, // Last time for which the tiledImage was reset. + _midDraw: false, // Is the tiledImage currently updating the viewport? + _needsDraw: true, // Does the tiledImage need to update the viewport again? + _hasOpaqueTile: false, // Do we have even one fully opaque tile? + //configurable settings + springStiffness: $.DEFAULT_SETTINGS.springStiffness, + animationTime: $.DEFAULT_SETTINGS.animationTime, + minZoomImageRatio: $.DEFAULT_SETTINGS.minZoomImageRatio, + wrapHorizontal: $.DEFAULT_SETTINGS.wrapHorizontal, + wrapVertical: $.DEFAULT_SETTINGS.wrapVertical, + immediateRender: $.DEFAULT_SETTINGS.immediateRender, + blendTime: $.DEFAULT_SETTINGS.blendTime, + alwaysBlend: $.DEFAULT_SETTINGS.alwaysBlend, + minPixelRatio: $.DEFAULT_SETTINGS.minPixelRatio, + smoothTileEdgesMinZoom: $.DEFAULT_SETTINGS.smoothTileEdgesMinZoom, + iOSDevice: $.DEFAULT_SETTINGS.iOSDevice, + debugMode: $.DEFAULT_SETTINGS.debugMode, + crossOriginPolicy: $.DEFAULT_SETTINGS.crossOriginPolicy, + placeholderFillStyle: $.DEFAULT_SETTINGS.placeholderFillStyle, + opacity: $.DEFAULT_SETTINGS.opacity, + compositeOperation: $.DEFAULT_SETTINGS.compositeOperation + + }, options ); + + this._xSpring = new $.Spring({ + initial: x, + springStiffness: this.springStiffness, + animationTime: this.animationTime + }); + + this._ySpring = new $.Spring({ + initial: y, + springStiffness: this.springStiffness, + animationTime: this.animationTime + }); + + this._scaleSpring = new $.Spring({ + initial: scale, + springStiffness: this.springStiffness, + animationTime: this.animationTime + }); + + this._updateForScale(); + + if (fitBounds) { + this.fitBounds(fitBounds, fitBoundsPlacement, true); + } + + // We need a callback to give image manipulation a chance to happen + this._drawingHandler = function(args) { + /** + * This event is fired just before the tile is drawn giving the application a chance to alter the image. + * + * NOTE: This event is only fired when the drawer is using a <canvas>. + * + * @event tile-drawing + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event. + * @property {OpenSeadragon.Tile} tile - The Tile being drawn. + * @property {OpenSeadragon.TiledImage} tiledImage - Which TiledImage is being drawn. + * @property {OpenSeadragon.Tile} context - The HTML canvas context being drawn into. + * @property {OpenSeadragon.Tile} rendered - The HTML canvas context containing the tile imagery. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + _this.viewer.raiseEvent('tile-drawing', $.extend({ + tiledImage: _this + }, args)); + }; +}; + +$.extend($.TiledImage.prototype, $.EventSource.prototype, /** @lends OpenSeadragon.TiledImage.prototype */{ + /** + * @returns {Boolean} Whether the TiledImage needs to be drawn. + */ + needsDraw: function() { + return this._needsDraw; + }, + + /** + * Clears all tiles and triggers an update on the next call to + * {@link OpenSeadragon.TiledImage#update}. + */ + reset: function() { + this._tileCache.clearTilesFor(this); + this.lastResetTime = $.now(); + this._needsDraw = true; + }, + + /** + * Updates the TiledImage's bounds, animating if needed. + * @returns {Boolean} Whether the TiledImage animated. + */ + update: function() { + var oldX = this._xSpring.current.value; + var oldY = this._ySpring.current.value; + var oldScale = this._scaleSpring.current.value; + + this._xSpring.update(); + this._ySpring.update(); + this._scaleSpring.update(); + + if (this._xSpring.current.value !== oldX || this._ySpring.current.value !== oldY || + this._scaleSpring.current.value !== oldScale) { + this._updateForScale(); + this._needsDraw = true; + return true; + } + + return false; + }, + + /** + * Draws the TiledImage to its Drawer. + */ + draw: function() { + if (this.opacity !== 0) { + this._midDraw = true; + updateViewport(this); + this._midDraw = false; + } + }, + + /** + * Destroy the TiledImage (unload current loaded tiles). + */ + destroy: function() { + this.reset(); + }, + + /** + * @returns {OpenSeadragon.Rect} This TiledImage's bounds in viewport coordinates. + * @param {Boolean} [current=false] - Pass true for the current location; false for target location. + */ + getBounds: function(current) { + if (current) { + return new $.Rect( this._xSpring.current.value, this._ySpring.current.value, + this._worldWidthCurrent, this._worldHeightCurrent ); + } + + return new $.Rect( this._xSpring.target.value, this._ySpring.target.value, + this._worldWidthTarget, this._worldHeightTarget ); + }, + + // deprecated + getWorldBounds: function() { + $.console.error('[TiledImage.getWorldBounds] is deprecated; use TiledImage.getBounds instead'); + return this.getBounds(); + }, + + /** + * Get the bounds of the displayed part of the tiled image. + * @param {Boolean} [current=false] Pass true for the current location, + * false for the target location. + * @returns {$.Rect} The clipped bounds in viewport coordinates. + */ + getClippedBounds: function(current) { + var bounds = this.getBounds(current); + if (this._clip) { + var ratio = this._worldWidthCurrent / this.source.dimensions.x; + var clip = this._clip.times(ratio); + bounds = new $.Rect( + bounds.x + clip.x, + bounds.y + clip.y, + clip.width, + clip.height); + } + return bounds; + }, + + /** + * @returns {OpenSeadragon.Point} This TiledImage's content size, in original pixels. + */ + getContentSize: function() { + return new $.Point(this.source.dimensions.x, this.source.dimensions.y); + }, + + // private + _viewportToImageDelta: function( viewerX, viewerY, current ) { + var scale = (current ? this._scaleSpring.current.value : this._scaleSpring.target.value); + return new $.Point(viewerX * (this.source.dimensions.x / scale), + viewerY * ((this.source.dimensions.y * this.contentAspectX) / scale)); + }, + + /** + * Translates from OpenSeadragon viewer coordinate system to image coordinate system. + * This method can be called either by passing X,Y coordinates or an {@link OpenSeadragon.Point}. + * @param {Number|OpenSeadragon.Point} viewerX - The X coordinate or point in viewport coordinate system. + * @param {Number} [viewerY] - The Y coordinate in viewport coordinate system. + * @param {Boolean} [current=false] - Pass true to use the current location; false for target location. + * @return {OpenSeadragon.Point} A point representing the coordinates in the image. + */ + viewportToImageCoordinates: function( viewerX, viewerY, current ) { + if (viewerX instanceof $.Point) { + //they passed a point instead of individual components + current = viewerY; + viewerY = viewerX.y; + viewerX = viewerX.x; + } + + if (current) { + return this._viewportToImageDelta(viewerX - this._xSpring.current.value, + viewerY - this._ySpring.current.value); + } + + return this._viewportToImageDelta(viewerX - this._xSpring.target.value, + viewerY - this._ySpring.target.value); + }, + + // private + _imageToViewportDelta: function( imageX, imageY, current ) { + var scale = (current ? this._scaleSpring.current.value : this._scaleSpring.target.value); + return new $.Point((imageX / this.source.dimensions.x) * scale, + (imageY / this.source.dimensions.y / this.contentAspectX) * scale); + }, + + /** + * Translates from image coordinate system to OpenSeadragon viewer coordinate system + * This method can be called either by passing X,Y coordinates or an {@link OpenSeadragon.Point}. + * @param {Number|OpenSeadragon.Point} imageX - The X coordinate or point in image coordinate system. + * @param {Number} [imageY] - The Y coordinate in image coordinate system. + * @param {Boolean} [current=false] - Pass true to use the current location; false for target location. + * @return {OpenSeadragon.Point} A point representing the coordinates in the viewport. + */ + imageToViewportCoordinates: function( imageX, imageY, current ) { + if (imageX instanceof $.Point) { + //they passed a point instead of individual components + current = imageY; + imageY = imageX.y; + imageX = imageX.x; + } + + var point = this._imageToViewportDelta(imageX, imageY); + if (current) { + point.x += this._xSpring.current.value; + point.y += this._ySpring.current.value; + } else { + point.x += this._xSpring.target.value; + point.y += this._ySpring.target.value; + } + + return point; + }, + + /** + * Translates from a rectangle which describes a portion of the image in + * pixel coordinates to OpenSeadragon viewport rectangle coordinates. + * This method can be called either by passing X,Y,width,height or an {@link OpenSeadragon.Rect}. + * @param {Number|OpenSeadragon.Rect} imageX - The left coordinate or rectangle in image coordinate system. + * @param {Number} [imageY] - The top coordinate in image coordinate system. + * @param {Number} [pixelWidth] - The width in pixel of the rectangle. + * @param {Number} [pixelHeight] - The height in pixel of the rectangle. + * @param {Boolean} [current=false] - Pass true to use the current location; false for target location. + * @return {OpenSeadragon.Rect} A rect representing the coordinates in the viewport. + */ + imageToViewportRectangle: function( imageX, imageY, pixelWidth, pixelHeight, current ) { + var rect = imageX; + if (rect instanceof $.Rect) { + //they passed a rect instead of individual components + current = imageY; + } else { + rect = new $.Rect(imageX, imageY, pixelWidth, pixelHeight); + } + + var coordA = this.imageToViewportCoordinates(rect.getTopLeft(), current); + var coordB = this._imageToViewportDelta(rect.width, rect.height, current); + + return new $.Rect( + coordA.x, + coordA.y, + coordB.x, + coordB.y, + rect.degrees + ); + }, + + /** + * Translates from a rectangle which describes a portion of + * the viewport in point coordinates to image rectangle coordinates. + * This method can be called either by passing X,Y,width,height or an {@link OpenSeadragon.Rect}. + * @param {Number|OpenSeadragon.Rect} viewerX - The left coordinate or rectangle in viewport coordinate system. + * @param {Number} [viewerY] - The top coordinate in viewport coordinate system. + * @param {Number} [pointWidth] - The width in viewport coordinate system. + * @param {Number} [pointHeight] - The height in viewport coordinate system. + * @param {Boolean} [current=false] - Pass true to use the current location; false for target location. + * @return {OpenSeadragon.Rect} A rect representing the coordinates in the image. + */ + viewportToImageRectangle: function( viewerX, viewerY, pointWidth, pointHeight, current ) { + var rect = viewerX; + if (viewerX instanceof $.Rect) { + //they passed a rect instead of individual components + current = viewerY; + } else { + rect = new $.Rect(viewerX, viewerY, pointWidth, pointHeight); + } + + var coordA = this.viewportToImageCoordinates(rect.getTopLeft(), current); + var coordB = this._viewportToImageDelta(rect.width, rect.height, current); + + return new $.Rect( + coordA.x, + coordA.y, + coordB.x, + coordB.y, + rect.degrees + ); + }, + + /** + * Convert pixel coordinates relative to the viewer element to image + * coordinates. + * @param {OpenSeadragon.Point} pixel + * @returns {OpenSeadragon.Point} + */ + viewerElementToImageCoordinates: function( pixel ) { + var point = this.viewport.pointFromPixel( pixel, true ); + return this.viewportToImageCoordinates( point ); + }, + + /** + * Convert pixel coordinates relative to the image to + * viewer element coordinates. + * @param {OpenSeadragon.Point} pixel + * @returns {OpenSeadragon.Point} + */ + imageToViewerElementCoordinates: function( pixel ) { + var point = this.imageToViewportCoordinates( pixel ); + return this.viewport.pixelFromPoint( point, true ); + }, + + /** + * Convert pixel coordinates relative to the window to image coordinates. + * @param {OpenSeadragon.Point} pixel + * @returns {OpenSeadragon.Point} + */ + windowToImageCoordinates: function( pixel ) { + var viewerCoordinates = pixel.minus( + OpenSeadragon.getElementPosition( this.viewer.element )); + return this.viewerElementToImageCoordinates( viewerCoordinates ); + }, + + /** + * Convert image coordinates to pixel coordinates relative to the window. + * @param {OpenSeadragon.Point} pixel + * @returns {OpenSeadragon.Point} + */ + imageToWindowCoordinates: function( pixel ) { + var viewerCoordinates = this.imageToViewerElementCoordinates( pixel ); + return viewerCoordinates.plus( + OpenSeadragon.getElementPosition( this.viewer.element )); + }, + + /** + * Convert a viewport zoom to an image zoom. + * Image zoom: ratio of the original image size to displayed image size. + * 1 means original image size, 0.5 half size... + * Viewport zoom: ratio of the displayed image's width to viewport's width. + * 1 means identical width, 2 means image's width is twice the viewport's width... + * @function + * @param {Number} viewportZoom The viewport zoom + * @returns {Number} imageZoom The image zoom + */ + viewportToImageZoom: function( viewportZoom ) { + var ratio = this._scaleSpring.current.value * + this.viewport._containerInnerSize.x / this.source.dimensions.x; + return ratio * viewportZoom ; + }, + + /** + * Convert an image zoom to a viewport zoom. + * Image zoom: ratio of the original image size to displayed image size. + * 1 means original image size, 0.5 half size... + * Viewport zoom: ratio of the displayed image's width to viewport's width. + * 1 means identical width, 2 means image's width is twice the viewport's width... + * Note: not accurate with multi-image. + * @function + * @param {Number} imageZoom The image zoom + * @returns {Number} viewportZoom The viewport zoom + */ + imageToViewportZoom: function( imageZoom ) { + var ratio = this._scaleSpring.current.value * + this.viewport._containerInnerSize.x / this.source.dimensions.x; + return imageZoom / ratio; + }, + + /** + * Sets the TiledImage's position in the world. + * @param {OpenSeadragon.Point} position - The new position, in viewport coordinates. + * @param {Boolean} [immediately=false] - Whether to animate to the new position or snap immediately. + * @fires OpenSeadragon.TiledImage.event:bounds-change + */ + setPosition: function(position, immediately) { + var sameTarget = (this._xSpring.target.value === position.x && + this._ySpring.target.value === position.y); + + if (immediately) { + if (sameTarget && this._xSpring.current.value === position.x && + this._ySpring.current.value === position.y) { + return; + } + + this._xSpring.resetTo(position.x); + this._ySpring.resetTo(position.y); + this._needsDraw = true; + } else { + if (sameTarget) { + return; + } + + this._xSpring.springTo(position.x); + this._ySpring.springTo(position.y); + this._needsDraw = true; + } + + if (!sameTarget) { + this._raiseBoundsChange(); + } + }, + + /** + * Sets the TiledImage's width in the world, adjusting the height to match based on aspect ratio. + * @param {Number} width - The new width, in viewport coordinates. + * @param {Boolean} [immediately=false] - Whether to animate to the new size or snap immediately. + * @fires OpenSeadragon.TiledImage.event:bounds-change + */ + setWidth: function(width, immediately) { + this._setScale(width, immediately); + }, + + /** + * Sets the TiledImage's height in the world, adjusting the width to match based on aspect ratio. + * @param {Number} height - The new height, in viewport coordinates. + * @param {Boolean} [immediately=false] - Whether to animate to the new size or snap immediately. + * @fires OpenSeadragon.TiledImage.event:bounds-change + */ + setHeight: function(height, immediately) { + this._setScale(height / this.normHeight, immediately); + }, + + /** + * Positions and scales the TiledImage to fit in the specified bounds. + * Note: this method fires OpenSeadragon.TiledImage.event:bounds-change + * twice + * @param {OpenSeadragon.Rect} bounds The bounds to fit the image into. + * @param {OpenSeadragon.Placement} [anchor=OpenSeadragon.Placement.CENTER] + * How to anchor the image in the bounds. + * @param {Boolean} [immediately=false] Whether to animate to the new size + * or snap immediately. + * @fires OpenSeadragon.TiledImage.event:bounds-change + */ + fitBounds: function(bounds, anchor, immediately) { + anchor = anchor || $.Placement.CENTER; + var anchorProperties = $.Placement.properties[anchor]; + var aspectRatio = this.contentAspectX; + var xOffset = 0; + var yOffset = 0; + var displayedWidthRatio = 1; + var displayedHeightRatio = 1; + if (this._clip) { + aspectRatio = this._clip.getAspectRatio(); + displayedWidthRatio = this._clip.width / this.source.dimensions.x; + displayedHeightRatio = this._clip.height / this.source.dimensions.y; + if (bounds.getAspectRatio() > aspectRatio) { + xOffset = this._clip.x / this._clip.height * bounds.height; + yOffset = this._clip.y / this._clip.height * bounds.height; + } else { + xOffset = this._clip.x / this._clip.width * bounds.width; + yOffset = this._clip.y / this._clip.width * bounds.width; + } + } + + if (bounds.getAspectRatio() > aspectRatio) { + // We will have margins on the X axis + var height = bounds.height / displayedHeightRatio; + var marginLeft = 0; + if (anchorProperties.isHorizontallyCentered) { + marginLeft = (bounds.width - bounds.height * aspectRatio) / 2; + } else if (anchorProperties.isRight) { + marginLeft = bounds.width - bounds.height * aspectRatio; + } + this.setPosition( + new $.Point(bounds.x - xOffset + marginLeft, bounds.y - yOffset), + immediately); + this.setHeight(height, immediately); + } else { + // We will have margins on the Y axis + var width = bounds.width / displayedWidthRatio; + var marginTop = 0; + if (anchorProperties.isVerticallyCentered) { + marginTop = (bounds.height - bounds.width / aspectRatio) / 2; + } else if (anchorProperties.isBottom) { + marginTop = bounds.height - bounds.width / aspectRatio; + } + this.setPosition( + new $.Point(bounds.x - xOffset, bounds.y - yOffset + marginTop), + immediately); + this.setWidth(width, immediately); + } + }, + + /** + * @returns {OpenSeadragon.Rect|null} The TiledImage's current clip rectangle, + * in image pixels, or null if none. + */ + getClip: function() { + if (this._clip) { + return this._clip.clone(); + } + + return null; + }, + + /** + * @param {OpenSeadragon.Rect|null} newClip - An area, in image pixels, to clip to + * (portions of the image outside of this area will not be visible). Only works on + * browsers that support the HTML5 canvas. + */ + setClip: function(newClip) { + $.console.assert(!newClip || newClip instanceof $.Rect, + "[TiledImage.setClip] newClip must be an OpenSeadragon.Rect or null"); + + if (newClip instanceof $.Rect) { + this._clip = newClip.clone(); + } else { + this._clip = null; + } + + this._needsDraw = true; + }, + + /** + * @returns {Number} The TiledImage's current opacity. + */ + getOpacity: function() { + return this.opacity; + }, + + /** + * @param {Number} opacity Opacity the tiled image should be drawn at. + */ + setOpacity: function(opacity) { + this.opacity = opacity; + this._needsDraw = true; + }, + + /** + * @returns {String} The TiledImage's current compositeOperation. + */ + getCompositeOperation: function() { + return this.compositeOperation; + }, + + /** + * @param {String} compositeOperation the tiled image should be drawn with this globalCompositeOperation. + */ + setCompositeOperation: function(compositeOperation) { + this.compositeOperation = compositeOperation; + this._needsDraw = true; + }, + + // private + _setScale: function(scale, immediately) { + var sameTarget = (this._scaleSpring.target.value === scale); + if (immediately) { + if (sameTarget && this._scaleSpring.current.value === scale) { + return; + } + + this._scaleSpring.resetTo(scale); + this._updateForScale(); + this._needsDraw = true; + } else { + if (sameTarget) { + return; + } + + this._scaleSpring.springTo(scale); + this._updateForScale(); + this._needsDraw = true; + } + + if (!sameTarget) { + this._raiseBoundsChange(); + } + }, + + // private + _updateForScale: function() { + this._worldWidthTarget = this._scaleSpring.target.value; + this._worldHeightTarget = this.normHeight * this._scaleSpring.target.value; + this._worldWidthCurrent = this._scaleSpring.current.value; + this._worldHeightCurrent = this.normHeight * this._scaleSpring.current.value; + }, + + // private + _raiseBoundsChange: function() { + /** + * Raised when the TiledImage's bounds are changed. + * Note that this event is triggered only when the animation target is changed; + * not for every frame of animation. + * @event bounds-change + * @memberOf OpenSeadragon.TiledImage + * @type {object} + * @property {OpenSeadragon.World} eventSource - A reference to the TiledImage which raised the event. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + this.raiseEvent('bounds-change'); + }, + + // private + _isBottomItem: function() { + return this.viewer.world.getItemAt(0) === this; + } +}); + +/** + * @private + * @inner + * Pretty much every other line in this needs to be documented so it's clear + * how each piece of this routine contributes to the drawing process. That's + * why there are so many TODO's inside this function. + */ +function updateViewport( tiledImage ) { + + tiledImage._needsDraw = false; + + var tile, + level, + best = null, + haveDrawn = false, + currentTime = $.now(), + viewportBounds = tiledImage.viewport.getBoundsWithMargins( true ), + zeroRatioC = tiledImage.viewport.deltaPixelsFromPointsNoRotate( + tiledImage.source.getPixelRatio( 0 ), + true + ).x * tiledImage._scaleSpring.current.value, + lowestLevel = Math.max( + tiledImage.source.minLevel, + Math.floor( + Math.log( tiledImage.minZoomImageRatio ) / + Math.log( 2 ) + ) + ), + highestLevel = Math.min( + Math.abs(tiledImage.source.maxLevel), + Math.abs(Math.floor( + Math.log( zeroRatioC / tiledImage.minPixelRatio ) / + Math.log( 2 ) + )) + ), + renderPixelRatioC, + renderPixelRatioT, + zeroRatioT, + optimalRatio, + levelOpacity, + levelVisibility; + + // Reset tile's internal drawn state + while (tiledImage.lastDrawn.length > 0) { + tile = tiledImage.lastDrawn.pop(); + tile.beingDrawn = false; + } + + if (!tiledImage.wrapHorizontal && !tiledImage.wrapVertical) { + var tiledImageBounds = tiledImage.getClippedBounds(true); + var intersection = viewportBounds.intersection(tiledImageBounds); + if (intersection === null) { + return; + } + viewportBounds = intersection; + } + viewportBounds = viewportBounds.getBoundingBox(); + viewportBounds.x -= tiledImage._xSpring.current.value; + viewportBounds.y -= tiledImage._ySpring.current.value; + + var viewportTL = viewportBounds.getTopLeft(); + var viewportBR = viewportBounds.getBottomRight(); + + //Don't draw if completely outside of the viewport + if ( !tiledImage.wrapHorizontal && (viewportBR.x < 0 || viewportTL.x > tiledImage._worldWidthCurrent ) ) { + return; + } + + if ( !tiledImage.wrapVertical && ( viewportBR.y < 0 || viewportTL.y > tiledImage._worldHeightCurrent ) ) { + return; + } + + // Calculate viewport rect / bounds + if ( !tiledImage.wrapHorizontal ) { + viewportTL.x = Math.max( viewportTL.x, 0 ); + viewportBR.x = Math.min( viewportBR.x, tiledImage._worldWidthCurrent ); + } + + if ( !tiledImage.wrapVertical ) { + viewportTL.y = Math.max( viewportTL.y, 0 ); + viewportBR.y = Math.min( viewportBR.y, tiledImage._worldHeightCurrent ); + } + + // Calculations for the interval of levels to draw + // (above in initial var statement) + // can return invalid intervals; fix that here if necessary + lowestLevel = Math.min( lowestLevel, highestLevel ); + + // Update any level that will be drawn + var drawLevel; // FIXME: drawLevel should have a more explanatory name + for ( level = highestLevel; level >= lowestLevel; level-- ) { + drawLevel = false; + + //Avoid calculations for draw if we have already drawn this + renderPixelRatioC = tiledImage.viewport.deltaPixelsFromPointsNoRotate( + tiledImage.source.getPixelRatio( level ), + true + ).x * tiledImage._scaleSpring.current.value; + + if ( ( !haveDrawn && renderPixelRatioC >= tiledImage.minPixelRatio ) || + ( level == lowestLevel ) ) { + drawLevel = true; + haveDrawn = true; + } else if ( !haveDrawn ) { + continue; + } + + //Perform calculations for draw if we haven't drawn this + renderPixelRatioT = tiledImage.viewport.deltaPixelsFromPointsNoRotate( + tiledImage.source.getPixelRatio( level ), + false + ).x * tiledImage._scaleSpring.current.value; + + zeroRatioT = tiledImage.viewport.deltaPixelsFromPointsNoRotate( + tiledImage.source.getPixelRatio( + Math.max( + tiledImage.source.getClosestLevel( tiledImage.viewport.containerSize ) - 1, + 0 + ) + ), + false + ).x * tiledImage._scaleSpring.current.value; + + optimalRatio = tiledImage.immediateRender ? + 1 : + zeroRatioT; + + levelOpacity = Math.min( 1, ( renderPixelRatioC - 0.5 ) / 0.5 ); + + levelVisibility = optimalRatio / Math.abs( + optimalRatio - renderPixelRatioT + ); + + // Update the level and keep track of 'best' tile to load + best = updateLevel( + tiledImage, + haveDrawn, + drawLevel, + level, + levelOpacity, + levelVisibility, + viewportTL, + viewportBR, + currentTime, + best + ); + + // Stop the loop if lower-res tiles would all be covered by + // already drawn tiles + if ( providesCoverage( tiledImage.coverage, level ) ) { + break; + } + } + + // Perform the actual drawing + drawTiles( tiledImage, tiledImage.lastDrawn ); + + // Load the new 'best' tile + if (best && !best.context2D) { + loadTile( tiledImage, best, currentTime ); + } + +} + + +function updateLevel( tiledImage, haveDrawn, drawLevel, level, levelOpacity, levelVisibility, viewportTL, viewportBR, currentTime, best ){ + + var x, y, + tileTL, + tileBR, + numberOfTiles, + viewportCenter = tiledImage.viewport.pixelFromPoint( tiledImage.viewport.getCenter() ); + + + if( tiledImage.viewer ){ + /** + * - Needs documentation - + * + * @event update-level + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event. + * @property {OpenSeadragon.TiledImage} tiledImage - Which TiledImage is being drawn. + * @property {Object} havedrawn + * @property {Object} level + * @property {Object} opacity + * @property {Object} visibility + * @property {Object} topleft + * @property {Object} bottomright + * @property {Object} currenttime + * @property {Object} best + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + tiledImage.viewer.raiseEvent( 'update-level', { + tiledImage: tiledImage, + havedrawn: haveDrawn, + level: level, + opacity: levelOpacity, + visibility: levelVisibility, + topleft: viewportTL, + bottomright: viewportBR, + currenttime: currentTime, + best: best + }); + } + + //OK, a new drawing so do your calculations + tileTL = tiledImage.source.getTileAtPoint( level, viewportTL.divide( tiledImage._scaleSpring.current.value )); + tileBR = tiledImage.source.getTileAtPoint( level, viewportBR.divide( tiledImage._scaleSpring.current.value )); + numberOfTiles = tiledImage.source.getNumTiles( level ); + + resetCoverage( tiledImage.coverage, level ); + + if ( !tiledImage.wrapHorizontal ) { + tileBR.x = Math.min( tileBR.x, numberOfTiles.x - 1 ); + } + if ( !tiledImage.wrapVertical ) { + tileBR.y = Math.min( tileBR.y, numberOfTiles.y - 1 ); + } + + for ( x = tileTL.x; x <= tileBR.x; x++ ) { + for ( y = tileTL.y; y <= tileBR.y; y++ ) { + + best = updateTile( + tiledImage, + drawLevel, + haveDrawn, + x, y, + level, + levelOpacity, + levelVisibility, + viewportCenter, + numberOfTiles, + currentTime, + best + ); + + } + } + + return best; +} + +function updateTile( tiledImage, drawLevel, haveDrawn, x, y, level, levelOpacity, levelVisibility, viewportCenter, numberOfTiles, currentTime, best){ + + var tile = getTile( + x, y, + level, + tiledImage.source, + tiledImage.tilesMatrix, + currentTime, + numberOfTiles, + tiledImage._worldWidthCurrent, + tiledImage._worldHeightCurrent + ), + drawTile = drawLevel; + + if( tiledImage.viewer ){ + /** + * - Needs documentation - + * + * @event update-tile + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event. + * @property {OpenSeadragon.TiledImage} tiledImage - Which TiledImage is being drawn. + * @property {OpenSeadragon.Tile} tile + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + tiledImage.viewer.raiseEvent( 'update-tile', { + tiledImage: tiledImage, + tile: tile + }); + } + + setCoverage( tiledImage.coverage, level, x, y, false ); + + if ( !tile.exists ) { + return best; + } + + if ( haveDrawn && !drawTile ) { + if ( isCovered( tiledImage.coverage, level, x, y ) ) { + setCoverage( tiledImage.coverage, level, x, y, true ); + } else { + drawTile = true; + } + } + + if ( !drawTile ) { + return best; + } + + positionTile( + tile, + tiledImage.source.tileOverlap, + tiledImage.viewport, + viewportCenter, + levelVisibility, + tiledImage + ); + + if (!tile.loaded) { + if (tile.context2D) { + setTileLoaded(tiledImage, tile); + } else { + var imageRecord = tiledImage._tileCache.getImageRecord(tile.url); + if (imageRecord) { + var image = imageRecord.getImage(); + setTileLoaded(tiledImage, tile, image); + } + } + } + + if ( tile.loaded ) { + var needsDraw = blendTile( + tiledImage, + tile, + x, y, + level, + levelOpacity, + currentTime + ); + + if ( needsDraw ) { + tiledImage._needsDraw = true; + } + } else if ( tile.loading ) { + // the tile is already in the download queue + // thanks josh1093 for finally translating this typo + } else { + best = compareTiles( best, tile ); + } + + return best; +} + +function getTile( x, y, level, tileSource, tilesMatrix, time, numTiles, worldWidth, worldHeight ) { + var xMod, + yMod, + bounds, + exists, + url, + context2D, + tile; + + if ( !tilesMatrix[ level ] ) { + tilesMatrix[ level ] = {}; + } + if ( !tilesMatrix[ level ][ x ] ) { + tilesMatrix[ level ][ x ] = {}; + } + + if ( !tilesMatrix[ level ][ x ][ y ] ) { + xMod = ( numTiles.x + ( x % numTiles.x ) ) % numTiles.x; + yMod = ( numTiles.y + ( y % numTiles.y ) ) % numTiles.y; + bounds = tileSource.getTileBounds( level, xMod, yMod ); + exists = tileSource.tileExists( level, xMod, yMod ); + url = tileSource.getTileUrl( level, xMod, yMod ); + context2D = tileSource.getContext2D ? + tileSource.getContext2D(level, xMod, yMod) : undefined; + + bounds.x += ( x - xMod ) / numTiles.x; + bounds.y += (worldHeight / worldWidth) * (( y - yMod ) / numTiles.y); + + tilesMatrix[ level ][ x ][ y ] = new $.Tile( + level, + x, + y, + bounds, + exists, + url, + context2D + ); + } + + tile = tilesMatrix[ level ][ x ][ y ]; + tile.lastTouchTime = time; + + return tile; +} + +function loadTile( tiledImage, tile, time ) { + tile.loading = true; + tiledImage._imageLoader.addJob({ + src: tile.url, + crossOriginPolicy: tiledImage.crossOriginPolicy, + callback: function( image, errorMsg ){ + onTileLoad( tiledImage, tile, time, image, errorMsg ); + }, + abort: function() { + tile.loading = false; + } + }); +} + +function onTileLoad( tiledImage, tile, time, image, errorMsg ) { + if ( !image ) { + $.console.log( "Tile %s failed to load: %s - error: %s", tile, tile.url, errorMsg ); + /** + * Triggered when a tile fails to load. + * + * @event tile-load-failed + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Tile} tile - The tile that failed to load. + * @property {OpenSeadragon.TiledImage} tiledImage - The tiled image the tile belongs to. + * @property {number} time - The time in milliseconds when the tile load began. + * @property {string} message - The error message. + */ + tiledImage.viewer.raiseEvent("tile-load-failed", {tile: tile, tiledImage: tiledImage, time: time, message: errorMsg}); + tile.loading = false; + tile.exists = false; + return; + } + + if ( time < tiledImage.lastResetTime ) { + $.console.log( "Ignoring tile %s loaded before reset: %s", tile, tile.url ); + tile.loading = false; + return; + } + + var finish = function() { + var cutoff = Math.ceil( Math.log( + tiledImage.source.getTileWidth(tile.level) ) / Math.log( 2 ) ); + setTileLoaded(tiledImage, tile, image, cutoff); + }; + + // Check if we're mid-update; this can happen on IE8 because image load events for + // cached images happen immediately there + if ( !tiledImage._midDraw ) { + finish(); + } else { + // Wait until after the update, in case caching unloads any tiles + window.setTimeout( finish, 1); + } +} + +function setTileLoaded(tiledImage, tile, image, cutoff) { + var increment = 0; + + function getCompletionCallback() { + increment++; + return completionCallback; + } + + function completionCallback() { + increment--; + if (increment === 0) { + tile.loading = false; + tile.loaded = true; + if (!tile.context2D) { + tiledImage._tileCache.cacheTile({ + image: image, + tile: tile, + cutoff: cutoff, + tiledImage: tiledImage + }); + } + tiledImage._needsDraw = true; + } + } + + /** + * Triggered when a tile has just been loaded in memory. That means that the + * image has been downloaded and can be modified before being drawn to the canvas. + * + * @event tile-loaded + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {Image} image - The image of the tile. + * @property {OpenSeadragon.TiledImage} tiledImage - The tiled image of the loaded tile. + * @property {OpenSeadragon.Tile} tile - The tile which has been loaded. + * @property {function} getCompletionCallback - A function giving a callback to call + * when the asynchronous processing of the image is done. The image will be + * marked as entirely loaded when the callback has been called once for each + * call to getCompletionCallback. + */ + tiledImage.viewer.raiseEvent("tile-loaded", { + tile: tile, + tiledImage: tiledImage, + image: image, + getCompletionCallback: getCompletionCallback + }); + // In case the completion callback is never called, we at least force it once. + getCompletionCallback()(); +} + +function positionTile( tile, overlap, viewport, viewportCenter, levelVisibility, tiledImage ){ + var boundsTL = tile.bounds.getTopLeft(); + + boundsTL.x *= tiledImage._scaleSpring.current.value; + boundsTL.y *= tiledImage._scaleSpring.current.value; + boundsTL.x += tiledImage._xSpring.current.value; + boundsTL.y += tiledImage._ySpring.current.value; + + var boundsSize = tile.bounds.getSize(); + + boundsSize.x *= tiledImage._scaleSpring.current.value; + boundsSize.y *= tiledImage._scaleSpring.current.value; + + var positionC = viewport.pixelFromPointNoRotate(boundsTL, true), + positionT = viewport.pixelFromPointNoRotate(boundsTL, false), + sizeC = viewport.deltaPixelsFromPointsNoRotate(boundsSize, true), + sizeT = viewport.deltaPixelsFromPointsNoRotate(boundsSize, false), + tileCenter = positionT.plus( sizeT.divide( 2 ) ), + tileDistance = viewportCenter.distanceTo( tileCenter ); + + if ( !overlap ) { + sizeC = sizeC.plus( new $.Point( 1, 1 ) ); + } + + tile.position = positionC; + tile.size = sizeC; + tile.distance = tileDistance; + tile.visibility = levelVisibility; +} + + +function blendTile( tiledImage, tile, x, y, level, levelOpacity, currentTime ){ + var blendTimeMillis = 1000 * tiledImage.blendTime, + deltaTime, + opacity; + + if ( !tile.blendStart ) { + tile.blendStart = currentTime; + } + + deltaTime = currentTime - tile.blendStart; + opacity = blendTimeMillis ? Math.min( 1, deltaTime / ( blendTimeMillis ) ) : 1; + + if ( tiledImage.alwaysBlend ) { + opacity *= levelOpacity; + } + + tile.opacity = opacity; + + tiledImage.lastDrawn.push( tile ); + + if ( opacity == 1 ) { + setCoverage( tiledImage.coverage, level, x, y, true ); + tiledImage._hasOpaqueTile = true; + } else if ( deltaTime < blendTimeMillis ) { + return true; + } + + return false; +} + +/** + * @private + * @inner + * Returns true if the given tile provides coverage to lower-level tiles of + * lower resolution representing the same content. If neither x nor y is + * given, returns true if the entire visible level provides coverage. + * + * Note that out-of-bounds tiles provide coverage in this sense, since + * there's no content that they would need to cover. Tiles at non-existent + * levels that are within the image bounds, however, do not. + */ +function providesCoverage( coverage, level, x, y ) { + var rows, + cols, + i, j; + + if ( !coverage[ level ] ) { + return false; + } + + if ( x === undefined || y === undefined ) { + rows = coverage[ level ]; + for ( i in rows ) { + if ( rows.hasOwnProperty( i ) ) { + cols = rows[ i ]; + for ( j in cols ) { + if ( cols.hasOwnProperty( j ) && !cols[ j ] ) { + return false; + } + } + } + } + + return true; + } + + return ( + coverage[ level ][ x] === undefined || + coverage[ level ][ x ][ y ] === undefined || + coverage[ level ][ x ][ y ] === true + ); +} + +/** + * @private + * @inner + * Returns true if the given tile is completely covered by higher-level + * tiles of higher resolution representing the same content. If neither x + * nor y is given, returns true if the entire visible level is covered. + */ +function isCovered( coverage, level, x, y ) { + if ( x === undefined || y === undefined ) { + return providesCoverage( coverage, level + 1 ); + } else { + return ( + providesCoverage( coverage, level + 1, 2 * x, 2 * y ) && + providesCoverage( coverage, level + 1, 2 * x, 2 * y + 1 ) && + providesCoverage( coverage, level + 1, 2 * x + 1, 2 * y ) && + providesCoverage( coverage, level + 1, 2 * x + 1, 2 * y + 1 ) + ); + } +} + +/** + * @private + * @inner + * Sets whether the given tile provides coverage or not. + */ +function setCoverage( coverage, level, x, y, covers ) { + if ( !coverage[ level ] ) { + $.console.warn( + "Setting coverage for a tile before its level's coverage has been reset: %s", + level + ); + return; + } + + if ( !coverage[ level ][ x ] ) { + coverage[ level ][ x ] = {}; + } + + coverage[ level ][ x ][ y ] = covers; +} + +/** + * @private + * @inner + * Resets coverage information for the given level. This should be called + * after every draw routine. Note that at the beginning of the next draw + * routine, coverage for every visible tile should be explicitly set. + */ +function resetCoverage( coverage, level ) { + coverage[ level ] = {}; +} + +/** + * @private + * @inner + * Determines whether the 'last best' tile for the area is better than the + * tile in question. + */ +function compareTiles( previousBest, tile ) { + if ( !previousBest ) { + return tile; + } + + if ( tile.visibility > previousBest.visibility ) { + return tile; + } else if ( tile.visibility == previousBest.visibility ) { + if ( tile.distance < previousBest.distance ) { + return tile; + } + } + + return previousBest; +} + +function drawTiles( tiledImage, lastDrawn ) { + if (lastDrawn.length === 0) { + return; + } + var tile = lastDrawn[0]; + + var useSketch = tiledImage.opacity < 1 || + (tiledImage.compositeOperation && + tiledImage.compositeOperation !== 'source-over') || + (!tiledImage._isBottomItem() && tile._hasTransparencyChannel()); + + var sketchScale; + var sketchTranslate; + + var zoom = tiledImage.viewport.getZoom(true); + var imageZoom = tiledImage.viewportToImageZoom(zoom); + if (imageZoom > tiledImage.smoothTileEdgesMinZoom && !tiledImage.iOSDevice) { + // When zoomed in a lot (>100%) the tile edges are visible. + // So we have to composite them at ~100% and scale them up together. + // Note: Disabled on iOS devices per default as it causes a native crash + useSketch = true; + sketchScale = tile.getScaleForEdgeSmoothing(); + sketchTranslate = tile.getTranslationForEdgeSmoothing(sketchScale, + tiledImage._drawer.getCanvasSize(false), + tiledImage._drawer.getCanvasSize(true)); + } + + var bounds; + if (useSketch) { + if (!sketchScale) { + // Except when edge smoothing, we only clean the part of the + // sketch canvas we are going to use for performance reasons. + bounds = tiledImage.viewport.viewportToViewerElementRectangle( + tiledImage.getClippedBounds(true)) + .getIntegerBoundingBox() + .times($.pixelDensityRatio); + } + tiledImage._drawer._clear(true, bounds); + } + + // When scaling, we must rotate only when blending the sketch canvas to avoid + // interpolation + if (tiledImage.viewport.degrees !== 0 && !sketchScale) { + tiledImage._drawer._offsetForRotation(tiledImage.viewport.degrees, useSketch); + } + + var usedClip = false; + if ( tiledImage._clip ) { + tiledImage._drawer.saveContext(useSketch); + + var box = tiledImage.imageToViewportRectangle(tiledImage._clip, true); + var clipRect = tiledImage._drawer.viewportToDrawerRectangle(box); + if (sketchScale) { + clipRect = clipRect.times(sketchScale); + } + if (sketchTranslate) { + clipRect = clipRect.translate(sketchTranslate); + } + tiledImage._drawer.setClip(clipRect, useSketch); + + usedClip = true; + } + + if ( tiledImage.placeholderFillStyle && tiledImage._hasOpaqueTile === false ) { + var placeholderRect = tiledImage._drawer.viewportToDrawerRectangle(tiledImage.getBounds(true)); + if (sketchScale) { + placeholderRect = placeholderRect.times(sketchScale); + } + if (sketchTranslate) { + placeholderRect = placeholderRect.translate(sketchTranslate); + } + + var fillStyle = null; + if ( typeof tiledImage.placeholderFillStyle === "function" ) { + fillStyle = tiledImage.placeholderFillStyle(tiledImage, tiledImage._drawer.context); + } + else { + fillStyle = tiledImage.placeholderFillStyle; + } + + tiledImage._drawer.drawRectangle(placeholderRect, fillStyle, useSketch); + } + + for (var i = lastDrawn.length - 1; i >= 0; i--) { + tile = lastDrawn[ i ]; + tiledImage._drawer.drawTile( tile, tiledImage._drawingHandler, useSketch, sketchScale, sketchTranslate ); + tile.beingDrawn = true; + + if( tiledImage.viewer ){ + /** + * - Needs documentation - + * + * @event tile-drawn + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event. + * @property {OpenSeadragon.TiledImage} tiledImage - Which TiledImage is being drawn. + * @property {OpenSeadragon.Tile} tile + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + tiledImage.viewer.raiseEvent( 'tile-drawn', { + tiledImage: tiledImage, + tile: tile + }); + } + } + + if ( usedClip ) { + tiledImage._drawer.restoreContext( useSketch ); + } + + if (tiledImage.viewport.degrees !== 0 && !sketchScale) { + tiledImage._drawer._restoreRotationChanges(useSketch); + } + + if (useSketch) { + var offsetForRotation = tiledImage.viewport.degrees !== 0 && sketchScale; + if (offsetForRotation) { + tiledImage._drawer._offsetForRotation(tiledImage.viewport.degrees, false); + } + tiledImage._drawer.blendSketch({ + opacity: tiledImage.opacity, + scale: sketchScale, + translate: sketchTranslate, + compositeOperation: tiledImage.compositeOperation, + bounds: bounds + }); + if (offsetForRotation) { + tiledImage._drawer._restoreRotationChanges(false); + } + } + drawDebugInfo( tiledImage, lastDrawn ); +} + +function drawDebugInfo( tiledImage, lastDrawn ) { + if( tiledImage.debugMode ) { + for ( var i = lastDrawn.length - 1; i >= 0; i-- ) { + var tile = lastDrawn[ i ]; + try { + tiledImage._drawer.drawDebugInfo( tile, lastDrawn.length, i ); + } catch(e) { + $.console.error(e); + } + } + } +} + +}( OpenSeadragon )); + +/* + * OpenSeadragon - TileCache + * + * Copyright (C) 2009 CodePlex Foundation + * Copyright (C) 2010-2013 OpenSeadragon contributors + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of CodePlex Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +(function( $ ){ + +// private class +var TileRecord = function( options ) { + $.console.assert( options, "[TileCache.cacheTile] options is required" ); + $.console.assert( options.tile, "[TileCache.cacheTile] options.tile is required" ); + $.console.assert( options.tiledImage, "[TileCache.cacheTile] options.tiledImage is required" ); + this.tile = options.tile; + this.tiledImage = options.tiledImage; +}; + +// private class +var ImageRecord = function(options) { + $.console.assert( options, "[ImageRecord] options is required" ); + $.console.assert( options.image, "[ImageRecord] options.image is required" ); + this._image = options.image; + this._tiles = []; +}; + +ImageRecord.prototype = { + destroy: function() { + this._image = null; + this._renderedContext = null; + this._tiles = null; + }, + + getImage: function() { + return this._image; + }, + + getRenderedContext: function() { + if (!this._renderedContext) { + var canvas = document.createElement( 'canvas' ); + canvas.width = this._image.width; + canvas.height = this._image.height; + this._renderedContext = canvas.getContext('2d'); + this._renderedContext.drawImage( this._image, 0, 0 ); + //since we are caching the prerendered image on a canvas + //allow the image to not be held in memory + this._image = null; + } + return this._renderedContext; + }, + + setRenderedContext: function(renderedContext) { + $.console.error("ImageRecord.setRenderedContext is deprecated. " + + "The rendered context should be created by the ImageRecord " + + "itself when calling ImageRecord.getRenderedContext."); + this._renderedContext = renderedContext; + }, + + addTile: function(tile) { + $.console.assert(tile, '[ImageRecord.addTile] tile is required'); + this._tiles.push(tile); + }, + + removeTile: function(tile) { + for (var i = 0; i < this._tiles.length; i++) { + if (this._tiles[i] === tile) { + this._tiles.splice(i, 1); + return; + } + } + + $.console.warn('[ImageRecord.removeTile] trying to remove unknown tile', tile); + }, + + getTileCount: function() { + return this._tiles.length; + } +}; + +/** + * @class TileCache + * @memberof OpenSeadragon + * @classdesc Stores all the tiles displayed in a {@link OpenSeadragon.Viewer}. + * You generally won't have to interact with the TileCache directly. + * @param {Object} options - Configuration for this TileCache. + * @param {Number} [options.maxImageCacheCount] - See maxImageCacheCount in + * {@link OpenSeadragon.Options} for details. + */ +$.TileCache = function( options ) { + options = options || {}; + + this._maxImageCacheCount = options.maxImageCacheCount || $.DEFAULT_SETTINGS.maxImageCacheCount; + this._tilesLoaded = []; + this._imagesLoaded = []; + this._imagesLoadedCount = 0; +}; + +/** @lends OpenSeadragon.TileCache.prototype */ +$.TileCache.prototype = { + /** + * @returns {Number} The total number of tiles that have been loaded by + * this TileCache. + */ + numTilesLoaded: function() { + return this._tilesLoaded.length; + }, + + /** + * Caches the specified tile, removing an old tile if necessary to stay under the + * maxImageCacheCount specified on construction. Note that if multiple tiles reference + * the same image, there may be more tiles than maxImageCacheCount; the goal is to keep + * the number of images below that number. Note, as well, that even the number of images + * may temporarily surpass that number, but should eventually come back down to the max specified. + * @param {Object} options - Tile info. + * @param {OpenSeadragon.Tile} options.tile - The tile to cache. + * @param {Image} options.image - The image of the tile to cache. + * @param {OpenSeadragon.TiledImage} options.tiledImage - The TiledImage that owns that tile. + * @param {Number} [options.cutoff=0] - If adding this tile goes over the cache max count, this + * function will release an old tile. The cutoff option specifies a tile level at or below which + * tiles will not be released. + */ + cacheTile: function( options ) { + $.console.assert( options, "[TileCache.cacheTile] options is required" ); + $.console.assert( options.tile, "[TileCache.cacheTile] options.tile is required" ); + $.console.assert( options.tile.url, "[TileCache.cacheTile] options.tile.url is required" ); + $.console.assert( options.tiledImage, "[TileCache.cacheTile] options.tiledImage is required" ); + + var cutoff = options.cutoff || 0; + var insertionIndex = this._tilesLoaded.length; + + var imageRecord = this._imagesLoaded[options.tile.url]; + if (!imageRecord) { + $.console.assert( options.image, "[TileCache.cacheTile] options.image is required to create an ImageRecord" ); + imageRecord = this._imagesLoaded[options.tile.url] = new ImageRecord({ + image: options.image + }); + + this._imagesLoadedCount++; + } + + imageRecord.addTile(options.tile); + options.tile.cacheImageRecord = imageRecord; + + // Note that just because we're unloading a tile doesn't necessarily mean + // we're unloading an image. With repeated calls it should sort itself out, though. + if ( this._imagesLoadedCount > this._maxImageCacheCount ) { + var worstTile = null; + var worstTileIndex = -1; + var worstTileRecord = null; + var prevTile, worstTime, worstLevel, prevTime, prevLevel, prevTileRecord; + + for ( var i = this._tilesLoaded.length - 1; i >= 0; i-- ) { + prevTileRecord = this._tilesLoaded[ i ]; + prevTile = prevTileRecord.tile; + + if ( prevTile.level <= cutoff || prevTile.beingDrawn ) { + continue; + } else if ( !worstTile ) { + worstTile = prevTile; + worstTileIndex = i; + worstTileRecord = prevTileRecord; + continue; + } + + prevTime = prevTile.lastTouchTime; + worstTime = worstTile.lastTouchTime; + prevLevel = prevTile.level; + worstLevel = worstTile.level; + + if ( prevTime < worstTime || + ( prevTime == worstTime && prevLevel > worstLevel ) ) { + worstTile = prevTile; + worstTileIndex = i; + worstTileRecord = prevTileRecord; + } + } + + if ( worstTile && worstTileIndex >= 0 ) { + this._unloadTile(worstTileRecord); + insertionIndex = worstTileIndex; + } + } + + this._tilesLoaded[ insertionIndex ] = new TileRecord({ + tile: options.tile, + tiledImage: options.tiledImage + }); + }, + + /** + * Clears all tiles associated with the specified tiledImage. + * @param {OpenSeadragon.TiledImage} tiledImage + */ + clearTilesFor: function( tiledImage ) { + $.console.assert(tiledImage, '[TileCache.clearTilesFor] tiledImage is required'); + var tileRecord; + for ( var i = 0; i < this._tilesLoaded.length; ++i ) { + tileRecord = this._tilesLoaded[ i ]; + if ( tileRecord.tiledImage === tiledImage ) { + this._unloadTile(tileRecord); + this._tilesLoaded.splice( i, 1 ); + i--; + } + } + }, + + // private + getImageRecord: function(url) { + $.console.assert(url, '[TileCache.getImageRecord] url is required'); + return this._imagesLoaded[url]; + }, + + // private + _unloadTile: function(tileRecord) { + $.console.assert(tileRecord, '[TileCache._unloadTile] tileRecord is required'); + var tile = tileRecord.tile; + var tiledImage = tileRecord.tiledImage; + + tile.unload(); + tile.cacheImageRecord = null; + + var imageRecord = this._imagesLoaded[tile.url]; + imageRecord.removeTile(tile); + if (!imageRecord.getTileCount()) { + imageRecord.destroy(); + delete this._imagesLoaded[tile.url]; + this._imagesLoadedCount--; + } + + /** + * Triggered when a tile has just been unloaded from memory. + * + * @event tile-unloaded + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.TiledImage} tiledImage - The tiled image of the unloaded tile. + * @property {OpenSeadragon.Tile} tile - The tile which has been unloaded. + */ + tiledImage.viewer.raiseEvent("tile-unloaded", { + tile: tile, + tiledImage: tiledImage + }); + } +}; + +}( OpenSeadragon )); + +/* + * OpenSeadragon - World + * + * Copyright (C) 2009 CodePlex Foundation + * Copyright (C) 2010-2013 OpenSeadragon contributors + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of CodePlex Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +(function( $ ){ + +/** + * @class World + * @memberof OpenSeadragon + * @extends OpenSeadragon.EventSource + * @classdesc Keeps track of all of the tiled images in the scene. + * @param {Object} options - World options. + * @param {OpenSeadragon.Viewer} options.viewer - The Viewer that owns this World. + **/ +$.World = function( options ) { + var _this = this; + + $.console.assert( options.viewer, "[World] options.viewer is required" ); + + $.EventSource.call( this ); + + this.viewer = options.viewer; + this._items = []; + this._needsDraw = false; + this._autoRefigureSizes = true; + this._needsSizesFigured = false; + this._delegatedFigureSizes = function(event) { + if (_this._autoRefigureSizes) { + _this._figureSizes(); + } else { + _this._needsSizesFigured = true; + } + }; + + this._figureSizes(); +}; + +$.extend( $.World.prototype, $.EventSource.prototype, /** @lends OpenSeadragon.World.prototype */{ + /** + * Add the specified item. + * @param {OpenSeadragon.TiledImage} item - The item to add. + * @param {Number} [options.index] - Index for the item. If not specified, goes at the top. + * @fires OpenSeadragon.World.event:add-item + * @fires OpenSeadragon.World.event:metrics-change + */ + addItem: function( item, options ) { + $.console.assert(item, "[World.addItem] item is required"); + $.console.assert(item instanceof $.TiledImage, "[World.addItem] only TiledImages supported at this time"); + + options = options || {}; + if (options.index !== undefined) { + var index = Math.max(0, Math.min(this._items.length, options.index)); + this._items.splice(index, 0, item); + } else { + this._items.push( item ); + } + + if (this._autoRefigureSizes) { + this._figureSizes(); + } else { + this._needsSizesFigured = true; + } + + this._needsDraw = true; + + item.addHandler('bounds-change', this._delegatedFigureSizes); + + /** + * Raised when an item is added to the World. + * @event add-item + * @memberOf OpenSeadragon.World + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the World which raised the event. + * @property {OpenSeadragon.TiledImage} item - The item that has been added. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + this.raiseEvent( 'add-item', { + item: item + } ); + }, + + /** + * Get the item at the specified index. + * @param {Number} index - The item's index. + * @returns {OpenSeadragon.TiledImage} The item at the specified index. + */ + getItemAt: function( index ) { + $.console.assert(index !== undefined, "[World.getItemAt] index is required"); + return this._items[ index ]; + }, + + /** + * Get the index of the given item or -1 if not present. + * @param {OpenSeadragon.TiledImage} item - The item. + * @returns {Number} The index of the item or -1 if not present. + */ + getIndexOfItem: function( item ) { + $.console.assert(item, "[World.getIndexOfItem] item is required"); + return $.indexOf( this._items, item ); + }, + + /** + * @returns {Number} The number of items used. + */ + getItemCount: function() { + return this._items.length; + }, + + /** + * Change the index of a item so that it appears over or under others. + * @param {OpenSeadragon.TiledImage} item - The item to move. + * @param {Number} index - The new index. + * @fires OpenSeadragon.World.event:item-index-change + */ + setItemIndex: function( item, index ) { + $.console.assert(item, "[World.setItemIndex] item is required"); + $.console.assert(index !== undefined, "[World.setItemIndex] index is required"); + + var oldIndex = this.getIndexOfItem( item ); + + if ( index >= this._items.length ) { + throw new Error( "Index bigger than number of layers." ); + } + + if ( index === oldIndex || oldIndex === -1 ) { + return; + } + + this._items.splice( oldIndex, 1 ); + this._items.splice( index, 0, item ); + this._needsDraw = true; + + /** + * Raised when the order of the indexes has been changed. + * @event item-index-change + * @memberOf OpenSeadragon.World + * @type {object} + * @property {OpenSeadragon.World} eventSource - A reference to the World which raised the event. + * @property {OpenSeadragon.TiledImage} item - The item whose index has + * been changed + * @property {Number} previousIndex - The previous index of the item + * @property {Number} newIndex - The new index of the item + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + this.raiseEvent( 'item-index-change', { + item: item, + previousIndex: oldIndex, + newIndex: index + } ); + }, + + /** + * Remove an item. + * @param {OpenSeadragon.TiledImage} item - The item to remove. + * @fires OpenSeadragon.World.event:remove-item + * @fires OpenSeadragon.World.event:metrics-change + */ + removeItem: function( item ) { + $.console.assert(item, "[World.removeItem] item is required"); + + var index = $.indexOf(this._items, item ); + if ( index === -1 ) { + return; + } + + item.removeHandler('bounds-change', this._delegatedFigureSizes); + item.destroy(); + this._items.splice( index, 1 ); + this._figureSizes(); + this._needsDraw = true; + this._raiseRemoveItem(item); + }, + + /** + * Remove all items. + * @fires OpenSeadragon.World.event:remove-item + * @fires OpenSeadragon.World.event:metrics-change + */ + removeAll: function() { + // We need to make sure any pending images are canceled so the world items don't get messed up + this.viewer._cancelPendingImages(); + var item; + for (var i = 0; i < this._items.length; i++) { + item = this._items[i]; + item.removeHandler('bounds-change', this._delegatedFigureSizes); + item.destroy(); + } + + var removedItems = this._items; + this._items = []; + this._figureSizes(); + this._needsDraw = true; + + for (i = 0; i < removedItems.length; i++) { + item = removedItems[i]; + this._raiseRemoveItem(item); + } + }, + + /** + * Clears all tiles and triggers updates for all items. + */ + resetItems: function() { + for ( var i = 0; i < this._items.length; i++ ) { + this._items[i].reset(); + } + }, + + /** + * Updates (i.e. animates bounds of) all items. + */ + update: function() { + var animated = false; + for ( var i = 0; i < this._items.length; i++ ) { + animated = this._items[i].update() || animated; + } + + return animated; + }, + + /** + * Draws all items. + */ + draw: function() { + for ( var i = 0; i < this._items.length; i++ ) { + this._items[i].draw(); + } + + this._needsDraw = false; + }, + + /** + * @returns {Boolean} true if any items need updating. + */ + needsDraw: function() { + for ( var i = 0; i < this._items.length; i++ ) { + if ( this._items[i].needsDraw() ) { + return true; + } + } + return this._needsDraw; + }, + + /** + * @returns {OpenSeadragon.Rect} The smallest rectangle that encloses all items, in viewport coordinates. + */ + getHomeBounds: function() { + return this._homeBounds.clone(); + }, + + /** + * To facilitate zoom constraints, we keep track of the pixel density of the + * densest item in the World (i.e. the item whose content size to viewport size + * ratio is the highest) and save it as this "content factor". + * @returns {Number} the number of content units per viewport unit. + */ + getContentFactor: function() { + return this._contentFactor; + }, + + /** + * As a performance optimization, setting this flag to false allows the bounds-change event handler + * on tiledImages to skip calculations on the world bounds. If a lot of images are going to be positioned in + * rapid succession, this is a good idea. When finished, setAutoRefigureSizes should be called with true + * or the system may behave oddly. + * @param {Boolean} [value] The value to which to set the flag. + */ + setAutoRefigureSizes: function(value) { + this._autoRefigureSizes = value; + if (value & this._needsSizesFigured) { + this._figureSizes(); + this._needsSizesFigured = false; + } + }, + + /** + * Arranges all of the TiledImages with the specified settings. + * @param {Object} options - Specifies how to arrange. + * @param {Boolean} [options.immediately=false] - Whether to animate to the new arrangement. + * @param {String} [options.layout] - See collectionLayout in {@link OpenSeadragon.Options}. + * @param {Number} [options.rows] - See collectionRows in {@link OpenSeadragon.Options}. + * @param {Number} [options.columns] - See collectionColumns in {@link OpenSeadragon.Options}. + * @param {Number} [options.tileSize] - See collectionTileSize in {@link OpenSeadragon.Options}. + * @param {Number} [options.tileMargin] - See collectionTileMargin in {@link OpenSeadragon.Options}. + * @fires OpenSeadragon.World.event:metrics-change + */ + arrange: function(options) { + options = options || {}; + var immediately = options.immediately || false; + var layout = options.layout || $.DEFAULT_SETTINGS.collectionLayout; + var rows = options.rows || $.DEFAULT_SETTINGS.collectionRows; + var columns = options.columns || $.DEFAULT_SETTINGS.collectionColumns; + var tileSize = options.tileSize || $.DEFAULT_SETTINGS.collectionTileSize; + var tileMargin = options.tileMargin || $.DEFAULT_SETTINGS.collectionTileMargin; + var increment = tileSize + tileMargin; + var wrap; + if (!options.rows && columns) { + wrap = columns; + } else { + wrap = Math.ceil(this._items.length / rows); + } + var x = 0; + var y = 0; + var item, box, width, height, position; + + this.setAutoRefigureSizes(false); + for (var i = 0; i < this._items.length; i++) { + if (i && (i % wrap) === 0) { + if (layout === 'horizontal') { + y += increment; + x = 0; + } else { + x += increment; + y = 0; + } + } + + item = this._items[i]; + box = item.getBounds(); + if (box.width > box.height) { + width = tileSize; + } else { + width = tileSize * (box.width / box.height); + } + + height = width * (box.height / box.width); + position = new $.Point(x + ((tileSize - width) / 2), + y + ((tileSize - height) / 2)); + + item.setPosition(position, immediately); + item.setWidth(width, immediately); + + if (layout === 'horizontal') { + x += increment; + } else { + y += increment; + } + } + this.setAutoRefigureSizes(true); + }, + + // private + _figureSizes: function() { + var oldHomeBounds = this._homeBounds ? this._homeBounds.clone() : null; + var oldContentSize = this._contentSize ? this._contentSize.clone() : null; + var oldContentFactor = this._contentFactor || 0; + + if (!this._items.length) { + this._homeBounds = new $.Rect(0, 0, 1, 1); + this._contentSize = new $.Point(1, 1); + this._contentFactor = 1; + } else { + var item = this._items[0]; + var bounds = item.getBounds(); + this._contentFactor = item.getContentSize().x / bounds.width; + var clippedBounds = item.getClippedBounds(); + var left = clippedBounds.x; + var top = clippedBounds.y; + var right = clippedBounds.x + clippedBounds.width; + var bottom = clippedBounds.y + clippedBounds.height; + for (var i = 1; i < this._items.length; i++) { + item = this._items[i]; + bounds = item.getBounds(); + this._contentFactor = Math.max(this._contentFactor, + item.getContentSize().x / bounds.width); + clippedBounds = item.getClippedBounds(); + left = Math.min(left, clippedBounds.x); + top = Math.min(top, clippedBounds.y); + right = Math.max(right, clippedBounds.x + clippedBounds.width); + bottom = Math.max(bottom, clippedBounds.y + clippedBounds.height); + } + + this._homeBounds = new $.Rect(left, top, right - left, bottom - top); + this._contentSize = new $.Point( + this._homeBounds.width * this._contentFactor, + this._homeBounds.height * this._contentFactor); + } + + if (this._contentFactor !== oldContentFactor || + !this._homeBounds.equals(oldHomeBounds) || + !this._contentSize.equals(oldContentSize)) { + /** + * Raised when the home bounds or content factor change. + * @event metrics-change + * @memberOf OpenSeadragon.World + * @type {object} + * @property {OpenSeadragon.World} eventSource - A reference to the World which raised the event. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + this.raiseEvent('metrics-change', {}); + } + }, + + // private + _raiseRemoveItem: function(item) { + /** + * Raised when an item is removed. + * @event remove-item + * @memberOf OpenSeadragon.World + * @type {object} + * @property {OpenSeadragon.World} eventSource - A reference to the World which raised the event. + * @property {OpenSeadragon.TiledImage} item - The item's underlying item. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + this.raiseEvent( 'remove-item', { item: item } ); + } +}); + +}( OpenSeadragon )); + + +},{}],6:[function(require,module,exports){ +/** + * Allows application to access and update current app state via query string + */ +module.exports = queryState; + +var eventify = require('ngraph.events'); +var windowHashHistory = require('./lib/windowHashHistory.js'); + +/** + * Just a convenience function that returns singleton instance of a query state + */ +queryState.instance = instance; + +// this variable holds singleton instance of the query state +var singletonQS; + +/** + * Creates new instance of the query state. + */ +function queryState(defaults, history) { + history = history || windowHashHistory(defaults); + validateHistoryAPI(history); + + history.onChanged(updateQuery) + + var query = history.get() || Object.create(null); + + var api = { + + /** + * Gets current state. + * + * @param {string?} keyName if present then value for this key is returned. + * Otherwise the entire app state is returend. + */ + get: getValue, + + /** + * Merges current app state with new key/value. + * + * @param {string} key name + * @param {string|number|date} value + */ + set: setValue, + + /** + * Similar to `set()`, but only sets value if it was not set before. + * + * @param {string} key name + * @param {string|number|date} value + */ + setIfEmpty: setIfEmpty, + + /** + * Releases all resources acquired by query state. After calling this method + * no hash monitoring will happen and no more events will be fired. + */ + dispose: dispose, + + onChange: onChange, + offChange: offChange, + + getHistoryObject: getHistoryObject, + } + + var eventBus = eventify({}); + + return api; + + function onChange(callback, ctx) { + eventBus.on('change', callback, ctx); + } + + function offChange(callback, ctx) { + eventBus.off('change', callback, ctx) + } + + function getHistoryObject() { + return history; + } + + function dispose() { + // dispose all history listeners + history.dispose(); + + // And remove our own listeners + eventBus.off(); + } + + function getValue(keyName) { + if (keyName === undefined) return query; + + return query[keyName]; + } + + function setValue(keyName, value) { + var keyNameType = typeof keyName; + + if (keyNameType === 'object') { + Object.keys(keyName).forEach(function(key) { + query[key] = keyName[key]; + }); + } else if (keyNameType === 'string') { + query[keyName] = value; + } + + history.set(query); + + return api; + } + + function updateQuery(newAppState) { + query = newAppState; + eventBus.fire('change', query); + } + + function setIfEmpty(keyName, value) { + if (typeof keyName === 'object') { + Object.keys(keyName).forEach(function(key) { + // TODO: Can i remove code duplication? The main reason why I don't + // want recursion here is to avoid spamming `history.set()` + if (key in query) return; // key name is not empty + + query[key] = keyName[key]; + }); + } + + if (keyName in query) return; // key name is not empty + query[keyName] = value; + + history.set(query); + + return api; + } +} + +/** + * Returns singleton instance of the query state. + * + * @param {Object} defaults - if present, then it is passed to the current instance + * of the query state. Defaults are applied only if they were not present before. + */ +function instance(defaults) { + if (!singletonQS) { + singletonQS = queryState(defaults); + } else if (defaults) { + singletonQS.setIfEmpty(defaults); + } + + return singletonQS; +} + +function validateHistoryAPI(history) { + if (!history) throw new Error('history is required'); + if (typeof history.dispose !== 'function') throw new Error('dispose is required'); + if (typeof history.onChanged !== 'function') throw new Error('onChanged is required'); +} + +},{"./lib/windowHashHistory.js":9,"ngraph.events":4}],7:[function(require,module,exports){ +/** + * Provides a `null` object that matches history API + */ +module.exports = inMemoryHistory; + +function inMemoryHistory(defaults) { + var listeners = []; + var lastQueryObject = defaults; + + return { + dispose: dispose, + onChanged: onChanged, + set: set, + get: get + }; + + function get() { + return lastQueryObject; + } + + function set(newQueryObject) { + lastQueryObject = newQueryObject; + setTimeout(function() { + triggerChange(newQueryObject); + }, 0); + } + + function dispose() { + listeners = []; + } + + function onChanged(changeCallback) { + if (typeof changeCallback !== 'function') { + throw new Error('changeCallback should be a function') + } + + listeners.push(changeCallback); + } + + function triggerChange(appState) { + listeners.forEach(function(listener) { + listener(appState); + }); + } +} + +},{}],8:[function(require,module,exports){ +/** + * This module is similar to JSON, but it encodes/decodes in query string + * format `key1=value1...` + */ +module.exports = { + parse: parse, + stringify: stringify +}; + +function stringify(object) { + if (!object) return ''; + + return Object.keys(object).map(toPairs).join('&'); + + function toPairs(key) { + var value = object[key]; + var pair = encodeURIComponent(key); + if (value !== undefined) { + pair += '=' + encodeValue(value); + } + + return pair; + } +} + +function parse(queryString) { + var query = Object.create(null); + + if (!queryString) return query; + + queryString.split('&').forEach(decodeRecord); + + return query; + + function decodeRecord(queryRecord) { + if (!queryRecord) return; + + var pair = queryRecord.split('='); + query[decodeURIComponent(pair[0])] = decodeValue(pair[1]); + } +} + +function encodeValue(value) { + // TODO: Do I need this? + // if (typeof value === 'string') { + // if (value.match(/^(true|false)$/)) { + // // special handling of strings that look like booleans + // value = JSON.stringify('' + value); + // } else if (value.match(/^-?\d+\.?\d*$/)) { + // // special handling of strings that look like numbers + // value = JSON.stringify('' + value); + // } + // } + if (value instanceof Date) { + value = value.toISOString(); + } + var uriValue = encodeURIComponent(value); + return uriValue; +} + +/** + * This method returns typed value from string + */ +function decodeValue(value) { + value = decodeURIComponent(value); + if (!isNaN(value)) { + return parseFloat(value); + } + if (isBolean(value)) { + return value === 'true'; + } + if (isISODateString(value)) { + return new Date(value); + } + + return value; +} + +function isBolean(strValue) { + return strValue === 'true' || strValue === 'false'; +} + +function isISODateString(str) { + return str && str.match(/(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z))|(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d([+-][0-2]\d:[0-5]\d|Z))|(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d([+-][0-2]\d:[0-5]\d|Z))/) +} + +},{}],9:[function(require,module,exports){ +/** + * Uses `window` to monitor hash and update hash + */ +module.exports = windowHistory; + +var inMemoryHistory = require('./inMemoryHistory.js'); +var query = require('./query.js'); + +function windowHistory(defaults) { + // If we don't support window, we are probably running in node. Just return + // in memory history + if (typeof window === 'undefined') return inMemoryHistory(defaults); + + // Store all `onChanged()` listeners here, so that we can have just one + // `hashchange` listener, and notify one listeners within single event. + var listeners = []; + + // This prefix is used for all query strings. So our state is stored as + // my-app.com/#?key=value + var hashPrefix = '#?'; + + init(); + + // This is our public API: + return { + /** + * Adds callback that is called when hash change happen. Callback receives + * current hash string with `#?` sign + * + * @param {Function} changeCallback - a function that is called when hash is + * changed. Callback gets one argument that represents the new state. + */ + onChanged: onChanged, + + /** + * Releases all resources + */ + dispose: dispose, + + /** + * Sets a new app state + * + * @param {object} appState - the new application state, that should be + * persisted in the hash string + */ + set: set, + + /** + * Gets current app state + */ + get: getStateFromHash + }; + + // Public API is over. You can ignore this part. + + function init() { + var stateFromHash = getStateFromHash(); + var stateChanged = false; + + if (typeof defaults === 'object' && defaults) { + Object.keys(defaults).forEach(function(key) { + if (key in stateFromHash) return; + + stateFromHash[key] = defaults[key] + stateChanged = true; + }); + } + + if (stateChanged) set(stateFromHash); + } + + function set(appState) { + var hash = hashPrefix + query.stringify(appState); + + if (window.history) { + window.history.replaceState(undefined, undefined, hash); + } else { + window.location.replace(hash); + } + } + + function onChanged(changeCallback) { + if (typeof changeCallback !== 'function') throw new Error('changeCallback needs to be a function'); + + // we start listen just once, only if we didn't listen before: + if (listeners.length === 0) { + window.addEventListener('hashchange', onHashChanged, false); + } + + listeners.push(changeCallback); + } + + function dispose() { + if (listeners.length === 0) return; // no need to do anything. + + // Let garbage collector collect all listeners; + listeners = []; + + // And release hash change event: + window.removeEventListener('hashchange', onHashChanged, false); + } + + function onHashChanged() { + var appState = getStateFromHash(); + notifyListeners(appState); + } + + function notifyListeners(appState) { + for (var i = 0; i < listeners.length; ++i) { + var listener = listeners[i]; + listener(appState); + } + } + + function getStateFromHash() { + var queryString = (window.location.hash || hashPrefix).substr(hashPrefix.length); + + return query.parse(queryString); + } +} + +},{"./inMemoryHistory.js":7,"./query.js":8}]},{},[1]) +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy5udm0vdmVyc2lvbnMvbm9kZS92Ni4zLjAvbGliL25vZGVfbW9kdWxlcy93YXRjaGlmeS9ub2RlX21vZHVsZXMvYnJvd3Nlci1wYWNrL19wcmVsdWRlLmpzIiwiaW5kZXguanMiLCJsaWIvaGVscC5qcyIsImxpYi9uYXZpZ2F0b3IuanMiLCJub2RlX21vZHVsZXMvbmdyYXBoLmV2ZW50cy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9vcGVuc2VhZHJhZ29uL2J1aWxkL29wZW5zZWFkcmFnb24vb3BlbnNlYWRyYWdvbi5qcyIsIm5vZGVfbW9kdWxlcy9xdWVyeS1zdGF0ZS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9xdWVyeS1zdGF0ZS9saWIvaW5NZW1vcnlIaXN0b3J5LmpzIiwibm9kZV9tb2R1bGVzL3F1ZXJ5LXN0YXRlL2xpYi9xdWVyeS5qcyIsIm5vZGVfbW9kdWxlcy9xdWVyeS1zdGF0ZS9saWIvd2luZG93SGFzaEhpc3RvcnkuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvNG9CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBzKG8sdSl7aWYoIW5bb10pe2lmKCF0W29dKXt2YXIgYT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2lmKCF1JiZhKXJldHVybiBhKG8sITApO2lmKGkpcmV0dXJuIGkobywhMCk7dmFyIGY9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitvK1wiJ1wiKTt0aHJvdyBmLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsZn12YXIgbD1uW29dPXtleHBvcnRzOnt9fTt0W29dWzBdLmNhbGwobC5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRbb11bMV1bZV07cmV0dXJuIHMobj9uOmUpfSxsLGwuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltvXS5leHBvcnRzfXZhciBpPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7Zm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKyspcyhyW29dKTtyZXR1cm4gc30pIiwidmFyIGxhc3RSZXF1ZXN0ID0gMDtcbnZhciBzYXZlRGVsYXkgPSAyMDA7IC8vIERvbid0IHdhbnQgdG8gc3BhbSB3aXRoIGhpc3RvcnkgdXBkYXRlc1xuXG52YXIgaGVscCA9IHJlcXVpcmUoJy4vbGliL2hlbHAuanMnKTtcbnZhciBxdWVyeVN0YXRlID0gcmVxdWlyZSgncXVlcnktc3RhdGUnKTtcbnJlcXVpcmUoJ29wZW5zZWFkcmFnb24nKTsgLy8gaXQgYWRkcyBpdHNlbGYgdG8gd2luZG93LlxuXG52YXIgcXMgPSBxdWVyeVN0YXRlKHtcbiAgaW5kZXg6ICdtYXJrX3R3YWluJ1xufSk7XG5cbnZhciBpbmRleE5hbWUgPSBxcy5nZXQoJ2luZGV4JylcbnZhciBpbmRleFJvb3QgPSAnaHR0cHM6Ly9hbnZha2EuZ2l0aHViLmlvL3BvcnRyYWl0LWRhdGEvJyArIGluZGV4TmFtZSArICcvJztcblxudmFyIHZpZXdlciA9IHdpbmRvdy5PcGVuU2VhZHJhZ29uKHtcbiAgaWQ6ICdtYXAnLFxuICBzaG93TmF2aWdhdGlvbkNvbnRyb2w6IGZhbHNlLFxuICAvLyBzaG93TmF2aWdhdG9yOiB0cnVlLFxuICBwcmVmaXhVcmw6ICcnLFxuICBwcmVzZXJ2ZVZpZXdwb3J0OiB0cnVlLFxuICB0aWxlU291cmNlczogaW5kZXhSb290ICsgJ2luZGV4LmR6aSdcbn0pO1xuXG5yZXF1aXJlKCcuL2xpYi9uYXZpZ2F0b3IuanMnKSh2aWV3ZXIsIGluZGV4Um9vdCArICdtaW5pLW1hcC5qcGcnKTtcblxudmFyIGJveCA9IGdldEJveCgpO1xuXG52aWV3ZXIuYWRkSGFuZGxlcignb3BlbicsIGZ1bmN0aW9uKCkge1xuICBpZiAoYm94KSB7XG4gICAgdmlld2VyLnZpZXdwb3J0LmZpdEJvdW5kcyhib3gsIHRydWUpXG4gIH1cbn0pO1xuXG52aWV3ZXIuYWRkSGFuZGxlcigndmlld3BvcnQtY2hhbmdlJywgZnVuY3Rpb24oKSB7XG4gIHZhciB2aWV3cG9ydCA9IHZpZXdlci52aWV3cG9ydDtcbiAgdmFyIGJveCA9IHZpZXdwb3J0LmdldEJvdW5kcygpO1xuICBpZiAodmlld3BvcnQuZ2V0Wm9vbSgpIDw9IDEpIHtcbiAgICBoZWxwLnNob3coKTtcbiAgfVxuICBzYXZlQ3VycmVudEJveChib3gpO1xufSk7XG5cbmZ1bmN0aW9uIGdldEJveCgpIHtcbiAgdmFyIGRlZ3JlZXMgPSBxcy5nZXQoJ2RlZ3JlZXMnKSB8fCAwO1xuICB2YXIgaGVpZ2h0ID0gcXMuZ2V0KCdoZWlnaHQnKTtcbiAgdmFyIHdpZHRoID0gcXMuZ2V0KCd3aWR0aCcpO1xuICB2YXIgeCA9IHFzLmdldCgneCcpO1xuICB2YXIgeSA9IHFzLmdldCgneScpO1xuICBpZiAoeCA9PT0gdW5kZWZpbmVkIHx8IHkgPT09IHVuZGVmaW5lZCB8fCB3aWR0aCA9PT0gdW5kZWZpbmVkIHx8IGhlaWdodCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG5cbiAgcmV0dXJuIG5ldyB3aW5kb3cuT3BlblNlYWRyYWdvbi5SZWN0KHgsIHksIHdpZHRoLCBoZWlnaHQsIGRlZ3JlZXMpXG59XG5cbmZ1bmN0aW9uIHNhdmVDdXJyZW50Qm94KGJveCkge1xuICBpZiAobGFzdFJlcXVlc3QpIHtcbiAgICBjbGVhclRpbWVvdXQobGFzdFJlcXVlc3QpO1xuICB9XG5cbiAgbGFzdFJlcXVlc3QgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgIHFzLnNldChib3gpO1xuICB9LCBzYXZlRGVsYXkpO1xufVxuXG5cblxuIiwibW9kdWxlLmV4cG9ydHMgPSBjcmVhdGVIZWxwKCk7XG5cbmZ1bmN0aW9uIGNyZWF0ZUhlbHAoKSB7XG4gIHZhciBzdWJzY3JpYmVkID0gZmFsc2U7XG4gIHZhciBldmVudFNvdXJjZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXAnKVxuICBsaXN0ZW5Ub0V2ZW50cygpO1xuXG4gIHJldHVybiB7XG4gICAgc2hvdzogc2hvd1xuICB9XG5cbiAgZnVuY3Rpb24gbGlzdGVuVG9FdmVudHMoKSB7XG4gICAgaWYgKHN1YnNjcmliZWQpIHJldHVybjtcblxuICAgIHN1YnNjcmliZWQgPSB0cnVlO1xuICAgIGV2ZW50U291cmNlLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaGlkZUhlbHAsIHRydWUpO1xuICAgIGV2ZW50U291cmNlLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNld2hlZWwnLCBoaWRlSGVscCwgdHJ1ZSk7XG4gICAgZXZlbnRTb3VyY2UuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIGhpZGVIZWxwLCB0cnVlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNob3coKSB7XG4gICAgdmFyIGl0ZW1zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmhlbHAnKVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyArK2kpIHtcbiAgICAgIGl0ZW1zW2ldLmNsYXNzTGlzdC5yZW1vdmUoJ2hpZGRlbicpO1xuICAgIH1cbiAgICBsaXN0ZW5Ub0V2ZW50cygpO1xuICB9XG5cbiAgZnVuY3Rpb24gaGlkZUhlbHAoKSB7XG4gICAgZXZlbnRTb3VyY2UucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoaWRlSGVscCwgdHJ1ZSk7XG4gICAgZXZlbnRTb3VyY2UucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V3aGVlbCcsIGhpZGVIZWxwLCB0cnVlKTtcbiAgICBldmVudFNvdXJjZS5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgaGlkZUhlbHAsIHRydWUpO1xuICAgIHN1YnNjcmliZWQgPSBmYWxzZTtcbiAgICB2YXIgaXRlbXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuaGVscCcpXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7ICsraSkge1xuICAgICAgaXRlbXNbaV0uY2xhc3NMaXN0LmFkZCgnaGlkZGVuJyk7XG4gICAgfVxuICB9XG59XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZU5hdmlnYXRvcjtcblxuZnVuY3Rpb24gY3JlYXRlTmF2aWdhdG9yKHZpZXdlciwgYmFja2dyb3VuZEltYWdlKSB7XG4gIHZhciBkaXNwbGF5UmVnaW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rpc3BsYXktcmVnaW9uJyk7XG4gIHZhciBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWluaS1tYXAnKTtcbiAgY29udGFpbmVyLnN0eWxlLmJhY2tncm91bmRJbWFnZSA9ICd1cmwoXCInICsgYmFja2dyb3VuZEltYWdlICsgJ1wiKSc7XG5cbiAgdmlld2VyLmFkZEhhbmRsZXIoJ3ZpZXdwb3J0LWNoYW5nZScsIHVwZGF0ZSk7XG4gIGNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCByZXNldFpvb20pO1xuICBjb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHJlc2V0Wm9vbSk7XG5cbiAgcmV0dXJuO1xuXG4gIGZ1bmN0aW9uIHJlc2V0Wm9vbShlKSB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdmlld2VyLnZpZXdwb3J0LmdvSG9tZSgpO1xuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlKCkge1xuICAgIHZhciB2aWV3cG9ydCA9IHZpZXdlci52aWV3cG9ydDtcbiAgICB2YXIgYm91bmRzID0gdmlld3BvcnQuZ2V0Qm91bmRzTm9Sb3RhdGUodHJ1ZSk7XG5cbiAgICAvLyBUT0RPOiBUaGlzIGlzIG5vdCBlbnRpcmVseSBjb3JyZWN0LiBOb3Qgc3VyZSB3aHkuIExpa2UgSSdtIG1pc3Npbmcgc29tZVxuICAgIC8vIHBhc3Npbmcgb3IgcmF0aW8uLi4gVGhpcyBjYW4gYmUgc2VlbiBpZiB5b3Ugem9vbSB0byB0aGUgcmlnaHQgc2lkZS5cbiAgICAvLyBSZWN0YW5nbGUgc2hvd3MgYmxhbmssIHdoaWxlIHBpeGVscyBhcmUgc3RpbGwgdmlzaWJsZVxuICAgIHZhciBNQVhfV0lEVEggPSA3NTtcbiAgICB2YXIgTUFYX0hFSUdIVCA9IE1BWF9XSURUSDtcblxuICAgIHZhciB4ID0gTUFYX1dJRFRIICogYm91bmRzLng7XG4gICAgdmFyIHkgPSBNQVhfSEVJR0hUICogYm91bmRzLnk7XG4gICAgdmFyIHdpZHRoID0gTUFYX1dJRFRIICogYm91bmRzLndpZHRoO1xuICAgIHZhciBoZWlnaHQgPSBNQVhfSEVJR0hUICogYm91bmRzLmhlaWdodDtcblxuICAgIC8vdXBkYXRlIHN0eWxlIGZvciBuYXZpZ2F0b3ItYm94XG4gICAgdmFyIHN0eWxlID0gZGlzcGxheVJlZ2lvbi5zdHlsZTtcblxuXG4gICAgc3R5bGUudG9wID0gcHgoeSk7XG4gICAgc3R5bGUubGVmdCA9IHB4KHgpO1xuICAgIHN0eWxlLndpZHRoICA9IHB4KE1hdGgubWF4KHdpZHRoLCAwKSk7XG4gICAgc3R5bGUuaGVpZ2h0ID0gcHgoTWF0aC5tYXgoaGVpZ2h0LCAwKSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcHgoeCkge1xuICByZXR1cm4gTWF0aC5yb3VuZCh4KSArICdweCdcbn1cbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oc3ViamVjdCkge1xuICB2YWxpZGF0ZVN1YmplY3Qoc3ViamVjdCk7XG5cbiAgdmFyIGV2ZW50c1N0b3JhZ2UgPSBjcmVhdGVFdmVudHNTdG9yYWdlKHN1YmplY3QpO1xuICBzdWJqZWN0Lm9uID0gZXZlbnRzU3RvcmFnZS5vbjtcbiAgc3ViamVjdC5vZmYgPSBldmVudHNTdG9yYWdlLm9mZjtcbiAgc3ViamVjdC5maXJlID0gZXZlbnRzU3RvcmFnZS5maXJlO1xuICByZXR1cm4gc3ViamVjdDtcbn07XG5cbmZ1bmN0aW9uIGNyZWF0ZUV2ZW50c1N0b3JhZ2Uoc3ViamVjdCkge1xuICAvLyBTdG9yZSBhbGwgZXZlbnQgbGlzdGVuZXJzIHRvIHRoaXMgaGFzaC4gS2V5IGlzIGV2ZW50IG5hbWUsIHZhbHVlIGlzIGFycmF5XG4gIC8vIG9mIGNhbGxiYWNrIHJlY29yZHMuXG4gIC8vXG4gIC8vIEEgY2FsbGJhY2sgcmVjb3JkIGNvbnNpc3RzIG9mIGNhbGxiYWNrIGZ1bmN0aW9uIGFuZCBpdHMgb3B0aW9uYWwgY29udGV4dDpcbiAgLy8geyAnZXZlbnROYW1lJyA9PiBbe2NhbGxiYWNrOiBmdW5jdGlvbiwgY3R4OiBvYmplY3R9XSB9XG4gIHZhciByZWdpc3RlcmVkRXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuICByZXR1cm4ge1xuICAgIG9uOiBmdW5jdGlvbiAoZXZlbnROYW1lLCBjYWxsYmFjaywgY3R4KSB7XG4gICAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignY2FsbGJhY2sgaXMgZXhwZWN0ZWQgdG8gYmUgYSBmdW5jdGlvbicpO1xuICAgICAgfVxuICAgICAgdmFyIGhhbmRsZXJzID0gcmVnaXN0ZXJlZEV2ZW50c1tldmVudE5hbWVdO1xuICAgICAgaWYgKCFoYW5kbGVycykge1xuICAgICAgICBoYW5kbGVycyA9IHJlZ2lzdGVyZWRFdmVudHNbZXZlbnROYW1lXSA9IFtdO1xuICAgICAgfVxuICAgICAgaGFuZGxlcnMucHVzaCh7Y2FsbGJhY2s6IGNhbGxiYWNrLCBjdHg6IGN0eH0pO1xuXG4gICAgICByZXR1cm4gc3ViamVjdDtcbiAgICB9LFxuXG4gICAgb2ZmOiBmdW5jdGlvbiAoZXZlbnROYW1lLCBjYWxsYmFjaykge1xuICAgICAgdmFyIHdhbnRUb1JlbW92ZUFsbCA9ICh0eXBlb2YgZXZlbnROYW1lID09PSAndW5kZWZpbmVkJyk7XG4gICAgICBpZiAod2FudFRvUmVtb3ZlQWxsKSB7XG4gICAgICAgIC8vIEtpbGxpbmcgb2xkIGV2ZW50cyBzdG9yYWdlIHNob3VsZCBiZSBlbm91Z2ggaW4gdGhpcyBjYXNlOlxuICAgICAgICByZWdpc3RlcmVkRXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgcmV0dXJuIHN1YmplY3Q7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZWdpc3RlcmVkRXZlbnRzW2V2ZW50TmFtZV0pIHtcbiAgICAgICAgdmFyIGRlbGV0ZUFsbENhbGxiYWNrc0ZvckV2ZW50ID0gKHR5cGVvZiBjYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJyk7XG4gICAgICAgIGlmIChkZWxldGVBbGxDYWxsYmFja3NGb3JFdmVudCkge1xuICAgICAgICAgIGRlbGV0ZSByZWdpc3RlcmVkRXZlbnRzW2V2ZW50TmFtZV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIGNhbGxiYWNrcyA9IHJlZ2lzdGVyZWRFdmVudHNbZXZlbnROYW1lXTtcbiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNhbGxiYWNrcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgaWYgKGNhbGxiYWNrc1tpXS5jYWxsYmFjayA9PT0gY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgY2FsbGJhY2tzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHN1YmplY3Q7XG4gICAgfSxcblxuICAgIGZpcmU6IGZ1bmN0aW9uIChldmVudE5hbWUpIHtcbiAgICAgIHZhciBjYWxsYmFja3MgPSByZWdpc3RlcmVkRXZlbnRzW2V2ZW50TmFtZV07XG4gICAgICBpZiAoIWNhbGxiYWNrcykge1xuICAgICAgICByZXR1cm4gc3ViamVjdDtcbiAgICAgIH1cblxuICAgICAgdmFyIGZpcmVBcmd1bWVudHM7XG4gICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgZmlyZUFyZ3VtZW50cyA9IEFycmF5LnByb3RvdHlwZS5zcGxpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuICAgICAgfVxuICAgICAgZm9yKHZhciBpID0gMDsgaSA8IGNhbGxiYWNrcy5sZW5ndGg7ICsraSkge1xuICAgICAgICB2YXIgY2FsbGJhY2tJbmZvID0gY2FsbGJhY2tzW2ldO1xuICAgICAgICBjYWxsYmFja0luZm8uY2FsbGJhY2suYXBwbHkoY2FsbGJhY2tJbmZvLmN0eCwgZmlyZUFyZ3VtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzdWJqZWN0O1xuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVTdWJqZWN0KHN1YmplY3QpIHtcbiAgaWYgKCFzdWJqZWN0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdFdmVudGlmeSBjYW5ub3QgdXNlIGZhbHN5IG9iamVjdCBhcyBldmVudHMgc3ViamVjdCcpO1xuICB9XG4gIHZhciByZXNlcnZlZFdvcmRzID0gWydvbicsICdmaXJlJywgJ29mZiddO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHJlc2VydmVkV29yZHMubGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoc3ViamVjdC5oYXNPd25Qcm9wZXJ0eShyZXNlcnZlZFdvcmRzW2ldKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU3ViamVjdCBjYW5ub3QgYmUgZXZlbnRpZmllZCwgc2luY2UgaXQgYWxyZWFkeSBoYXMgcHJvcGVydHkgJ1wiICsgcmVzZXJ2ZWRXb3Jkc1tpXSArIFwiJ1wiKTtcbiAgICB9XG4gIH1cbn1cbiIsIi8vISBvcGVuc2VhZHJhZ29uIDIuMi4xXG4vLyEgQnVpbHQgb24gMjAxNi0wNy0wMVxuLy8hIEdpdCBjb21taXQ6IHYyLjIuMS0wLWJhYmRlZmRcbi8vISBodHRwOi8vb3BlbnNlYWRyYWdvbi5naXRodWIuaW9cbi8vISBMaWNlbnNlOiBodHRwOi8vb3BlbnNlYWRyYWdvbi5naXRodWIuaW8vbGljZW5zZS9cblxuLypcbiAqIE9wZW5TZWFkcmFnb25cbiAqXG4gKiBDb3B5cmlnaHQgKEMpIDIwMDkgQ29kZVBsZXggRm91bmRhdGlvblxuICogQ29weXJpZ2h0IChDKSAyMDEwLTIwMTMgT3BlblNlYWRyYWdvbiBjb250cmlidXRvcnNcbiAqXG4gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmVcbiAqIG1ldDpcbiAqXG4gKiAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiAqICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAqXG4gKiAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0XG4gKiAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGVcbiAqICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cbiAqXG4gKiAtIE5laXRoZXIgdGhlIG5hbWUgb2YgQ29kZVBsZXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0c1xuICogICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbVxuICogICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuICpcbiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlNcbiAqIFwiQVMgSVNcIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1RcbiAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUlxuICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUXG4gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCxcbiAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRFxuICogVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUlxuICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkdcbiAqIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJU1xuICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4gKi9cblxuLypcbiAqIFBvcnRpb25zIG9mIHRoaXMgc291cmNlIGZpbGUgdGFrZW4gZnJvbSBqUXVlcnk6XG4gKlxuICogQ29weXJpZ2h0IDIwMTEgSm9obiBSZXNpZ1xuICpcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZ1xuICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4gKiBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbiAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbiAqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0b1xuICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvXG4gKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmVcbiAqIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsXG4gKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0ZcbiAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EXG4gKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFXG4gKiBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OXG4gKiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT05cbiAqIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuICovXG5cbi8qXG4gKiBQb3J0aW9ucyBvZiB0aGlzIHNvdXJjZSBmaWxlIHRha2VuIGZyb20gbWF0dHNuaWRlci5jb206XG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTMgTWF0dCBTbmlkZXJcbiAqXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLFxuICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvblxuICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsXG4gKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGVcbiAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbiAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1NcbiAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0ZcbiAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC5cbiAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZXG4gKiBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUXG4gKiBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1JcbiAqIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuICovXG5cblxuLyoqXG4gKiBAbmFtZXNwYWNlIE9wZW5TZWFkcmFnb25cbiAqIEB2ZXJzaW9uIG9wZW5zZWFkcmFnb24gMi4yLjFcbiAqIEBjbGFzc2Rlc2MgVGhlIHJvb3QgbmFtZXNwYWNlIGZvciBPcGVuU2VhZHJhZ29uLiAgQWxsIHV0aWxpdHkgbWV0aG9kc1xuICogYW5kIGNsYXNzZXMgYXJlIGRlZmluZWQgb24gb3IgYmVsb3cgdGhpcyBuYW1lc3BhY2UuXG4gKlxuICovXG5cblxuLy8gVHlwZWRlZnNcblxuIC8qKlxuICAqIEFsbCByZXF1aXJlZCBhbmQgb3B0aW9uYWwgc2V0dGluZ3MgZm9yIGluc3RhbnRpYXRpbmcgYSBuZXcgaW5zdGFuY2Ugb2YgYW4gT3BlblNlYWRyYWdvbiBpbWFnZSB2aWV3ZXIuXG4gICpcbiAgKiBAdHlwZWRlZiB7T2JqZWN0fSBPcHRpb25zXG4gICogQG1lbWJlcm9mIE9wZW5TZWFkcmFnb25cbiAgKlxuICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBpZFxuICAqICAgICBJZCBvZiB0aGUgZWxlbWVudCB0byBhcHBlbmQgdGhlIHZpZXdlcidzIGNvbnRhaW5lciBlbGVtZW50IHRvLiBJZiBub3QgcHJvdmlkZWQsIHRoZSAnZWxlbWVudCcgcHJvcGVydHkgbXVzdCBiZSBwcm92aWRlZC5cbiAgKiAgICAgSWYgYm90aCB0aGUgZWxlbWVudCBhbmQgaWQgcHJvcGVydGllcyBhcmUgc3BlY2lmaWVkLCB0aGUgdmlld2VyIGlzIGFwcGVuZGVkIHRvIHRoZSBlbGVtZW50IHByb3ZpZGVkIGluIHRoZSBlbGVtZW50IHByb3BlcnR5LlxuICAqXG4gICogQHByb3BlcnR5IHtFbGVtZW50fSBlbGVtZW50XG4gICogICAgIFRoZSBlbGVtZW50IHRvIGFwcGVuZCB0aGUgdmlld2VyJ3MgY29udGFpbmVyIGVsZW1lbnQgdG8uIElmIG5vdCBwcm92aWRlZCwgdGhlICdpZCcgcHJvcGVydHkgbXVzdCBiZSBwcm92aWRlZC5cbiAgKiAgICAgSWYgYm90aCB0aGUgZWxlbWVudCBhbmQgaWQgcHJvcGVydGllcyBhcmUgc3BlY2lmaWVkLCB0aGUgdmlld2VyIGlzIGFwcGVuZGVkIHRvIHRoZSBlbGVtZW50IHByb3ZpZGVkIGluIHRoZSBlbGVtZW50IHByb3BlcnR5LlxuICAqXG4gICogQHByb3BlcnR5IHtBcnJheXxTdHJpbmd8RnVuY3Rpb258T2JqZWN0fSBbdGlsZVNvdXJjZXM9bnVsbF1cbiAgKiAgICAgVGlsZSBzb3VyY2UocykgdG8gb3BlbiBpbml0aWFsbHkuIFRoaXMgaXMgYSBjb21wbGV4IHBhcmFtZXRlcjsgc2VlXG4gICogICAgIHtAbGluayBPcGVuU2VhZHJhZ29uLlZpZXdlciNvcGVufSBmb3IgZGV0YWlscy5cbiAgKlxuICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBbdGFiSW5kZXg9MF1cbiAgKiAgICAgVGFiYmluZyBvcmRlciBpbmRleCB0byBhc3NpZ24gdG8gdGhlIHZpZXdlciBlbGVtZW50LiBQb3NpdGl2ZSB2YWx1ZXMgYXJlIHNlbGVjdGVkIGluIGluY3JlYXNpbmcgb3JkZXIuIFdoZW4gdGFiSW5kZXggaXMgMFxuICAqICAgICBzb3VyY2Ugb3JkZXIgaXMgdXNlZC4gQSBuZWdhdGl2ZSB2YWx1ZSBvbWl0cyB0aGUgdmlld2VyIGZyb20gdGhlIHRhYmJpbmcgb3JkZXIuXG4gICpcbiAgKiBAcHJvcGVydHkge0FycmF5fSBvdmVybGF5cyBBcnJheSBvZiBvYmplY3RzIGRlZmluaW5nIHBlcm1hbmVudCBvdmVybGF5cyBvZlxuICAqICAgICB0aGUgdmlld2VyLiBUaGUgb3ZlcmxheXMgYWRkZWQgdmlhIHRoaXMgb3B0aW9uIGFuZCBsYXRlciByZW1vdmVkIHdpdGhcbiAgKiAgICAge0BsaW5rIE9wZW5TZWFkcmFnb24uVmlld2VyI3JlbW92ZU92ZXJsYXl9IHdpbGwgYmUgYWRkZWQgYmFjayB3aGVuIGEgbmV3XG4gICogICAgIGltYWdlIGlzIG9wZW5lZC5cbiAgKiAgICAgVG8gYWRkIG92ZXJsYXlzIHdoaWNoIGNhbiBiZSBkZWZpbml0aXZlbHkgcmVtb3ZlZCwgb25lIG11c3QgdXNlXG4gICogICAgIHtAbGluayBPcGVuU2VhZHJhZ29uLlZpZXdlciNhZGRPdmVybGF5fVxuICAqICAgICBJZiBkaXNwbGF5aW5nIGEgc2VxdWVuY2Ugb2YgaW1hZ2VzLCB0aGUgb3ZlcmxheXMgY2FuIGJlIGFzc29jaWF0ZWRcbiAgKiAgICAgd2l0aCBhIHNwZWNpZmljIHBhZ2UgYnkgcGFzc2luZyB0aGUgb3ZlcmxheXMgYXJyYXkgdG8gdGhlIHBhZ2Unc1xuICAqICAgICB0aWxlIHNvdXJjZSBjb25maWd1cmF0aW9uLlxuICAqICAgICBFeHBlY3RlZCBwcm9wZXJ0aWVzOlxuICAqICAgICAqIHgsIHksIChvciBweCwgcHkgZm9yIHBpeGVsIGNvb3JkaW5hdGVzKSB0byBkZWZpbmUgdGhlIGxvY2F0aW9uLlxuICAqICAgICAqIHdpZHRoLCBoZWlnaHQgaW4gcG9pbnQgaWYgdXNpbmcgeCx5IG9yIGluIHBpeGVscyBpZiB1c2luZyBweCxweS4gSWYgd2lkdGhcbiAgKiAgICAgICBhbmQgaGVpZ2h0IGFyZSBzcGVjaWZpZWQsIHRoZSBvdmVybGF5IHNpemUgaXMgYWRqdXN0ZWQgd2hlbiB6b29taW5nLFxuICAqICAgICAgIG90aGVyd2lzZSB0aGUgc2l6ZSBzdGF5cyB0aGUgc2l6ZSBvZiB0aGUgY29udGVudCAob3IgdGhlIHNpemUgZGVmaW5lZCBieSBDU1MpLlxuICAqICAgICAqIGNsYXNzTmFtZSB0byBhc3NvY2lhdGUgYSBjbGFzcyB0byB0aGUgb3ZlcmxheVxuICAqICAgICAqIGlkIHRvIHNldCB0aGUgb3ZlcmxheSBlbGVtZW50LiBJZiBhbiBlbGVtZW50IHdpdGggdGhpcyBpZCBhbHJlYWR5IGV4aXN0cyxcbiAgKiAgICAgICBpdCBpcyByZXVzZWQsIG90aGVyd2lzZSBpdCBpcyBjcmVhdGVkLiBJZiBub3Qgc3BlY2lmaWVkLCBhIG5ldyBlbGVtZW50IGlzXG4gICogICAgICAgY3JlYXRlZC5cbiAgKiAgICAgKiBwbGFjZW1lbnQgYSBzdHJpbmcgdG8gZGVmaW5lIHRoZSByZWxhdGl2ZSBwb3NpdGlvbiB0byB0aGUgdmlld3BvcnQuXG4gICogICAgICAgT25seSB1c2VkIGlmIG5vIHdpZHRoIGFuZCBoZWlnaHQgYXJlIHNwZWNpZmllZC4gRGVmYXVsdDogJ1RPUF9MRUZUJy5cbiAgKiAgICAgICBTZWUge0BsaW5rIE9wZW5TZWFkcmFnb24uUGxhY2VtZW50fSBmb3IgcG9zc2libGUgdmFsdWVzLlxuICAqXG4gICogQHByb3BlcnR5IHtTdHJpbmd9IFt4bWxQYXRoPW51bGxdXG4gICogICAgIDxzdHJvbmc+REVQUkVDQVRFRDwvc3Ryb25nPi4gQSByZWxhdGl2ZSBwYXRoIHRvIGxvYWQgYSBEWkkgZmlsZSBmcm9tIHRoZSBzZXJ2ZXIuXG4gICogICAgIFByZWZlciB0aGUgbmV3ZXIgT3B0aW9ucy50aWxlU291cmNlcy5cbiAgKlxuICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBbcHJlZml4VXJsPScvaW1hZ2VzLyddXG4gICogICAgIFByZXBlbmRzIHRoZSBwcmVmaXhVcmwgdG8gbmF2SW1hZ2VzIHBhdGhzLCB3aGljaCBpcyB2ZXJ5IHVzZWZ1bFxuICAqICAgICBzaW5jZSB0aGUgZGVmYXVsdCBwYXRocyBhcmUgcmFyZWx5IHVzZWZ1bCBmb3IgcHJvZHVjdGlvblxuICAqICAgICBlbnZpcm9ubWVudHMuXG4gICpcbiAgKiBAcHJvcGVydHkge09wZW5TZWFkcmFnb24uTmF2SW1hZ2VzfSBbbmF2SW1hZ2VzXVxuICAqICAgICBBbiBvYmplY3Qgd2l0aCBhIHByb3BlcnR5IGZvciBlYWNoIGJ1dHRvbiBvciBvdGhlciBidWlsdC1pbiBuYXZpZ2F0aW9uXG4gICogICAgIGNvbnRyb2wsIGVnIHRoZSBjdXJyZW50ICd6b29tSW4nLCAnem9vbU91dCcsICdob21lJywgYW5kICdmdWxscGFnZScuXG4gICogICAgIEVhY2ggb2YgdGhvc2UgaW4gdHVybiBwcm92aWRlcyBhbiBpbWFnZSBwYXRoIGZvciBlYWNoIHN0YXRlIG9mIHRoZSBidXR0b25cbiAgKiAgICAgb3IgbmF2aWdhdGlvbiBjb250cm9sLCBlZyAnUkVTVCcsICdHUk9VUCcsICdIT1ZFUicsICdQUkVTUycuIEZpbmFsbHkgdGhlXG4gICogICAgIGltYWdlIHBhdGhzLCBieSBkZWZhdWx0IGFzc3VtZSB0aGVyZSBpcyBhIGZvbGRlciBvbiB0aGUgc2VydmVycyByb290IHBhdGhcbiAgKiAgICAgY2FsbGVkICcvaW1hZ2VzJywgZWcgJy9pbWFnZXMvem9vbWluX3Jlc3QucG5nJy4gIElmIHlvdSBuZWVkIHRvIGFkanVzdFxuICAqICAgICB0aGVzZSBwYXRocywgcHJlZmVyIHNldHRpbmcgdGhlIG9wdGlvbi5wcmVmaXhVcmwgcmF0aGVyIHRoYW4gb3ZlcnJpZGluZ1xuICAqICAgICBldmVyeSBpbWFnZSBwYXRoIGRpcmVjdGx5IHRocm91Z2ggdGhpcyBzZXR0aW5nLlxuICAqXG4gICogQHByb3BlcnR5IHtCb29sZWFufSBbZGVidWdNb2RlPWZhbHNlXVxuICAqICAgICBUT0RPOiBwcm92aWRlIGFuIGluLXNjcmVlbiBwYW5lbCBwcm92aWRpbmcgZXZlbnQgZGV0YWlsIGZlZWRiYWNrLlxuICAqXG4gICogQHByb3BlcnR5IHtTdHJpbmd9IFtkZWJ1Z0dyaWRDb2xvcj0nIzQzN0FCMiddXG4gICpcbiAgKiBAcHJvcGVydHkge051bWJlcn0gW2JsZW5kVGltZT0wXVxuICAqICAgICBTcGVjaWZpZXMgdGhlIGR1cmF0aW9uIG9mIGFuaW1hdGlvbiBhcyBoaWdoZXIgb3IgbG93ZXIgbGV2ZWwgdGlsZXMgYXJlXG4gICogICAgIHJlcGxhY2luZyB0aGUgZXhpc3RpbmcgdGlsZS5cbiAgKlxuICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gW2Fsd2F5c0JsZW5kPWZhbHNlXVxuICAqICAgICBGb3JjZXMgdGhlIHRpbGUgdG8gYWx3YXlzIGJsZW5kLiAgQnkgZGVmYXVsdCB0aGUgdGlsZXMgc2tpcCBibGVuZGluZ1xuICAqICAgICB3aGVuIHRoZSBibGVuZFRpbWUgaXMgc3VycGFzc2VkIGFuZCB0aGUgY3VycmVudCBhbmltYXRpb24gZnJhbWUgd291bGRcbiAgKiAgICAgbm90IGNvbXBsZXRlIHRoZSBibGVuZC5cbiAgKlxuICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gW2F1dG9IaWRlQ29udHJvbHM9dHJ1ZV1cbiAgKiAgICAgSWYgdGhlIHVzZXIgc3RvcHMgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgdmlld3BvcnQsIGZhZGUgdGhlIG5hdmlnYXRpb25cbiAgKiAgICAgY29udHJvbHMuICBVc2VmdWwgZm9yIHByZXNlbnRhdGlvbiBzaW5jZSB0aGUgY29udHJvbHMgYXJlIGJ5IGRlZmF1bHRcbiAgKiAgICAgZmxvYXRlZCBvbiB0b3Agb2YgdGhlIGltYWdlIHRoZSB1c2VyIGlzIHZpZXdpbmcuXG4gICpcbiAgKiBAcHJvcGVydHkge0Jvb2xlYW59IFtpbW1lZGlhdGVSZW5kZXI9ZmFsc2VdXG4gICogICAgIFJlbmRlciB0aGUgYmVzdCBjbG9zZXN0IGxldmVsIGZpcnN0LCBpZ25vcmluZyB0aGUgbG93ZXJpbmcgbGV2ZWxzIHdoaWNoXG4gICogICAgIHByb3ZpZGUgdGhlIGVmZmVjdCBvZiB2ZXJ5IGJsdXJyeSB0byBzaGFycC4gSXQgaXMgcmVjb21tZW5kZWQgdG8gY2hhbmdlXG4gICogICAgIHNldHRpbmcgdG8gdHJ1ZSBmb3IgbW9iaWxlIGRldmljZXMuXG4gICpcbiAgKiBAcHJvcGVydHkge051bWJlcn0gW2RlZmF1bHRab29tTGV2ZWw9MF1cbiAgKiAgICAgWm9vbSBsZXZlbCB0byB1c2Ugd2hlbiBpbWFnZSBpcyBmaXJzdCBvcGVuZWQgb3IgdGhlIGhvbWUgYnV0dG9uIGlzIGNsaWNrZWQuXG4gICogICAgIElmIDAsIGFkanVzdHMgdG8gZml0IHZpZXdlci5cbiAgKlxuICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBbb3BhY2l0eT0xXVxuICAqICAgICBEZWZhdWx0IG9wYWNpdHkgb2YgdGhlIHRpbGVkIGltYWdlcyAoMT1vcGFxdWUsIDA9dHJhbnNwYXJlbnQpXG4gICpcbiAgKiBAcHJvcGVydHkge1N0cmluZ30gW2NvbXBvc2l0ZU9wZXJhdGlvbj1udWxsXVxuICAqICAgICBWYWxpZCB2YWx1ZXMgYXJlICdzb3VyY2Utb3ZlcicsICdzb3VyY2UtYXRvcCcsICdzb3VyY2UtaW4nLCAnc291cmNlLW91dCcsXG4gICogICAgICdkZXN0aW5hdGlvbi1vdmVyJywgJ2Rlc3RpbmF0aW9uLWF0b3AnLCAnZGVzdGluYXRpb24taW4nLFxuICAqICAgICAnZGVzdGluYXRpb24tb3V0JywgJ2xpZ2h0ZXInLCAnY29weScgb3IgJ3hvcidcbiAgKlxuICAqIEBwcm9wZXJ0eSB7U3RyaW5nfENhbnZhc0dyYWRpZW50fENhbnZhc1BhdHRlcm58RnVuY3Rpb259IFtwbGFjZWhvbGRlckZpbGxTdHlsZT1udWxsXVxuICAqICAgICBEcmF3cyBhIGNvbG9yZWQgcmVjdGFuZ2xlIGJlaGluZCB0aGUgdGlsZSBpZiBpdCBpcyBub3QgbG9hZGVkIHlldC5cbiAgKiAgICAgWW91IGNhbiBwYXNzIGEgQ1NTIGNvbG9yIHZhbHVlIGxpa2UgXCIjRkY4ODAwXCIuXG4gICogICAgIFdoZW4gcGFzc2luZyBhIGZ1bmN0aW9uIHRoZSB0aWxlZEltYWdlIGFuZCBjYW52YXMgY29udGV4dCBhcmUgYXZhaWxhYmxlIGFzIGFyZ3VtZW50IHdoaWNoIGlzIHVzZWZ1bCB3aGVuIHlvdSBkcmF3IGEgZ3JhZGllbnQgb3IgcGF0dGVybi5cbiAgKlxuICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBbZGVncmVlcz0wXVxuICAqICAgICBJbml0aWFsIHJvdGF0aW9uLlxuICAqXG4gICogQHByb3BlcnR5IHtOdW1iZXJ9IFttaW5ab29tTGV2ZWw9bnVsbF1cbiAgKlxuICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBbbWF4Wm9vbUxldmVsPW51bGxdXG4gICpcbiAgKiBAcHJvcGVydHkge0Jvb2xlYW59IFtob21lRmlsbHNWaWV3ZXI9ZmFsc2VdXG4gICogICAgIE1ha2UgdGhlICdob21lJyBidXR0b24gZmlsbCB0aGUgdmlld2VyIGFuZCBjbGlwIHRoZSBpbWFnZSwgaW5zdGVhZFxuICAqICAgICBvZiBmaXR0aW5nIHRoZSBpbWFnZSB0byB0aGUgdmlld2VyIGFuZCBsZXR0ZXJib3hpbmcuXG4gICpcbiAgKiBAcHJvcGVydHkge0Jvb2xlYW59IFtwYW5Ib3Jpem9udGFsPXRydWVdXG4gICogICAgIEFsbG93IGhvcml6b250YWwgcGFuLlxuICAqXG4gICogQHByb3BlcnR5IHtCb29sZWFufSBbcGFuVmVydGljYWw9dHJ1ZV1cbiAgKiAgICAgQWxsb3cgdmVydGljYWwgcGFuLlxuICAqXG4gICogQHByb3BlcnR5IHtCb29sZWFufSBbY29uc3RyYWluRHVyaW5nUGFuPWZhbHNlXVxuICAqXG4gICogQHByb3BlcnR5IHtCb29sZWFufSBbd3JhcEhvcml6b250YWw9ZmFsc2VdXG4gICogICAgIFNldCB0byB0cnVlIHRvIGZvcmNlIHRoZSBpbWFnZSB0byB3cmFwIGhvcml6b250YWxseSB3aXRoaW4gdGhlIHZpZXdwb3J0LlxuICAqICAgICBVc2VmdWwgZm9yIG1hcHMgb3IgaW1hZ2VzIHJlcHJlc2VudGluZyB0aGUgc3VyZmFjZSBvZiBhIHNwaGVyZSBvciBjeWxpbmRlci5cbiAgKlxuICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gW3dyYXBWZXJ0aWNhbD1mYWxzZV1cbiAgKiAgICAgU2V0IHRvIHRydWUgdG8gZm9yY2UgdGhlIGltYWdlIHRvIHdyYXAgdmVydGljYWxseSB3aXRoaW4gdGhlIHZpZXdwb3J0LlxuICAqICAgICBVc2VmdWwgZm9yIG1hcHMgb3IgaW1hZ2VzIHJlcHJlc2VudGluZyB0aGUgc3VyZmFjZSBvZiBhIHNwaGVyZSBvciBjeWxpbmRlci5cbiAgKlxuICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBbbWluWm9vbUltYWdlUmF0aW89MC45XVxuICAqICAgICBUaGUgbWluaW11bSBwZXJjZW50YWdlICggZXhwcmVzc2VkIGFzIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgMSApIG9mXG4gICogICAgIHRoZSB2aWV3cG9ydCBoZWlnaHQgb3Igd2lkdGggYXQgd2hpY2ggdGhlIHpvb20gb3V0IHdpbGwgYmUgY29uc3RyYWluZWQuXG4gICogICAgIFNldHRpbmcgaXQgdG8gMCwgZm9yIGV4YW1wbGUgd2lsbCBhbGxvdyB5b3UgdG8gem9vbSBvdXQgaW5maW5pdHkuXG4gICpcbiAgKiBAcHJvcGVydHkge051bWJlcn0gW21heFpvb21QaXhlbFJhdGlvPTEuMV1cbiAgKiAgICAgVGhlIG1heGltdW0gcmF0aW8gdG8gYWxsb3cgYSB6b29tLWluIHRvIGFmZmVjdCB0aGUgaGlnaGVzdCBsZXZlbCBwaXhlbFxuICAqICAgICByYXRpby4gVGhpcyBjYW4gYmUgc2V0IHRvIEluZmluaXR5IHRvIGFsbG93ICdpbmZpbml0ZScgem9vbWluZyBpbnRvIHRoZVxuICAqICAgICBpbWFnZSB0aG91Z2ggaXQgaXMgbGVzcyBlZmZlY3RpdmUgdmlzdWFsbHkgaWYgdGhlIEhUTUw1IENhbnZhcyBpcyBub3RcbiAgKiAgICAgYXZhaWxibGUgb24gdGhlIHZpZXdpbmcgZGV2aWNlLlxuICAqXG4gICogQHByb3BlcnR5IHtOdW1iZXJ9IFtzbW9vdGhUaWxlRWRnZXNNaW5ab29tPTEuMV1cbiAgKiAgICAgQSB6b29tIHBlcmNlbnRhZ2UgKCB3aGVyZSAxIGlzIDEwMCUgKSBvZiB0aGUgaGlnaGVzdCByZXNvbHV0aW9uIGxldmVsLlxuICAqICAgICBXaGVuIHpvb21lZCBpbiBiZXlvbmQgdGhpcyB2YWx1ZSBhbHRlcm5hdGl2ZSBjb21wb3NpdGluZyB3aWxsIGJlIHVzZWQgdG9cbiAgKiAgICAgc21vb3RoIG91dCB0aGUgZWRnZXMgYmV0d2VlbiB0aWxlcy4gVGhpcyB3aWxsIGhhdmUgYSBwZXJmb3JtYW5jZSBpbXBhY3QuXG4gICogICAgIENhbiBiZSBzZXQgdG8gSW5maW5pdHkgdG8gdHVybiBpdCBvZmYuXG4gICogICAgIE5vdGU6IFRoaXMgc2V0dGluZyBpcyBpZ25vcmVkIG9uIGlPUyBkZXZpY2VzIGR1ZSB0byBhIGtub3duIGJ1ZyAoU2VlIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vb3BlbnNlYWRyYWdvbi9vcGVuc2VhZHJhZ29uL2lzc3Vlcy85NTJ9KVxuICAqXG4gICogQHByb3BlcnR5IHtCb29sZWFufSBbaU9TRGV2aWNlPT9dXG4gICogICAgIFRydWUgaWYgcnVubmluZyBvbiBhbiBpT1MgZGV2aWNlLCBmYWxzZSBvdGhlcndpc2UuXG4gICogICAgIFVzZWQgdG8gZGlzYWJsZSBjZXJ0YWluIGZlYXR1cmVzIHRoYXQgYmVoYXZlIGRpZmZlcmVudGx5IG9uIGlPUyBkZXZpY2VzLlxuICAqXG4gICogQHByb3BlcnR5IHtCb29sZWFufSBbYXV0b1Jlc2l6ZT10cnVlXVxuICAqICAgICBTZXQgdG8gZmFsc2UgdG8gcHJldmVudCBwb2xsaW5nIGZvciB2aWV3ZXIgc2l6ZSBjaGFuZ2VzLiBVc2VmdWwgZm9yIHByb3ZpZGluZyBjdXN0b20gcmVzaXplIGJlaGF2aW9yLlxuICAqXG4gICogQHByb3BlcnR5IHtCb29sZWFufSBbcHJlc2VydmVJbWFnZVNpemVPblJlc2l6ZT1mYWxzZV1cbiAgKiAgICAgU2V0IHRvIHRydWUgdG8gaGF2ZSB0aGUgaW1hZ2Ugc2l6ZSBwcmVzZXJ2ZWQgd2hlbiB0aGUgdmlld2VyIGlzIHJlc2l6ZWQuIFRoaXMgcmVxdWlyZXMgYXV0b1Jlc2l6ZT10cnVlIChkZWZhdWx0KS5cbiAgKlxuICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBbbWluU2Nyb2xsRGVsdGFUaW1lPTUwXVxuICAqICAgICBOdW1iZXIgb2YgbWlsbGlzZWNvbmRzIGJldHdlZW4gY2FudmFzLXNjcm9sbCBldmVudHMuIFRoaXMgdmFsdWUgaGVscHMgbm9ybWFsaXplIHRoZSByYXRlIG9mIGNhbnZhcy1zY3JvbGxcbiAgKiAgICAgZXZlbnRzIGJldHdlZW4gZGlmZmVyZW50IGRldmljZXMsIGNhdXNpbmcgdGhlIGZhc3RlciBkZXZpY2VzIHRvIHNsb3cgZG93biBlbm91Z2ggdG8gbWFrZSB0aGUgem9vbSBjb250cm9sXG4gICogICAgIG1vcmUgbWFuYWdlYWJsZS5cbiAgKlxuICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBbcGl4ZWxzUGVyV2hlZWxMaW5lPTQwXVxuICAqICAgICBGb3IgcGl4ZWwtcmVzb2x1dGlvbiBzY3JvbGxpbmcgZGV2aWNlcywgdGhlIG51bWJlciBvZiBwaXhlbHMgZXF1YWwgdG8gb25lIHNjcm9sbCBsaW5lLlxuICAqXG4gICogQHByb3BlcnR5IHtOdW1iZXJ9IFt2aXNpYmlsaXR5UmF0aW89MC41XVxuICAqICAgICBUaGUgcGVyY2VudGFnZSAoIGFzIGEgbnVtYmVyIGZyb20gMCB0byAxICkgb2YgdGhlIHNvdXJjZSBpbWFnZSB3aGljaFxuICAqICAgICBtdXN0IGJlIGtlcHQgd2l0aGluIHRoZSB2aWV3cG9ydC4gIElmIHRoZSBpbWFnZSBpcyBkcmFnZ2VkIGJleW9uZCB0aGF0XG4gICogICAgIGxpbWl0LCBpdCB3aWxsICdib3VuY2UnIGJhY2sgdW50aWwgdGhlIG1pbmltdW0gdmlzaWJpbGl0eSByYXRpbyBpc1xuICAqICAgICBhY2hpZXZlZC4gIFNldHRpbmcgdGhpcyB0byAwIGFuZCB3cmFwSG9yaXpvbnRhbCAoIG9yIHdyYXBWZXJ0aWNhbCApIHRvXG4gICogICAgIHRydWUgd2lsbCBwcm92aWRlIHRoZSBlZmZlY3Qgb2YgYW4gaW5maW5pdGVseSBzY3JvbGxpbmcgdmlld3BvcnQuXG4gICpcbiAgKiBAcHJvcGVydHkge09iamVjdH0gW3ZpZXdwb3J0TWFyZ2lucz17fV1cbiAgKiAgICAgUHVzaGVzIHRoZSBcImhvbWVcIiByZWdpb24gaW4gZnJvbSB0aGUgc2lkZXMgYnkgdGhlIHNwZWNpZmllZCBhbW91bnRzLlxuICAqICAgICBQb3NzaWJsZSBzdWJwcm9wZXJ0aWVzIChOdW1iZXJzLCBpbiBzY3JlZW4gY29vcmRpbmF0ZXMpOiBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20uXG4gICpcbiAgKiBAcHJvcGVydHkge051bWJlcn0gW2ltYWdlTG9hZGVyTGltaXQ9MF1cbiAgKiAgICAgVGhlIG1heGltdW0gbnVtYmVyIG9mIGltYWdlIHJlcXVlc3RzIHRvIG1ha2UgY29uY3VycmVudGx5LiBCeSBkZWZhdWx0XG4gICogICAgIGl0IGlzIHNldCB0byAwIGFsbG93aW5nIHRoZSBicm93c2VyIHRvIG1ha2UgdGhlIG1heGltdW0gbnVtYmVyIG9mXG4gICogICAgIGltYWdlIHJlcXVlc3RzIGluIHBhcmFsbGVsIGFzIGFsbG93ZWQgYnkgdGhlIGJyb3dzZXJzIHBvbGljeS5cbiAgKlxuICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBbY2xpY2tUaW1lVGhyZXNob2xkPTMwMF1cbiAgKiAgICAgIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHdpdGhpbiB3aGljaCBhIHBvaW50ZXIgZG93bi11cCBldmVudCBjb21iaW5hdGlvblxuICAqICAgICAgd2lsbCBiZSB0cmVhdGVkIGFzIGEgY2xpY2sgZ2VzdHVyZS5cbiAgKlxuICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBbY2xpY2tEaXN0VGhyZXNob2xkPTVdXG4gICogICAgICBUaGUgbWF4aW11bSBkaXN0YW5jZSBhbGxvd2VkIGJldHdlZW4gYSBwb2ludGVyIGRvd24gZXZlbnQgYW5kIGEgcG9pbnRlciB1cCBldmVudFxuICAqICAgICAgdG8gYmUgdHJlYXRlZCBhcyBhIGNsaWNrIGdlc3R1cmUuXG4gICpcbiAgKiBAcHJvcGVydHkge051bWJlcn0gW2RibENsaWNrVGltZVRocmVzaG9sZD0zMDBdXG4gICogICAgICBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB3aXRoaW4gd2hpY2ggdHdvIHBvaW50ZXIgZG93bi11cCBldmVudCBjb21iaW5hdGlvbnNcbiAgKiAgICAgIHdpbGwgYmUgdHJlYXRlZCBhcyBhIGRvdWJsZS1jbGljayBnZXN0dXJlLlxuICAqXG4gICogQHByb3BlcnR5IHtOdW1iZXJ9IFtkYmxDbGlja0Rpc3RUaHJlc2hvbGQ9MjBdXG4gICogICAgICBUaGUgbWF4aW11bSBkaXN0YW5jZSBhbGxvd2VkIGJldHdlZW4gdHdvIHBvaW50ZXIgY2xpY2sgZXZlbnRzXG4gICogICAgICB0byBiZSB0cmVhdGVkIGFzIGEgZG91YmxlLWNsaWNrIGdlc3R1cmUuXG4gICpcbiAgKiBAcHJvcGVydHkge051bWJlcn0gW3NwcmluZ1N0aWZmbmVzcz02LjVdXG4gICpcbiAgKiBAcHJvcGVydHkge051bWJlcn0gW2FuaW1hdGlvblRpbWU9MS4yXVxuICAqICAgICBTcGVjaWZpZXMgdGhlIGFuaW1hdGlvbiBkdXJhdGlvbiBwZXIgZWFjaCB7QGxpbmsgT3BlblNlYWRyYWdvbi5TcHJpbmd9XG4gICogICAgIHdoaWNoIG9jY3VyIHdoZW4gdGhlIGltYWdlIGlzIGRyYWdnZWQgb3Igem9vbWVkLlxuICAqXG4gICogQHByb3BlcnR5IHtPcGVuU2VhZHJhZ29uLkdlc3R1cmVTZXR0aW5nc30gW2dlc3R1cmVTZXR0aW5nc01vdXNlXVxuICAqICAgICBTZXR0aW5ncyBmb3IgZ2VzdHVyZXMgZ2VuZXJhdGVkIGJ5IGEgbW91c2UgcG9pbnRlciBkZXZpY2UuIChTZWUge0BsaW5rIE9wZW5TZWFkcmFnb24uR2VzdHVyZVNldHRpbmdzfSlcbiAgKiBAcHJvcGVydHkge0Jvb2xlYW59IFtnZXN0dXJlU2V0dGluZ3NNb3VzZS5zY3JvbGxUb1pvb209dHJ1ZV0gLSBab29tIG9uIHNjcm9sbCBnZXN0dXJlXG4gICogQHByb3BlcnR5IHtCb29sZWFufSBbZ2VzdHVyZVNldHRpbmdzTW91c2UuY2xpY2tUb1pvb209dHJ1ZV0gLSBab29tIG9uIGNsaWNrIGdlc3R1cmVcbiAgKiBAcHJvcGVydHkge0Jvb2xlYW59IFtnZXN0dXJlU2V0dGluZ3NNb3VzZS5kYmxDbGlja1RvWm9vbT1mYWxzZV0gLSBab29tIG9uIGRvdWJsZS1jbGljayBnZXN0dXJlLiBOb3RlOiBJZiBzZXQgdG8gdHJ1ZVxuICAqICAgICB0aGVuIGNsaWNrVG9ab29tIHNob3VsZCBiZSBzZXQgdG8gZmFsc2UgdG8gcHJldmVudCBtdWx0aXBsZSB6b29tcy5cbiAgKiBAcHJvcGVydHkge0Jvb2xlYW59IFtnZXN0dXJlU2V0dGluZ3NNb3VzZS5waW5jaFRvWm9vbT1mYWxzZV0gLSBab29tIG9uIHBpbmNoIGdlc3R1cmVcbiAgKiBAcHJvcGVydHkge0Jvb2xlYW59IFtnZXN0dXJlU2V0dGluZ3NNb3VzZS5mbGlja0VuYWJsZWQ9ZmFsc2VdIC0gRW5hYmxlIGZsaWNrIGdlc3R1cmVcbiAgKiBAcHJvcGVydHkge051bWJlcn0gW2dlc3R1cmVTZXR0aW5nc01vdXNlLmZsaWNrTWluU3BlZWQ9MTIwXSAtIElmIGZsaWNrRW5hYmxlZCBpcyB0cnVlLCB0aGUgbWluaW11bSBzcGVlZCB0byBpbml0aWF0ZSBhIGZsaWNrIGdlc3R1cmUgKHBpeGVscy1wZXItc2Vjb25kKVxuICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBbZ2VzdHVyZVNldHRpbmdzTW91c2UuZmxpY2tNb21lbnR1bT0wLjI1XSAtIElmIGZsaWNrRW5hYmxlZCBpcyB0cnVlLCB0aGUgbW9tZW50dW0gZmFjdG9yIGZvciB0aGUgZmxpY2sgZ2VzdHVyZVxuICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gW2dlc3R1cmVTZXR0aW5nc01vdXNlLnBpbmNoUm90YXRlPWZhbHNlXSAtIElmIHBpbmNoUm90YXRlIGlzIHRydWUsIHRoZSB1c2VyIHdpbGwgaGF2ZSB0aGUgYWJpbGl0eSB0byByb3RhdGUgdGhlIGltYWdlIHVzaW5nIHRoZWlyIGZpbmdlcnMuXG4gICpcbiAgKiBAcHJvcGVydHkge09wZW5TZWFkcmFnb24uR2VzdHVyZVNldHRpbmdzfSBbZ2VzdHVyZVNldHRpbmdzVG91Y2hdXG4gICogICAgIFNldHRpbmdzIGZvciBnZXN0dXJlcyBnZW5lcmF0ZWQgYnkgYSB0b3VjaCBwb2ludGVyIGRldmljZS4gKFNlZSB7QGxpbmsgT3BlblNlYWRyYWdvbi5HZXN0dXJlU2V0dGluZ3N9KVxuICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gW2dlc3R1cmVTZXR0aW5nc1RvdWNoLnNjcm9sbFRvWm9vbT1mYWxzZV0gLSBab29tIG9uIHNjcm9sbCBnZXN0dXJlXG4gICogQHByb3BlcnR5IHtCb29sZWFufSBbZ2VzdHVyZVNldHRpbmdzVG91Y2guY2xpY2tUb1pvb209ZmFsc2VdIC0gWm9vbSBvbiBjbGljayBnZXN0dXJlXG4gICogQHByb3BlcnR5IHtCb29sZWFufSBbZ2VzdHVyZVNldHRpbmdzVG91Y2guZGJsQ2xpY2tUb1pvb209dHJ1ZV0gLSBab29tIG9uIGRvdWJsZS1jbGljayBnZXN0dXJlLiBOb3RlOiBJZiBzZXQgdG8gdHJ1ZVxuICAqICAgICB0aGVuIGNsaWNrVG9ab29tIHNob3VsZCBiZSBzZXQgdG8gZmFsc2UgdG8gcHJldmVudCBtdWx0aXBsZSB6b29tcy5cbiAgKiBAcHJvcGVydHkge0Jvb2xlYW59IFtnZXN0dXJlU2V0dGluZ3NUb3VjaC5waW5jaFRvWm9vbT10cnVlXSAtIFpvb20gb24gcGluY2ggZ2VzdHVyZVxuICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gW2dlc3R1cmVTZXR0aW5nc1RvdWNoLmZsaWNrRW5hYmxlZD10cnVlXSAtIEVuYWJsZSBmbGljayBnZXN0dXJlXG4gICogQHByb3BlcnR5IHtOdW1iZXJ9IFtnZXN0dXJlU2V0dGluZ3NUb3VjaC5mbGlja01pblNwZWVkPTEyMF0gLSBJZiBmbGlja0VuYWJsZWQgaXMgdHJ1ZSwgdGhlIG1pbmltdW0gc3BlZWQgdG8gaW5pdGlhdGUgYSBmbGljayBnZXN0dXJlIChwaXhlbHMtcGVyLXNlY29uZClcbiAgKiBAcHJvcGVydHkge051bWJlcn0gW2dlc3R1cmVTZXR0aW5nc1RvdWNoLmZsaWNrTW9tZW50dW09MC4yNV0gLSBJZiBmbGlja0VuYWJsZWQgaXMgdHJ1ZSwgdGhlIG1vbWVudHVtIGZhY3RvciBmb3IgdGhlIGZsaWNrIGdlc3R1cmVcbiAgKiBAcHJvcGVydHkge0Jvb2xlYW59IFtnZXN0dXJlU2V0dGluZ3NUb3VjaC5waW5jaFJvdGF0ZT1mYWxzZV0gLSBJZiBwaW5jaFJvdGF0ZSBpcyB0cnVlLCB0aGUgdXNlciB3aWxsIGhhdmUgdGhlIGFiaWxpdHkgdG8gcm90YXRlIHRoZSBpbWFnZSB1c2luZyB0aGVpciBmaW5nZXJzLlxuICAqXG4gICogQHByb3BlcnR5IHtPcGVuU2VhZHJhZ29uLkdlc3R1cmVTZXR0aW5nc30gW2dlc3R1cmVTZXR0aW5nc1Blbl1cbiAgKiAgICAgU2V0dGluZ3MgZm9yIGdlc3R1cmVzIGdlbmVyYXRlZCBieSBhIHBlbiBwb2ludGVyIGRldmljZS4gKFNlZSB7QGxpbmsgT3BlblNlYWRyYWdvbi5HZXN0dXJlU2V0dGluZ3N9KVxuICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gW2dlc3R1cmVTZXR0aW5nc1Blbi5zY3JvbGxUb1pvb209ZmFsc2VdIC0gWm9vbSBvbiBzY3JvbGwgZ2VzdHVyZVxuICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gW2dlc3R1cmVTZXR0aW5nc1Blbi5jbGlja1RvWm9vbT10cnVlXSAtIFpvb20gb24gY2xpY2sgZ2VzdHVyZVxuICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gW2dlc3R1cmVTZXR0aW5nc1Blbi5kYmxDbGlja1RvWm9vbT1mYWxzZV0gLSBab29tIG9uIGRvdWJsZS1jbGljayBnZXN0dXJlLiBOb3RlOiBJZiBzZXQgdG8gdHJ1ZVxuICAqICAgICB0aGVuIGNsaWNrVG9ab29tIHNob3VsZCBiZSBzZXQgdG8gZmFsc2UgdG8gcHJldmVudCBtdWx0aXBsZSB6b29tcy5cbiAgKiBAcHJvcGVydHkge0Jvb2xlYW59IFtnZXN0dXJlU2V0dGluZ3NQZW4ucGluY2hUb1pvb209ZmFsc2VdIC0gWm9vbSBvbiBwaW5jaCBnZXN0dXJlXG4gICogQHByb3BlcnR5IHtCb29sZWFufSBbZ2VzdHVyZVNldHRpbmdzUGVuLmZsaWNrRW5hYmxlZD1mYWxzZV0gLSBFbmFibGUgZmxpY2sgZ2VzdHVyZVxuICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBbZ2VzdHVyZVNldHRpbmdzUGVuLmZsaWNrTWluU3BlZWQ9MTIwXSAtIElmIGZsaWNrRW5hYmxlZCBpcyB0cnVlLCB0aGUgbWluaW11bSBzcGVlZCB0byBpbml0aWF0ZSBhIGZsaWNrIGdlc3R1cmUgKHBpeGVscy1wZXItc2Vjb25kKVxuICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBbZ2VzdHVyZVNldHRpbmdzUGVuLmZsaWNrTW9tZW50dW09MC4yNV0gLSBJZiBmbGlja0VuYWJsZWQgaXMgdHJ1ZSwgdGhlIG1vbWVudHVtIGZhY3RvciBmb3IgdGhlIGZsaWNrIGdlc3R1cmVcbiAgKiBAcHJvcGVydHkge0Jvb2xlYW59IFtnZXN0dXJlU2V0dGluZ3NQZW4ucGluY2hSb3RhdGU9ZmFsc2VdIC0gSWYgcGluY2hSb3RhdGUgaXMgdHJ1ZSwgdGhlIHVzZXIgd2lsbCBoYXZlIHRoZSBhYmlsaXR5IHRvIHJvdGF0ZSB0aGUgaW1hZ2UgdXNpbmcgdGhlaXIgZmluZ2Vycy5cbiAgKlxuICAqIEBwcm9wZXJ0eSB7T3BlblNlYWRyYWdvbi5HZXN0dXJlU2V0dGluZ3N9IFtnZXN0dXJlU2V0dGluZ3NVbmtub3duXVxuICAqICAgICBTZXR0aW5ncyBmb3IgZ2VzdHVyZXMgZ2VuZXJhdGVkIGJ5IHVua25vd24gcG9pbnRlciBkZXZpY2VzLiAoU2VlIHtAbGluayBPcGVuU2VhZHJhZ29uLkdlc3R1cmVTZXR0aW5nc30pXG4gICogQHByb3BlcnR5IHtCb29sZWFufSBbZ2VzdHVyZVNldHRpbmdzVW5rbm93bi5zY3JvbGxUb1pvb209dHJ1ZV0gLSBab29tIG9uIHNjcm9sbCBnZXN0dXJlXG4gICogQHByb3BlcnR5IHtCb29sZWFufSBbZ2VzdHVyZVNldHRpbmdzVW5rbm93bi5jbGlja1RvWm9vbT1mYWxzZV0gLSBab29tIG9uIGNsaWNrIGdlc3R1cmVcbiAgKiBAcHJvcGVydHkge0Jvb2xlYW59IFtnZXN0dXJlU2V0dGluZ3NVbmtub3duLmRibENsaWNrVG9ab29tPXRydWVdIC0gWm9vbSBvbiBkb3VibGUtY2xpY2sgZ2VzdHVyZS4gTm90ZTogSWYgc2V0IHRvIHRydWVcbiAgKiAgICAgdGhlbiBjbGlja1RvWm9vbSBzaG91bGQgYmUgc2V0IHRvIGZhbHNlIHRvIHByZXZlbnQgbXVsdGlwbGUgem9vbXMuXG4gICogQHByb3BlcnR5IHtCb29sZWFufSBbZ2VzdHVyZVNldHRpbmdzVW5rbm93bi5waW5jaFRvWm9vbT10cnVlXSAtIFpvb20gb24gcGluY2ggZ2VzdHVyZVxuICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gW2dlc3R1cmVTZXR0aW5nc1Vua25vd24uZmxpY2tFbmFibGVkPXRydWVdIC0gRW5hYmxlIGZsaWNrIGdlc3R1cmVcbiAgKiBAcHJvcGVydHkge051bWJlcn0gW2dlc3R1cmVTZXR0aW5nc1Vua25vd24uZmxpY2tNaW5TcGVlZD0xMjBdIC0gSWYgZmxpY2tFbmFibGVkIGlzIHRydWUsIHRoZSBtaW5pbXVtIHNwZWVkIHRvIGluaXRpYXRlIGEgZmxpY2sgZ2VzdHVyZSAocGl4ZWxzLXBlci1zZWNvbmQpXG4gICogQHByb3BlcnR5IHtOdW1iZXJ9IFtnZXN0dXJlU2V0dGluZ3NVbmtub3duLmZsaWNrTW9tZW50dW09MC4yNV0gLSBJZiBmbGlja0VuYWJsZWQgaXMgdHJ1ZSwgdGhlIG1vbWVudHVtIGZhY3RvciBmb3IgdGhlIGZsaWNrIGdlc3R1cmVcbiAgKiBAcHJvcGVydHkge0Jvb2xlYW59IFtnZXN0dXJlU2V0dGluZ3NVbmtub3duLnBpbmNoUm90YXRlPWZhbHNlXSAtIElmIHBpbmNoUm90YXRlIGlzIHRydWUsIHRoZSB1c2VyIHdpbGwgaGF2ZSB0aGUgYWJpbGl0eSB0byByb3RhdGUgdGhlIGltYWdlIHVzaW5nIHRoZWlyIGZpbmdlcnMuXG4gICpcbiAgKiBAcHJvcGVydHkge051bWJlcn0gW3pvb21QZXJDbGljaz0yLjBdXG4gICogICAgIFRoZSBcInpvb20gZGlzdGFuY2VcIiBwZXIgbW91c2UgY2xpY2sgb3IgdG91Y2ggdGFwLiA8ZW0+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBTZXR0aW5nIHRoaXMgdG8gMS4wIGVmZmVjdGl2ZWx5IGRpc2FibGVzIHRoZSBjbGljay10by16b29tIGZlYXR1cmUgKGFsc28gc2VlIGdlc3R1cmVTZXR0aW5nc1tNb3VzZXxUb3VjaHxQZW5dLmNsaWNrVG9ab29tL2RibENsaWNrVG9ab29tKS48L2VtPlxuICAqXG4gICogQHByb3BlcnR5IHtOdW1iZXJ9IFt6b29tUGVyU2Nyb2xsPTEuMl1cbiAgKiAgICAgVGhlIFwiem9vbSBkaXN0YW5jZVwiIHBlciBtb3VzZSBzY3JvbGwgb3IgdG91Y2ggcGluY2guIDxlbT48c3Ryb25nPk5vdGU6PC9zdHJvbmc+IFNldHRpbmcgdGhpcyB0byAxLjAgZWZmZWN0aXZlbHkgZGlzYWJsZXMgdGhlIG1vdXNlLXdoZWVsIHpvb20gZmVhdHVyZSAoYWxzbyBzZWUgZ2VzdHVyZVNldHRpbmdzW01vdXNlfFRvdWNofFBlbl0uc2Nyb2xsVG9ab29tfSkuPC9lbT5cbiAgKlxuICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBbem9vbVBlclNlY29uZD0xLjBdXG4gICogICAgIFRoZSBudW1iZXIgb2Ygc2Vjb25kcyB0byBhbmltYXRlIGEgc2luZ2xlIHpvb20gZXZlbnQgb3Zlci5cbiAgKlxuICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gW3Nob3dOYXZpZ2F0b3I9ZmFsc2VdXG4gICogICAgIFNldCB0byB0cnVlIHRvIG1ha2UgdGhlIG5hdmlnYXRvciBtaW5pbWFwIGFwcGVhci5cbiAgKlxuICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBbbmF2aWdhdG9ySWQ9bmF2aWdhdG9yLUdFTkVSQVRFRCBEQVRFXVxuICAqICAgICBUaGUgSUQgb2YgYSBkaXYgdG8gaG9sZCB0aGUgbmF2aWdhdG9yIG1pbmltYXAuXG4gICogICAgIElmIGFuIElEIGlzIHNwZWNpZmllZCwgdGhlIG5hdmlnYXRvclBvc2l0aW9uLCBuYXZpZ2F0b3JTaXplUmF0aW8sIG5hdmlnYXRvck1haW50YWluU2l6ZVJhdGlvLCBuYXZpZ2F0b3JbVG9wfExlZnR8SGVpZ2h0fFdpZHRoXSBhbmQgbmF2aWdhdG9yQXV0b0ZhZGUgb3B0aW9ucyB3aWxsIGJlIGlnbm9yZWQuXG4gICogICAgIElmIGFuIElEIGlzIG5vdCBzcGVjaWZpZWQsIGEgZGl2IGVsZW1lbnQgd2lsbCBiZSBnZW5lcmF0ZWQgYW5kIHBsYWNlZCBvbiB0b3Agb2YgdGhlIG1haW4gaW1hZ2UuXG4gICpcbiAgKiBAcHJvcGVydHkge1N0cmluZ30gW25hdmlnYXRvclBvc2l0aW9uPSdUT1BfUklHSFQnXVxuICAqICAgICBWYWxpZCB2YWx1ZXMgYXJlICdUT1BfTEVGVCcsICdUT1BfUklHSFQnLCAnQk9UVE9NX0xFRlQnLCAnQk9UVE9NX1JJR0hUJywgb3IgJ0FCU09MVVRFJy48YnI+XG4gICogICAgIElmICdBQlNPTFVURScgaXMgc3BlY2lmaWVkLCB0aGVuIG5hdmlnYXRvcltUb3B8TGVmdHxIZWlnaHR8V2lkdGhdIGRldGVybWluZXMgdGhlIHNpemUgYW5kIHBvc2l0aW9uIG9mIHRoZSBuYXZpZ2F0b3IgbWluaW1hcCBpbiB0aGUgdmlld2VyLCBhbmQgbmF2aWdhdG9yU2l6ZVJhdGlvIGFuZCBuYXZpZ2F0b3JNYWludGFpblNpemVSYXRpbyBhcmUgaWdub3JlZC48YnI+XG4gICogICAgIEZvciAnVE9QX0xFRlQnLCAnVE9QX1JJR0hUJywgJ0JPVFRPTV9MRUZUJywgYW5kICdCT1RUT01fUklHSFQnLCB0aGUgbmF2aWdhdG9yU2l6ZVJhdGlvIG9yIG5hdmlnYXRvcltIZWlnaHR8V2lkdGhdIHZhbHVlcyBkZXRlcm1pbmUgdGhlIHNpemUgb2YgdGhlIG5hdmlnYXRvciBtaW5pbWFwLlxuICAqXG4gICogQHByb3BlcnR5IHtOdW1iZXJ9IFtuYXZpZ2F0b3JTaXplUmF0aW89MC4yXVxuICAqICAgICBSYXRpbyBvZiBuYXZpZ2F0b3Igc2l6ZSB0byB2aWV3ZXIgc2l6ZS4gSWdub3JlZCBpZiBuYXZpZ2F0b3JbSGVpZ2h0fFdpZHRoXSBhcmUgc3BlY2lmaWVkLlxuICAqXG4gICogQHByb3BlcnR5IHtCb29sZWFufSBbbmF2aWdhdG9yTWFpbnRhaW5TaXplUmF0aW89ZmFsc2VdXG4gICogICAgIElmIHRydWUsIHRoZSBuYXZpZ2F0b3IgbWluaW1hcCBpcyByZXNpemVkICh1c2luZyBuYXZpZ2F0b3JTaXplUmF0aW8pIHdoZW4gdGhlIHZpZXdlciBzaXplIGNoYW5nZXMuXG4gICpcbiAgKiBAcHJvcGVydHkge051bWJlcnxTdHJpbmd9IFtuYXZpZ2F0b3JUb3A9bnVsbF1cbiAgKiAgICAgU3BlY2lmaWVzIHRoZSBsb2NhdGlvbiBvZiB0aGUgbmF2aWdhdG9yIG1pbmltYXAgKHNlZSBuYXZpZ2F0b3JQb3NpdGlvbikuXG4gICpcbiAgKiBAcHJvcGVydHkge051bWJlcnxTdHJpbmd9IFtuYXZpZ2F0b3JMZWZ0PW51bGxdXG4gICogICAgIFNwZWNpZmllcyB0aGUgbG9jYXRpb24gb2YgdGhlIG5hdmlnYXRvciBtaW5pbWFwIChzZWUgbmF2aWdhdG9yUG9zaXRpb24pLlxuICAqXG4gICogQHByb3BlcnR5IHtOdW1iZXJ8U3RyaW5nfSBbbmF2aWdhdG9ySGVpZ2h0PW51bGxdXG4gICogICAgIFNwZWNpZmllcyB0aGUgc2l6ZSBvZiB0aGUgbmF2aWdhdG9yIG1pbmltYXAgKHNlZSBuYXZpZ2F0b3JQb3NpdGlvbikuXG4gICogICAgIElmIHNwZWNpZmllZCwgbmF2aWdhdG9yU2l6ZVJhdGlvIGFuZCBuYXZpZ2F0b3JNYWludGFpblNpemVSYXRpbyBhcmUgaWdub3JlZC5cbiAgKlxuICAqIEBwcm9wZXJ0eSB7TnVtYmVyfFN0cmluZ30gW25hdmlnYXRvcldpZHRoPW51bGxdXG4gICogICAgIFNwZWNpZmllcyB0aGUgc2l6ZSBvZiB0aGUgbmF2aWdhdG9yIG1pbmltYXAgKHNlZSBuYXZpZ2F0b3JQb3NpdGlvbikuXG4gICogICAgIElmIHNwZWNpZmllZCwgbmF2aWdhdG9yU2l6ZVJhdGlvIGFuZCBuYXZpZ2F0b3JNYWludGFpblNpemVSYXRpbyBhcmUgaWdub3JlZC5cbiAgKlxuICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gW25hdmlnYXRvckF1dG9SZXNpemU9dHJ1ZV1cbiAgKiAgICAgU2V0IHRvIGZhbHNlIHRvIHByZXZlbnQgcG9sbGluZyBmb3IgbmF2aWdhdG9yIHNpemUgY2hhbmdlcy4gVXNlZnVsIGZvciBwcm92aWRpbmcgY3VzdG9tIHJlc2l6ZSBiZWhhdmlvci5cbiAgKiAgICAgU2V0dGluZyB0byBmYWxzZSBjYW4gYWxzbyBpbXByb3ZlIHBlcmZvcm1hbmNlIHdoZW4gdGhlIG5hdmlnYXRvciBpcyBjb25maWd1cmVkIHRvIGEgZml4ZWQgc2l6ZS5cbiAgKlxuICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gW25hdmlnYXRvckF1dG9GYWRlPXRydWVdXG4gICogICAgIElmIHRoZSB1c2VyIHN0b3BzIGludGVyYWN0aW5nIHdpdGggdGhlIHZpZXdwb3J0LCBmYWRlIHRoZSBuYXZpZ2F0b3IgbWluaW1hcC5cbiAgKiAgICAgU2V0dGluZyB0byBmYWxzZSB3aWxsIG1ha2UgdGhlIG5hdmlnYXRvciBtaW5pbWFwIGFsd2F5cyB2aXNpYmxlLlxuICAqXG4gICogQHByb3BlcnR5IHtCb29sZWFufSBbbmF2aWdhdG9yUm90YXRlPXRydWVdXG4gICogICAgIElmIHRydWUsIHRoZSBuYXZpZ2F0b3Igd2lsbCBiZSByb3RhdGVkIHRvZ2V0aGVyIHdpdGggdGhlIHZpZXdlci5cbiAgKlxuICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBbY29udHJvbHNGYWRlRGVsYXk9MjAwMF1cbiAgKiAgICAgVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gd2FpdCBvbmNlIHRoZSB1c2VyIGhhcyBzdG9wcGVkIGludGVyYWN0aW5nXG4gICogICAgIHdpdGggdGhlIGludGVyZmFjZSBiZWZvcmUgYmVnaW5pbmcgdG8gZmFkZSB0aGUgY29udHJvbHMuIEFzc3VtZXNcbiAgKiAgICAgc2hvd05hdmlnYXRpb25Db250cm9sIGFuZCBhdXRvSGlkZUNvbnRyb2xzIGFyZSBib3RoIHRydWUuXG4gICpcbiAgKiBAcHJvcGVydHkge051bWJlcn0gW2NvbnRyb2xzRmFkZUxlbmd0aD0xNTAwXVxuICAqICAgICBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBhbmltYXRlIHRoZSBjb250cm9scyBmYWRpbmcgb3V0LlxuICAqXG4gICogQHByb3BlcnR5IHtOdW1iZXJ9IFttYXhJbWFnZUNhY2hlQ291bnQ9MjAwXVxuICAqICAgICBUaGUgbWF4IG51bWJlciBvZiBpbWFnZXMgd2Ugc2hvdWxkIGtlZXAgaW4gbWVtb3J5IChwZXIgZHJhd2VyKS5cbiAgKlxuICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBbdGltZW91dD0zMDAwMF1cbiAgKlxuICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gW3VzZUNhbnZhcz10cnVlXVxuICAqICAgICBTZXQgdG8gZmFsc2UgdG8gbm90IHVzZSBhbiBIVE1MIGNhbnZhcyBlbGVtZW50IGZvciBpbWFnZSByZW5kZXJpbmcgZXZlbiBpZiBjYW52YXMgaXMgc3VwcG9ydGVkLlxuICAqXG4gICogQHByb3BlcnR5IHtOdW1iZXJ9IFttaW5QaXhlbFJhdGlvPTAuNV1cbiAgKiAgICAgVGhlIGhpZ2hlciB0aGUgbWluUGl4ZWxSYXRpbywgdGhlIGxvd2VyIHRoZSBxdWFsaXR5IG9mIHRoZSBpbWFnZSB0aGF0XG4gICogICAgIGlzIGNvbnNpZGVyZWQgc3VmZmljaWVudCB0byBzdG9wIHJlbmRlcmluZyBhIGdpdmVuIHpvb20gbGV2ZWwuICBGb3JcbiAgKiAgICAgZXhhbXBsZSwgaWYgeW91IGFyZSB0YXJnZXRpbmcgbW9iaWxlIGRldmljZXMgd2l0aCBsZXNzIGJhbmR3aXRoIHlvdSBtYXlcbiAgKiAgICAgdHJ5IHNldHRpbmcgdGhpcyB0byAxLjUgb3IgaGlnaGVyLlxuICAqXG4gICogQHByb3BlcnR5IHtCb29sZWFufSBbbW91c2VOYXZFbmFibGVkPXRydWVdXG4gICogICAgIElzIHRoZSB1c2VyIGFibGUgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgaW1hZ2UgdmlhIG1vdXNlIG9yIHRvdWNoLiBEZWZhdWx0XG4gICogICAgIGludGVyYWN0aW9ucyBpbmNsdWRlIGRyYWdpbmcgdGhlIGltYWdlIGluIGEgcGxhbmUsIGFuZCB6b29taW5nIGluIHRvd2FyZFxuICAqICAgICBhbmQgYXdheSBmcm9tIHRoZSBpbWFnZS5cbiAgKlxuICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gW3Nob3dOYXZpZ2F0aW9uQ29udHJvbD10cnVlXVxuICAqICAgICBTZXQgdG8gZmFsc2UgdG8gcHJldmVudCB0aGUgYXBwZWFyYW5jZSBvZiB0aGUgZGVmYXVsdCBuYXZpZ2F0aW9uIGNvbnRyb2xzLjxicj5cbiAgKiAgICAgTm90ZSB0aGF0IGlmIHNldCB0byBmYWxzZSwgdGhlIGN1c3RvbXMgYnV0dG9ucyBzZXQgYnkgdGhlIG9wdGlvbnNcbiAgKiAgICAgem9vbUluQnV0dG9uLCB6b29tT3V0QnV0dG9uIGV0YywgYXJlIHJlbmRlcmVkIGluYWN0aXZlLlxuICAqXG4gICogQHByb3BlcnR5IHtPcGVuU2VhZHJhZ29uLkNvbnRyb2xBbmNob3J9IFtuYXZpZ2F0aW9uQ29udHJvbEFuY2hvcj1UT1BfTEVGVF1cbiAgKiAgICAgUGxhY2VtZW50IG9mIHRoZSBkZWZhdWx0IG5hdmlnYXRpb24gY29udHJvbHMuXG4gICogICAgIFRvIHNldCB0aGUgcGxhY2VtZW50IG9mIHRoZSBzZXF1ZW5jZSBjb250cm9scywgc2VlIHRoZVxuICAqICAgICBzZXF1ZW5jZUNvbnRyb2xBbmNob3Igb3B0aW9uLlxuICAqXG4gICogQHByb3BlcnR5IHtCb29sZWFufSBbc2hvd1pvb21Db250cm9sPXRydWVdXG4gICogICAgIElmIHRydWUgdGhlbiArIGFuZCAtIGJ1dHRvbnMgdG8gem9vbSBpbiBhbmQgb3V0IGFyZSBkaXNwbGF5ZWQuPGJyPlxuICAqICAgICBOb3RlOiB7QGxpbmsgT3BlblNlYWRyYWdvbi5PcHRpb25zLnNob3dOYXZpZ2F0aW9uQ29udHJvbH0gaXMgb3ZlcnJpZGluZ1xuICAqICAgICB0aGlzIHNldHRpbmcgd2hlbiBzZXQgdG8gZmFsc2UuXG4gICpcbiAgKiBAcHJvcGVydHkge0Jvb2xlYW59IFtzaG93SG9tZUNvbnRyb2w9dHJ1ZV1cbiAgKiAgICAgSWYgdHJ1ZSB0aGVuIHRoZSAnR28gaG9tZScgYnV0dG9uIGlzIGRpc3BsYXllZCB0byBnbyBiYWNrIHRvIHRoZSBvcmlnaW5hbFxuICAqICAgICB6b29tIGFuZCBwYW4uPGJyPlxuICAqICAgICBOb3RlOiB7QGxpbmsgT3BlblNlYWRyYWdvbi5PcHRpb25zLnNob3dOYXZpZ2F0aW9uQ29udHJvbH0gaXMgb3ZlcnJpZGluZ1xuICAqICAgICB0aGlzIHNldHRpbmcgd2hlbiBzZXQgdG8gZmFsc2UuXG4gICpcbiAgKiBAcHJvcGVydHkge0Jvb2xlYW59IFtzaG93RnVsbFBhZ2VDb250cm9sPXRydWVdXG4gICogICAgIElmIHRydWUgdGhlbiB0aGUgJ1RvZ2dsZSBmdWxsIHBhZ2UnIGJ1dHRvbiBpcyBkaXNwbGF5ZWQgdG8gc3dpdGNoXG4gICogICAgIGJldHdlZW4gZnVsbCBwYWdlIGFuZCBub3JtYWwgbW9kZS48YnI+XG4gICogICAgIE5vdGU6IHtAbGluayBPcGVuU2VhZHJhZ29uLk9wdGlvbnMuc2hvd05hdmlnYXRpb25Db250cm9sfSBpcyBvdmVycmlkaW5nXG4gICogICAgIHRoaXMgc2V0dGluZyB3aGVuIHNldCB0byBmYWxzZS5cbiAgKlxuICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gW3Nob3dSb3RhdGlvbkNvbnRyb2w9ZmFsc2VdXG4gICogICAgIElmIHRydWUgdGhlbiB0aGUgcm90YXRlIGxlZnQvcmlnaHQgY29udHJvbHMgd2lsbCBiZSBkaXNwbGF5ZWQgYXMgcGFydCBvZiB0aGVcbiAgKiAgICAgc3RhbmRhcmQgY29udHJvbHMuIFRoaXMgaXMgYWxzbyBzdWJqZWN0IHRvIHRoZSBicm93c2VyIHN1cHBvcnQgZm9yIHJvdGF0ZVxuICAqICAgICAoZS5nLiB2aWV3ZXIuZHJhd2VyLmNhblJvdGF0ZSgpKS48YnI+XG4gICogICAgIE5vdGU6IHtAbGluayBPcGVuU2VhZHJhZ29uLk9wdGlvbnMuc2hvd05hdmlnYXRpb25Db250cm9sfSBpcyBvdmVycmlkaW5nXG4gICogICAgIHRoaXMgc2V0dGluZyB3aGVuIHNldCB0byBmYWxzZS5cbiAgKlxuICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gW3Nob3dTZXF1ZW5jZUNvbnRyb2w9dHJ1ZV1cbiAgKiAgICAgSWYgc2VxdWVuY2VNb2RlIGlzIHRydWUsIHRoZW4gcHJvdmlkZSBidXR0b25zIGZvciBuYXZpZ2F0aW5nIGZvcndhcmQgYW5kXG4gICogICAgIGJhY2t3YXJkIHRocm91Z2ggdGhlIGltYWdlcy5cbiAgKlxuICAqIEBwcm9wZXJ0eSB7T3BlblNlYWRyYWdvbi5Db250cm9sQW5jaG9yfSBbc2VxdWVuY2VDb250cm9sQW5jaG9yPVRPUF9MRUZUXVxuICAqICAgICBQbGFjZW1lbnQgb2YgdGhlIGRlZmF1bHQgc2VxdWVuY2UgY29udHJvbHMuXG4gICpcbiAgKiBAcHJvcGVydHkge0Jvb2xlYW59IFtuYXZQcmV2TmV4dFdyYXA9ZmFsc2VdXG4gICogICAgIElmIHRydWUgdGhlbiB0aGUgJ3ByZXZpb3VzJyBidXR0b24gd2lsbCB3cmFwIHRvIHRoZSBsYXN0IGltYWdlIHdoZW5cbiAgKiAgICAgdmlld2luZyB0aGUgZmlyc3QgaW1hZ2UgYW5kIHRoZSAnbmV4dCcgYnV0dG9uIHdpbGwgd3JhcCB0byB0aGUgZmlyc3RcbiAgKiAgICAgaW1hZ2Ugd2hlbiB2aWV3aW5nIHRoZSBsYXN0IGltYWdlLlxuICAqXG4gICogQHByb3BlcnR5IHtTdHJpbmd9IHpvb21JbkJ1dHRvblxuICAqICAgICBTZXQgdGhlIGlkIG9mIHRoZSBjdXN0b20gJ1pvb20gaW4nIGJ1dHRvbiB0byB1c2UuXG4gICogICAgIFRoaXMgaXMgdXNlZnVsIHRvIGhhdmUgYSBjdXN0b20gYnV0dG9uIGFueXdoZXJlIGluIHRoZSB3ZWIgcGFnZS48YnI+XG4gICogICAgIFRvIG9ubHkgY2hhbmdlIHRoZSBidXR0b24gaW1hZ2VzLCBjb25zaWRlciB1c2luZ1xuICAqICAgICB7QGxpbmsgT3BlblNlYWRyYWdvbi5PcHRpb25zLm5hdkltYWdlc31cbiAgKlxuICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSB6b29tT3V0QnV0dG9uXG4gICogICAgIFNldCB0aGUgaWQgb2YgdGhlIGN1c3RvbSAnWm9vbSBvdXQnIGJ1dHRvbiB0byB1c2UuXG4gICogICAgIFRoaXMgaXMgdXNlZnVsIHRvIGhhdmUgYSBjdXN0b20gYnV0dG9uIGFueXdoZXJlIGluIHRoZSB3ZWIgcGFnZS48YnI+XG4gICogICAgIFRvIG9ubHkgY2hhbmdlIHRoZSBidXR0b24gaW1hZ2VzLCBjb25zaWRlciB1c2luZ1xuICAqICAgICB7QGxpbmsgT3BlblNlYWRyYWdvbi5PcHRpb25zLm5hdkltYWdlc31cbiAgKlxuICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBob21lQnV0dG9uXG4gICogICAgIFNldCB0aGUgaWQgb2YgdGhlIGN1c3RvbSAnR28gaG9tZScgYnV0dG9uIHRvIHVzZS5cbiAgKiAgICAgVGhpcyBpcyB1c2VmdWwgdG8gaGF2ZSBhIGN1c3RvbSBidXR0b24gYW55d2hlcmUgaW4gdGhlIHdlYiBwYWdlLjxicj5cbiAgKiAgICAgVG8gb25seSBjaGFuZ2UgdGhlIGJ1dHRvbiBpbWFnZXMsIGNvbnNpZGVyIHVzaW5nXG4gICogICAgIHtAbGluayBPcGVuU2VhZHJhZ29uLk9wdGlvbnMubmF2SW1hZ2VzfVxuICAqXG4gICogQHByb3BlcnR5IHtTdHJpbmd9IGZ1bGxQYWdlQnV0dG9uXG4gICogICAgIFNldCB0aGUgaWQgb2YgdGhlIGN1c3RvbSAnVG9nZ2xlIGZ1bGwgcGFnZScgYnV0dG9uIHRvIHVzZS5cbiAgKiAgICAgVGhpcyBpcyB1c2VmdWwgdG8gaGF2ZSBhIGN1c3RvbSBidXR0b24gYW55d2hlcmUgaW4gdGhlIHdlYiBwYWdlLjxicj5cbiAgKiAgICAgVG8gb25seSBjaGFuZ2UgdGhlIGJ1dHRvbiBpbWFnZXMsIGNvbnNpZGVyIHVzaW5nXG4gICogICAgIHtAbGluayBPcGVuU2VhZHJhZ29uLk9wdGlvbnMubmF2SW1hZ2VzfVxuICAqXG4gICogQHByb3BlcnR5IHtTdHJpbmd9IHJvdGF0ZUxlZnRCdXR0b25cbiAgKiAgICAgU2V0IHRoZSBpZCBvZiB0aGUgY3VzdG9tICdSb3RhdGUgbGVmdCcgYnV0dG9uIHRvIHVzZS5cbiAgKiAgICAgVGhpcyBpcyB1c2VmdWwgdG8gaGF2ZSBhIGN1c3RvbSBidXR0b24gYW55d2hlcmUgaW4gdGhlIHdlYiBwYWdlLjxicj5cbiAgKiAgICAgVG8gb25seSBjaGFuZ2UgdGhlIGJ1dHRvbiBpbWFnZXMsIGNvbnNpZGVyIHVzaW5nXG4gICogICAgIHtAbGluayBPcGVuU2VhZHJhZ29uLk9wdGlvbnMubmF2SW1hZ2VzfVxuICAqXG4gICogQHByb3BlcnR5IHtTdHJpbmd9IHJvdGF0ZVJpZ2h0QnV0dG9uXG4gICogICAgIFNldCB0aGUgaWQgb2YgdGhlIGN1c3RvbSAnUm90YXRlIHJpZ2h0JyBidXR0b24gdG8gdXNlLlxuICAqICAgICBUaGlzIGlzIHVzZWZ1bCB0byBoYXZlIGEgY3VzdG9tIGJ1dHRvbiBhbnl3aGVyZSBpbiB0aGUgd2ViIHBhZ2UuPGJyPlxuICAqICAgICBUbyBvbmx5IGNoYW5nZSB0aGUgYnV0dG9uIGltYWdlcywgY29uc2lkZXIgdXNpbmdcbiAgKiAgICAge0BsaW5rIE9wZW5TZWFkcmFnb24uT3B0aW9ucy5uYXZJbWFnZXN9XG4gICpcbiAgKiBAcHJvcGVydHkge1N0cmluZ30gcHJldmlvdXNCdXR0b25cbiAgKiAgICAgU2V0IHRoZSBpZCBvZiB0aGUgY3VzdG9tICdQcmV2aW91cyBwYWdlJyBidXR0b24gdG8gdXNlLlxuICAqICAgICBUaGlzIGlzIHVzZWZ1bCB0byBoYXZlIGEgY3VzdG9tIGJ1dHRvbiBhbnl3aGVyZSBpbiB0aGUgd2ViIHBhZ2UuPGJyPlxuICAqICAgICBUbyBvbmx5IGNoYW5nZSB0aGUgYnV0dG9uIGltYWdlcywgY29uc2lkZXIgdXNpbmdcbiAgKiAgICAge0BsaW5rIE9wZW5TZWFkcmFnb24uT3B0aW9ucy5uYXZJbWFnZXN9XG4gICpcbiAgKiBAcHJvcGVydHkge1N0cmluZ30gbmV4dEJ1dHRvblxuICAqICAgICBTZXQgdGhlIGlkIG9mIHRoZSBjdXN0b20gJ05leHQgcGFnZScgYnV0dG9uIHRvIHVzZS5cbiAgKiAgICAgVGhpcyBpcyB1c2VmdWwgdG8gaGF2ZSBhIGN1c3RvbSBidXR0b24gYW55d2hlcmUgaW4gdGhlIHdlYiBwYWdlLjxicj5cbiAgKiAgICAgVG8gb25seSBjaGFuZ2UgdGhlIGJ1dHRvbiBpbWFnZXMsIGNvbnNpZGVyIHVzaW5nXG4gICogICAgIHtAbGluayBPcGVuU2VhZHJhZ29uLk9wdGlvbnMubmF2SW1hZ2VzfVxuICAqXG4gICogQHByb3BlcnR5IHtCb29sZWFufSBbc2VxdWVuY2VNb2RlPWZhbHNlXVxuICAqICAgICBTZXQgdG8gdHJ1ZSB0byBoYXZlIHRoZSB2aWV3ZXIgdHJlYXQgeW91ciB0aWxlc291cmNlcyBhcyBhIHNlcXVlbmNlIG9mIGltYWdlcyB0b1xuICAqICAgICBiZSBvcGVuZWQgb25lIGF0IGEgdGltZSByYXRoZXIgdGhhbiBhbGwgYXQgb25jZS5cbiAgKlxuICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBbaW5pdGlhbFBhZ2U9MF1cbiAgKiAgICAgSWYgc2VxdWVuY2VNb2RlIGlzIHRydWUsIGRpc3BsYXkgdGhpcyBwYWdlIGluaXRpYWxseS5cbiAgKlxuICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gW3ByZXNlcnZlVmlld3BvcnQ9ZmFsc2VdXG4gICogICAgIElmIHNlcXVlbmNlTW9kZSBpcyB0cnVlLCB0aGVuIG5vcm1hbGx5IG5hdmlnYXRpbmcgdGhyb3VnaCBlYWNoIGltYWdlIHJlc2V0cyB0aGVcbiAgKiAgICAgdmlld3BvcnQgdG8gJ2hvbWUnIHBvc2l0aW9uLiAgSWYgcHJlc2VydmVWaWV3cG9ydCBpcyBzZXQgdG8gdHJ1ZSwgdGhlbiB0aGUgdmlld3BvcnRcbiAgKiAgICAgcG9zaXRpb24gaXMgcHJlc2VydmVkIHdoZW4gbmF2aWdhdGluZyBiZXR3ZWVuIGltYWdlcyBpbiB0aGUgc2VxdWVuY2UuXG4gICpcbiAgKiBAcHJvcGVydHkge0Jvb2xlYW59IFtwcmVzZXJ2ZU92ZXJsYXlzPWZhbHNlXVxuICAqICAgICBJZiBzZXF1ZW5jZU1vZGUgaXMgdHJ1ZSwgdGhlbiBub3JtYWxseSBuYXZpZ2F0aW5nIHRocm91Z2ggZWFjaCBpbWFnZVxuICAqICAgICByZXNldHMgdGhlIG92ZXJsYXlzLlxuICAqICAgICBJZiBwcmVzZXJ2ZU92ZXJsYXlzIGlzIHNldCB0byB0cnVlLCB0aGVuIHRoZSBvdmVybGF5cyBhZGRlZCB3aXRoIHtAbGluayBPcGVuU2VhZHJhZ29uLlZpZXdlciNhZGRPdmVybGF5fVxuICAqICAgICBhcmUgcHJlc2VydmVkIHdoZW4gbmF2aWdhdGluZyBiZXR3ZWVuIGltYWdlcyBpbiB0aGUgc2VxdWVuY2UuXG4gICogICAgIE5vdGU6IHNldHRpbmcgcHJlc2VydmVPdmVybGF5cyBvdmVycmlkZXMgYW55IG92ZXJsYXlzIHNwZWNpZmllZCBpbiB0aGUgZ2xvYmFsXG4gICogICAgIFwib3ZlcmxheXNcIiBvcHRpb24gZm9yIHRoZSBWaWV3ZXIuIEl0J3MgYWxzbyBub3QgY29tcGF0aWJsZSB3aXRoIHNwZWNpZnlpbmdcbiAgKiAgICAgcGVyLXRpbGVTb3VyY2Ugb3ZlcmxheXMgdmlhIHRoZSBvcHRpb25zLCBhcyB0aG9zZSBvdmVybGF5cyB3aWxsIHBlcnNpc3RcbiAgKiAgICAgZXZlbiBhZnRlciB0aGUgdGlsZVNvdXJjZSBpcyBjbG9zZWQuXG4gICpcbiAgKiBAcHJvcGVydHkge0Jvb2xlYW59IFtzaG93UmVmZXJlbmNlU3RyaXA9ZmFsc2VdXG4gICogICAgIElmIHNlcXVlbmNlTW9kZSBpcyB0cnVlLCB0aGVuIGRpc3BsYXkgYSBzY3JvbGxpbmcgc3RyaXAgb2YgaW1hZ2UgdGh1bWJuYWlscyBmb3JcbiAgKiAgICAgbmF2aWdhdGluZyB0aHJvdWdoIHRoZSBpbWFnZXMuXG4gICpcbiAgKiBAcHJvcGVydHkge1N0cmluZ30gW3JlZmVyZW5jZVN0cmlwU2Nyb2xsPSdob3Jpem9udGFsJ11cbiAgKlxuICAqIEBwcm9wZXJ0eSB7RWxlbWVudH0gW3JlZmVyZW5jZVN0cmlwRWxlbWVudD1udWxsXVxuICAqXG4gICogQHByb3BlcnR5IHtOdW1iZXJ9IFtyZWZlcmVuY2VTdHJpcEhlaWdodD1udWxsXVxuICAqXG4gICogQHByb3BlcnR5IHtOdW1iZXJ9IFtyZWZlcmVuY2VTdHJpcFdpZHRoPW51bGxdXG4gICpcbiAgKiBAcHJvcGVydHkge1N0cmluZ30gW3JlZmVyZW5jZVN0cmlwUG9zaXRpb249J0JPVFRPTV9MRUZUJ11cbiAgKlxuICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBbcmVmZXJlbmNlU3RyaXBTaXplUmF0aW89MC4yXVxuICAqXG4gICogQHByb3BlcnR5IHtCb29sZWFufSBbY29sbGVjdGlvbk1vZGU9ZmFsc2VdXG4gICogICAgIFNldCB0byB0cnVlIHRvIGhhdmUgdGhlIHZpZXdlciBhcnJhbmdlIHlvdXIgVGlsZWRJbWFnZXMgaW4gYSBncmlkIG9yIGxpbmUuXG4gICpcbiAgKiBAcHJvcGVydHkge051bWJlcn0gW2NvbGxlY3Rpb25Sb3dzPTNdXG4gICogICAgIElmIGNvbGxlY3Rpb25Nb2RlIGlzIHRydWUsIHNwZWNpZmllcyBob3cgbWFueSByb3dzIHRoZSBncmlkIHNob3VsZCBoYXZlLiBVc2UgMSB0byBtYWtlIGEgbGluZS5cbiAgKiAgICAgSWYgY29sbGVjdGlvbkxheW91dCBpcyAndmVydGljYWwnLCBzcGVjaWZpZXMgaG93IG1hbnkgY29sdW1ucyBpbnN0ZWFkLlxuICAqXG4gICogQHByb3BlcnR5IHtOdW1iZXJ9IFtjb2xsZWN0aW9uQ29sdW1ucz0wXVxuICAqICAgICBJZiBjb2xsZWN0aW9uTW9kZSBpcyB0cnVlLCBzcGVjaWZpZXMgaG93IG1hbnkgY29sdW1ucyB0aGUgZ3JpZCBzaG91bGQgaGF2ZS4gVXNlIDEgdG8gbWFrZSBhIGxpbmUuXG4gICogICAgIElmIGNvbGxlY3Rpb25MYXlvdXQgaXMgJ3ZlcnRpY2FsJywgc3BlY2lmaWVzIGhvdyBtYW55IHJvd3MgaW5zdGVhZC4gSWdub3JlZCBpZiBjb2xsZWN0aW9uUm93cyBpcyBub3Qgc2V0IHRvIGEgZmFsc3kgdmFsdWUuXG4gICpcbiAgKiBAcHJvcGVydHkge1N0cmluZ30gW2NvbGxlY3Rpb25MYXlvdXQ9J2hvcml6b250YWwnXVxuICAqICAgICBJZiBjb2xsZWN0aW9uTW9kZSBpcyB0cnVlLCBzcGVjaWZpZXMgd2hldGhlciB0byBhcnJhbmdlIHZlcnRpY2FsbHkgb3IgaG9yaXpvbnRhbGx5LlxuICAqXG4gICogQHByb3BlcnR5IHtOdW1iZXJ9IFtjb2xsZWN0aW9uVGlsZVNpemU9ODAwXVxuICAqICAgICBJZiBjb2xsZWN0aW9uTW9kZSBpcyB0cnVlLCBzcGVjaWZpZXMgdGhlIHNpemUsIGluIHZpZXdwb3J0IGNvb3JkaW5hdGVzLCBmb3IgZWFjaCBUaWxlZEltYWdlIHRvIGZpdCBpbnRvLlxuICAqICAgICBUaGUgVGlsZWRJbWFnZSB3aWxsIGJlIGNlbnRlcmVkIHdpdGhpbiBhIHNxdWFyZSBvZiB0aGUgc3BlY2lmaWVkIHNpemUuXG4gICpcbiAgKiBAcHJvcGVydHkge051bWJlcn0gW2NvbGxlY3Rpb25UaWxlTWFyZ2luPTgwXVxuICAqICAgICBJZiBjb2xsZWN0aW9uTW9kZSBpcyB0cnVlLCBzcGVjaWZpZXMgdGhlIG1hcmdpbiwgaW4gdmlld3BvcnQgY29vcmRpbmF0ZXMsIGJldHdlZW4gZWFjaCBUaWxlZEltYWdlLlxuICAqXG4gICogQHByb3BlcnR5IHtTdHJpbmd8Qm9vbGVhbn0gW2Nyb3NzT3JpZ2luUG9saWN5PWZhbHNlXVxuICAqICAgICBWYWxpZCB2YWx1ZXMgYXJlICdBbm9ueW1vdXMnLCAndXNlLWNyZWRlbnRpYWxzJywgYW5kIGZhbHNlLiBJZiBmYWxzZSwgY2FudmFzIHJlcXVlc3RzIHdpbGxcbiAgKiAgICAgbm90IHVzZSBDT1JTLCBhbmQgdGhlIGNhbnZhcyB3aWxsIGJlIHRhaW50ZWQuXG4gICpcbiAgKiBAcHJvcGVydHkge0Jvb2xlYW59IFthamF4V2l0aENyZWRlbnRpYWxzPWZhbHNlXVxuICAqICAgICBXaGV0aGVyIHRvIHNldCB0aGUgd2l0aENyZWRlbnRpYWxzIFhIUiBmbGFnIGZvciBBSkFYIHJlcXVlc3RzICh3aGVuIGxvYWRpbmcgdGlsZSBzb3VyY2VzKS5cbiAgKiAgICAgTm90ZSB0aGF0IHRoaXMgY2FuIGJlIG92ZXJyaWRkZW4gYXQgdGhlIHtAbGluayBPcGVuU2VhZHJhZ29uLlRpbGVTb3VyY2V9IGxldmVsLlxuICAqXG4gICovXG5cbiAvKipcbiAgKiBTZXR0aW5ncyBmb3IgZ2VzdHVyZXMgZ2VuZXJhdGVkIGJ5IGEgcG9pbnRlciBkZXZpY2UuXG4gICpcbiAgKiBAdHlwZWRlZiB7T2JqZWN0fSBHZXN0dXJlU2V0dGluZ3NcbiAgKiBAbWVtYmVyb2YgT3BlblNlYWRyYWdvblxuICAqXG4gICogQHByb3BlcnR5IHtCb29sZWFufSBzY3JvbGxUb1pvb21cbiAgKiAgICAgU2V0IHRvIGZhbHNlIHRvIGRpc2FibGUgem9vbWluZyBvbiBzY3JvbGwgZ2VzdHVyZXMuXG4gICpcbiAgKiBAcHJvcGVydHkge0Jvb2xlYW59IGNsaWNrVG9ab29tXG4gICogICAgIFNldCB0byBmYWxzZSB0byBkaXNhYmxlIHpvb21pbmcgb24gY2xpY2sgZ2VzdHVyZXMuXG4gICpcbiAgKiBAcHJvcGVydHkge0Jvb2xlYW59IGRibENsaWNrVG9ab29tXG4gICogICAgIFNldCB0byBmYWxzZSB0byBkaXNhYmxlIHpvb21pbmcgb24gZG91YmxlLWNsaWNrIGdlc3R1cmVzLiBOb3RlOiBJZiBzZXQgdG8gdHJ1ZVxuICAqICAgICB0aGVuIGNsaWNrVG9ab29tIHNob3VsZCBiZSBzZXQgdG8gZmFsc2UgdG8gcHJldmVudCBtdWx0aXBsZSB6b29tcy5cbiAgKlxuICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gcGluY2hUb1pvb21cbiAgKiAgICAgU2V0IHRvIGZhbHNlIHRvIGRpc2FibGUgem9vbWluZyBvbiBwaW5jaCBnZXN0dXJlcy5cbiAgKlxuICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gZmxpY2tFbmFibGVkXG4gICogICAgIFNldCB0byBmYWxzZSB0byBkaXNhYmxlIHRoZSBraW5ldGljIHBhbm5pbmcgZWZmZWN0IChmbGljaykgYXQgdGhlIGVuZCBvZiBhIGRyYWcgZ2VzdHVyZS5cbiAgKlxuICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBmbGlja01pblNwZWVkXG4gICogICAgIElmIGZsaWNrRW5hYmxlZCBpcyB0cnVlLCB0aGUgbWluaW11bSBzcGVlZCAoaW4gcGl4ZWxzLXBlci1zZWNvbmQpIHJlcXVpcmVkIHRvIGNhdXNlIHRoZSBraW5ldGljIHBhbm5pbmcgZWZmZWN0IChmbGljaykgYXQgdGhlIGVuZCBvZiBhIGRyYWcgZ2VzdHVyZS5cbiAgKlxuICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBmbGlja01vbWVudHVtXG4gICogICAgIElmIGZsaWNrRW5hYmxlZCBpcyB0cnVlLCBhIGNvbnN0YW50IG11bHRpcGxpZWQgYnkgdGhlIHZlbG9jaXR5IHRvIGRldGVybWluZSB0aGUgZGlzdGFuY2Ugb2YgdGhlIGtpbmV0aWMgcGFubmluZyBlZmZlY3QgKGZsaWNrKSBhdCB0aGUgZW5kIG9mIGEgZHJhZyBnZXN0dXJlLlxuICAqICAgICBBIGxhcmdlciB2YWx1ZSB3aWxsIG1ha2UgdGhlIGZsaWNrIGZlZWwgXCJsaWdodGVyXCIsIHdoaWxlIGEgc21hbGxlciB2YWx1ZSB3aWxsIG1ha2UgdGhlIGZsaWNrIGZlZWwgXCJoZWF2aWVyXCIuXG4gICogICAgIE5vdGU6IHNwcmluZ1N0aWZmbmVzcyBhbmQgYW5pbWF0aW9uVGltZSBhbHNvIGFmZmVjdCB0aGUgXCJzcHJpbmdcIiB1c2VkIHRvIHN0b3AgdGhlIGZsaWNrIGFuaW1hdGlvbi5cbiAgKlxuICAqL1xuXG4vKipcbiAgKiBUaGUgbmFtZXMgZm9yIHRoZSBpbWFnZSByZXNvdXJjZXMgdXNlZCBmb3IgdGhlIGltYWdlIG5hdmlnYXRpb24gYnV0dG9ucy5cbiAgKlxuICAqIEB0eXBlZGVmIHtPYmplY3R9IE5hdkltYWdlc1xuICAqIEBtZW1iZXJvZiBPcGVuU2VhZHJhZ29uXG4gICpcbiAgKiBAcHJvcGVydHkge09iamVjdH0gem9vbUluIC0gSW1hZ2VzIGZvciB0aGUgem9vbS1pbiBidXR0b24uXG4gICogQHByb3BlcnR5IHtTdHJpbmd9IHpvb21Jbi5SRVNUXG4gICogQHByb3BlcnR5IHtTdHJpbmd9IHpvb21Jbi5HUk9VUFxuICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSB6b29tSW4uSE9WRVJcbiAgKiBAcHJvcGVydHkge1N0cmluZ30gem9vbUluLkRPV05cbiAgKlxuICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSB6b29tT3V0IC0gSW1hZ2VzIGZvciB0aGUgem9vbS1vdXQgYnV0dG9uLlxuICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSB6b29tT3V0LlJFU1RcbiAgKiBAcHJvcGVydHkge1N0cmluZ30gem9vbU91dC5HUk9VUFxuICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSB6b29tT3V0LkhPVkVSXG4gICogQHByb3BlcnR5IHtTdHJpbmd9IHpvb21PdXQuRE9XTlxuICAqXG4gICogQHByb3BlcnR5IHtPYmplY3R9IGhvbWUgLSBJbWFnZXMgZm9yIHRoZSBob21lIGJ1dHRvbi5cbiAgKiBAcHJvcGVydHkge1N0cmluZ30gaG9tZS5SRVNUXG4gICogQHByb3BlcnR5IHtTdHJpbmd9IGhvbWUuR1JPVVBcbiAgKiBAcHJvcGVydHkge1N0cmluZ30gaG9tZS5IT1ZFUlxuICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBob21lLkRPV05cbiAgKlxuICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBmdWxscGFnZSAtIEltYWdlcyBmb3IgdGhlIGZ1bGwtcGFnZSBidXR0b24uXG4gICogQHByb3BlcnR5IHtTdHJpbmd9IGZ1bGxwYWdlLlJFU1RcbiAgKiBAcHJvcGVydHkge1N0cmluZ30gZnVsbHBhZ2UuR1JPVVBcbiAgKiBAcHJvcGVydHkge1N0cmluZ30gZnVsbHBhZ2UuSE9WRVJcbiAgKiBAcHJvcGVydHkge1N0cmluZ30gZnVsbHBhZ2UuRE9XTlxuICAqXG4gICogQHByb3BlcnR5IHtPYmplY3R9IHJvdGF0ZWxlZnQgLSBJbWFnZXMgZm9yIHRoZSByb3RhdGUgbGVmdCBidXR0b24uXG4gICogQHByb3BlcnR5IHtTdHJpbmd9IHJvdGF0ZWxlZnQuUkVTVFxuICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSByb3RhdGVsZWZ0LkdST1VQXG4gICogQHByb3BlcnR5IHtTdHJpbmd9IHJvdGF0ZWxlZnQuSE9WRVJcbiAgKiBAcHJvcGVydHkge1N0cmluZ30gcm90YXRlbGVmdC5ET1dOXG4gICpcbiAgKiBAcHJvcGVydHkge09iamVjdH0gcm90YXRlcmlnaHQgLSBJbWFnZXMgZm9yIHRoZSByb3RhdGUgcmlnaHQgYnV0dG9uLlxuICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSByb3RhdGVyaWdodC5SRVNUXG4gICogQHByb3BlcnR5IHtTdHJpbmd9IHJvdGF0ZXJpZ2h0LkdST1VQXG4gICogQHByb3BlcnR5IHtTdHJpbmd9IHJvdGF0ZXJpZ2h0LkhPVkVSXG4gICogQHByb3BlcnR5IHtTdHJpbmd9IHJvdGF0ZXJpZ2h0LkRPV05cbiAgKlxuICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBwcmV2aW91cyAtIEltYWdlcyBmb3IgdGhlIHByZXZpb3VzIGJ1dHRvbi5cbiAgKiBAcHJvcGVydHkge1N0cmluZ30gcHJldmlvdXMuUkVTVFxuICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBwcmV2aW91cy5HUk9VUFxuICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBwcmV2aW91cy5IT1ZFUlxuICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBwcmV2aW91cy5ET1dOXG4gICpcbiAgKiBAcHJvcGVydHkge09iamVjdH0gbmV4dCAtIEltYWdlcyBmb3IgdGhlIG5leHQgYnV0dG9uLlxuICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBuZXh0LlJFU1RcbiAgKiBAcHJvcGVydHkge1N0cmluZ30gbmV4dC5HUk9VUFxuICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBuZXh0LkhPVkVSXG4gICogQHByb3BlcnR5IHtTdHJpbmd9IG5leHQuRE9XTlxuICAqXG4gICovXG5cblxuIC8qKlxuICAqIFRoaXMgZnVuY3Rpb24gc2VydmVzIGFzIGEgc2luZ2xlIHBvaW50IG9mIGluc3RhbnRpYXRpb24gZm9yIGFuIHtAbGluayBPcGVuU2VhZHJhZ29uLlZpZXdlcn0sIGluY2x1ZGluZyBhbGxcbiAgKiBjb21iaW5hdGlvbnMgb2Ygb3V0LW9mLXRoZS1ib3ggY29uZmlndXJhYmxlIGZlYXR1cmVzLlxuICAqXG4gICogQHBhcmFtIHtPcGVuU2VhZHJhZ29uLk9wdGlvbnN9IG9wdGlvbnMgLSBWaWV3ZXIgb3B0aW9ucy5cbiAgKiBAcmV0dXJucyB7T3BlblNlYWRyYWdvbi5WaWV3ZXJ9XG4gICovXG53aW5kb3cuT3BlblNlYWRyYWdvbiA9IHdpbmRvdy5PcGVuU2VhZHJhZ29uIHx8IGZ1bmN0aW9uKCBvcHRpb25zICl7XG5cbiAgICByZXR1cm4gbmV3IE9wZW5TZWFkcmFnb24uVmlld2VyKCBvcHRpb25zICk7XG5cbn07XG5cbmlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHtcbiAgIGRlZmluZShmdW5jdGlvbiAoKSB7XG4gICAgICAgcmV0dXJuICh3aW5kb3cuT3BlblNlYWRyYWdvbik7XG4gICB9KTtcbn1cblxuXG4oZnVuY3Rpb24oICQgKXtcblxuXG4gICAgLyoqXG4gICAgICogVGhlIE9wZW5TZWFkcmFnb24gdmVyc2lvbi5cbiAgICAgKlxuICAgICAqIEBtZW1iZXIge09iamVjdH0gT3BlblNlYWRyYWdvbi52ZXJzaW9uXG4gICAgICogQHByb3BlcnR5IHtTdHJpbmd9IHZlcnNpb25TdHIgLSBUaGUgdmVyc2lvbiBudW1iZXIgYXMgYSBzdHJpbmcgKCdtYWpvci5taW5vci5yZXZpc2lvbicpLlxuICAgICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBtYWpvciAtIFRoZSBtYWpvciB2ZXJzaW9uIG51bWJlci5cbiAgICAgKiBAcHJvcGVydHkge051bWJlcn0gbWlub3IgLSBUaGUgbWlub3IgdmVyc2lvbiBudW1iZXIuXG4gICAgICogQHByb3BlcnR5IHtOdW1iZXJ9IHJldmlzaW9uIC0gVGhlIHJldmlzaW9uIG51bWJlci5cbiAgICAgKiBAc2luY2UgMS4wLjBcbiAgICAgKi9cbiAgICAkLnZlcnNpb24gPSB7XG4gICAgICAgIHZlcnNpb25TdHI6ICcyLjIuMScsXG4gICAgICAgIG1ham9yOiBwYXJzZUludCgnMicsIDEwKSxcbiAgICAgICAgbWlub3I6IHBhcnNlSW50KCcyJywgMTApLFxuICAgICAgICByZXZpc2lvbjogcGFyc2VJbnQoJzEnLCAxMClcbiAgICB9O1xuXG5cbiAgICAvKipcbiAgICAgKiBUYWtlbiBmcm9tIGpxdWVyeSAxLjYuMVxuICAgICAqIFtbQ2xhc3NdXSAtPiB0eXBlIHBhaXJzXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICB2YXIgY2xhc3MydHlwZSA9IHtcbiAgICAgICAgICAgICdbb2JqZWN0IEJvb2xlYW5dJzogICAgICdib29sZWFuJyxcbiAgICAgICAgICAgICdbb2JqZWN0IE51bWJlcl0nOiAgICAgICdudW1iZXInLFxuICAgICAgICAgICAgJ1tvYmplY3QgU3RyaW5nXSc6ICAgICAgJ3N0cmluZycsXG4gICAgICAgICAgICAnW29iamVjdCBGdW5jdGlvbl0nOiAgICAnZnVuY3Rpb24nLFxuICAgICAgICAgICAgJ1tvYmplY3QgQXJyYXldJzogICAgICAgJ2FycmF5JyxcbiAgICAgICAgICAgICdbb2JqZWN0IERhdGVdJzogICAgICAgICdkYXRlJyxcbiAgICAgICAgICAgICdbb2JqZWN0IFJlZ0V4cF0nOiAgICAgICdyZWdleHAnLFxuICAgICAgICAgICAgJ1tvYmplY3QgT2JqZWN0XSc6ICAgICAgJ29iamVjdCdcbiAgICAgICAgfSxcbiAgICAgICAgLy8gU2F2ZSBhIHJlZmVyZW5jZSB0byBzb21lIGNvcmUgbWV0aG9kc1xuICAgICAgICB0b1N0cmluZyAgICA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsXG4gICAgICAgIGhhc093biAgICAgID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcblxuICAgIC8qKlxuICAgICAqIFRha2VuIGZyb20galF1ZXJ5IDEuNi4xXG4gICAgICogQGZ1bmN0aW9uIGlzRnVuY3Rpb25cbiAgICAgKiBAbWVtYmVyb2YgT3BlblNlYWRyYWdvblxuICAgICAqIEBzZWUge0BsaW5rIGh0dHA6Ly93d3cuanF1ZXJ5LmNvbS8galF1ZXJ5fVxuICAgICAqL1xuICAgICQuaXNGdW5jdGlvbiA9IGZ1bmN0aW9uKCBvYmogKSB7XG4gICAgICAgIHJldHVybiAkLnR5cGUob2JqKSA9PT0gXCJmdW5jdGlvblwiO1xuICAgIH07XG5cblxuICAgIC8qKlxuICAgICAqIFRha2VuIGZyb20galF1ZXJ5IDEuNi4xXG4gICAgICogQGZ1bmN0aW9uIGlzQXJyYXlcbiAgICAgKiBAbWVtYmVyb2YgT3BlblNlYWRyYWdvblxuICAgICAqIEBzZWUge0BsaW5rIGh0dHA6Ly93d3cuanF1ZXJ5LmNvbS8galF1ZXJ5fVxuICAgICAqL1xuICAgICQuaXNBcnJheSA9IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24oIG9iaiApIHtcbiAgICAgICAgcmV0dXJuICQudHlwZShvYmopID09PSBcImFycmF5XCI7XG4gICAgfTtcblxuXG4gICAgLyoqXG4gICAgICogQSBjcnVkZSB3YXkgb2YgZGV0ZXJtaW5pbmcgaWYgYW4gb2JqZWN0IGlzIGEgd2luZG93LlxuICAgICAqIFRha2VuIGZyb20galF1ZXJ5IDEuNi4xXG4gICAgICogQGZ1bmN0aW9uIGlzV2luZG93XG4gICAgICogQG1lbWJlcm9mIE9wZW5TZWFkcmFnb25cbiAgICAgKiBAc2VlIHtAbGluayBodHRwOi8vd3d3LmpxdWVyeS5jb20vIGpRdWVyeX1cbiAgICAgKi9cbiAgICAkLmlzV2luZG93ID0gZnVuY3Rpb24oIG9iaiApIHtcbiAgICAgICAgcmV0dXJuIG9iaiAmJiB0eXBlb2Ygb2JqID09PSBcIm9iamVjdFwiICYmIFwic2V0SW50ZXJ2YWxcIiBpbiBvYmo7XG4gICAgfTtcblxuXG4gICAgLyoqXG4gICAgICogVGFrZW4gZnJvbSBqUXVlcnkgMS42LjFcbiAgICAgKiBAZnVuY3Rpb24gdHlwZVxuICAgICAqIEBtZW1iZXJvZiBPcGVuU2VhZHJhZ29uXG4gICAgICogQHNlZSB7QGxpbmsgaHR0cDovL3d3dy5qcXVlcnkuY29tLyBqUXVlcnl9XG4gICAgICovXG4gICAgJC50eXBlID0gZnVuY3Rpb24oIG9iaiApIHtcbiAgICAgICAgcmV0dXJuICggb2JqID09PSBudWxsICkgfHwgKCBvYmogPT09IHVuZGVmaW5lZCApID9cbiAgICAgICAgICAgIFN0cmluZyggb2JqICkgOlxuICAgICAgICAgICAgY2xhc3MydHlwZVsgdG9TdHJpbmcuY2FsbChvYmopIF0gfHwgXCJvYmplY3RcIjtcbiAgICB9O1xuXG5cbiAgICAvKipcbiAgICAgKiBUYWtlbiBmcm9tIGpRdWVyeSAxLjYuMVxuICAgICAqIEBmdW5jdGlvbiBpc1BsYWluT2JqZWN0XG4gICAgICogQG1lbWJlcm9mIE9wZW5TZWFkcmFnb25cbiAgICAgKiBAc2VlIHtAbGluayBodHRwOi8vd3d3LmpxdWVyeS5jb20vIGpRdWVyeX1cbiAgICAgKi9cbiAgICAkLmlzUGxhaW5PYmplY3QgPSBmdW5jdGlvbiggb2JqICkge1xuICAgICAgICAvLyBNdXN0IGJlIGFuIE9iamVjdC5cbiAgICAgICAgLy8gQmVjYXVzZSBvZiBJRSwgd2UgYWxzbyBoYXZlIHRvIGNoZWNrIHRoZSBwcmVzZW5jZSBvZiB0aGUgY29uc3RydWN0b3IgcHJvcGVydHkuXG4gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IERPTSBub2RlcyBhbmQgd2luZG93IG9iamVjdHMgZG9uJ3QgcGFzcyB0aHJvdWdoLCBhcyB3ZWxsXG4gICAgICAgIGlmICggIW9iaiB8fCBPcGVuU2VhZHJhZ29uLnR5cGUob2JqKSAhPT0gXCJvYmplY3RcIiB8fCBvYmoubm9kZVR5cGUgfHwgJC5pc1dpbmRvdyggb2JqICkgKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBOb3Qgb3duIGNvbnN0cnVjdG9yIHByb3BlcnR5IG11c3QgYmUgT2JqZWN0XG4gICAgICAgIGlmICggb2JqLmNvbnN0cnVjdG9yICYmXG4gICAgICAgICAgICAhaGFzT3duLmNhbGwob2JqLCBcImNvbnN0cnVjdG9yXCIpICYmXG4gICAgICAgICAgICAhaGFzT3duLmNhbGwob2JqLmNvbnN0cnVjdG9yLnByb3RvdHlwZSwgXCJpc1Byb3RvdHlwZU9mXCIpICkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gT3duIHByb3BlcnRpZXMgYXJlIGVudW1lcmF0ZWQgZmlyc3RseSwgc28gdG8gc3BlZWQgdXAsXG4gICAgICAgIC8vIGlmIGxhc3Qgb25lIGlzIG93biwgdGhlbiBhbGwgcHJvcGVydGllcyBhcmUgb3duLlxuXG4gICAgICAgIHZhciBsYXN0S2V5O1xuICAgICAgICBmb3IgKHZhciBrZXkgaW4gb2JqICkge1xuICAgICAgICAgICAgbGFzdEtleSA9IGtleTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBsYXN0S2V5ID09PSB1bmRlZmluZWQgfHwgaGFzT3duLmNhbGwoIG9iaiwgbGFzdEtleSApO1xuICAgIH07XG5cblxuICAgIC8qKlxuICAgICAqIFRha2VuIGZyb20galF1ZXJ5IDEuNi4xXG4gICAgICogQGZ1bmN0aW9uIGlzRW1wdHlPYmplY3RcbiAgICAgKiBAbWVtYmVyb2YgT3BlblNlYWRyYWdvblxuICAgICAqIEBzZWUge0BsaW5rIGh0dHA6Ly93d3cuanF1ZXJ5LmNvbS8galF1ZXJ5fVxuICAgICAqL1xuICAgICQuaXNFbXB0eU9iamVjdCA9IGZ1bmN0aW9uKCBvYmogKSB7XG4gICAgICAgIGZvciAoIHZhciBuYW1lIGluIG9iaiApIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogU2hpbSBhcm91bmQgT2JqZWN0LmZyZWV6ZS4gRG9lcyBub3RoaW5nIGlmIE9iamVjdC5mcmVlemUgaXMgbm90IHN1cHBvcnRlZC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gZnJlZXplLlxuICAgICAqIEByZXR1cm4ge09iamVjdH0gb2JqIFRoZSBmcm96ZW4gb2JqZWN0LlxuICAgICAqL1xuICAgICQuZnJlZXplT2JqZWN0ID0gZnVuY3Rpb24ob2JqKSB7XG4gICAgICAgIGlmIChPYmplY3QuZnJlZXplKSB7XG4gICAgICAgICAgICAkLmZyZWV6ZU9iamVjdCA9IE9iamVjdC5mcmVlemU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAkLmZyZWV6ZU9iamVjdCA9IGZ1bmN0aW9uKG9iaikge1xuICAgICAgICAgICAgICAgIHJldHVybiBvYmo7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAkLmZyZWV6ZU9iamVjdChvYmopO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBUcnVlIGlmIHRoZSBicm93c2VyIHN1cHBvcnRzIHRoZSBIVE1MNSBjYW52YXMgZWxlbWVudFxuICAgICAqIEBtZW1iZXIge0Jvb2xlYW59IHN1cHBvcnRzQ2FudmFzXG4gICAgICogQG1lbWJlcm9mIE9wZW5TZWFkcmFnb25cbiAgICAgKi9cbiAgICAkLnN1cHBvcnRzQ2FudmFzID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGNhbnZhc0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAnY2FudmFzJyApO1xuICAgICAgICByZXR1cm4gISEoICQuaXNGdW5jdGlvbiggY2FudmFzRWxlbWVudC5nZXRDb250ZXh0ICkgJiZcbiAgICAgICAgICAgICAgICAgICAgY2FudmFzRWxlbWVudC5nZXRDb250ZXh0KCAnMmQnICkgKTtcbiAgICB9KCkpO1xuXG4gICAgLyoqXG4gICAgICogVGVzdCB3aGV0aGVyIHRoZSBzdWJtaXR0ZWQgY2FudmFzIGlzIHRhaW50ZWQgb3Igbm90LlxuICAgICAqIEBhcmd1bWVudCB7Q2FudmFzfSBjYW52YXMgVGhlIGNhbnZhcyB0byB0ZXN0LlxuICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSBjYW52YXMgaXMgdGFpbnRlZC5cbiAgICAgKi9cbiAgICAkLmlzQ2FudmFzVGFpbnRlZCA9IGZ1bmN0aW9uKGNhbnZhcykge1xuICAgICAgICB2YXIgaXNUYWludGVkID0gZmFsc2U7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXZSB0ZXN0IGlmIHRoZSBjYW52YXMgaXMgdGFpbnRlZCBieSByZXRyaWV2aW5nIGRhdGEgZnJvbSBpdC5cbiAgICAgICAgICAgIC8vIEFuIGV4Y2VwdGlvbiB3aWxsIGJlIHJhaXNlZCBpZiB0aGUgY2FudmFzIGlzIHRhaW50ZWQuXG4gICAgICAgICAgICB2YXIgZGF0YSA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpLmdldEltYWdlRGF0YSgwLCAwLCAxLCAxKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgaXNUYWludGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXNUYWludGVkO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBBIHJhdGlvIGNvbXBhcmluZyB0aGUgZGV2aWNlIHNjcmVlbidzIHBpeGVsIGRlbnNpdHkgdG8gdGhlIGNhbnZhcydzIGJhY2tpbmcgc3RvcmUgcGl4ZWwgZGVuc2l0eS4gRGVmYXVsdHMgdG8gMSBpZiBjYW52YXMgaXNuJ3Qgc3VwcG9ydGVkIGJ5IHRoZSBicm93c2VyLlxuICAgICAqIEBtZW1iZXIge051bWJlcn0gcGl4ZWxEZW5zaXR5UmF0aW9cbiAgICAgKiBAbWVtYmVyb2YgT3BlblNlYWRyYWdvblxuICAgICAqL1xuICAgICQucGl4ZWxEZW5zaXR5UmF0aW8gPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoICQuc3VwcG9ydHNDYW52YXMgKSB7XG4gICAgICAgICAgICB2YXIgY29udGV4dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpLmdldENvbnRleHQoJzJkJyk7XG4gICAgICAgICAgICB2YXIgZGV2aWNlUGl4ZWxSYXRpbyA9IHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvIHx8IDE7XG4gICAgICAgICAgICB2YXIgYmFja2luZ1N0b3JlUmF0aW8gPSBjb250ZXh0LndlYmtpdEJhY2tpbmdTdG9yZVBpeGVsUmF0aW8gfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQubW96QmFja2luZ1N0b3JlUGl4ZWxSYXRpbyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5tc0JhY2tpbmdTdG9yZVBpeGVsUmF0aW8gfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQub0JhY2tpbmdTdG9yZVBpeGVsUmF0aW8gfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuYmFja2luZ1N0b3JlUGl4ZWxSYXRpbyB8fCAxO1xuICAgICAgICAgICAgcmV0dXJuIGRldmljZVBpeGVsUmF0aW8gLyBiYWNraW5nU3RvcmVSYXRpbztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9XG4gICAgfSgpKTtcblxufSggT3BlblNlYWRyYWdvbiApKTtcblxuLyoqXG4gKiAgVGhpcyBjbG9zdXJlIGRlZmluZXMgYWxsIHN0YXRpYyBtZXRob2RzIGF2YWlsYWJsZSB0byB0aGUgT3BlblNlYWRyYWdvblxuICogIG5hbWVzcGFjZS4gIE1hbnksIGlmIG5vdCBtb3N0LCBhcmUgdGFrZWQgZGlyZWN0bHkgZnJvbSBqUXVlcnkgZm9yIHVzZVxuICogIHRvIHNpbXBsaWZ5IGFuZCByZWR1Y2UgY29tbW9uIHByb2dyYW1taW5nIHBhdHRlcm5zLiAgTW9yZSBzdGF0aWMgbWV0aG9kc1xuICogIGZyb20galF1ZXJ5IG1heSBldmVudHVhbGx5IG1ha2UgdGhlaXIgd2F5IGludG8gdGhpcyB0aG91Z2ggd2UgYXJlXG4gKiAgYXR0ZW1wdGluZyB0byBhdm9pZCBhbiBleHBsaWNpdCBkZXBlbmRlbmN5IG9uIGpRdWVyeSBvbmx5IGJlY2F1c2VcbiAqICBPcGVuU2VhZHJhZ29uIGlzIGEgYnJvYWRseSB1c2VmdWwgY29kZSBiYXNlIGFuZCB3b3VsZCBiZSBtYWRlIGxlc3MgYnJvYWRcbiAqICBieSByZXF1aXJpbmcgalF1ZXJ5IGZ1bGx5LlxuICpcbiAqICBTb21lIHN0YXRpYyBtZXRob2RzIGhhdmUgYWxzbyBiZWVuIHJlZmFjdG9yZWQgZnJvbSB0aGUgb3JpZ2luYWwgT3BlblNlYWRyYWdvblxuICogIHByb2plY3QuXG4gKi9cbihmdW5jdGlvbiggJCApe1xuXG4gICAgLyoqXG4gICAgICogVGFrZW4gZnJvbSBqUXVlcnkgMS42LjFcbiAgICAgKiBAZnVuY3Rpb24gZXh0ZW5kXG4gICAgICogQG1lbWJlcm9mIE9wZW5TZWFkcmFnb25cbiAgICAgKiBAc2VlIHtAbGluayBodHRwOi8vd3d3LmpxdWVyeS5jb20vIGpRdWVyeX1cbiAgICAgKi9cbiAgICAkLmV4dGVuZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgb3B0aW9ucyxcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBzcmMsXG4gICAgICAgICAgICBjb3B5LFxuICAgICAgICAgICAgY29weUlzQXJyYXksXG4gICAgICAgICAgICBjbG9uZSxcbiAgICAgICAgICAgIHRhcmdldCAgPSBhcmd1bWVudHNbIDAgXSB8fCB7fSxcbiAgICAgICAgICAgIGxlbmd0aCAgPSBhcmd1bWVudHMubGVuZ3RoLFxuICAgICAgICAgICAgZGVlcCAgICA9IGZhbHNlLFxuICAgICAgICAgICAgaSAgICAgICA9IDE7XG5cbiAgICAgICAgLy8gSGFuZGxlIGEgZGVlcCBjb3B5IHNpdHVhdGlvblxuICAgICAgICBpZiAoIHR5cGVvZiB0YXJnZXQgPT09IFwiYm9vbGVhblwiICkge1xuICAgICAgICAgICAgZGVlcCAgICA9IHRhcmdldDtcbiAgICAgICAgICAgIHRhcmdldCAgPSBhcmd1bWVudHNbIDEgXSB8fCB7fTtcbiAgICAgICAgICAgIC8vIHNraXAgdGhlIGJvb2xlYW4gYW5kIHRoZSB0YXJnZXRcbiAgICAgICAgICAgIGkgPSAyO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSGFuZGxlIGNhc2Ugd2hlbiB0YXJnZXQgaXMgYSBzdHJpbmcgb3Igc29tZXRoaW5nIChwb3NzaWJsZSBpbiBkZWVwIGNvcHkpXG4gICAgICAgIGlmICggdHlwZW9mIHRhcmdldCAhPT0gXCJvYmplY3RcIiAmJiAhT3BlblNlYWRyYWdvbi5pc0Z1bmN0aW9uKCB0YXJnZXQgKSApIHtcbiAgICAgICAgICAgIHRhcmdldCA9IHt9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZXh0ZW5kIGpRdWVyeSBpdHNlbGYgaWYgb25seSBvbmUgYXJndW1lbnQgaXMgcGFzc2VkXG4gICAgICAgIGlmICggbGVuZ3RoID09PSBpICkge1xuICAgICAgICAgICAgdGFyZ2V0ID0gdGhpcztcbiAgICAgICAgICAgIC0taTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoIDsgaSA8IGxlbmd0aDsgaSsrICkge1xuICAgICAgICAgICAgLy8gT25seSBkZWFsIHdpdGggbm9uLW51bGwvdW5kZWZpbmVkIHZhbHVlc1xuICAgICAgICAgICAgb3B0aW9ucyA9IGFyZ3VtZW50c1sgaSBdO1xuICAgICAgICAgICAgaWYgKCBvcHRpb25zICE9PSBudWxsIHx8IG9wdGlvbnMgIT09IHVuZGVmaW5lZCApIHtcbiAgICAgICAgICAgICAgICAvLyBFeHRlbmQgdGhlIGJhc2Ugb2JqZWN0XG4gICAgICAgICAgICAgICAgZm9yICggbmFtZSBpbiBvcHRpb25zICkge1xuICAgICAgICAgICAgICAgICAgICBzcmMgPSB0YXJnZXRbIG5hbWUgXTtcbiAgICAgICAgICAgICAgICAgICAgY29weSA9IG9wdGlvbnNbIG5hbWUgXTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBQcmV2ZW50IG5ldmVyLWVuZGluZyBsb29wXG4gICAgICAgICAgICAgICAgICAgIGlmICggdGFyZ2V0ID09PSBjb3B5ICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBSZWN1cnNlIGlmIHdlJ3JlIG1lcmdpbmcgcGxhaW4gb2JqZWN0cyBvciBhcnJheXNcbiAgICAgICAgICAgICAgICAgICAgaWYgKCBkZWVwICYmIGNvcHkgJiYgKCBPcGVuU2VhZHJhZ29uLmlzUGxhaW5PYmplY3QoIGNvcHkgKSB8fCAoIGNvcHlJc0FycmF5ID0gT3BlblNlYWRyYWdvbi5pc0FycmF5KCBjb3B5ICkgKSApICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBjb3B5SXNBcnJheSApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3B5SXNBcnJheSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb25lID0gc3JjICYmIE9wZW5TZWFkcmFnb24uaXNBcnJheSggc3JjICkgPyBzcmMgOiBbXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9uZSA9IHNyYyAmJiBPcGVuU2VhZHJhZ29uLmlzUGxhaW5PYmplY3QoIHNyYyApID8gc3JjIDoge307XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5ldmVyIG1vdmUgb3JpZ2luYWwgb2JqZWN0cywgY2xvbmUgdGhlbVxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0WyBuYW1lIF0gPSBPcGVuU2VhZHJhZ29uLmV4dGVuZCggZGVlcCwgY2xvbmUsIGNvcHkgKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBEb24ndCBicmluZyBpbiB1bmRlZmluZWQgdmFsdWVzXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIGNvcHkgIT09IHVuZGVmaW5lZCApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFsgbmFtZSBdID0gY29weTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJldHVybiB0aGUgbW9kaWZpZWQgb2JqZWN0XG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfTtcblxuICAgIHZhciBpc0lPU0RldmljZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBuYXZpZ2F0b3IgIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHVzZXJBZ2VudCA9IG5hdmlnYXRvci51c2VyQWdlbnQ7XG4gICAgICAgIGlmICh0eXBlb2YgdXNlckFnZW50ICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1c2VyQWdlbnQuaW5kZXhPZignaVBob25lJykgIT09IC0xIHx8XG4gICAgICAgICAgICAgICB1c2VyQWdlbnQuaW5kZXhPZignaVBhZCcpICE9PSAtMSB8fFxuICAgICAgICAgICAgICAgdXNlckFnZW50LmluZGV4T2YoJ2lQb2QnKSAhPT0gLTE7XG4gICAgfTtcblxuICAgICQuZXh0ZW5kKCAkLCAvKiogQGxlbmRzIE9wZW5TZWFkcmFnb24gKi97XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZXMgZm9yIHRoZSBvcHRpb25hbCBzZXR0aW5ncyBkb2N1bWVudGVkIGF0IHtAbGluayBPcGVuU2VhZHJhZ29uLk9wdGlvbnN9LlxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEB0eXBlIHtPYmplY3R9XG4gICAgICAgICAqL1xuICAgICAgICBERUZBVUxUX1NFVFRJTkdTOiB7XG4gICAgICAgICAgICAvL0RBVEEgU09VUkNFIERFVEFJTFNcbiAgICAgICAgICAgIHhtbFBhdGg6ICAgICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICB0aWxlU291cmNlczogICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgdGlsZUhvc3Q6ICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIGluaXRpYWxQYWdlOiAgICAgICAgICAgIDAsXG4gICAgICAgICAgICBjcm9zc09yaWdpblBvbGljeTogICAgICBmYWxzZSxcbiAgICAgICAgICAgIGFqYXhXaXRoQ3JlZGVudGlhbHM6ICAgIGZhbHNlLFxuXG4gICAgICAgICAgICAvL1BBTiBBTkQgWk9PTSBTRVRUSU5HUyBBTkQgQ09OU1RSQUlOVFNcbiAgICAgICAgICAgIHBhbkhvcml6b250YWw6ICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICBwYW5WZXJ0aWNhbDogICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgY29uc3RyYWluRHVyaW5nUGFuOiAgICAgZmFsc2UsXG4gICAgICAgICAgICB3cmFwSG9yaXpvbnRhbDogICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgIHdyYXBWZXJ0aWNhbDogICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgdmlzaWJpbGl0eVJhdGlvOiAgICAgICAgMC41LCAvLy0+IGhvdyBtdWNoIG9mIHRoZSB2aWV3ZXIgY2FuIGJlIG5lZ2F0aXZlIHNwYWNlXG4gICAgICAgICAgICBtaW5QaXhlbFJhdGlvOiAgICAgICAgICAwLjUsIC8vLT5jbG9zZXIgdG8gMCBkcmF3cyB0aWxlcyBtZWFudCBmb3IgYSBoaWdoZXIgem9vbSBhdCB0aGlzIHpvb21cbiAgICAgICAgICAgIGRlZmF1bHRab29tTGV2ZWw6ICAgICAgIDAsXG4gICAgICAgICAgICBtaW5ab29tTGV2ZWw6ICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgbWF4Wm9vbUxldmVsOiAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIGhvbWVGaWxsc1ZpZXdlcjogICAgICAgIGZhbHNlLFxuXG4gICAgICAgICAgICAvL1VJIFJFU1BPTlNJVkVORVNTIEFORCBGRUVMXG4gICAgICAgICAgICBjbGlja1RpbWVUaHJlc2hvbGQ6ICAgICAzMDAsXG4gICAgICAgICAgICBjbGlja0Rpc3RUaHJlc2hvbGQ6ICAgICA1LFxuICAgICAgICAgICAgZGJsQ2xpY2tUaW1lVGhyZXNob2xkOiAgMzAwLFxuICAgICAgICAgICAgZGJsQ2xpY2tEaXN0VGhyZXNob2xkOiAgMjAsXG4gICAgICAgICAgICBzcHJpbmdTdGlmZm5lc3M6ICAgICAgICA2LjUsXG4gICAgICAgICAgICBhbmltYXRpb25UaW1lOiAgICAgICAgICAxLjIsXG4gICAgICAgICAgICBnZXN0dXJlU2V0dGluZ3NNb3VzZTogICB7IHNjcm9sbFRvWm9vbTogdHJ1ZSwgIGNsaWNrVG9ab29tOiB0cnVlLCAgZGJsQ2xpY2tUb1pvb206IGZhbHNlLCBwaW5jaFRvWm9vbTogZmFsc2UsIGZsaWNrRW5hYmxlZDogZmFsc2UsIGZsaWNrTWluU3BlZWQ6IDEyMCwgZmxpY2tNb21lbnR1bTogMC4yNSwgcGluY2hSb3RhdGU6IGZhbHNlIH0sXG4gICAgICAgICAgICBnZXN0dXJlU2V0dGluZ3NUb3VjaDogICB7IHNjcm9sbFRvWm9vbTogZmFsc2UsIGNsaWNrVG9ab29tOiBmYWxzZSwgZGJsQ2xpY2tUb1pvb206IHRydWUsICBwaW5jaFRvWm9vbTogdHJ1ZSwgIGZsaWNrRW5hYmxlZDogdHJ1ZSwgIGZsaWNrTWluU3BlZWQ6IDEyMCwgZmxpY2tNb21lbnR1bTogMC4yNSwgcGluY2hSb3RhdGU6IGZhbHNlIH0sXG4gICAgICAgICAgICBnZXN0dXJlU2V0dGluZ3NQZW46ICAgICB7IHNjcm9sbFRvWm9vbTogZmFsc2UsIGNsaWNrVG9ab29tOiB0cnVlLCAgZGJsQ2xpY2tUb1pvb206IGZhbHNlLCBwaW5jaFRvWm9vbTogZmFsc2UsIGZsaWNrRW5hYmxlZDogZmFsc2UsIGZsaWNrTWluU3BlZWQ6IDEyMCwgZmxpY2tNb21lbnR1bTogMC4yNSwgcGluY2hSb3RhdGU6IGZhbHNlIH0sXG4gICAgICAgICAgICBnZXN0dXJlU2V0dGluZ3NVbmtub3duOiB7IHNjcm9sbFRvWm9vbTogZmFsc2UsIGNsaWNrVG9ab29tOiBmYWxzZSwgZGJsQ2xpY2tUb1pvb206IHRydWUsICBwaW5jaFRvWm9vbTogdHJ1ZSwgIGZsaWNrRW5hYmxlZDogdHJ1ZSwgIGZsaWNrTWluU3BlZWQ6IDEyMCwgZmxpY2tNb21lbnR1bTogMC4yNSwgcGluY2hSb3RhdGU6IGZhbHNlIH0sXG4gICAgICAgICAgICB6b29tUGVyQ2xpY2s6ICAgICAgICAgICAyLFxuICAgICAgICAgICAgem9vbVBlclNjcm9sbDogICAgICAgICAgMS4yLFxuICAgICAgICAgICAgem9vbVBlclNlY29uZDogICAgICAgICAgMS4wLFxuICAgICAgICAgICAgYmxlbmRUaW1lOiAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgIGFsd2F5c0JsZW5kOiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgYXV0b0hpZGVDb250cm9sczogICAgICAgdHJ1ZSxcbiAgICAgICAgICAgIGltbWVkaWF0ZVJlbmRlcjogICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgbWluWm9vbUltYWdlUmF0aW86ICAgICAgMC45LCAvLy0+IGNsb3NlciB0byAwIGFsbG93cyB6b29tIG91dCB0byBpbmZpbml0eVxuICAgICAgICAgICAgbWF4Wm9vbVBpeGVsUmF0aW86ICAgICAgMS4xLCAvLy0+IGhpZ2hlciBhbGxvd3MgJ292ZXIgem9vbScgaW50byBwaXhlbHNcbiAgICAgICAgICAgIHNtb290aFRpbGVFZGdlc01pblpvb206IDEuMSwgLy8tPiBoaWdoZXIgdGhhbiBtYXhab29tUGl4ZWxSYXRpbyBkaXNhYmxlcyBpdFxuICAgICAgICAgICAgaU9TRGV2aWNlOiAgICAgICAgICAgICAgaXNJT1NEZXZpY2UoKSxcbiAgICAgICAgICAgIHBpeGVsc1BlcldoZWVsTGluZTogICAgIDQwLFxuICAgICAgICAgICAgYXV0b1Jlc2l6ZTogICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgIHByZXNlcnZlSW1hZ2VTaXplT25SZXNpemU6IGZhbHNlLCAvLyByZXF1aXJlcyBhdXRvUmVzaXplPXRydWVcbiAgICAgICAgICAgIG1pblNjcm9sbERlbHRhVGltZTogICAgIDUwLFxuXG4gICAgICAgICAgICAvL0RFRkFVTFQgQ09OVFJPTCBTRVRUSU5HU1xuICAgICAgICAgICAgc2hvd1NlcXVlbmNlQ29udHJvbDogICAgIHRydWUsICAvL1NFUVVFTkNFXG4gICAgICAgICAgICBzZXF1ZW5jZUNvbnRyb2xBbmNob3I6ICAgbnVsbCwgIC8vU0VRVUVOQ0VcbiAgICAgICAgICAgIHByZXNlcnZlVmlld3BvcnQ6ICAgICAgICBmYWxzZSwgLy9TRVFVRU5DRVxuICAgICAgICAgICAgcHJlc2VydmVPdmVybGF5czogICAgICAgIGZhbHNlLCAvL1NFUVVFTkNFXG4gICAgICAgICAgICBuYXZQcmV2TmV4dFdyYXA6ICAgICAgICAgZmFsc2UsIC8vU0VRVUVOQ0VcbiAgICAgICAgICAgIHNob3dOYXZpZ2F0aW9uQ29udHJvbDogICB0cnVlLCAgLy9aT09NL0hPTUUvRlVMTC9ST1RBVElPTlxuICAgICAgICAgICAgbmF2aWdhdGlvbkNvbnRyb2xBbmNob3I6IG51bGwsICAvL1pPT00vSE9NRS9GVUxML1JPVEFUSU9OXG4gICAgICAgICAgICBzaG93Wm9vbUNvbnRyb2w6ICAgICAgICAgdHJ1ZSwgIC8vWk9PTVxuICAgICAgICAgICAgc2hvd0hvbWVDb250cm9sOiAgICAgICAgIHRydWUsICAvL0hPTUVcbiAgICAgICAgICAgIHNob3dGdWxsUGFnZUNvbnRyb2w6ICAgICB0cnVlLCAgLy9GVUxMXG4gICAgICAgICAgICBzaG93Um90YXRpb25Db250cm9sOiAgICAgZmFsc2UsIC8vUk9UQVRJT05cbiAgICAgICAgICAgIGNvbnRyb2xzRmFkZURlbGF5OiAgICAgICAyMDAwLCAgLy9aT09NL0hPTUUvRlVMTC9TRVFVRU5DRVxuICAgICAgICAgICAgY29udHJvbHNGYWRlTGVuZ3RoOiAgICAgIDE1MDAsICAvL1pPT00vSE9NRS9GVUxML1NFUVVFTkNFXG4gICAgICAgICAgICBtb3VzZU5hdkVuYWJsZWQ6ICAgICAgICAgdHJ1ZSwgIC8vR0VORVJBTCBNT1VTRSBJTlRFUkFDVElWSVRZXG5cbiAgICAgICAgICAgIC8vVklFV1BPUlQgTkFWSUdBVE9SIFNFVFRJTkdTXG4gICAgICAgICAgICBzaG93TmF2aWdhdG9yOiAgICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICBuYXZpZ2F0b3JJZDogICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIG5hdmlnYXRvclBvc2l0aW9uOiAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgbmF2aWdhdG9yU2l6ZVJhdGlvOiAgICAgICAgIDAuMixcbiAgICAgICAgICAgIG5hdmlnYXRvck1haW50YWluU2l6ZVJhdGlvOiBmYWxzZSxcbiAgICAgICAgICAgIG5hdmlnYXRvclRvcDogICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgbmF2aWdhdG9yTGVmdDogICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICBuYXZpZ2F0b3JIZWlnaHQ6ICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIG5hdmlnYXRvcldpZHRoOiAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgbmF2aWdhdG9yQXV0b1Jlc2l6ZTogICAgICAgIHRydWUsXG4gICAgICAgICAgICBuYXZpZ2F0b3JBdXRvRmFkZTogICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgIG5hdmlnYXRvclJvdGF0ZTogICAgICAgICAgICB0cnVlLFxuXG4gICAgICAgICAgICAvLyBJTklUSUFMIFJPVEFUSU9OXG4gICAgICAgICAgICBkZWdyZWVzOiAgICAgICAgICAgICAgICAgICAgMCxcblxuICAgICAgICAgICAgLy8gQVBQRUFSQU5DRVxuICAgICAgICAgICAgb3BhY2l0eTogICAgICAgICAgICAgICAgICAgIDEsXG4gICAgICAgICAgICBjb21wb3NpdGVPcGVyYXRpb246ICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyRmlsbFN0eWxlOiAgICAgICBudWxsLFxuXG4gICAgICAgICAgICAvL1JFRkVSRU5DRSBTVFJJUCBTRVRUSU5HU1xuICAgICAgICAgICAgc2hvd1JlZmVyZW5jZVN0cmlwOiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgIHJlZmVyZW5jZVN0cmlwU2Nyb2xsOiAgICAgICAnaG9yaXpvbnRhbCcsXG4gICAgICAgICAgICByZWZlcmVuY2VTdHJpcEVsZW1lbnQ6ICAgICAgIG51bGwsXG4gICAgICAgICAgICByZWZlcmVuY2VTdHJpcEhlaWdodDogICAgICAgIG51bGwsXG4gICAgICAgICAgICByZWZlcmVuY2VTdHJpcFdpZHRoOiAgICAgICAgIG51bGwsXG4gICAgICAgICAgICByZWZlcmVuY2VTdHJpcFBvc2l0aW9uOiAgICAgICdCT1RUT01fTEVGVCcsXG4gICAgICAgICAgICByZWZlcmVuY2VTdHJpcFNpemVSYXRpbzogICAgIDAuMixcblxuICAgICAgICAgICAgLy9DT0xMRUNUSU9OIFZJU1VBTElaQVRJT04gU0VUVElOR1NcbiAgICAgICAgICAgIGNvbGxlY3Rpb25Sb3dzOiAgICAgICAgIDMsIC8vb3IgY29sdW1ucyBkZXBlbmRpbmcgb24gbGF5b3V0XG4gICAgICAgICAgICBjb2xsZWN0aW9uQ29sdW1uczogICAgICAwLCAvL2NvbHVtbnMgaW4gaG9yaXpvbnRhbCBsYXlvdXQsIHJvd3MgaW4gdmVydGljYWwgbGF5b3V0XG4gICAgICAgICAgICBjb2xsZWN0aW9uTGF5b3V0OiAgICAgICAnaG9yaXpvbnRhbCcsIC8vdmVydGljYWxcbiAgICAgICAgICAgIGNvbGxlY3Rpb25Nb2RlOiAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgY29sbGVjdGlvblRpbGVTaXplOiAgICAgODAwLFxuICAgICAgICAgICAgY29sbGVjdGlvblRpbGVNYXJnaW46ICAgODAsXG5cbiAgICAgICAgICAgIC8vUEVSRk9STUFOQ0UgU0VUVElOR1NcbiAgICAgICAgICAgIGltYWdlTG9hZGVyTGltaXQ6ICAgICAgIDAsXG4gICAgICAgICAgICBtYXhJbWFnZUNhY2hlQ291bnQ6ICAgICAyMDAsXG4gICAgICAgICAgICB0aW1lb3V0OiAgICAgICAgICAgICAgICAzMDAwMCxcbiAgICAgICAgICAgIHVzZUNhbnZhczogICAgICAgICAgICAgIHRydWUsICAvLyBVc2UgY2FudmFzIGVsZW1lbnQgZm9yIGRyYXdpbmcgaWYgYXZhaWxhYmxlXG5cbiAgICAgICAgICAgIC8vSU5URVJGQUNFIFJFU09VUkNFIFNFVFRJTkdTXG4gICAgICAgICAgICBwcmVmaXhVcmw6ICAgICAgICAgICAgICBcIi9pbWFnZXMvXCIsXG4gICAgICAgICAgICBuYXZJbWFnZXM6IHtcbiAgICAgICAgICAgICAgICB6b29tSW46IHtcbiAgICAgICAgICAgICAgICAgICAgUkVTVDogICAnem9vbWluX3Jlc3QucG5nJyxcbiAgICAgICAgICAgICAgICAgICAgR1JPVVA6ICAnem9vbWluX2dyb3VwaG92ZXIucG5nJyxcbiAgICAgICAgICAgICAgICAgICAgSE9WRVI6ICAnem9vbWluX2hvdmVyLnBuZycsXG4gICAgICAgICAgICAgICAgICAgIERPV046ICAgJ3pvb21pbl9wcmVzc2VkLnBuZydcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHpvb21PdXQ6IHtcbiAgICAgICAgICAgICAgICAgICAgUkVTVDogICAnem9vbW91dF9yZXN0LnBuZycsXG4gICAgICAgICAgICAgICAgICAgIEdST1VQOiAgJ3pvb21vdXRfZ3JvdXBob3Zlci5wbmcnLFxuICAgICAgICAgICAgICAgICAgICBIT1ZFUjogICd6b29tb3V0X2hvdmVyLnBuZycsXG4gICAgICAgICAgICAgICAgICAgIERPV046ICAgJ3pvb21vdXRfcHJlc3NlZC5wbmcnXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBob21lOiB7XG4gICAgICAgICAgICAgICAgICAgIFJFU1Q6ICAgJ2hvbWVfcmVzdC5wbmcnLFxuICAgICAgICAgICAgICAgICAgICBHUk9VUDogICdob21lX2dyb3VwaG92ZXIucG5nJyxcbiAgICAgICAgICAgICAgICAgICAgSE9WRVI6ICAnaG9tZV9ob3Zlci5wbmcnLFxuICAgICAgICAgICAgICAgICAgICBET1dOOiAgICdob21lX3ByZXNzZWQucG5nJ1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZnVsbHBhZ2U6IHtcbiAgICAgICAgICAgICAgICAgICAgUkVTVDogICAnZnVsbHBhZ2VfcmVzdC5wbmcnLFxuICAgICAgICAgICAgICAgICAgICBHUk9VUDogICdmdWxscGFnZV9ncm91cGhvdmVyLnBuZycsXG4gICAgICAgICAgICAgICAgICAgIEhPVkVSOiAgJ2Z1bGxwYWdlX2hvdmVyLnBuZycsXG4gICAgICAgICAgICAgICAgICAgIERPV046ICAgJ2Z1bGxwYWdlX3ByZXNzZWQucG5nJ1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcm90YXRlbGVmdDoge1xuICAgICAgICAgICAgICAgICAgICBSRVNUOiAgICdyb3RhdGVsZWZ0X3Jlc3QucG5nJyxcbiAgICAgICAgICAgICAgICAgICAgR1JPVVA6ICAncm90YXRlbGVmdF9ncm91cGhvdmVyLnBuZycsXG4gICAgICAgICAgICAgICAgICAgIEhPVkVSOiAgJ3JvdGF0ZWxlZnRfaG92ZXIucG5nJyxcbiAgICAgICAgICAgICAgICAgICAgRE9XTjogICAncm90YXRlbGVmdF9wcmVzc2VkLnBuZydcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHJvdGF0ZXJpZ2h0OiB7XG4gICAgICAgICAgICAgICAgICAgIFJFU1Q6ICAgJ3JvdGF0ZXJpZ2h0X3Jlc3QucG5nJyxcbiAgICAgICAgICAgICAgICAgICAgR1JPVVA6ICAncm90YXRlcmlnaHRfZ3JvdXBob3Zlci5wbmcnLFxuICAgICAgICAgICAgICAgICAgICBIT1ZFUjogICdyb3RhdGVyaWdodF9ob3Zlci5wbmcnLFxuICAgICAgICAgICAgICAgICAgICBET1dOOiAgICdyb3RhdGVyaWdodF9wcmVzc2VkLnBuZydcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHByZXZpb3VzOiB7XG4gICAgICAgICAgICAgICAgICAgIFJFU1Q6ICAgJ3ByZXZpb3VzX3Jlc3QucG5nJyxcbiAgICAgICAgICAgICAgICAgICAgR1JPVVA6ICAncHJldmlvdXNfZ3JvdXBob3Zlci5wbmcnLFxuICAgICAgICAgICAgICAgICAgICBIT1ZFUjogICdwcmV2aW91c19ob3Zlci5wbmcnLFxuICAgICAgICAgICAgICAgICAgICBET1dOOiAgICdwcmV2aW91c19wcmVzc2VkLnBuZydcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG5leHQ6IHtcbiAgICAgICAgICAgICAgICAgICAgUkVTVDogICAnbmV4dF9yZXN0LnBuZycsXG4gICAgICAgICAgICAgICAgICAgIEdST1VQOiAgJ25leHRfZ3JvdXBob3Zlci5wbmcnLFxuICAgICAgICAgICAgICAgICAgICBIT1ZFUjogICduZXh0X2hvdmVyLnBuZycsXG4gICAgICAgICAgICAgICAgICAgIERPV046ICAgJ25leHRfcHJlc3NlZC5wbmcnXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgLy9ERVZFTE9QRVIgU0VUVElOR1NcbiAgICAgICAgICAgIGRlYnVnTW9kZTogICAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgZGVidWdHcmlkQ29sb3I6ICAgICAgICAgJyM0MzdBQjInXG4gICAgICAgIH0sXG5cblxuICAgICAgICAvKipcbiAgICAgICAgICogVE9ETzogZ2V0IHJpZCBvZiB0aGlzLiAgSSBjYW4ndCBzZWUgaG93IGl0J3MgcmVxdWlyZWQgYXQgYWxsLiAgTG9va3NcbiAgICAgICAgICogICAgICAgbGlrZSBhbiBlYXJseSBsZWdhY3kgY29kZSBhcnRpZmFjdC5cbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAaWdub3JlXG4gICAgICAgICAqL1xuICAgICAgICBTSUdOQUw6IFwiLS0tLXNlYWRyYWdvbi0tLS1cIixcblxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgZnVuY3Rpb24gd2hpY2ggaW52b2tlcyB0aGUgbWV0aG9kIGFzIGlmIGl0IHdlcmUgYSBtZXRob2QgYmVsb25naW5nIHRvIHRoZSBvYmplY3QuXG4gICAgICAgICAqIEBmdW5jdGlvblxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0XG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG1ldGhvZFxuICAgICAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259XG4gICAgICAgICAqL1xuICAgICAgICBkZWxlZ2F0ZTogZnVuY3Rpb24oIG9iamVjdCwgbWV0aG9kICkge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgICAgICAgICAgICAgaWYgKCBhcmdzID09PSB1bmRlZmluZWQgKXtcbiAgICAgICAgICAgICAgICAgICAgYXJncyA9IFtdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbWV0aG9kLmFwcGx5KCBvYmplY3QsIGFyZ3MgKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG5cblxuICAgICAgICAvKipcbiAgICAgICAgICogQW4gZW51bWVyYXRpb24gb2YgQnJvd3NlciB2ZW5kb3JzLlxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEB0eXBlIHtPYmplY3R9XG4gICAgICAgICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBVTktOT1dOXG4gICAgICAgICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBJRVxuICAgICAgICAgKiBAcHJvcGVydHkge051bWJlcn0gRklSRUZPWFxuICAgICAgICAgKiBAcHJvcGVydHkge051bWJlcn0gU0FGQVJJXG4gICAgICAgICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBDSFJPTUVcbiAgICAgICAgICogQHByb3BlcnR5IHtOdW1iZXJ9IE9QRVJBXG4gICAgICAgICAqL1xuICAgICAgICBCUk9XU0VSUzoge1xuICAgICAgICAgICAgVU5LTk9XTjogICAgMCxcbiAgICAgICAgICAgIElFOiAgICAgICAgIDEsXG4gICAgICAgICAgICBGSVJFRk9YOiAgICAyLFxuICAgICAgICAgICAgU0FGQVJJOiAgICAgMyxcbiAgICAgICAgICAgIENIUk9NRTogICAgIDQsXG4gICAgICAgICAgICBPUEVSQTogICAgICA1XG4gICAgICAgIH0sXG5cblxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIERPTSBFbGVtZW50IGZvciB0aGUgZ2l2ZW4gaWQgb3IgZWxlbWVudC5cbiAgICAgICAgICogQGZ1bmN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfEVsZW1lbnR9IGVsZW1lbnQgQWNjZXB0cyBhbiBpZCBvciBlbGVtZW50LlxuICAgICAgICAgKiBAcmV0dXJucyB7RWxlbWVudH0gVGhlIGVsZW1lbnQgd2l0aCB0aGUgZ2l2ZW4gaWQsIG51bGwsIG9yIHRoZSBlbGVtZW50IGl0c2VsZi5cbiAgICAgICAgICovXG4gICAgICAgIGdldEVsZW1lbnQ6IGZ1bmN0aW9uKCBlbGVtZW50ICkge1xuICAgICAgICAgICAgaWYgKCB0eXBlb2YgKCBlbGVtZW50ICkgPT0gXCJzdHJpbmdcIiApIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIGVsZW1lbnQgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgICAgICB9LFxuXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIERldGVybWluZXMgdGhlIHBvc2l0aW9uIG9mIHRoZSB1cHBlci1sZWZ0IGNvcm5lciBvZiB0aGUgZWxlbWVudC5cbiAgICAgICAgICogQGZ1bmN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7RWxlbWVudHxTdHJpbmd9IGVsZW1lbnQgLSB0aGUgZWxlbWVuZXQgd2Ugd2FudCB0aGUgcG9zaXRpb24gZm9yLlxuICAgICAgICAgKiBAcmV0dXJucyB7T3BlblNlYWRyYWdvbi5Qb2ludH0gLSB0aGUgcG9zaXRpb24gb2YgdGhlIHVwcGVyIGxlZnQgY29ybmVyIG9mIHRoZSBlbGVtZW50LlxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0RWxlbWVudFBvc2l0aW9uOiBmdW5jdGlvbiggZWxlbWVudCApIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSBuZXcgJC5Qb2ludCgpLFxuICAgICAgICAgICAgICAgIGlzRml4ZWQsXG4gICAgICAgICAgICAgICAgb2Zmc2V0UGFyZW50O1xuXG4gICAgICAgICAgICBlbGVtZW50ICAgICAgPSAkLmdldEVsZW1lbnQoIGVsZW1lbnQgKTtcbiAgICAgICAgICAgIGlzRml4ZWQgICAgICA9ICQuZ2V0RWxlbWVudFN0eWxlKCBlbGVtZW50ICkucG9zaXRpb24gPT0gXCJmaXhlZFwiO1xuICAgICAgICAgICAgb2Zmc2V0UGFyZW50ID0gZ2V0T2Zmc2V0UGFyZW50KCBlbGVtZW50LCBpc0ZpeGVkICk7XG5cbiAgICAgICAgICAgIHdoaWxlICggb2Zmc2V0UGFyZW50ICkge1xuXG4gICAgICAgICAgICAgICAgcmVzdWx0LnggKz0gZWxlbWVudC5vZmZzZXRMZWZ0O1xuICAgICAgICAgICAgICAgIHJlc3VsdC55ICs9IGVsZW1lbnQub2Zmc2V0VG9wO1xuXG4gICAgICAgICAgICAgICAgaWYgKCBpc0ZpeGVkICkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQucGx1cyggJC5nZXRQYWdlU2Nyb2xsKCkgKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBlbGVtZW50ID0gb2Zmc2V0UGFyZW50O1xuICAgICAgICAgICAgICAgIGlzRml4ZWQgPSAkLmdldEVsZW1lbnRTdHlsZSggZWxlbWVudCApLnBvc2l0aW9uID09IFwiZml4ZWRcIjtcbiAgICAgICAgICAgICAgICBvZmZzZXRQYXJlbnQgPSBnZXRPZmZzZXRQYXJlbnQoIGVsZW1lbnQsIGlzRml4ZWQgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSxcblxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEZXRlcm1pbmVzIHRoZSBwb3NpdGlvbiBvZiB0aGUgdXBwZXItbGVmdCBjb3JuZXIgb2YgdGhlIGVsZW1lbnQgYWRqdXN0ZWQgZm9yIGN1cnJlbnQgcGFnZSBhbmQvb3IgZWxlbWVudCBzY3JvbGwuXG4gICAgICAgICAqIEBmdW5jdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR8U3RyaW5nfSBlbGVtZW50IC0gdGhlIGVsZW1lbnQgd2Ugd2FudCB0aGUgcG9zaXRpb24gZm9yLlxuICAgICAgICAgKiBAcmV0dXJucyB7T3BlblNlYWRyYWdvbi5Qb2ludH0gLSB0aGUgcG9zaXRpb24gb2YgdGhlIHVwcGVyIGxlZnQgY29ybmVyIG9mIHRoZSBlbGVtZW50IGFkanVzdGVkIGZvciBjdXJyZW50IHBhZ2UgYW5kL29yIGVsZW1lbnQgc2Nyb2xsLlxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0RWxlbWVudE9mZnNldDogZnVuY3Rpb24oIGVsZW1lbnQgKSB7XG4gICAgICAgICAgICBlbGVtZW50ID0gJC5nZXRFbGVtZW50KCBlbGVtZW50ICk7XG5cbiAgICAgICAgICAgIHZhciBkb2MgPSBlbGVtZW50ICYmIGVsZW1lbnQub3duZXJEb2N1bWVudCxcbiAgICAgICAgICAgICAgICBkb2NFbGVtZW50LFxuICAgICAgICAgICAgICAgIHdpbixcbiAgICAgICAgICAgICAgICBib3VuZGluZ1JlY3QgPSB7IHRvcDogMCwgbGVmdDogMCB9O1xuXG4gICAgICAgICAgICBpZiAoICFkb2MgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyAkLlBvaW50KCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRvY0VsZW1lbnQgPSBkb2MuZG9jdW1lbnRFbGVtZW50O1xuXG4gICAgICAgICAgICBpZiAoIHR5cGVvZiBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCAhPT0gdHlwZW9mIHVuZGVmaW5lZCApIHtcbiAgICAgICAgICAgICAgICBib3VuZGluZ1JlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB3aW4gPSAoIGRvYyA9PSBkb2Mud2luZG93ICkgP1xuICAgICAgICAgICAgICAgIGRvYyA6XG4gICAgICAgICAgICAgICAgKCBkb2Mubm9kZVR5cGUgPT09IDkgKSA/XG4gICAgICAgICAgICAgICAgICAgIGRvYy5kZWZhdWx0VmlldyB8fCBkb2MucGFyZW50V2luZG93IDpcbiAgICAgICAgICAgICAgICAgICAgZmFsc2U7XG5cbiAgICAgICAgICAgIHJldHVybiBuZXcgJC5Qb2ludChcbiAgICAgICAgICAgICAgICBib3VuZGluZ1JlY3QubGVmdCArICggd2luLnBhZ2VYT2Zmc2V0IHx8IGRvY0VsZW1lbnQuc2Nyb2xsTGVmdCApIC0gKCBkb2NFbGVtZW50LmNsaWVudExlZnQgfHwgMCApLFxuICAgICAgICAgICAgICAgIGJvdW5kaW5nUmVjdC50b3AgKyAoIHdpbi5wYWdlWU9mZnNldCB8fCBkb2NFbGVtZW50LnNjcm9sbFRvcCApIC0gKCBkb2NFbGVtZW50LmNsaWVudFRvcCB8fCAwIClcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0sXG5cblxuICAgICAgICAvKipcbiAgICAgICAgICogRGV0ZXJtaW5lcyB0aGUgaGVpZ2h0IGFuZCB3aWR0aCBvZiB0aGUgZ2l2ZW4gZWxlbWVudC5cbiAgICAgICAgICogQGZ1bmN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7RWxlbWVudHxTdHJpbmd9IGVsZW1lbnRcbiAgICAgICAgICogQHJldHVybnMge09wZW5TZWFkcmFnb24uUG9pbnR9XG4gICAgICAgICAqL1xuICAgICAgICBnZXRFbGVtZW50U2l6ZTogZnVuY3Rpb24oIGVsZW1lbnQgKSB7XG4gICAgICAgICAgICBlbGVtZW50ID0gJC5nZXRFbGVtZW50KCBlbGVtZW50ICk7XG5cbiAgICAgICAgICAgIHJldHVybiBuZXcgJC5Qb2ludChcbiAgICAgICAgICAgICAgICBlbGVtZW50LmNsaWVudFdpZHRoLFxuICAgICAgICAgICAgICAgIGVsZW1lbnQuY2xpZW50SGVpZ2h0XG4gICAgICAgICAgICApO1xuICAgICAgICB9LFxuXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgdGhlIENTU1N0eWxlIG9iamVjdCBmb3IgdGhlIGdpdmVuIGVsZW1lbnQuXG4gICAgICAgICAqIEBmdW5jdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR8U3RyaW5nfSBlbGVtZW50XG4gICAgICAgICAqIEByZXR1cm5zIHtDU1NTdHlsZX1cbiAgICAgICAgICovXG4gICAgICAgIGdldEVsZW1lbnRTdHlsZTpcbiAgICAgICAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jdXJyZW50U3R5bGUgP1xuICAgICAgICAgICAgZnVuY3Rpb24oIGVsZW1lbnQgKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudCA9ICQuZ2V0RWxlbWVudCggZWxlbWVudCApO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50LmN1cnJlbnRTdHlsZTtcbiAgICAgICAgICAgIH0gOlxuICAgICAgICAgICAgZnVuY3Rpb24oIGVsZW1lbnQgKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudCA9ICQuZ2V0RWxlbWVudCggZWxlbWVudCApO1xuICAgICAgICAgICAgICAgIHJldHVybiB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSggZWxlbWVudCwgXCJcIiApO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyB0aGUgcHJvcGVydHkgd2l0aCB0aGUgY29ycmVjdCB2ZW5kb3IgcHJlZml4IGFwcGVuZGVkLlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gcHJvcGVydHkgdGhlIHByb3BlcnR5IG5hbWVcbiAgICAgICAgICogQHJldHVybnMge1N0cmluZ30gdGhlIHByb3BlcnR5IHdpdGggdGhlIGNvcnJlY3QgcHJlZml4IG9yIG51bGwgaWYgbm90XG4gICAgICAgICAqIHN1cHBvcnRlZC5cbiAgICAgICAgICovXG4gICAgICAgIGdldENzc1Byb3BlcnR5V2l0aFZlbmRvclByZWZpeDogZnVuY3Rpb24ocHJvcGVydHkpIHtcbiAgICAgICAgICAgIHZhciBtZW1vID0ge307XG5cbiAgICAgICAgICAgICQuZ2V0Q3NzUHJvcGVydHlXaXRoVmVuZG9yUHJlZml4ID0gZnVuY3Rpb24ocHJvcGVydHkpIHtcbiAgICAgICAgICAgICAgICBpZiAobWVtb1twcm9wZXJ0eV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWVtb1twcm9wZXJ0eV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpLnN0eWxlO1xuICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBudWxsO1xuICAgICAgICAgICAgICAgIGlmIChzdHlsZVtwcm9wZXJ0eV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBwcm9wZXJ0eTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcHJlZml4ZXMgPSBbJ1dlYmtpdCcsICdNb3onLCAnTVMnLCAnTycsXG4gICAgICAgICAgICAgICAgICAgICAgICAnd2Via2l0JywgJ21veicsICdtcycsICdvJ107XG4gICAgICAgICAgICAgICAgICAgIHZhciBzdWZmaXggPSAkLmNhcGl0YWxpemVGaXJzdExldHRlcihwcm9wZXJ0eSk7XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJlZml4ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwcm9wID0gcHJlZml4ZXNbaV0gKyBzdWZmaXg7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGVbcHJvcF0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHByb3A7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbWVtb1twcm9wZXJ0eV0gPSByZXN1bHQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gJC5nZXRDc3NQcm9wZXJ0eVdpdGhWZW5kb3JQcmVmaXgocHJvcGVydHkpO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDYXBpdGFsaXplcyB0aGUgZmlyc3QgbGV0dGVyIG9mIGEgc3RyaW5nXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdHJpbmdcbiAgICAgICAgICogQHJldHVybnMge1N0cmluZ30gVGhlIHN0cmluZyB3aXRoIHRoZSBmaXJzdCBsZXR0ZXIgY2FwaXRhbGl6ZWRcbiAgICAgICAgICovXG4gICAgICAgIGNhcGl0YWxpemVGaXJzdExldHRlcjogZnVuY3Rpb24oc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgc3RyaW5nLnNsaWNlKDEpO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEZXRlcm1pbmVzIGlmIGEgcG9pbnQgaXMgd2l0aGluIHRoZSBib3VuZGluZyByZWN0YW5nbGUgb2YgdGhlIGdpdmVuIGVsZW1lbnQgKGhpdC10ZXN0KS5cbiAgICAgICAgICogQGZ1bmN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7RWxlbWVudHxTdHJpbmd9IGVsZW1lbnRcbiAgICAgICAgICogQHBhcmFtIHtPcGVuU2VhZHJhZ29uLlBvaW50fSBwb2ludFxuICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAgICAgICAgICovXG4gICAgICAgIHBvaW50SW5FbGVtZW50OiBmdW5jdGlvbiggZWxlbWVudCwgcG9pbnQgKSB7XG4gICAgICAgICAgICBlbGVtZW50ID0gJC5nZXRFbGVtZW50KCBlbGVtZW50ICk7XG4gICAgICAgICAgICB2YXIgb2Zmc2V0ID0gJC5nZXRFbGVtZW50T2Zmc2V0KCBlbGVtZW50ICksXG4gICAgICAgICAgICAgICAgc2l6ZSA9ICQuZ2V0RWxlbWVudFNpemUoIGVsZW1lbnQgKTtcbiAgICAgICAgICAgIHJldHVybiBwb2ludC54ID49IG9mZnNldC54ICYmIHBvaW50LnggPCBvZmZzZXQueCArIHNpemUueCAmJiBwb2ludC55IDwgb2Zmc2V0LnkgKyBzaXplLnkgJiYgcG9pbnQueSA+PSBvZmZzZXQueTtcbiAgICAgICAgfSxcblxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIHRoZSBsYXRlc3QgZXZlbnQsIHJlYWxseSBvbmx5IHVzZWZ1bCBpbnRlcm5hbGx5IHNpbmNlIGl0c1xuICAgICAgICAgKiBzcGVjaWZpYyB0byBJRSBiZWhhdmlvci5cbiAgICAgICAgICogQGZ1bmN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7RXZlbnR9IFtldmVudF1cbiAgICAgICAgICogQHJldHVybnMge0V2ZW50fVxuICAgICAgICAgKiBAZGVwcmVjYXRlZCBGb3IgaW50ZXJuYWwgdXNlIG9ubHlcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICovXG4gICAgICAgIGdldEV2ZW50OiBmdW5jdGlvbiggZXZlbnQgKSB7XG4gICAgICAgICAgICBpZiggZXZlbnQgKXtcbiAgICAgICAgICAgICAgICAkLmdldEV2ZW50ID0gZnVuY3Rpb24oIGV2ZW50ICkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXZlbnQ7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgJC5nZXRFdmVudCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gd2luZG93LmV2ZW50O1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gJC5nZXRFdmVudCggZXZlbnQgKTtcbiAgICAgICAgfSxcblxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIHRoZSBwb3NpdGlvbiBvZiB0aGUgbW91c2Ugb24gdGhlIHNjcmVlbiBmb3IgYSBnaXZlbiBldmVudC5cbiAgICAgICAgICogQGZ1bmN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7RXZlbnR9IFtldmVudF1cbiAgICAgICAgICogQHJldHVybnMge09wZW5TZWFkcmFnb24uUG9pbnR9XG4gICAgICAgICAqL1xuICAgICAgICBnZXRNb3VzZVBvc2l0aW9uOiBmdW5jdGlvbiggZXZlbnQgKSB7XG5cbiAgICAgICAgICAgIGlmICggdHlwZW9mKCBldmVudC5wYWdlWCApID09IFwibnVtYmVyXCIgKSB7XG4gICAgICAgICAgICAgICAgJC5nZXRNb3VzZVBvc2l0aW9uID0gZnVuY3Rpb24oIGV2ZW50ICl7XG4gICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBuZXcgJC5Qb2ludCgpO1xuXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50ID0gJC5nZXRFdmVudCggZXZlbnQgKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnggPSBldmVudC5wYWdlWDtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnkgPSBldmVudC5wYWdlWTtcblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCB0eXBlb2YoIGV2ZW50LmNsaWVudFggKSA9PSBcIm51bWJlclwiICkge1xuICAgICAgICAgICAgICAgICQuZ2V0TW91c2VQb3NpdGlvbiA9IGZ1bmN0aW9uKCBldmVudCApe1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gbmV3ICQuUG9pbnQoKTtcblxuICAgICAgICAgICAgICAgICAgICBldmVudCA9ICQuZ2V0RXZlbnQoIGV2ZW50ICk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC54ID1cbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmNsaWVudFggK1xuICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5zY3JvbGxMZWZ0ICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0O1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQueSA9XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudC5jbGllbnRZICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3A7XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIFwiVW5rbm93biBldmVudCBtb3VzZSBwb3NpdGlvbiwgbm8ga25vd24gdGVjaG5pcXVlLlwiXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuICQuZ2V0TW91c2VQb3NpdGlvbiggZXZlbnQgKTtcbiAgICAgICAgfSxcblxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEZXRlcm1pbmVzIHRoZSBwYWdlJ3MgY3VycmVudCBzY3JvbGwgcG9zaXRpb24uXG4gICAgICAgICAqIEBmdW5jdGlvblxuICAgICAgICAgKiBAcmV0dXJucyB7T3BlblNlYWRyYWdvbi5Qb2ludH1cbiAgICAgICAgICovXG4gICAgICAgIGdldFBhZ2VTY3JvbGw6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdmFyIGRvY0VsZW1lbnQgID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50IHx8IHt9LFxuICAgICAgICAgICAgICAgIGJvZHkgICAgICAgID0gZG9jdW1lbnQuYm9keSB8fCB7fTtcblxuICAgICAgICAgICAgaWYgKCB0eXBlb2YoIHdpbmRvdy5wYWdlWE9mZnNldCApID09IFwibnVtYmVyXCIgKSB7XG4gICAgICAgICAgICAgICAgJC5nZXRQYWdlU2Nyb2xsID0gZnVuY3Rpb24oKXtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyAkLlBvaW50KFxuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnBhZ2VYT2Zmc2V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnBhZ2VZT2Zmc2V0XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIGJvZHkuc2Nyb2xsTGVmdCB8fCBib2R5LnNjcm9sbFRvcCApIHtcbiAgICAgICAgICAgICAgICAkLmdldFBhZ2VTY3JvbGwgPSBmdW5jdGlvbigpe1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3ICQuUG9pbnQoXG4gICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LnNjcm9sbExlZnQsXG4gICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LnNjcm9sbFRvcFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCBkb2NFbGVtZW50LnNjcm9sbExlZnQgfHwgZG9jRWxlbWVudC5zY3JvbGxUb3AgKSB7XG4gICAgICAgICAgICAgICAgJC5nZXRQYWdlU2Nyb2xsID0gZnVuY3Rpb24oKXtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyAkLlBvaW50KFxuICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQsXG4gICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gV2UgY2FuJ3QgcmVhc3NpZ24gdGhlIGZ1bmN0aW9uIHlldCwgYXMgdGhlcmUgd2FzIG5vIHNjcm9sbC5cbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3ICQuUG9pbnQoMCwwKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuICQuZ2V0UGFnZVNjcm9sbCgpO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTZXQgdGhlIHBhZ2Ugc2Nyb2xsIHBvc2l0aW9uLlxuICAgICAgICAgKiBAZnVuY3Rpb25cbiAgICAgICAgICogQHJldHVybnMge09wZW5TZWFkcmFnb24uUG9pbnR9XG4gICAgICAgICAqL1xuICAgICAgICBzZXRQYWdlU2Nyb2xsOiBmdW5jdGlvbiggc2Nyb2xsICkge1xuICAgICAgICAgICAgaWYgKCB0eXBlb2YgKCB3aW5kb3cuc2Nyb2xsVG8gKSAhPT0gXCJ1bmRlZmluZWRcIiApIHtcbiAgICAgICAgICAgICAgICAkLnNldFBhZ2VTY3JvbGwgPSBmdW5jdGlvbiggc2Nyb2xsICkge1xuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuc2Nyb2xsVG8oIHNjcm9sbC54LCBzY3JvbGwueSApO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBvcmlnaW5hbFNjcm9sbCA9ICQuZ2V0UGFnZVNjcm9sbCgpO1xuICAgICAgICAgICAgICAgIGlmICggb3JpZ2luYWxTY3JvbGwueCA9PT0gc2Nyb2xsLnggJiZcbiAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxTY3JvbGwueSA9PT0gc2Nyb2xsLnkgKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBhbHJlYWR5IGNvcnJlY3RseSBwb3NpdGlvbmVkIGFuZCB0aGVyZVxuICAgICAgICAgICAgICAgICAgICAvLyBpcyBubyB3YXkgdG8gZGV0ZWN0IHRoZSBjb3JyZWN0IG1ldGhvZC5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuc2Nyb2xsTGVmdCA9IHNjcm9sbC54O1xuICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wID0gc2Nyb2xsLnk7XG4gICAgICAgICAgICAgICAgdmFyIGN1cnJlbnRTY3JvbGwgPSAkLmdldFBhZ2VTY3JvbGwoKTtcbiAgICAgICAgICAgICAgICBpZiAoIGN1cnJlbnRTY3JvbGwueCAhPT0gb3JpZ2luYWxTY3JvbGwueCAmJlxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50U2Nyb2xsLnkgIT09IG9yaWdpbmFsU2Nyb2xsLnkgKSB7XG4gICAgICAgICAgICAgICAgICAgICQuc2V0UGFnZVNjcm9sbCA9IGZ1bmN0aW9uKCBzY3JvbGwgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LnNjcm9sbExlZnQgPSBzY3JvbGwueDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wID0gc2Nyb2xsLnk7XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdCA9IHNjcm9sbC54O1xuICAgICAgICAgICAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3AgPSBzY3JvbGwueTtcbiAgICAgICAgICAgICAgICBjdXJyZW50U2Nyb2xsID0gJC5nZXRQYWdlU2Nyb2xsKCk7XG4gICAgICAgICAgICAgICAgaWYgKCBjdXJyZW50U2Nyb2xsLnggIT09IG9yaWdpbmFsU2Nyb2xsLnggJiZcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFNjcm9sbC55ICE9PSBvcmlnaW5hbFNjcm9sbC55ICkge1xuICAgICAgICAgICAgICAgICAgICAkLnNldFBhZ2VTY3JvbGwgPSBmdW5jdGlvbiggc2Nyb2xsICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQgPSBzY3JvbGwueDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3AgPSBzY3JvbGwueTtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFdlIGNhbid0IGZpbmQgYW55dGhpbmcgd29ya2luZywgc28gd2UgZG8gbm90aGluZy5cbiAgICAgICAgICAgICAgICAkLnNldFBhZ2VTY3JvbGwgPSBmdW5jdGlvbiggc2Nyb2xsICkge1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiAkLnNldFBhZ2VTY3JvbGwoIHNjcm9sbCApO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEZXRlcm1pbmVzIHRoZSBzaXplIG9mIHRoZSBicm93c2VycyB3aW5kb3cuXG4gICAgICAgICAqIEBmdW5jdGlvblxuICAgICAgICAgKiBAcmV0dXJucyB7T3BlblNlYWRyYWdvbi5Qb2ludH1cbiAgICAgICAgICovXG4gICAgICAgIGdldFdpbmRvd1NpemU6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdmFyIGRvY0VsZW1lbnQgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgfHwge30sXG4gICAgICAgICAgICAgICAgYm9keSAgICA9IGRvY3VtZW50LmJvZHkgfHwge307XG5cbiAgICAgICAgICAgIGlmICggdHlwZW9mKCB3aW5kb3cuaW5uZXJXaWR0aCApID09ICdudW1iZXInICkge1xuICAgICAgICAgICAgICAgICQuZ2V0V2luZG93U2l6ZSA9IGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgJC5Qb2ludChcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5pbm5lcldpZHRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmlubmVySGVpZ2h0XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIGRvY0VsZW1lbnQuY2xpZW50V2lkdGggfHwgZG9jRWxlbWVudC5jbGllbnRIZWlnaHQgKSB7XG4gICAgICAgICAgICAgICAgJC5nZXRXaW5kb3dTaXplID0gZnVuY3Rpb24oKXtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyAkLlBvaW50KFxuICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCBib2R5LmNsaWVudFdpZHRoIHx8IGJvZHkuY2xpZW50SGVpZ2h0ICkge1xuICAgICAgICAgICAgICAgICQuZ2V0V2luZG93U2l6ZSA9IGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgJC5Qb2ludChcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xpZW50V2lkdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsaWVudEhlaWdodFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gd2luZG93IHNpemUsIG5vIGtub3duIHRlY2huaXF1ZS5cIik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiAkLmdldFdpbmRvd1NpemUoKTtcbiAgICAgICAgfSxcblxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBXcmFwcyB0aGUgZ2l2ZW4gZWxlbWVudCBpbiBhIG5lc3Qgb2YgZGl2cyBzbyB0aGF0IHRoZSBlbGVtZW50IGNhblxuICAgICAgICAgKiBiZSBlYXNpbHkgY2VudGVyZWQgdXNpbmcgQ1NTIHRhYmxlc1xuICAgICAgICAgKiBAZnVuY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtFbGVtZW50fFN0cmluZ30gZWxlbWVudFxuICAgICAgICAgKiBAcmV0dXJucyB7RWxlbWVudH0gb3V0ZXJtb3N0IHdyYXBwZXIgZWxlbWVudFxuICAgICAgICAgKi9cbiAgICAgICAgbWFrZUNlbnRlcmVkTm9kZTogZnVuY3Rpb24oIGVsZW1lbnQgKSB7XG4gICAgICAgICAgICAvLyBDb252ZXJ0IGEgcG9zc2libGUgSUQgdG8gYW4gYWN0dWFsIEhUTUxFbGVtZW50XG4gICAgICAgICAgICBlbGVtZW50ID0gJC5nZXRFbGVtZW50KCBlbGVtZW50ICk7XG5cbiAgICAgICAgICAgIC8qXG4gICAgICAgICAgICAgICAgQ1NTIHRhYmxlcyByZXF1aXJlIHlvdSB0byBoYXZlIGEgZGlzcGxheTp0YWJsZS9yb3cvY2VsbCBoaWVyYXJjaHkgc28gd2UgbmVlZCB0byBjcmVhdGVcbiAgICAgICAgICAgICAgICB0aHJlZSBuZXN0ZWQgd3JhcHBlciBkaXZzOlxuICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgIHZhciB3cmFwcGVycyA9IFtcbiAgICAgICAgICAgICAgICAkLm1ha2VOZXV0cmFsRWxlbWVudCggJ2RpdicgKSxcbiAgICAgICAgICAgICAgICAkLm1ha2VOZXV0cmFsRWxlbWVudCggJ2RpdicgKSxcbiAgICAgICAgICAgICAgICAkLm1ha2VOZXV0cmFsRWxlbWVudCggJ2RpdicgKVxuICAgICAgICAgICAgXTtcblxuICAgICAgICAgICAgLy8gSXQgZmVlbHMgbGlrZSB3ZSBzaG91bGQgYmUgYWJsZSB0byBwYXNzIHN0eWxlIGRpY3RzIHRvIG1ha2VOZXV0cmFsRWxlbWVudDpcbiAgICAgICAgICAgICQuZXh0ZW5kKHdyYXBwZXJzWzBdLnN0eWxlLCB7XG4gICAgICAgICAgICAgICAgZGlzcGxheTogXCJ0YWJsZVwiLFxuICAgICAgICAgICAgICAgIGhlaWdodDogXCIxMDAlXCIsXG4gICAgICAgICAgICAgICAgd2lkdGg6IFwiMTAwJVwiXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgJC5leHRlbmQod3JhcHBlcnNbMV0uc3R5bGUsIHtcbiAgICAgICAgICAgICAgICBkaXNwbGF5OiBcInRhYmxlLXJvd1wiXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgJC5leHRlbmQod3JhcHBlcnNbMl0uc3R5bGUsIHtcbiAgICAgICAgICAgICAgICBkaXNwbGF5OiBcInRhYmxlLWNlbGxcIixcbiAgICAgICAgICAgICAgICB2ZXJ0aWNhbEFsaWduOiBcIm1pZGRsZVwiLFxuICAgICAgICAgICAgICAgIHRleHRBbGlnbjogXCJjZW50ZXJcIlxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHdyYXBwZXJzWzBdLmFwcGVuZENoaWxkKHdyYXBwZXJzWzFdKTtcbiAgICAgICAgICAgIHdyYXBwZXJzWzFdLmFwcGVuZENoaWxkKHdyYXBwZXJzWzJdKTtcbiAgICAgICAgICAgIHdyYXBwZXJzWzJdLmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuXG4gICAgICAgICAgICByZXR1cm4gd3JhcHBlcnNbMF07XG4gICAgICAgIH0sXG5cblxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlcyBhbiBlYXNpbHkgcG9zaXRpb25hYmxlIGVsZW1lbnQgb2YgdGhlIGdpdmVuIHR5cGUgdGhhdCB0aGVyZWZvclxuICAgICAgICAgKiBzZXJ2ZXMgYXMgYW4gZXhjZWxsZW50IGNvbnRhaW5lciBlbGVtZW50LlxuICAgICAgICAgKiBAZnVuY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHRhZ05hbWVcbiAgICAgICAgICogQHJldHVybnMge0VsZW1lbnR9XG4gICAgICAgICAqL1xuICAgICAgICBtYWtlTmV1dHJhbEVsZW1lbnQ6IGZ1bmN0aW9uKCB0YWdOYW1lICkge1xuICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCB0YWdOYW1lICksXG4gICAgICAgICAgICAgICAgc3R5bGUgICA9IGVsZW1lbnQuc3R5bGU7XG5cbiAgICAgICAgICAgIHN0eWxlLmJhY2tncm91bmQgPSBcInRyYW5zcGFyZW50IG5vbmVcIjtcbiAgICAgICAgICAgIHN0eWxlLmJvcmRlciAgICAgPSBcIm5vbmVcIjtcbiAgICAgICAgICAgIHN0eWxlLm1hcmdpbiAgICAgPSBcIjBweFwiO1xuICAgICAgICAgICAgc3R5bGUucGFkZGluZyAgICA9IFwiMHB4XCI7XG4gICAgICAgICAgICBzdHlsZS5wb3NpdGlvbiAgID0gXCJzdGF0aWNcIjtcblxuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgICAgIH0sXG5cblxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyB0aGUgY3VycmVudCBtaWxsaXNlY29uZHMsIHVzaW5nIERhdGUubm93KCkgaWYgYXZhaWxhYmxlXG4gICAgICAgICAqIEBmdW5jdGlvblxuICAgICAgICAgKi9cbiAgICAgICAgbm93OiBmdW5jdGlvbiggKSB7XG4gICAgICAgICAgaWYgKERhdGUubm93KSB7XG4gICAgICAgICAgICAkLm5vdyA9IERhdGUubm93O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAkLm5vdyA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gbmV3IERhdGUoKS5nZXRUaW1lKCk7IH07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuICQubm93KCk7XG4gICAgICAgIH0sXG5cblxuICAgICAgICAvKipcbiAgICAgICAgICogRW5zdXJlcyBhbiBpbWFnZSBpcyBsb2FkZWQgY29ycmVjdGx5IHRvIHN1cHBvcnQgYWxwaGEgdHJhbnNwYXJlbmN5LlxuICAgICAgICAgKiBHZW5lcmFsbHkgb25seSBJRSBoYXMgaXNzdWVzIGRvaW5nIHRoaXMgY29ycmVjdGx5IGZvciBmb3JtYXRzIGxpa2VcbiAgICAgICAgICogcG5nLlxuICAgICAgICAgKiBAZnVuY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHNyY1xuICAgICAgICAgKiBAcmV0dXJucyB7RWxlbWVudH1cbiAgICAgICAgICovXG4gICAgICAgIG1ha2VUcmFuc3BhcmVudEltYWdlOiBmdW5jdGlvbiggc3JjICkge1xuXG4gICAgICAgICAgICAkLm1ha2VUcmFuc3BhcmVudEltYWdlID0gZnVuY3Rpb24oIHNyYyApe1xuICAgICAgICAgICAgICAgIHZhciBpbWcgPSAkLm1ha2VOZXV0cmFsRWxlbWVudCggXCJpbWdcIiApO1xuXG4gICAgICAgICAgICAgICAgaW1nLnNyYyA9IHNyYztcblxuICAgICAgICAgICAgICAgIHJldHVybiBpbWc7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBpZiAoICQuQnJvd3Nlci52ZW5kb3IgPT0gJC5CUk9XU0VSUy5JRSAmJiAkLkJyb3dzZXIudmVyc2lvbiA8IDcgKSB7XG5cbiAgICAgICAgICAgICAgICAkLm1ha2VUcmFuc3BhcmVudEltYWdlID0gZnVuY3Rpb24oIHNyYyApe1xuICAgICAgICAgICAgICAgICAgICB2YXIgaW1nICAgICA9ICQubWFrZU5ldXRyYWxFbGVtZW50KCBcImltZ1wiICksXG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50ID0gbnVsbDtcblxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50ID0gJC5tYWtlTmV1dHJhbEVsZW1lbnQoXCJzcGFuXCIpO1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LnN0eWxlLmRpc3BsYXkgPSBcImlubGluZS1ibG9ja1wiO1xuXG4gICAgICAgICAgICAgICAgICAgIGltZy5vbmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUud2lkdGggID0gZWxlbWVudC5zdHlsZS53aWR0aCB8fCBpbWcud2lkdGggKyBcInB4XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LnN0eWxlLmhlaWdodCA9IGVsZW1lbnQuc3R5bGUuaGVpZ2h0IHx8IGltZy5oZWlnaHQgKyBcInB4XCI7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGltZy5vbmxvYWQgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgaW1nID0gbnVsbDsgICAgIC8vIHRvIHByZXZlbnQgbWVtb3J5IGxlYWtzIGluIElFXG4gICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgaW1nLnNyYyA9IHNyYztcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5maWx0ZXIgPVxuICAgICAgICAgICAgICAgICAgICAgICAgXCJwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuQWxwaGFJbWFnZUxvYWRlcihzcmM9J1wiICtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNyYyArXG4gICAgICAgICAgICAgICAgICAgICAgICBcIicsIHNpemluZ01ldGhvZD0nc2NhbGUnKVwiO1xuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuICQubWFrZVRyYW5zcGFyZW50SW1hZ2UoIHNyYyApO1xuICAgICAgICB9LFxuXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNldHMgdGhlIG9wYWNpdHkgb2YgdGhlIHNwZWNpZmllZCBlbGVtZW50LlxuICAgICAgICAgKiBAZnVuY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtFbGVtZW50fFN0cmluZ30gZWxlbWVudFxuICAgICAgICAgKiBAcGFyYW0ge051bWJlcn0gb3BhY2l0eVxuICAgICAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IFt1c2VzQWxwaGFdXG4gICAgICAgICAqL1xuICAgICAgICBzZXRFbGVtZW50T3BhY2l0eTogZnVuY3Rpb24oIGVsZW1lbnQsIG9wYWNpdHksIHVzZXNBbHBoYSApIHtcblxuICAgICAgICAgICAgdmFyIGllT3BhY2l0eSxcbiAgICAgICAgICAgICAgICBpZUZpbHRlcjtcblxuICAgICAgICAgICAgZWxlbWVudCA9ICQuZ2V0RWxlbWVudCggZWxlbWVudCApO1xuXG4gICAgICAgICAgICBpZiAoIHVzZXNBbHBoYSAmJiAhJC5Ccm93c2VyLmFscGhhICkge1xuICAgICAgICAgICAgICAgIG9wYWNpdHkgPSBNYXRoLnJvdW5kKCBvcGFjaXR5ICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICggJC5Ccm93c2VyLm9wYWNpdHkgKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gb3BhY2l0eSA8IDEgPyBvcGFjaXR5IDogXCJcIjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKCBvcGFjaXR5IDwgMSApIHtcbiAgICAgICAgICAgICAgICAgICAgaWVPcGFjaXR5ID0gTWF0aC5yb3VuZCggMTAwICogb3BhY2l0eSApO1xuICAgICAgICAgICAgICAgICAgICBpZUZpbHRlciAgPSBcImFscGhhKG9wYWNpdHk9XCIgKyBpZU9wYWNpdHkgKyBcIilcIjtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5maWx0ZXIgPSBpZUZpbHRlcjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LnN0eWxlLmZpbHRlciA9IFwiXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNldHMgdGhlIHNwZWNpZmllZCBlbGVtZW50J3MgdG91Y2gtYWN0aW9uIHN0eWxlIGF0dHJpYnV0ZSB0byAnbm9uZScuXG4gICAgICAgICAqIEBmdW5jdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR8U3RyaW5nfSBlbGVtZW50XG4gICAgICAgICAqL1xuICAgICAgICBzZXRFbGVtZW50VG91Y2hBY3Rpb25Ob25lOiBmdW5jdGlvbiggZWxlbWVudCApIHtcbiAgICAgICAgICAgIGVsZW1lbnQgPSAkLmdldEVsZW1lbnQoIGVsZW1lbnQgKTtcbiAgICAgICAgICAgIGlmICggdHlwZW9mIGVsZW1lbnQuc3R5bGUudG91Y2hBY3Rpb24gIT09ICd1bmRlZmluZWQnICkge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUudG91Y2hBY3Rpb24gPSAnbm9uZSc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCB0eXBlb2YgZWxlbWVudC5zdHlsZS5tc1RvdWNoQWN0aW9uICE9PSAndW5kZWZpbmVkJyApIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LnN0eWxlLm1zVG91Y2hBY3Rpb24gPSAnbm9uZSc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cblxuICAgICAgICAvKipcbiAgICAgICAgICogQWRkIHRoZSBzcGVjaWZpZWQgQ1NTIGNsYXNzIHRvIHRoZSBlbGVtZW50IGlmIG5vdCBwcmVzZW50LlxuICAgICAgICAgKiBAZnVuY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtFbGVtZW50fFN0cmluZ30gZWxlbWVudFxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gY2xhc3NOYW1lXG4gICAgICAgICAqL1xuICAgICAgICBhZGRDbGFzczogZnVuY3Rpb24oIGVsZW1lbnQsIGNsYXNzTmFtZSApIHtcbiAgICAgICAgICAgIGVsZW1lbnQgPSAkLmdldEVsZW1lbnQoIGVsZW1lbnQgKTtcblxuICAgICAgICAgICAgaWYgKCAhIGVsZW1lbnQuY2xhc3NOYW1lICkge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQuY2xhc3NOYW1lID0gY2xhc3NOYW1lO1xuICAgICAgICAgICAgfSBlbHNlIGlmICggKCAnICcgKyBlbGVtZW50LmNsYXNzTmFtZSArICcgJyApLlxuICAgICAgICAgICAgICAgIGluZGV4T2YoICcgJyArIGNsYXNzTmFtZSArICcgJyApID09PSAtMSApIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LmNsYXNzTmFtZSArPSAnICcgKyBjbGFzc05hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZpbmQgdGhlIGZpcnN0IGluZGV4IGF0IHdoaWNoIGFuIGVsZW1lbnQgaXMgZm91bmQgaW4gYW4gYXJyYXkgb3IgLTFcbiAgICAgICAgICogaWYgbm90IHByZXNlbnQuXG4gICAgICAgICAqXG4gICAgICAgICAqIENvZGUgdGFrZW4gYW5kIGFkYXB0ZWQgZnJvbVxuICAgICAgICAgKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9pbmRleE9mI0NvbXBhdGliaWxpdHlcbiAgICAgICAgICpcbiAgICAgICAgICogQGZ1bmN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSBmcm9tIHdoaWNoIHRvIGZpbmQgdGhlIGVsZW1lbnRcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHNlYXJjaEVsZW1lbnQgVGhlIGVsZW1lbnQgdG8gZmluZFxuICAgICAgICAgKiBAcGFyYW0ge051bWJlcn0gW2Zyb21JbmRleD0wXSBJbmRleCB0byBzdGFydCByZXNlYXJjaC5cbiAgICAgICAgICogQHJldHVybnMge051bWJlcn0gVGhlIGluZGV4IG9mIHRoZSBlbGVtZW50IGluIHRoZSBhcnJheS5cbiAgICAgICAgICovXG4gICAgICAgIGluZGV4T2Y6IGZ1bmN0aW9uKCBhcnJheSwgc2VhcmNoRWxlbWVudCwgZnJvbUluZGV4ICkge1xuICAgICAgICAgICAgaWYgKCBBcnJheS5wcm90b3R5cGUuaW5kZXhPZiApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmluZGV4T2YgPSBmdW5jdGlvbiggYXJyYXksIHNlYXJjaEVsZW1lbnQsIGZyb21JbmRleCApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFycmF5LmluZGV4T2YoIHNlYXJjaEVsZW1lbnQsIGZyb21JbmRleCApO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5kZXhPZiA9IGZ1bmN0aW9uKCBhcnJheSwgc2VhcmNoRWxlbWVudCwgZnJvbUluZGV4ICkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgaSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBpdm90ID0gKCBmcm9tSW5kZXggKSA/IGZyb21JbmRleCA6IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIGlmICggIWFycmF5ICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvciggKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCBsZW5ndGggPT09IDAgfHwgcGl2b3QgPj0gbGVuZ3RoICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCBwaXZvdCA8IDAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwaXZvdCA9IGxlbmd0aCAtIE1hdGguYWJzKCBwaXZvdCApO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgZm9yICggaSA9IHBpdm90OyBpIDwgbGVuZ3RoOyBpKysgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGFycmF5W2ldID09PSBzZWFyY2hFbGVtZW50ICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW5kZXhPZiggYXJyYXksIHNlYXJjaEVsZW1lbnQsIGZyb21JbmRleCApO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBDU1MgY2xhc3MgZnJvbSB0aGUgZWxlbWVudC5cbiAgICAgICAgICogQGZ1bmN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7RWxlbWVudHxTdHJpbmd9IGVsZW1lbnRcbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGNsYXNzTmFtZVxuICAgICAgICAgKi9cbiAgICAgICAgcmVtb3ZlQ2xhc3M6IGZ1bmN0aW9uKCBlbGVtZW50LCBjbGFzc05hbWUgKSB7XG4gICAgICAgICAgICB2YXIgb2xkQ2xhc3NlcyxcbiAgICAgICAgICAgICAgICBuZXdDbGFzc2VzID0gW10sXG4gICAgICAgICAgICAgICAgaTtcblxuICAgICAgICAgICAgZWxlbWVudCA9ICQuZ2V0RWxlbWVudCggZWxlbWVudCApO1xuICAgICAgICAgICAgb2xkQ2xhc3NlcyA9IGVsZW1lbnQuY2xhc3NOYW1lLnNwbGl0KCAvXFxzKy8gKTtcbiAgICAgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgb2xkQ2xhc3Nlcy5sZW5ndGg7IGkrKyApIHtcbiAgICAgICAgICAgICAgICBpZiAoIG9sZENsYXNzZXNbIGkgXSAmJiBvbGRDbGFzc2VzWyBpIF0gIT09IGNsYXNzTmFtZSApIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3Q2xhc3Nlcy5wdXNoKCBvbGRDbGFzc2VzWyBpIF0gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbGVtZW50LmNsYXNzTmFtZSA9IG5ld0NsYXNzZXMuam9pbignICcpO1xuICAgICAgICB9LFxuXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFkZHMgYW4gZXZlbnQgbGlzdGVuZXIgZm9yIHRoZSBnaXZlbiBlbGVtZW50LCBldmVudE5hbWUgYW5kIGhhbmRsZXIuXG4gICAgICAgICAqIEBmdW5jdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR8U3RyaW5nfSBlbGVtZW50XG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBldmVudE5hbWVcbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaGFuZGxlclxuICAgICAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IFt1c2VDYXB0dXJlXVxuICAgICAgICAgKi9cbiAgICAgICAgYWRkRXZlbnQ6IChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyICkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoIGVsZW1lbnQsIGV2ZW50TmFtZSwgaGFuZGxlciwgdXNlQ2FwdHVyZSApIHtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudCA9ICQuZ2V0RWxlbWVudCggZWxlbWVudCApO1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoIGV2ZW50TmFtZSwgaGFuZGxlciwgdXNlQ2FwdHVyZSApO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCB3aW5kb3cuYXR0YWNoRXZlbnQgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICggZWxlbWVudCwgZXZlbnROYW1lLCBoYW5kbGVyLCB1c2VDYXB0dXJlICkge1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50ID0gJC5nZXRFbGVtZW50KCBlbGVtZW50ICk7XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuYXR0YWNoRXZlbnQoICdvbicgKyBldmVudE5hbWUsIGhhbmRsZXIgKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIFwiTm8ga25vd24gZXZlbnQgbW9kZWwuXCIgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSgpKSxcblxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZW1vdmUgYSBnaXZlbiBldmVudCBsaXN0ZW5lciBmb3IgdGhlIGdpdmVuIGVsZW1lbnQsIGV2ZW50IHR5cGUgYW5kXG4gICAgICAgICAqIGhhbmRsZXIuXG4gICAgICAgICAqIEBmdW5jdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR8U3RyaW5nfSBlbGVtZW50XG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBldmVudE5hbWVcbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaGFuZGxlclxuICAgICAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IFt1c2VDYXB0dXJlXVxuICAgICAgICAgKi9cbiAgICAgICAgcmVtb3ZlRXZlbnQ6IChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyICkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoIGVsZW1lbnQsIGV2ZW50TmFtZSwgaGFuZGxlciwgdXNlQ2FwdHVyZSApIHtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudCA9ICQuZ2V0RWxlbWVudCggZWxlbWVudCApO1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIGV2ZW50TmFtZSwgaGFuZGxlciwgdXNlQ2FwdHVyZSApO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCB3aW5kb3cuZGV0YWNoRXZlbnQgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCBlbGVtZW50LCBldmVudE5hbWUsIGhhbmRsZXIsIHVzZUNhcHR1cmUgKSB7XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgPSAkLmdldEVsZW1lbnQoIGVsZW1lbnQgKTtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5kZXRhY2hFdmVudCggJ29uJyArIGV2ZW50TmFtZSwgaGFuZGxlciApO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvciggXCJObyBrbm93biBldmVudCBtb2RlbC5cIiApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KCkpLFxuXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIENhbmNlbHMgdGhlIGRlZmF1bHQgYnJvd3NlciBiZWhhdmlvciBoYWQgdGhlIGV2ZW50IHByb3BhZ2F0ZWQgYWxsXG4gICAgICAgICAqIHRoZSB3YXkgdXAgdGhlIERPTSB0byB0aGUgd2luZG93IG9iamVjdC5cbiAgICAgICAgICogQGZ1bmN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7RXZlbnR9IFtldmVudF1cbiAgICAgICAgICovXG4gICAgICAgIGNhbmNlbEV2ZW50OiBmdW5jdGlvbiggZXZlbnQgKSB7XG4gICAgICAgICAgICBldmVudCA9ICQuZ2V0RXZlbnQoIGV2ZW50ICk7XG5cbiAgICAgICAgICAgIGlmICggZXZlbnQucHJldmVudERlZmF1bHQgKSB7XG4gICAgICAgICAgICAgICAgJC5jYW5jZWxFdmVudCA9IGZ1bmN0aW9uKCBldmVudCApe1xuICAgICAgICAgICAgICAgICAgICAvLyBXM0MgZm9yIHByZXZlbnRpbmcgZGVmYXVsdFxuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICQuY2FuY2VsRXZlbnQgPSBmdW5jdGlvbiggZXZlbnQgKXtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQgPSAkLmdldEV2ZW50KCBldmVudCApO1xuICAgICAgICAgICAgICAgICAgICAvLyBsZWdhY3kgZm9yIHByZXZlbnRpbmcgZGVmYXVsdFxuICAgICAgICAgICAgICAgICAgICBldmVudC5jYW5jZWwgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAvLyBJRSBmb3IgcHJldmVudGluZyBkZWZhdWx0XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnJldHVyblZhbHVlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICQuY2FuY2VsRXZlbnQoIGV2ZW50ICk7XG4gICAgICAgIH0sXG5cblxuICAgICAgICAvKipcbiAgICAgICAgICogU3RvcHMgdGhlIHByb3BhZ2F0aW9uIG9mIHRoZSBldmVudCB1cCB0aGUgRE9NLlxuICAgICAgICAgKiBAZnVuY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtFdmVudH0gW2V2ZW50XVxuICAgICAgICAgKi9cbiAgICAgICAgc3RvcEV2ZW50OiBmdW5jdGlvbiggZXZlbnQgKSB7XG4gICAgICAgICAgICBldmVudCA9ICQuZ2V0RXZlbnQoIGV2ZW50ICk7XG5cbiAgICAgICAgICAgIGlmICggZXZlbnQuc3RvcFByb3BhZ2F0aW9uICkge1xuICAgICAgICAgICAgICAgIC8vIFczQyBmb3Igc3RvcHBpbmcgcHJvcGFnYXRpb25cbiAgICAgICAgICAgICAgICAkLnN0b3BFdmVudCA9IGZ1bmN0aW9uKCBldmVudCApe1xuICAgICAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBJRSBmb3Igc3RvcHBpbmcgcHJvcGFnYXRpb25cbiAgICAgICAgICAgICAgICAkLnN0b3BFdmVudCA9IGZ1bmN0aW9uKCBldmVudCApe1xuICAgICAgICAgICAgICAgICAgICBldmVudCA9ICQuZ2V0RXZlbnQoIGV2ZW50ICk7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LmNhbmNlbEJ1YmJsZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAkLnN0b3BFdmVudCggZXZlbnQgKTtcbiAgICAgICAgfSxcblxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTaW1pbGFyIHRvIE9wZW5TZWFkcmFnb24uZGVsZWdhdGUsIGJ1dCBpdCBkb2VzIG5vdCBpbW1lZGlhdGVseSBjYWxsXG4gICAgICAgICAqIHRoZSBtZXRob2Qgb24gdGhlIG9iamVjdCwgcmV0dXJuaW5nIGEgZnVuY3Rpb24gd2hpY2ggY2FuIGJlIGNhbGxlZFxuICAgICAgICAgKiByZXBlYXRlZGx5IHRvIGRlbGVnYXRlIHRoZSBtZXRob2QuIEl0IGFsc28gYWxsb3dzIGFkZGl0b25hbCBhcmd1bWVudHNcbiAgICAgICAgICogdG8gYmUgcGFzc2VkIGR1cmluZyBjb25zdHJ1Y3Rpb24gd2hpY2ggd2lsbCBiZSBhZGRlZCBkdXJpbmcgZWFjaFxuICAgICAgICAgKiBpbnZvY2F0aW9uLCBhbmQgZWFjaCBpbnZvY2F0aW9uIGNhbiBhZGQgYWRkaXRpb25hbCBhcmd1bWVudHMgYXMgd2VsbC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGZ1bmN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3RcbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gbWV0aG9kXG4gICAgICAgICAqIEBwYXJhbSBbYXJnc10gYW55IGFkZGl0aW9uYWwgYXJndW1lbnRzIGFyZSBwYXNzZWQgYXMgYXJndW1lbnRzIHRvIHRoZVxuICAgICAgICAgKiAgY3JlYXRlZCBjYWxsYmFja1xuICAgICAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259XG4gICAgICAgICAqL1xuICAgICAgICBjcmVhdGVDYWxsYmFjazogZnVuY3Rpb24oIG9iamVjdCwgbWV0aG9kICkge1xuICAgICAgICAgICAgLy9UT0RPOiBUaGlzIHBhdHRlcm4gaXMgcGFpbmZ1bCB0byB1c2UgYW5kIGRlYnVnLiAgSXQncyBtdWNoIGNsZWFuZXJcbiAgICAgICAgICAgIC8vICAgICAgdG8gdXNlIHBpbm5pbmcgcGx1cyBhbm9ueW1vdXMgZnVuY3Rpb25zLiAgR2V0IHJpZCBvZiB0aGlzXG4gICAgICAgICAgICAvLyAgICAgIHBhdHRlcm4hXG4gICAgICAgICAgICB2YXIgaW5pdGlhbEFyZ3MgPSBbXSxcbiAgICAgICAgICAgICAgICBpO1xuICAgICAgICAgICAgZm9yICggaSA9IDI7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKysgKSB7XG4gICAgICAgICAgICAgICAgaW5pdGlhbEFyZ3MucHVzaCggYXJndW1lbnRzWyBpIF0gKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHZhciBhcmdzID0gaW5pdGlhbEFyZ3MuY29uY2F0KCBbXSApLFxuICAgICAgICAgICAgICAgICAgICBpO1xuICAgICAgICAgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrICkge1xuICAgICAgICAgICAgICAgICAgICBhcmdzLnB1c2goIGFyZ3VtZW50c1sgaSBdICk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIG1ldGhvZC5hcHBseSggb2JqZWN0LCBhcmdzICk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJlaXZlcyB0aGUgdmFsdWUgb2YgYSB1cmwgcGFyYW1ldGVyIGZyb20gdGhlIHdpbmRvdy5sb2NhdGlvbiBzdHJpbmcuXG4gICAgICAgICAqIEBmdW5jdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30ga2V5XG4gICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IFRoZSB2YWx1ZSBvZiB0aGUgdXJsIHBhcmFtZXRlciBvciBudWxsIGlmIG5vIHBhcmFtIG1hdGNoZXMuXG4gICAgICAgICAqL1xuICAgICAgICBnZXRVcmxQYXJhbWV0ZXI6IGZ1bmN0aW9uKCBrZXkgKSB7XG4gICAgICAgICAgICB2YXIgdmFsdWUgPSBVUkxQQVJBTVNbIGtleSBdO1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlID8gdmFsdWUgOiBudWxsO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZXMgdGhlIHByb3RvY29sIHVzZWQgYnkgdGhlIHVybC4gVGhlIHVybCBjYW4gZWl0aGVyIGJlIGFic29sdXRlXG4gICAgICAgICAqIG9yIHJlbGF0aXZlLlxuICAgICAgICAgKiBAZnVuY3Rpb25cbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHVybCBUaGUgdXJsIHRvIHJldHJpZXZlIHRoZSBwcm90b2NvbCBmcm9tLlxuICAgICAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IFRoZSBwcm90b2NvbCAoaHR0cDosIGh0dHBzOiwgZmlsZTosIGZ0cDogLi4uKVxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0VXJsUHJvdG9jb2w6IGZ1bmN0aW9uKCB1cmwgKSB7XG4gICAgICAgICAgICB2YXIgbWF0Y2ggPSB1cmwubWF0Y2goL14oW2Etel0rOilcXC9cXC8vaSk7XG4gICAgICAgICAgICBpZiAoIG1hdGNoID09PSBudWxsICkge1xuICAgICAgICAgICAgICAgIC8vIFJlbGF0aXZlIFVSTCwgcmV0cml2ZSB0aGUgcHJvdG9jb2wgZnJvbSB3aW5kb3cubG9jYXRpb25cbiAgICAgICAgICAgICAgICByZXR1cm4gd2luZG93LmxvY2F0aW9uLnByb3RvY29sO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG1hdGNoWzFdLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZSBhbiBYSFIgb2JqZWN0XG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEBwYXJhbSB7dHlwZX0gW2xvY2FsXSBJZiBzZXQgdG8gdHJ1ZSwgdGhlIFhIUiB3aWxsIGJlIGZpbGU6IHByb3RvY29sXG4gICAgICAgICAqIGNvbXBhdGlibGUgaWYgcG9zc2libGUgKGJ1dCBtYXkgcmFpc2UgYSB3YXJuaW5nIGluIHRoZSBicm93c2VyKS5cbiAgICAgICAgICogQHJldHVybnMge1hNTEh0dHBSZXF1ZXN0fVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlYXRlQWpheFJlcXVlc3Q6IGZ1bmN0aW9uKCBsb2NhbCApIHtcbiAgICAgICAgICAgIC8vIElFMTEgZG9lcyBub3Qgc3VwcG9ydCB3aW5kb3cuQWN0aXZlWE9iamVjdCBzbyB3ZSBqdXN0IHRyeSB0b1xuICAgICAgICAgICAgLy8gY3JlYXRlIG9uZSB0byBzZWUgaWYgaXQgaXMgc3VwcG9ydGVkLlxuICAgICAgICAgICAgLy8gU2VlOiBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvaWUvZG40MjM5NDglMjh2PXZzLjg1JTI5LmFzcHhcbiAgICAgICAgICAgIHZhciBzdXBwb3J0QWN0aXZlWDtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgLyogZ2xvYmFsIEFjdGl2ZVhPYmplY3Q6dHJ1ZSAqL1xuICAgICAgICAgICAgICAgIHN1cHBvcnRBY3RpdmVYID0gISFuZXcgQWN0aXZlWE9iamVjdCggXCJNaWNyb3NvZnQuWE1MSFRUUFwiICk7XG4gICAgICAgICAgICB9IGNhdGNoKCBlICkge1xuICAgICAgICAgICAgICAgIHN1cHBvcnRBY3RpdmVYID0gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICggc3VwcG9ydEFjdGl2ZVggKSB7XG4gICAgICAgICAgICAgICAgaWYgKCB3aW5kb3cuWE1MSHR0cFJlcXVlc3QgKSB7XG4gICAgICAgICAgICAgICAgICAgICQuY3JlYXRlQWpheFJlcXVlc3QgPSBmdW5jdGlvbiggbG9jYWwgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGxvY2FsICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQWN0aXZlWE9iamVjdCggXCJNaWNyb3NvZnQuWE1MSFRUUFwiICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgJC5jcmVhdGVBamF4UmVxdWVzdCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBY3RpdmVYT2JqZWN0KCBcIk1pY3Jvc29mdC5YTUxIVFRQXCIgKTtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCB3aW5kb3cuWE1MSHR0cFJlcXVlc3QgKSB7XG4gICAgICAgICAgICAgICAgJC5jcmVhdGVBamF4UmVxdWVzdCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCBcIkJyb3dzZXIgZG9lc24ndCBzdXBwb3J0IFhNTEh0dHBSZXF1ZXN0LlwiICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gJC5jcmVhdGVBamF4UmVxdWVzdCggbG9jYWwgKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogTWFrZXMgYW4gQUpBWCByZXF1ZXN0LlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gb3B0aW9ucy51cmwgLSB0aGUgdXJsIHRvIHJlcXVlc3RcbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb3B0aW9ucy5zdWNjZXNzIC0gYSBmdW5jdGlvbiB0byBjYWxsIG9uIGEgc3VjY2Vzc2Z1bCByZXNwb25zZVxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvcHRpb25zLmVycm9yIC0gYSBmdW5jdGlvbiB0byBjYWxsIG9uIHdoZW4gYW4gZXJyb3Igb2NjdXJzXG4gICAgICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMud2l0aENyZWRlbnRpYWxzPWZhbHNlXSAtIHdoZXRoZXIgdG8gc2V0IHRoZSBYSFIncyB3aXRoQ3JlZGVudGlhbHNcbiAgICAgICAgICogQHRocm93cyB7RXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBtYWtlQWpheFJlcXVlc3Q6IGZ1bmN0aW9uKCB1cmwsIG9uU3VjY2Vzcywgb25FcnJvciApIHtcbiAgICAgICAgICAgIHZhciB3aXRoQ3JlZGVudGlhbHM7XG5cbiAgICAgICAgICAgIC8vIE5vdGUgdGhhdCBvdXIgcHJlZmVycmVkIEFQSSBpcyB0aGF0IHlvdSBwYXNzIGluIGEgc2luZ2xlIG9iamVjdDsgdGhlIG5hbWVkXG4gICAgICAgICAgICAvLyBhcmd1bWVudHMgYXJlIGZvciBsZWdhY3kgc3VwcG9ydC5cbiAgICAgICAgICAgIGlmKCAkLmlzUGxhaW5PYmplY3QoIHVybCApICl7XG4gICAgICAgICAgICAgICAgb25TdWNjZXNzID0gdXJsLnN1Y2Nlc3M7XG4gICAgICAgICAgICAgICAgb25FcnJvciA9IHVybC5lcnJvcjtcbiAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHMgPSB1cmwud2l0aENyZWRlbnRpYWxzO1xuICAgICAgICAgICAgICAgIHVybCA9IHVybC51cmw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBwcm90b2NvbCA9ICQuZ2V0VXJsUHJvdG9jb2woIHVybCApO1xuICAgICAgICAgICAgdmFyIHJlcXVlc3QgPSAkLmNyZWF0ZUFqYXhSZXF1ZXN0KCBwcm90b2NvbCA9PT0gXCJmaWxlOlwiICk7XG5cbiAgICAgICAgICAgIGlmICggISQuaXNGdW5jdGlvbiggb25TdWNjZXNzICkgKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCBcIm1ha2VBamF4UmVxdWVzdCByZXF1aXJlcyBhIHN1Y2Nlc3MgY2FsbGJhY2tcIiApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXF1ZXN0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIC8vIDQgPSBET05FIChodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvWE1MSHR0cFJlcXVlc3QjUHJvcGVydGllcylcbiAgICAgICAgICAgICAgICBpZiAoIHJlcXVlc3QucmVhZHlTdGF0ZSA9PSA0ICkge1xuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKCl7fTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBXaXRoIHByb3RvY29scyBvdGhlciB0aGFuIGh0dHAvaHR0cHMsIHRoZSBzdGF0dXMgaXMgMjAwXG4gICAgICAgICAgICAgICAgICAgIC8vIG9uIEZpcmVmb3ggYW5kIDAgb24gb3RoZXIgYnJvd3NlcnNcbiAgICAgICAgICAgICAgICAgICAgaWYgKCByZXF1ZXN0LnN0YXR1cyA9PT0gMjAwIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAoIHJlcXVlc3Quc3RhdHVzID09PSAwICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvY29sICE9PSBcImh0dHA6XCIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2wgIT09IFwiaHR0cHM6XCIgKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgb25TdWNjZXNzKCByZXF1ZXN0ICk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAkLmNvbnNvbGUubG9nKCBcIkFKQVggcmVxdWVzdCByZXR1cm5lZCAlZDogJXNcIiwgcmVxdWVzdC5zdGF0dXMsIHVybCApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoICQuaXNGdW5jdGlvbiggb25FcnJvciApICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uRXJyb3IoIHJlcXVlc3QgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGlmICh3aXRoQ3JlZGVudGlhbHMpIHtcbiAgICAgICAgICAgICAgICByZXF1ZXN0LndpdGhDcmVkZW50aWFscyA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmVxdWVzdC5vcGVuKCBcIkdFVFwiLCB1cmwsIHRydWUgKTtcbiAgICAgICAgICAgICAgICByZXF1ZXN0LnNlbmQoIG51bGwgKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICB2YXIgbXNnID0gZS5tZXNzYWdlO1xuXG4gICAgICAgICAgICAgICAgLypcbiAgICAgICAgICAgICAgICAgICAgSUUgPCAxMCBkb2VzIG5vdCBzdXBwb3J0IENPUlMgYW5kIGFuIFhIUiByZXF1ZXN0IHRvIGEgZGlmZmVyZW50IG9yaWdpbiB3aWxsIGZhaWwgYXMgc29vblxuICAgICAgICAgICAgICAgICAgICBhcyBzZW5kKCkgaXMgY2FsbGVkLiBUaGlzIGlzIHBhcnRpY3VsYXJseSBlYXN5IHRvIG1pc3MgZHVyaW5nIGRldmVsb3BtZW50IGFuZCBhcHBlYXIgaW5cbiAgICAgICAgICAgICAgICAgICAgcHJvZHVjdGlvbiBpZiB5b3UgdXNlIGEgQ0ROIG9yIGRvbWFpbiBzaGFyZGluZyBhbmQgdGhlIHNlY3VyaXR5IHBvbGljeSBpcyBsaWtlbHkgdG8gYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uIGhhbmRsZXJzIHNpbmNlIGFueSBhdHRlbXB0IHRvIGFjY2VzcyBhIHByb3BlcnR5IG9mIHRoZSByZXF1ZXN0IG9iamVjdCB3aWxsXG4gICAgICAgICAgICAgICAgICAgIHJhaXNlIGFuIGFjY2VzcyBkZW5pZWQgVHlwZUVycm9yIGluc2lkZSB0aGUgY2F0Y2ggYmxvY2suXG5cbiAgICAgICAgICAgICAgICAgICAgVG8gYmUgZnJpZW5kbGllciwgd2UnbGwgY2hlY2sgZm9yIHRoaXMgc3BlY2lmaWMgZXJyb3IgYW5kIGFkZCBhIGRvY3VtZW50YXRpb24gcG9pbnRlclxuICAgICAgICAgICAgICAgICAgICB0byBwb2ludCBkZXZlbG9wZXJzIGluIHRoZSByaWdodCBkaXJlY3Rpb24uIFdlIHRlc3QgdGhlIGV4Y2VwdGlvbiBudW1iZXIgYmVjYXVzZSBJRSdzXG4gICAgICAgICAgICAgICAgICAgIGVycm9yIG1lc3NhZ2VzIGFyZSBsb2NhbGl6ZWQuXG4gICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICB2YXIgb2xkSUUgPSAkLkJyb3dzZXIudmVuZG9yID09ICQuQlJPV1NFUlMuSUUgJiYgJC5Ccm93c2VyLnZlcnNpb24gPCAxMDtcbiAgICAgICAgICAgICAgICBpZiAoIG9sZElFICYmIHR5cGVvZiggZS5udW1iZXIgKSAhPSBcInVuZGVmaW5lZFwiICYmIGUubnVtYmVyID09IC0yMTQ3MDI0ODkxICkge1xuICAgICAgICAgICAgICAgICAgICBtc2cgKz0gXCJcXG5TZWUgaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zNTM3NTA1KHY9dnMuODUpLmFzcHgjeGRvbWFpblwiO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICQuY29uc29sZS5sb2coIFwiJXMgd2hpbGUgbWFraW5nIEFKQVggcmVxdWVzdDogJXNcIiwgZS5uYW1lLCBtc2cgKTtcblxuICAgICAgICAgICAgICAgIHJlcXVlc3Qub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKXt9O1xuXG4gICAgICAgICAgICAgICAgaWYgKHdpbmRvdy5YRG9tYWluUmVxdWVzdCkgeyAvLyBJRTkgb3IgSUU4IG1pZ2h0IGFzIHdlbGwgdHJ5IHRvIHVzZSBYRG9tYWluUmVxdWVzdFxuICAgICAgICAgICAgICAgICAgICB2YXIgeGRyID0gbmV3IFhEb21haW5SZXF1ZXN0KCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh4ZHIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHhkci5vbmxvYWQgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJC5pc0Z1bmN0aW9uKCBvblN1Y2Nlc3MgKSApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25TdWNjZXNzKHsgLy8gRmFraW5nIGFuIHhociBvYmplY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlVGV4dDogeGRyLnJlc3BvbnNlVGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czogMjAwLCAvLyBYRG9tYWluUmVxdWVzdCBkb2Vzbid0IHN1cHBvcnQgc3RhdHVzIGNvZGVzLCBzbyB3ZSBqdXN0IGZha2Ugb25lISA6L1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzVGV4dDogJ09LJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgeGRyLm9uZXJyb3IgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJC5pc0Z1bmN0aW9uICggb25FcnJvciApICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkVycm9yKHsgLy8gRmFraW5nIGFuIHhociBvYmplY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlVGV4dDogeGRyLnJlc3BvbnNlVGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czogNDQ0LCAvLyA0NDQgTm8gUmVzcG9uc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c1RleHQ6ICdBbiBlcnJvciBoYXBwZW5lZC4gRHVlIHRvIGFuIFhEb21haW5SZXF1ZXN0IGRlZmljaWVuY3kgd2UgY2FuIG5vdCBleHRyYWN0IGFueSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGVycm9yLiBVcGdyYWRlIHlvdXIgYnJvd3Nlci4nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhkci5vcGVuKCdHRVQnLCB1cmwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhkci5zZW5kKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJC5pc0Z1bmN0aW9uKCBvbkVycm9yICkgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uRXJyb3IoIHJlcXVlc3QsIGUgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAoICQuaXNGdW5jdGlvbiggb25FcnJvciApICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgb25FcnJvciggcmVxdWVzdCwgZSApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUYWtlbiBmcm9tIGpRdWVyeSAxLjYuMVxuICAgICAgICAgKiBAZnVuY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IG9wdGlvbnMudXJsXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9wdGlvbnMuY2FsbGJhY2tcbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLnBhcmFtPSdjYWxsYmFjayddIFRoZSBuYW1lIG9mIHRoZSB1cmwgcGFyYW1ldGVyXG4gICAgICAgICAqICAgICAgdG8gcmVxdWVzdCB0aGUganNvbnAgcHJvdmlkZXIgd2l0aC5cbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmNhbGxiYWNrTmFtZT1dIFRoZSBuYW1lIG9mIHRoZSBjYWxsYmFjayB0b1xuICAgICAgICAgKiAgICAgIHJlcXVlc3QgdGhlIGpzb25wIHByb3ZpZGVyIHdpdGguXG4gICAgICAgICAqL1xuICAgICAgICBqc29ucDogZnVuY3Rpb24oIG9wdGlvbnMgKXtcbiAgICAgICAgICAgIHZhciBzY3JpcHQsXG4gICAgICAgICAgICAgICAgdXJsICAgICA9IG9wdGlvbnMudXJsLFxuICAgICAgICAgICAgICAgIGhlYWQgICAgPSBkb2N1bWVudC5oZWFkIHx8XG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCBcImhlYWRcIiApWyAwIF0gfHxcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LFxuICAgICAgICAgICAgICAgIGpzb25wQ2FsbGJhY2sgPSBvcHRpb25zLmNhbGxiYWNrTmFtZSB8fCAnb3BlbnNlYWRyYWdvbicgKyAkLm5vdygpLFxuICAgICAgICAgICAgICAgIHByZXZpb3VzICAgICAgPSB3aW5kb3dbIGpzb25wQ2FsbGJhY2sgXSxcbiAgICAgICAgICAgICAgICByZXBsYWNlICAgICAgID0gXCIkMVwiICsganNvbnBDYWxsYmFjayArIFwiJDJcIixcbiAgICAgICAgICAgICAgICBjYWxsYmFja1BhcmFtID0gb3B0aW9ucy5wYXJhbSB8fCAnY2FsbGJhY2snLFxuICAgICAgICAgICAgICAgIGNhbGxiYWNrICAgICAgPSBvcHRpb25zLmNhbGxiYWNrO1xuXG4gICAgICAgICAgICB1cmwgPSB1cmwucmVwbGFjZSggLyhcXD0pXFw/KCZ8JCl8XFw/XFw/L2ksIHJlcGxhY2UgKTtcbiAgICAgICAgICAgIC8vIEFkZCBjYWxsYmFjayBtYW51YWxseVxuICAgICAgICAgICAgdXJsICs9ICgvXFw/Ly50ZXN0KCB1cmwgKSA/IFwiJlwiIDogXCI/XCIpICsgY2FsbGJhY2tQYXJhbSArIFwiPVwiICsganNvbnBDYWxsYmFjaztcblxuICAgICAgICAgICAgLy8gSW5zdGFsbCBjYWxsYmFja1xuICAgICAgICAgICAgd2luZG93WyBqc29ucENhbGxiYWNrIF0gPSBmdW5jdGlvbiggcmVzcG9uc2UgKSB7XG4gICAgICAgICAgICAgICAgaWYgKCAhcHJldmlvdXMgKXtcbiAgICAgICAgICAgICAgICAgICAgdHJ5e1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHdpbmRvd1sganNvbnBDYWxsYmFjayBdO1xuICAgICAgICAgICAgICAgICAgICB9Y2F0Y2goZSl7XG4gICAgICAgICAgICAgICAgICAgICAgICAvL3N3YWxsb3dcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHdpbmRvd1sganNvbnBDYWxsYmFjayBdID0gcHJldmlvdXM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmKCBjYWxsYmFjayAmJiAkLmlzRnVuY3Rpb24oIGNhbGxiYWNrICkgKXtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soIHJlc3BvbnNlICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJzY3JpcHRcIiApO1xuXG4gICAgICAgICAgICAvL1RPRE86IGhhdmluZyBhbiBpc3N1ZSB3aXRoIGFzeW5jIGluZm8gcmVxdWVzdHNcbiAgICAgICAgICAgIGlmKCB1bmRlZmluZWQgIT09IG9wdGlvbnMuYXN5bmMgfHwgZmFsc2UgIT09IG9wdGlvbnMuYXN5bmMgKXtcbiAgICAgICAgICAgICAgICBzY3JpcHQuYXN5bmMgPSBcImFzeW5jXCI7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICggb3B0aW9ucy5zY3JpcHRDaGFyc2V0ICkge1xuICAgICAgICAgICAgICAgIHNjcmlwdC5jaGFyc2V0ID0gb3B0aW9ucy5zY3JpcHRDaGFyc2V0O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzY3JpcHQuc3JjID0gdXJsO1xuXG4gICAgICAgICAgICAvLyBBdHRhY2ggaGFuZGxlcnMgZm9yIGFsbCBicm93c2Vyc1xuICAgICAgICAgICAgc2NyaXB0Lm9ubG9hZCA9IHNjcmlwdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbiggXywgaXNBYm9ydCApIHtcblxuICAgICAgICAgICAgICAgIGlmICggaXNBYm9ydCB8fCAhc2NyaXB0LnJlYWR5U3RhdGUgfHwgL2xvYWRlZHxjb21wbGV0ZS8udGVzdCggc2NyaXB0LnJlYWR5U3RhdGUgKSApIHtcblxuICAgICAgICAgICAgICAgICAgICAvLyBIYW5kbGUgbWVtb3J5IGxlYWsgaW4gSUVcbiAgICAgICAgICAgICAgICAgICAgc2NyaXB0Lm9ubG9hZCA9IHNjcmlwdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBudWxsO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgc2NyaXB0XG4gICAgICAgICAgICAgICAgICAgIGlmICggaGVhZCAmJiBzY3JpcHQucGFyZW50Tm9kZSApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWQucmVtb3ZlQ2hpbGQoIHNjcmlwdCApO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gRGVyZWZlcmVuY2UgdGhlIHNjcmlwdFxuICAgICAgICAgICAgICAgICAgICBzY3JpcHQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIC8vIFVzZSBpbnNlcnRCZWZvcmUgaW5zdGVhZCBvZiBhcHBlbmRDaGlsZCAgdG8gY2lyY3VtdmVudCBhbiBJRTYgYnVnLlxuICAgICAgICAgICAgLy8gVGhpcyBhcmlzZXMgd2hlbiBhIGJhc2Ugbm9kZSBpcyB1c2VkICgjMjcwOSBhbmQgIzQzNzgpLlxuICAgICAgICAgICAgaGVhZC5pbnNlcnRCZWZvcmUoIHNjcmlwdCwgaGVhZC5maXJzdENoaWxkICk7XG5cbiAgICAgICAgfSxcblxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGdWxseSBkZXByZWNhdGVkLiBXaWxsIHRocm93IGFuIGVycm9yLlxuICAgICAgICAgKiBAZnVuY3Rpb25cbiAgICAgICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayBPcGVuU2VhZHJhZ29uLlZpZXdlciNvcGVufVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlYXRlRnJvbURaSTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB0aHJvdyBcIk9wZW5TZWFkcmFnb24uY3JlYXRlRnJvbURaSSBpcyBkZXByZWNhdGVkLCB1c2UgVmlld2VyLm9wZW4uXCI7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBhcnNlcyBhbiBYTUwgc3RyaW5nIGludG8gYSBET00gRG9jdW1lbnQuXG4gICAgICAgICAqIEBmdW5jdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3RyaW5nXG4gICAgICAgICAqIEByZXR1cm5zIHtEb2N1bWVudH1cbiAgICAgICAgICovXG4gICAgICAgIHBhcnNlWG1sOiBmdW5jdGlvbiggc3RyaW5nICkge1xuICAgICAgICAgICAgaWYgKCB3aW5kb3cuRE9NUGFyc2VyICkge1xuXG4gICAgICAgICAgICAgICAgJC5wYXJzZVhtbCA9IGZ1bmN0aW9uKCBzdHJpbmcgKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB4bWxEb2MgPSBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyO1xuXG4gICAgICAgICAgICAgICAgICAgIHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgeG1sRG9jID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyggc3RyaW5nLCBcInRleHQveG1sXCIgKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhtbERvYztcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICB9IGVsc2UgaWYgKCB3aW5kb3cuQWN0aXZlWE9iamVjdCApIHtcblxuICAgICAgICAgICAgICAgICQucGFyc2VYbWwgPSBmdW5jdGlvbiggc3RyaW5nICkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgeG1sRG9jID0gbnVsbDtcblxuICAgICAgICAgICAgICAgICAgICB4bWxEb2MgPSBuZXcgQWN0aXZlWE9iamVjdCggXCJNaWNyb3NvZnQuWE1MRE9NXCIgKTtcbiAgICAgICAgICAgICAgICAgICAgeG1sRG9jLmFzeW5jID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHhtbERvYy5sb2FkWE1MKCBzdHJpbmcgKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhtbERvYztcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvciggXCJCcm93c2VyIGRvZXNuJ3Qgc3VwcG9ydCBYTUwgRE9NLlwiICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiAkLnBhcnNlWG1sKCBzdHJpbmcgKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogUGFyc2VzIGEgSlNPTiBzdHJpbmcgaW50byBhIEphdmFzY3JpcHQgb2JqZWN0LlxuICAgICAgICAgKiBAZnVuY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHN0cmluZ1xuICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgICAgICAgKi9cbiAgICAgICAgcGFyc2VKU09OOiBmdW5jdGlvbihzdHJpbmcpIHtcbiAgICAgICAgICAgIGlmICh3aW5kb3cuSlNPTiAmJiB3aW5kb3cuSlNPTi5wYXJzZSkge1xuICAgICAgICAgICAgICAgICQucGFyc2VKU09OID0gd2luZG93LkpTT04ucGFyc2U7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFNob3VsZCBvbmx5IGJlIHVzZWQgYnkgSUU4IGluIG5vbiBzdGFuZGFyZHMgbW9kZVxuICAgICAgICAgICAgICAgICQucGFyc2VKU09OID0gZnVuY3Rpb24oc3RyaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIC8qanNoaW50IGV2aWw6dHJ1ZSovXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBldmFsKCcoJyArIHN0cmluZyArICcpJyk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAkLnBhcnNlSlNPTihzdHJpbmcpO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXBvcnRzIHdoZXRoZXIgdGhlIGltYWdlIGZvcm1hdCBpcyBzdXBwb3J0ZWQgZm9yIHRpbGluZyBpbiB0aGlzXG4gICAgICAgICAqIHZlcnNpb24uXG4gICAgICAgICAqIEBmdW5jdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gW2V4dGVuc2lvbl1cbiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59XG4gICAgICAgICAqL1xuICAgICAgICBpbWFnZUZvcm1hdFN1cHBvcnRlZDogZnVuY3Rpb24oIGV4dGVuc2lvbiApIHtcbiAgICAgICAgICAgIGV4dGVuc2lvbiA9IGV4dGVuc2lvbiA/IGV4dGVuc2lvbiA6IFwiXCI7XG4gICAgICAgICAgICByZXR1cm4gISFGSUxFRk9STUFUU1sgZXh0ZW5zaW9uLnRvTG93ZXJDYXNlKCkgXTtcbiAgICAgICAgfVxuXG4gICAgfSk7XG5cblxuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW50IGJyb3dzZXIgdmVuZG9yLCB2ZXJzaW9uLCBhbmQgcmVsYXRlZCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgZGV0ZWN0ZWQgZmVhdHVyZXMuXG4gICAgICogQG1lbWJlciB7T2JqZWN0fSBCcm93c2VyXG4gICAgICogQG1lbWJlcm9mIE9wZW5TZWFkcmFnb25cbiAgICAgKiBAc3RhdGljXG4gICAgICogQHR5cGUge09iamVjdH1cbiAgICAgKiBAcHJvcGVydHkge09wZW5TZWFkcmFnb24uQlJPV1NFUlN9IHZlbmRvciAtIE9uZSBvZiB0aGUge0BsaW5rIE9wZW5TZWFkcmFnb24uQlJPV1NFUlN9IGVudW1lcmF0aW9uIHZhbHVlcy5cbiAgICAgKiBAcHJvcGVydHkge051bWJlcn0gdmVyc2lvblxuICAgICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gYWxwaGEgLSBEb2VzIHRoZSBicm93c2VyIHN1cHBvcnQgaW1hZ2UgYWxwaGEgdHJhbnNwYXJlbmN5LlxuICAgICAqL1xuICAgICQuQnJvd3NlciA9IHtcbiAgICAgICAgdmVuZG9yOiAgICAgJC5CUk9XU0VSUy5VTktOT1dOLFxuICAgICAgICB2ZXJzaW9uOiAgICAwLFxuICAgICAgICBhbHBoYTogICAgICB0cnVlXG4gICAgfTtcblxuXG4gICAgdmFyIEZJTEVGT1JNQVRTID0ge1xuICAgICAgICAgICAgXCJibXBcIjogIGZhbHNlLFxuICAgICAgICAgICAgXCJqcGVnXCI6IHRydWUsXG4gICAgICAgICAgICBcImpwZ1wiOiAgdHJ1ZSxcbiAgICAgICAgICAgIFwicG5nXCI6ICB0cnVlLFxuICAgICAgICAgICAgXCJ0aWZcIjogIGZhbHNlLFxuICAgICAgICAgICAgXCJ3ZHBcIjogIGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFVSTFBBUkFNUyA9IHt9O1xuXG4gICAgKGZ1bmN0aW9uKCkge1xuICAgICAgICAvL0Egc21hbGwgYXV0by1leGVjdXRpbmcgcm91dGluZSB0byBkZXRlcm1pbmUgdGhlIGJyb3dzZXIgdmVuZG9yLFxuICAgICAgICAvL3ZlcnNpb24gYW5kIHN1cHBvcnRpbmcgZmVhdHVyZSBzZXRzLlxuICAgICAgICB2YXIgYXBwID0gbmF2aWdhdG9yLmFwcE5hbWUsXG4gICAgICAgICAgICB2ZXIgPSBuYXZpZ2F0b3IuYXBwVmVyc2lvbixcbiAgICAgICAgICAgIHVhICA9IG5hdmlnYXRvci51c2VyQWdlbnQsXG4gICAgICAgICAgICByZWdleDtcblxuICAgICAgICAvL2NvbnNvbGUuZXJyb3IoICdhcHBOYW1lOiAnICsgbmF2aWdhdG9yLmFwcE5hbWUgKTtcbiAgICAgICAgLy9jb25zb2xlLmVycm9yKCAnYXBwVmVyc2lvbjogJyArIG5hdmlnYXRvci5hcHBWZXJzaW9uICk7XG4gICAgICAgIC8vY29uc29sZS5lcnJvciggJ3VzZXJBZ2VudDogJyArIG5hdmlnYXRvci51c2VyQWdlbnQgKTtcblxuICAgICAgICBzd2l0Y2goIG5hdmlnYXRvci5hcHBOYW1lICl7XG4gICAgICAgICAgICBjYXNlIFwiTWljcm9zb2Z0IEludGVybmV0IEV4cGxvcmVyXCI6XG4gICAgICAgICAgICAgICAgaWYoICEhd2luZG93LmF0dGFjaEV2ZW50ICYmXG4gICAgICAgICAgICAgICAgICAgICEhd2luZG93LkFjdGl2ZVhPYmplY3QgKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgJC5Ccm93c2VyLnZlbmRvciA9ICQuQlJPV1NFUlMuSUU7XG4gICAgICAgICAgICAgICAgICAgICQuQnJvd3Nlci52ZXJzaW9uID0gcGFyc2VGbG9hdChcbiAgICAgICAgICAgICAgICAgICAgICAgIHVhLnN1YnN0cmluZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1YS5pbmRleE9mKCBcIk1TSUVcIiApICsgNSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1YS5pbmRleE9mKCBcIjtcIiwgdWEuaW5kZXhPZiggXCJNU0lFXCIgKSApIClcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIk5ldHNjYXBlXCI6XG4gICAgICAgICAgICAgICAgaWYoICEhd2luZG93LmFkZEV2ZW50TGlzdGVuZXIgKXtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCB1YS5pbmRleE9mKCBcIkZpcmVmb3hcIiApID49IDAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAkLkJyb3dzZXIudmVuZG9yID0gJC5CUk9XU0VSUy5GSVJFRk9YO1xuICAgICAgICAgICAgICAgICAgICAgICAgJC5Ccm93c2VyLnZlcnNpb24gPSBwYXJzZUZsb2F0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVhLnN1YnN0cmluZyggdWEuaW5kZXhPZiggXCJGaXJlZm94XCIgKSArIDggKVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICggdWEuaW5kZXhPZiggXCJTYWZhcmlcIiApID49IDAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAkLkJyb3dzZXIudmVuZG9yID0gdWEuaW5kZXhPZiggXCJDaHJvbWVcIiApID49IDAgP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICQuQlJPV1NFUlMuQ0hST01FIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkLkJST1dTRVJTLlNBRkFSSTtcbiAgICAgICAgICAgICAgICAgICAgICAgICQuQnJvd3Nlci52ZXJzaW9uID0gcGFyc2VGbG9hdChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1YS5zdWJzdHJpbmcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVhLnN1YnN0cmluZyggMCwgdWEuaW5kZXhPZiggXCJTYWZhcmlcIiApICkubGFzdEluZGV4T2YoIFwiL1wiICkgKyAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1YS5pbmRleE9mKCBcIlNhZmFyaVwiIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVnZXggPSBuZXcgUmVnRXhwKCBcIlRyaWRlbnQvLipydjooWzAtOV17MSx9Wy4wLTldezAsfSlcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHJlZ2V4LmV4ZWMoIHVhICkgIT09IG51bGwgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJC5Ccm93c2VyLnZlbmRvciA9ICQuQlJPV1NFUlMuSUU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJC5Ccm93c2VyLnZlcnNpb24gPSBwYXJzZUZsb2F0KCBSZWdFeHAuJDEgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJPcGVyYVwiOlxuICAgICAgICAgICAgICAgICQuQnJvd3Nlci52ZW5kb3IgPSAkLkJST1dTRVJTLk9QRVJBO1xuICAgICAgICAgICAgICAgICQuQnJvd3Nlci52ZXJzaW9uID0gcGFyc2VGbG9hdCggdmVyICk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICAgICAgLy8gaWdub3JlICc/JyBwb3J0aW9uIG9mIHF1ZXJ5IHN0cmluZ1xuICAgICAgICB2YXIgcXVlcnkgPSB3aW5kb3cubG9jYXRpb24uc2VhcmNoLnN1YnN0cmluZyggMSApLFxuICAgICAgICAgICAgcGFydHMgPSBxdWVyeS5zcGxpdCgnJicpLFxuICAgICAgICAgICAgcGFydCxcbiAgICAgICAgICAgIHNlcCxcbiAgICAgICAgICAgIGk7XG5cbiAgICAgICAgZm9yICggaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGg7IGkrKyApIHtcbiAgICAgICAgICAgIHBhcnQgPSBwYXJ0c1sgaSBdO1xuICAgICAgICAgICAgc2VwICA9IHBhcnQuaW5kZXhPZiggJz0nICk7XG5cbiAgICAgICAgICAgIGlmICggc2VwID4gMCApIHtcbiAgICAgICAgICAgICAgICBVUkxQQVJBTVNbIHBhcnQuc3Vic3RyaW5nKCAwLCBzZXAgKSBdID1cbiAgICAgICAgICAgICAgICAgICAgZGVjb2RlVVJJQ29tcG9uZW50KCBwYXJ0LnN1YnN0cmluZyggc2VwICsgMSApICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvL2RldGVybWluZSBpZiB0aGlzIGJyb3dzZXIgc3VwcG9ydHMgaW1hZ2UgYWxwaGEgdHJhbnNwYXJlbmN5XG4gICAgICAgICQuQnJvd3Nlci5hbHBoYSA9ICEoXG4gICAgICAgICAgICAoXG4gICAgICAgICAgICAgICAgJC5Ccm93c2VyLnZlbmRvciA9PSAkLkJST1dTRVJTLklFICYmXG4gICAgICAgICAgICAgICAgJC5Ccm93c2VyLnZlcnNpb24gPCA5XG4gICAgICAgICAgICApIHx8IChcbiAgICAgICAgICAgICAgICAkLkJyb3dzZXIudmVuZG9yID09ICQuQlJPV1NFUlMuQ0hST01FICYmXG4gICAgICAgICAgICAgICAgJC5Ccm93c2VyLnZlcnNpb24gPCAyXG4gICAgICAgICAgICApXG4gICAgICAgICk7XG5cbiAgICAgICAgLy9kZXRlcm1pbmUgaWYgdGhpcyBicm93c2VyIHN1cHBvcnRzIGVsZW1lbnQuc3R5bGUub3BhY2l0eVxuICAgICAgICAkLkJyb3dzZXIub3BhY2l0eSA9ICEoXG4gICAgICAgICAgICAkLkJyb3dzZXIudmVuZG9yID09ICQuQlJPV1NFUlMuSUUgJiZcbiAgICAgICAgICAgICQuQnJvd3Nlci52ZXJzaW9uIDwgOVxuICAgICAgICApO1xuXG4gICAgfSkoKTtcblxuXG4gICAgLy9UT0RPOiAkLmNvbnNvbGUgaXMgb2Z0ZW4gdXNlZCBpbnNpZGUgYSB0cnkvY2F0Y2ggYmxvY2sgd2hpY2ggZ2VuZXJhbGx5XG4gICAgLy8gICAgICBwcmV2ZW50cyBhbGxvd2luZ3MgZXJyb3JzIHRvIG9jY3VyIHdpdGggZGV0ZWN0aW9uIHVudGlsIGEgZGVidWdnZXJcbiAgICAvLyAgICAgIGlzIGF0dGFjaGVkLiAgQWx0aG91Z2ggSSd2ZSBiZWVuIGd1aWx0eSBvZiB0aGUgc2FtZSBhbnRpLXBhdHRlcm5cbiAgICAvLyAgICAgIEkgZXZlbnR1YWxseSB3YXMgY29udmluY2VkIHRoYXQgZXJyb3JzIHNob3VsZCBuYXR1cmFsbHkgcHJvcG9nYXRlIGluXG4gICAgLy8gICAgICBhbGwgYnV0IHRoZSBtb3N0IHNwZWNpYWwgY2FzZXMuXG4gICAgLyoqXG4gICAgICogQSBjb252ZW5pZW50IGFsaWFzIGZvciBjb25zb2xlIHdoZW4gYXZhaWxhYmxlLCBhbmQgYSBzaW1wbGUgbnVsbFxuICAgICAqIGZ1bmN0aW9uIHdoZW4gY29uc29sZSBpcyB1bmF2YWlsYWJsZS5cbiAgICAgKiBAc3RhdGljXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICB2YXIgbnVsbGZ1bmN0aW9uID0gZnVuY3Rpb24oIG1zZyApe1xuICAgICAgICAgICAgLy9kb2N1bWVudC5sb2NhdGlvbi5oYXNoID0gbXNnO1xuICAgICAgICB9O1xuXG4gICAgJC5jb25zb2xlID0gd2luZG93LmNvbnNvbGUgfHwge1xuICAgICAgICBsb2c6ICAgIG51bGxmdW5jdGlvbixcbiAgICAgICAgZGVidWc6ICBudWxsZnVuY3Rpb24sXG4gICAgICAgIGluZm86ICAgbnVsbGZ1bmN0aW9uLFxuICAgICAgICB3YXJuOiAgIG51bGxmdW5jdGlvbixcbiAgICAgICAgZXJyb3I6ICBudWxsZnVuY3Rpb24sXG4gICAgICAgIGFzc2VydDogbnVsbGZ1bmN0aW9uXG4gICAgfTtcblxuXG4gICAgLy8gQWRkaW5nIHN1cHBvcnQgZm9yIEhUTUw1J3MgcmVxdWVzdEFuaW1hdGlvbkZyYW1lIGFzIHN1Z2dlc3RlZCBieSBhY2RoYS5cbiAgICAvLyBJbXBsZW1lbnRhdGlvbiB0YWtlbiBmcm9tIG1hdHQgc3luZGVyJ3MgcG9zdCBoZXJlOlxuICAgIC8vIGh0dHA6Ly9tYXR0c25pZGVyLmNvbS9jcm9zcy1icm93c2VyLWFuZC1sZWdhY3ktc3VwcG9ydGVkLXJlcXVlc3RmcmFtZWFuaW1hdGlvbi9cbiAgICAoZnVuY3Rpb24oIHcgKSB7XG5cbiAgICAgICAgLy8gbW9zdCBicm93c2VycyBoYXZlIGFuIGltcGxlbWVudGF0aW9uXG4gICAgICAgIHZhciByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPSB3LnJlcXVlc3RBbmltYXRpb25GcmFtZSB8fFxuICAgICAgICAgICAgdy5tb3pSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHxcbiAgICAgICAgICAgIHcud2Via2l0UmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8XG4gICAgICAgICAgICB3Lm1zUmVxdWVzdEFuaW1hdGlvbkZyYW1lO1xuXG4gICAgICAgIHZhciBjYW5jZWxBbmltYXRpb25GcmFtZSA9IHcuY2FuY2VsQW5pbWF0aW9uRnJhbWUgfHxcbiAgICAgICAgICAgIHcubW96Q2FuY2VsQW5pbWF0aW9uRnJhbWUgfHxcbiAgICAgICAgICAgIHcud2Via2l0Q2FuY2VsQW5pbWF0aW9uRnJhbWUgfHxcbiAgICAgICAgICAgIHcubXNDYW5jZWxBbmltYXRpb25GcmFtZTtcblxuICAgICAgICAvLyBwb2x5ZmlsbCwgd2hlbiBuZWNlc3NhcnlcbiAgICAgICAgaWYgKCByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgJiYgY2FuY2VsQW5pbWF0aW9uRnJhbWUgKSB7XG4gICAgICAgICAgICAvLyBXZSBjYW4ndCBhc3NpZ24gdGhlc2Ugd2luZG93IG1ldGhvZHMgZGlyZWN0bHkgdG8gJCBiZWNhdXNlIHRoZXlcbiAgICAgICAgICAgIC8vIGV4cGVjdCB0aGVpciBcInRoaXNcIiB0byBiZSBcIndpbmRvd1wiLCBzbyB3ZSBjYWxsIHRoZW0gaW4gd3JhcHBlcnMuXG4gICAgICAgICAgICAkLnJlcXVlc3RBbmltYXRpb25GcmFtZSA9IGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlcXVlc3RBbmltYXRpb25GcmFtZS5hcHBseSggdywgYXJndW1lbnRzICk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgJC5jYW5jZWxBbmltYXRpb25GcmFtZSA9IGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNhbmNlbEFuaW1hdGlvbkZyYW1lLmFwcGx5KCB3LCBhcmd1bWVudHMgKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgYUFuaW1RdWV1ZSA9IFtdLFxuICAgICAgICAgICAgICAgIHByb2Nlc3NpbmcgPSBbXSxcbiAgICAgICAgICAgICAgICBpUmVxdWVzdElkID0gMCxcbiAgICAgICAgICAgICAgICBpSW50ZXJ2YWxJZDtcblxuICAgICAgICAgICAgLy8gY3JlYXRlIGEgbW9jayByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgZnVuY3Rpb25cbiAgICAgICAgICAgICQucmVxdWVzdEFuaW1hdGlvbkZyYW1lID0gZnVuY3Rpb24oIGNhbGxiYWNrICkge1xuICAgICAgICAgICAgICAgIGFBbmltUXVldWUucHVzaCggWyArK2lSZXF1ZXN0SWQsIGNhbGxiYWNrIF0gKTtcblxuICAgICAgICAgICAgICAgIGlmICggIWlJbnRlcnZhbElkICkge1xuICAgICAgICAgICAgICAgICAgICBpSW50ZXJ2YWxJZCA9IHNldEludGVydmFsKCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggYUFuaW1RdWV1ZS5sZW5ndGggKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRpbWUgPSAkLm5vdygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByb2Nlc3MgYWxsIG9mIHRoZSBjdXJyZW50bHkgb3V0c3RhbmRpbmcgZnJhbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXF1ZXN0cywgYnV0IG5vbmUgdGhhdCBnZXQgYWRkZWQgZHVyaW5nIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByb2Nlc3NpbmcuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3dhcCB0aGUgYXJyYXlzIHNvIHdlIGRvbid0IGhhdmUgdG8gY3JlYXRlIGEgbmV3XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXJyYXkgZXZlcnkgZnJhbWUuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRlbXAgPSBwcm9jZXNzaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NpbmcgPSBhQW5pbVF1ZXVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFBbmltUXVldWUgPSB0ZW1wO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICggcHJvY2Vzc2luZy5sZW5ndGggKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3Npbmcuc2hpZnQoKVsgMSBdKCB0aW1lICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkb24ndCBjb250aW51ZSB0aGUgaW50ZXJ2YWwsIGlmIHVubmVjZXNzYXJ5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCggaUludGVydmFsSWQgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpSW50ZXJ2YWxJZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSwgMTAwMCAvIDUwKTsgIC8vIGVzdGltYXRpbmcgc3VwcG9ydCBmb3IgNTAgZnJhbWVzIHBlciBzZWNvbmRcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gaVJlcXVlc3RJZDtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIC8vIGNyZWF0ZSBhIG1vY2sgY2FuY2VsQW5pbWF0aW9uRnJhbWUgZnVuY3Rpb25cbiAgICAgICAgICAgICQuY2FuY2VsQW5pbWF0aW9uRnJhbWUgPSBmdW5jdGlvbiggcmVxdWVzdElkICkge1xuICAgICAgICAgICAgICAgIC8vIGZpbmQgdGhlIHJlcXVlc3QgSUQgYW5kIHJlbW92ZSBpdFxuICAgICAgICAgICAgICAgIHZhciBpLCBqO1xuICAgICAgICAgICAgICAgIGZvciAoIGkgPSAwLCBqID0gYUFuaW1RdWV1ZS5sZW5ndGg7IGkgPCBqOyBpICs9IDEgKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICggYUFuaW1RdWV1ZVsgaSBdWyAwIF0gPT09IHJlcXVlc3RJZCApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFBbmltUXVldWUuc3BsaWNlKCBpLCAxICk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBJZiBpdCdzIG5vdCBpbiB0aGUgcXVldWUsIGl0IG1heSBiZSBpbiB0aGUgc2V0IHdlJ3JlIGN1cnJlbnRseVxuICAgICAgICAgICAgICAgIC8vIHByb2Nlc3NpbmcgKGlmIGNhbmNlbEFuaW1hdGlvbkZyYW1lIGlzIGNhbGxlZCBmcm9tIHdpdGhpbiBhXG4gICAgICAgICAgICAgICAgLy8gcmVxdWVzdEFuaW1hdGlvbkZyYW1lIGNhbGxiYWNrKS5cbiAgICAgICAgICAgICAgICBmb3IgKCBpID0gMCwgaiA9IHByb2Nlc3NpbmcubGVuZ3RoOyBpIDwgajsgaSArPSAxICkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIHByb2Nlc3NpbmdbIGkgXVsgMCBdID09PSByZXF1ZXN0SWQgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzaW5nLnNwbGljZSggaSwgMSApO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH0pKCB3aW5kb3cgKTtcblxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQGlubmVyXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50XG4gICAgICogQHBhcmFtIHtCb29sZWFufSBbaXNGaXhlZF1cbiAgICAgKiBAcmV0dXJucyB7RWxlbWVudH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRPZmZzZXRQYXJlbnQoIGVsZW1lbnQsIGlzRml4ZWQgKSB7XG4gICAgICAgIGlmICggaXNGaXhlZCAmJiBlbGVtZW50ICE9IGRvY3VtZW50LmJvZHkgKSB7XG4gICAgICAgICAgICByZXR1cm4gZG9jdW1lbnQuYm9keTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50Lm9mZnNldFBhcmVudDtcbiAgICAgICAgfVxuICAgIH1cblxufShPcGVuU2VhZHJhZ29uKSk7XG5cbi8qXG4gKiBPcGVuU2VhZHJhZ29uIC0gZnVsbC1zY3JlZW4gc3VwcG9ydCBmdW5jdGlvbnNcbiAqXG4gKiBDb3B5cmlnaHQgKEMpIDIwMDkgQ29kZVBsZXggRm91bmRhdGlvblxuICogQ29weXJpZ2h0IChDKSAyMDEwLTIwMTMgT3BlblNlYWRyYWdvbiBjb250cmlidXRvcnNcbiAqXG4gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmVcbiAqIG1ldDpcbiAqXG4gKiAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiAqICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAqXG4gKiAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0XG4gKiAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGVcbiAqICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cbiAqXG4gKiAtIE5laXRoZXIgdGhlIG5hbWUgb2YgQ29kZVBsZXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0c1xuICogICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbVxuICogICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuICpcbiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlNcbiAqIFwiQVMgSVNcIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1RcbiAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUlxuICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUXG4gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCxcbiAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRFxuICogVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUlxuICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkdcbiAqIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJU1xuICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4gKi9cblxuKGZ1bmN0aW9uKCAkICkge1xuICAgIC8qKlxuICAgICAqIERldGVybWluZSBuYXRpdmUgZnVsbCBzY3JlZW4gc3VwcG9ydCB3ZSBjYW4gZ2V0IGZyb20gdGhlIGJyb3dzZXIuXG4gICAgICogQG1lbWJlciBmdWxsU2NyZWVuQXBpXG4gICAgICogQG1lbWJlcm9mIE9wZW5TZWFkcmFnb25cbiAgICAgKiBAdHlwZSB7b2JqZWN0fVxuICAgICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gc3VwcG9ydHNGdWxsU2NyZWVuIFJldHVybiB0cnVlIGlmIGZ1bGwgc2NyZWVuIEFQSSBpcyBzdXBwb3J0ZWQuXG4gICAgICogQHByb3BlcnR5IHtGdW5jdGlvbn0gaXNGdWxsU2NyZWVuIFJldHVybiB0cnVlIGlmIGN1cnJlbnRseSBpbiBmdWxsIHNjcmVlbiBtb2RlLlxuICAgICAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IGdldEZ1bGxTY3JlZW5FbGVtZW50IFJldHVybiB0aGUgZWxlbWVudCBjdXJyZW50bHkgaW4gZnVsbCBzY3JlZW4gbW9kZS5cbiAgICAgKiBAcHJvcGVydHkge0Z1bmN0aW9ufSByZXF1ZXN0RnVsbFNjcmVlbiBNYWtlIGEgcmVxdWVzdCB0byBnbyBpbiBmdWxsIHNjcmVlbiBtb2RlLlxuICAgICAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IGV4aXRGdWxsU2NyZWVuIE1ha2UgYSByZXF1ZXN0IHRvIGV4aXQgZnVsbCBzY3JlZW4gbW9kZS5cbiAgICAgKiBAcHJvcGVydHkge0Z1bmN0aW9ufSBjYW5jZWxGdWxsU2NyZWVuIERlcHJlY2F0ZWQsIHVzZSBleGl0RnVsbFNjcmVlbiBpbnN0ZWFkLlxuICAgICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBmdWxsU2NyZWVuRXZlbnROYW1lIEV2ZW50IGZpcmVkIHdoZW4gdGhlIGZ1bGwgc2NyZWVuIG1vZGUgY2hhbmdlLlxuICAgICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBmdWxsU2NyZWVuRXJyb3JFdmVudE5hbWUgRXZlbnQgZmlyZWQgd2hlbiBhIHJlcXVlc3QgdG8gZ29cbiAgICAgKiBpbiBmdWxsIHNjcmVlbiBtb2RlIGZhaWxlZC5cbiAgICAgKi9cbiAgICB2YXIgZnVsbFNjcmVlbkFwaSA9IHtcbiAgICAgICAgc3VwcG9ydHNGdWxsU2NyZWVuOiBmYWxzZSxcbiAgICAgICAgaXNGdWxsU2NyZWVuOiBmdW5jdGlvbigpIHsgcmV0dXJuIGZhbHNlOyB9LFxuICAgICAgICBnZXRGdWxsU2NyZWVuRWxlbWVudDogZnVuY3Rpb24oKSB7IHJldHVybiBudWxsOyB9LFxuICAgICAgICByZXF1ZXN0RnVsbFNjcmVlbjogZnVuY3Rpb24oKSB7fSxcbiAgICAgICAgZXhpdEZ1bGxTY3JlZW46IGZ1bmN0aW9uKCkge30sXG4gICAgICAgIGNhbmNlbEZ1bGxTY3JlZW46IGZ1bmN0aW9uKCkge30sXG4gICAgICAgIGZ1bGxTY3JlZW5FdmVudE5hbWU6ICcnLFxuICAgICAgICBmdWxsU2NyZWVuRXJyb3JFdmVudE5hbWU6ICcnXG4gICAgfTtcblxuICAgIC8vIGNoZWNrIGZvciBuYXRpdmUgc3VwcG9ydFxuICAgIGlmICggZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4gKSB7XG4gICAgICAgIC8vIFczQyBzdGFuZGFyZFxuICAgICAgICBmdWxsU2NyZWVuQXBpLnN1cHBvcnRzRnVsbFNjcmVlbiA9IHRydWU7XG4gICAgICAgIGZ1bGxTY3JlZW5BcGkuZ2V0RnVsbFNjcmVlbkVsZW1lbnQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBkb2N1bWVudC5mdWxsc2NyZWVuRWxlbWVudDtcbiAgICAgICAgfTtcbiAgICAgICAgZnVsbFNjcmVlbkFwaS5yZXF1ZXN0RnVsbFNjcmVlbiA9IGZ1bmN0aW9uKCBlbGVtZW50ICkge1xuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQucmVxdWVzdEZ1bGxzY3JlZW4oKTtcbiAgICAgICAgfTtcbiAgICAgICAgZnVsbFNjcmVlbkFwaS5leGl0RnVsbFNjcmVlbiA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKTtcbiAgICAgICAgfTtcbiAgICAgICAgZnVsbFNjcmVlbkFwaS5mdWxsU2NyZWVuRXZlbnROYW1lID0gXCJmdWxsc2NyZWVuY2hhbmdlXCI7XG4gICAgICAgIGZ1bGxTY3JlZW5BcGkuZnVsbFNjcmVlbkVycm9yRXZlbnROYW1lID0gXCJmdWxsc2NyZWVuZXJyb3JcIjtcbiAgICB9IGVsc2UgaWYgKCBkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuICkge1xuICAgICAgICAvLyBJRSAxMVxuICAgICAgICBmdWxsU2NyZWVuQXBpLnN1cHBvcnRzRnVsbFNjcmVlbiA9IHRydWU7XG4gICAgICAgIGZ1bGxTY3JlZW5BcGkuZ2V0RnVsbFNjcmVlbkVsZW1lbnQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBkb2N1bWVudC5tc0Z1bGxzY3JlZW5FbGVtZW50O1xuICAgICAgICB9O1xuICAgICAgICBmdWxsU2NyZWVuQXBpLnJlcXVlc3RGdWxsU2NyZWVuID0gZnVuY3Rpb24oIGVsZW1lbnQgKSB7XG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudC5tc1JlcXVlc3RGdWxsc2NyZWVuKCk7XG4gICAgICAgIH07XG4gICAgICAgIGZ1bGxTY3JlZW5BcGkuZXhpdEZ1bGxTY3JlZW4gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTtcbiAgICAgICAgfTtcbiAgICAgICAgZnVsbFNjcmVlbkFwaS5mdWxsU2NyZWVuRXZlbnROYW1lID0gXCJNU0Z1bGxzY3JlZW5DaGFuZ2VcIjtcbiAgICAgICAgZnVsbFNjcmVlbkFwaS5mdWxsU2NyZWVuRXJyb3JFdmVudE5hbWUgPSBcIk1TRnVsbHNjcmVlbkVycm9yXCI7XG4gICAgfSBlbHNlIGlmICggZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4gKSB7XG4gICAgICAgIC8vIFJlY2VudCB3ZWJraXRcbiAgICAgICAgZnVsbFNjcmVlbkFwaS5zdXBwb3J0c0Z1bGxTY3JlZW4gPSB0cnVlO1xuICAgICAgICBmdWxsU2NyZWVuQXBpLmdldEZ1bGxTY3JlZW5FbGVtZW50ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gZG9jdW1lbnQud2Via2l0RnVsbHNjcmVlbkVsZW1lbnQ7XG4gICAgICAgIH07XG4gICAgICAgIGZ1bGxTY3JlZW5BcGkucmVxdWVzdEZ1bGxTY3JlZW4gPSBmdW5jdGlvbiggZWxlbWVudCApIHtcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50LndlYmtpdFJlcXVlc3RGdWxsc2NyZWVuKCk7XG4gICAgICAgIH07XG4gICAgICAgIGZ1bGxTY3JlZW5BcGkuZXhpdEZ1bGxTY3JlZW4gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7XG4gICAgICAgIH07XG4gICAgICAgIGZ1bGxTY3JlZW5BcGkuZnVsbFNjcmVlbkV2ZW50TmFtZSA9IFwid2Via2l0ZnVsbHNjcmVlbmNoYW5nZVwiO1xuICAgICAgICBmdWxsU2NyZWVuQXBpLmZ1bGxTY3JlZW5FcnJvckV2ZW50TmFtZSA9IFwid2Via2l0ZnVsbHNjcmVlbmVycm9yXCI7XG4gICAgfSBlbHNlIGlmICggZG9jdW1lbnQud2Via2l0Q2FuY2VsRnVsbFNjcmVlbiApIHtcbiAgICAgICAgLy8gT2xkIHdlYmtpdFxuICAgICAgICBmdWxsU2NyZWVuQXBpLnN1cHBvcnRzRnVsbFNjcmVlbiA9IHRydWU7XG4gICAgICAgIGZ1bGxTY3JlZW5BcGkuZ2V0RnVsbFNjcmVlbkVsZW1lbnQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBkb2N1bWVudC53ZWJraXRDdXJyZW50RnVsbFNjcmVlbkVsZW1lbnQ7XG4gICAgICAgIH07XG4gICAgICAgIGZ1bGxTY3JlZW5BcGkucmVxdWVzdEZ1bGxTY3JlZW4gPSBmdW5jdGlvbiggZWxlbWVudCApIHtcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50LndlYmtpdFJlcXVlc3RGdWxsU2NyZWVuKCk7XG4gICAgICAgIH07XG4gICAgICAgIGZ1bGxTY3JlZW5BcGkuZXhpdEZ1bGxTY3JlZW4gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGRvY3VtZW50LndlYmtpdENhbmNlbEZ1bGxTY3JlZW4oKTtcbiAgICAgICAgfTtcbiAgICAgICAgZnVsbFNjcmVlbkFwaS5mdWxsU2NyZWVuRXZlbnROYW1lID0gXCJ3ZWJraXRmdWxsc2NyZWVuY2hhbmdlXCI7XG4gICAgICAgIGZ1bGxTY3JlZW5BcGkuZnVsbFNjcmVlbkVycm9yRXZlbnROYW1lID0gXCJ3ZWJraXRmdWxsc2NyZWVuZXJyb3JcIjtcbiAgICB9IGVsc2UgaWYgKCBkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuICkge1xuICAgICAgICAvLyBGaXJlZm94XG4gICAgICAgIGZ1bGxTY3JlZW5BcGkuc3VwcG9ydHNGdWxsU2NyZWVuID0gdHJ1ZTtcbiAgICAgICAgZnVsbFNjcmVlbkFwaS5nZXRGdWxsU2NyZWVuRWxlbWVudCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIGRvY3VtZW50Lm1vekZ1bGxTY3JlZW5FbGVtZW50O1xuICAgICAgICB9O1xuICAgICAgICBmdWxsU2NyZWVuQXBpLnJlcXVlc3RGdWxsU2NyZWVuID0gZnVuY3Rpb24oIGVsZW1lbnQgKSB7XG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudC5tb3pSZXF1ZXN0RnVsbFNjcmVlbigpO1xuICAgICAgICB9O1xuICAgICAgICBmdWxsU2NyZWVuQXBpLmV4aXRGdWxsU2NyZWVuID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7XG4gICAgICAgIH07XG4gICAgICAgIGZ1bGxTY3JlZW5BcGkuZnVsbFNjcmVlbkV2ZW50TmFtZSA9IFwibW96ZnVsbHNjcmVlbmNoYW5nZVwiO1xuICAgICAgICBmdWxsU2NyZWVuQXBpLmZ1bGxTY3JlZW5FcnJvckV2ZW50TmFtZSA9IFwibW96ZnVsbHNjcmVlbmVycm9yXCI7XG4gICAgfVxuICAgIGZ1bGxTY3JlZW5BcGkuaXNGdWxsU2NyZWVuID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBmdWxsU2NyZWVuQXBpLmdldEZ1bGxTY3JlZW5FbGVtZW50KCkgIT09IG51bGw7XG4gICAgfTtcbiAgICBmdWxsU2NyZWVuQXBpLmNhbmNlbEZ1bGxTY3JlZW4gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgJC5jb25zb2xlLmVycm9yKFwiY2FuY2VsRnVsbFNjcmVlbiBpcyBkZXByZWNhdGVkLiBVc2UgZXhpdEZ1bGxTY3JlZW4gaW5zdGVhZC5cIik7XG4gICAgICAgIGZ1bGxTY3JlZW5BcGkuZXhpdEZ1bGxTY3JlZW4oKTtcbiAgICB9O1xuXG4gICAgLy8gZXhwb3J0IGFwaVxuICAgICQuZXh0ZW5kKCAkLCBmdWxsU2NyZWVuQXBpICk7XG5cbn0pKCBPcGVuU2VhZHJhZ29uICk7XG5cbi8qXG4gKiBPcGVuU2VhZHJhZ29uIC0gRXZlbnRTb3VyY2VcbiAqXG4gKiBDb3B5cmlnaHQgKEMpIDIwMDkgQ29kZVBsZXggRm91bmRhdGlvblxuICogQ29weXJpZ2h0IChDKSAyMDEwLTIwMTMgT3BlblNlYWRyYWdvbiBjb250cmlidXRvcnNcbiAqXG4gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmVcbiAqIG1ldDpcbiAqXG4gKiAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiAqICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAqXG4gKiAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0XG4gKiAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGVcbiAqICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cbiAqXG4gKiAtIE5laXRoZXIgdGhlIG5hbWUgb2YgQ29kZVBsZXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0c1xuICogICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbVxuICogICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuICpcbiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlNcbiAqIFwiQVMgSVNcIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1RcbiAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUlxuICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUXG4gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCxcbiAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRFxuICogVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUlxuICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkdcbiAqIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJU1xuICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4gKi9cblxuKGZ1bmN0aW9uKCQpe1xuXG4vKipcbiAqIEV2ZW50IGhhbmRsZXIgbWV0aG9kIHNpZ25hdHVyZSB1c2VkIGJ5IGFsbCBPcGVuU2VhZHJhZ29uIGV2ZW50cy5cbiAqXG4gKiBAY2FsbGJhY2sgRXZlbnRIYW5kbGVyXG4gKiBAbWVtYmVyb2YgT3BlblNlYWRyYWdvblxuICogQHBhcmFtIHtPYmplY3R9IGV2ZW50IC0gU2VlIGluZGl2aWR1YWwgZXZlbnRzIGZvciBldmVudC1zcGVjaWZpYyBwcm9wZXJ0aWVzLlxuICovXG5cblxuLyoqXG4gKiBAY2xhc3MgRXZlbnRTb3VyY2VcbiAqIEBjbGFzc2Rlc2MgRm9yIHVzZSBieSBjbGFzc2VzIHdoaWNoIHdhbnQgdG8gc3VwcG9ydCBjdXN0b20sIG5vbi1icm93c2VyIGV2ZW50cy5cbiAqXG4gKiBAbWVtYmVyb2YgT3BlblNlYWRyYWdvblxuICovXG4kLkV2ZW50U291cmNlID0gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5ldmVudHMgPSB7fTtcbn07XG5cbi8qKiBAbGVuZHMgT3BlblNlYWRyYWdvbi5FdmVudFNvdXJjZS5wcm90b3R5cGUgKi9cbiQuRXZlbnRTb3VyY2UucHJvdG90eXBlID0ge1xuXG4gICAgLyoqXG4gICAgICogQWRkIGFuIGV2ZW50IGhhbmRsZXIgdG8gYmUgdHJpZ2dlcmVkIG9ubHkgb25jZSAob3IgYSBnaXZlbiBudW1iZXIgb2YgdGltZXMpXG4gICAgICogZm9yIGEgZ2l2ZW4gZXZlbnQuXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50TmFtZSAtIE5hbWUgb2YgZXZlbnQgdG8gcmVnaXN0ZXIuXG4gICAgICogQHBhcmFtIHtPcGVuU2VhZHJhZ29uLkV2ZW50SGFuZGxlcn0gaGFuZGxlciAtIEZ1bmN0aW9uIHRvIGNhbGwgd2hlbiBldmVudFxuICAgICAqIGlzIHRyaWdnZXJlZC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW3VzZXJEYXRhPW51bGxdIC0gQXJiaXRyYXJ5IG9iamVjdCB0byBiZSBwYXNzZWQgdW5jaGFuZ2VkXG4gICAgICogdG8gdGhlIGhhbmRsZXIuXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IFt0aW1lcz0xXSAtIFRoZSBudW1iZXIgb2YgdGltZXMgdG8gaGFuZGxlIHRoZSBldmVudFxuICAgICAqIGJlZm9yZSByZW1vdmluZyBpdC5cbiAgICAgKi9cbiAgICBhZGRPbmNlSGFuZGxlcjogZnVuY3Rpb24oZXZlbnROYW1lLCBoYW5kbGVyLCB1c2VyRGF0YSwgdGltZXMpIHtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICB0aW1lcyA9IHRpbWVzIHx8IDE7XG4gICAgICAgIHZhciBjb3VudCA9IDA7XG4gICAgICAgIHZhciBvbmNlSGFuZGxlciA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgICBjb3VudCsrO1xuICAgICAgICAgICAgaWYgKGNvdW50ID09PSB0aW1lcykge1xuICAgICAgICAgICAgICAgIHNlbGYucmVtb3ZlSGFuZGxlcihldmVudE5hbWUsIG9uY2VIYW5kbGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGhhbmRsZXIoZXZlbnQpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmFkZEhhbmRsZXIoZXZlbnROYW1lLCBvbmNlSGFuZGxlciwgdXNlckRhdGEpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBBZGQgYW4gZXZlbnQgaGFuZGxlciBmb3IgYSBnaXZlbiBldmVudC5cbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gZXZlbnROYW1lIC0gTmFtZSBvZiBldmVudCB0byByZWdpc3Rlci5cbiAgICAgKiBAcGFyYW0ge09wZW5TZWFkcmFnb24uRXZlbnRIYW5kbGVyfSBoYW5kbGVyIC0gRnVuY3Rpb24gdG8gY2FsbCB3aGVuIGV2ZW50IGlzIHRyaWdnZXJlZC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW3VzZXJEYXRhPW51bGxdIC0gQXJiaXRyYXJ5IG9iamVjdCB0byBiZSBwYXNzZWQgdW5jaGFuZ2VkIHRvIHRoZSBoYW5kbGVyLlxuICAgICAqL1xuICAgIGFkZEhhbmRsZXI6IGZ1bmN0aW9uICggZXZlbnROYW1lLCBoYW5kbGVyLCB1c2VyRGF0YSApIHtcbiAgICAgICAgdmFyIGV2ZW50cyA9IHRoaXMuZXZlbnRzWyBldmVudE5hbWUgXTtcbiAgICAgICAgaWYgKCAhZXZlbnRzICkge1xuICAgICAgICAgICAgdGhpcy5ldmVudHNbIGV2ZW50TmFtZSBdID0gZXZlbnRzID0gW107XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCBoYW5kbGVyICYmICQuaXNGdW5jdGlvbiggaGFuZGxlciApICkge1xuICAgICAgICAgICAgZXZlbnRzWyBldmVudHMubGVuZ3RoIF0gPSB7IGhhbmRsZXI6IGhhbmRsZXIsIHVzZXJEYXRhOiB1c2VyRGF0YSB8fCBudWxsIH07XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGEgc3BlY2lmaWMgZXZlbnQgaGFuZGxlciBmb3IgYSBnaXZlbiBldmVudC5cbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gZXZlbnROYW1lIC0gTmFtZSBvZiBldmVudCBmb3Igd2hpY2ggdGhlIGhhbmRsZXIgaXMgdG8gYmUgcmVtb3ZlZC5cbiAgICAgKiBAcGFyYW0ge09wZW5TZWFkcmFnb24uRXZlbnRIYW5kbGVyfSBoYW5kbGVyIC0gRnVuY3Rpb24gdG8gYmUgcmVtb3ZlZC5cbiAgICAgKi9cbiAgICByZW1vdmVIYW5kbGVyOiBmdW5jdGlvbiAoIGV2ZW50TmFtZSwgaGFuZGxlciApIHtcbiAgICAgICAgdmFyIGV2ZW50cyA9IHRoaXMuZXZlbnRzWyBldmVudE5hbWUgXSxcbiAgICAgICAgICAgIGhhbmRsZXJzID0gW10sXG4gICAgICAgICAgICBpO1xuICAgICAgICBpZiAoICFldmVudHMgKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCAkLmlzQXJyYXkoIGV2ZW50cyApICkge1xuICAgICAgICAgICAgZm9yICggaSA9IDA7IGkgPCBldmVudHMubGVuZ3RoOyBpKysgKSB7XG4gICAgICAgICAgICAgICAgaWYgKCBldmVudHNbaV0uaGFuZGxlciAhPT0gaGFuZGxlciApIHtcbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlcnMucHVzaCggZXZlbnRzWyBpIF0gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmV2ZW50c1sgZXZlbnROYW1lIF0gPSBoYW5kbGVycztcbiAgICAgICAgfVxuICAgIH0sXG5cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBhbGwgZXZlbnQgaGFuZGxlcnMgZm9yIGEgZ2l2ZW4gZXZlbnQgdHlwZS4gSWYgbm8gdHlwZSBpcyBnaXZlbiBhbGxcbiAgICAgKiBldmVudCBoYW5kbGVycyBmb3IgZXZlcnkgZXZlbnQgdHlwZSBhcmUgcmVtb3ZlZC5cbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gZXZlbnROYW1lIC0gTmFtZSBvZiBldmVudCBmb3Igd2hpY2ggYWxsIGhhbmRsZXJzIGFyZSB0byBiZSByZW1vdmVkLlxuICAgICAqL1xuICAgIHJlbW92ZUFsbEhhbmRsZXJzOiBmdW5jdGlvbiggZXZlbnROYW1lICkge1xuICAgICAgICBpZiAoIGV2ZW50TmFtZSApe1xuICAgICAgICAgICAgdGhpcy5ldmVudHNbIGV2ZW50TmFtZSBdID0gW107XG4gICAgICAgIH0gZWxzZXtcbiAgICAgICAgICAgIGZvciAoIHZhciBldmVudFR5cGUgaW4gdGhpcy5ldmVudHMgKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ldmVudHNbIGV2ZW50VHlwZSBdID0gW107XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2V0IGEgZnVuY3Rpb24gd2hpY2ggaXRlcmF0ZXMgdGhlIGxpc3Qgb2YgYWxsIGhhbmRsZXJzIHJlZ2lzdGVyZWQgZm9yIGEgZ2l2ZW4gZXZlbnQsIGNhbGxpbmcgdGhlIGhhbmRsZXIgZm9yIGVhY2guXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50TmFtZSAtIE5hbWUgb2YgZXZlbnQgdG8gZ2V0IGhhbmRsZXJzIGZvci5cbiAgICAgKi9cbiAgICBnZXRIYW5kbGVyOiBmdW5jdGlvbiAoIGV2ZW50TmFtZSApIHtcbiAgICAgICAgdmFyIGV2ZW50cyA9IHRoaXMuZXZlbnRzWyBldmVudE5hbWUgXTtcbiAgICAgICAgaWYgKCAhZXZlbnRzIHx8ICFldmVudHMubGVuZ3RoICkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgZXZlbnRzID0gZXZlbnRzLmxlbmd0aCA9PT0gMSA/XG4gICAgICAgICAgICBbIGV2ZW50c1sgMCBdIF0gOlxuICAgICAgICAgICAgQXJyYXkuYXBwbHkoIG51bGwsIGV2ZW50cyApO1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCBzb3VyY2UsIGFyZ3MgKSB7XG4gICAgICAgICAgICB2YXIgaSxcbiAgICAgICAgICAgICAgICBsZW5ndGggPSBldmVudHMubGVuZ3RoO1xuICAgICAgICAgICAgZm9yICggaSA9IDA7IGkgPCBsZW5ndGg7IGkrKyApIHtcbiAgICAgICAgICAgICAgICBpZiAoIGV2ZW50c1sgaSBdICkge1xuICAgICAgICAgICAgICAgICAgICBhcmdzLmV2ZW50U291cmNlID0gc291cmNlO1xuICAgICAgICAgICAgICAgICAgICBhcmdzLnVzZXJEYXRhID0gZXZlbnRzWyBpIF0udXNlckRhdGE7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50c1sgaSBdLmhhbmRsZXIoIGFyZ3MgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFRyaWdnZXIgYW4gZXZlbnQsIG9wdGlvbmFsbHkgcGFzc2luZyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBldmVudE5hbWUgLSBOYW1lIG9mIGV2ZW50IHRvIHJlZ2lzdGVyLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudEFyZ3MgLSBFdmVudC1zcGVjaWZpYyBkYXRhLlxuICAgICAqL1xuICAgIHJhaXNlRXZlbnQ6IGZ1bmN0aW9uKCBldmVudE5hbWUsIGV2ZW50QXJncyApIHtcbiAgICAgICAgLy91bmNvbW1lbnQgaWYgeW91IHdhbnQgdG8gZ2V0IGEgbG9nIG9mIGFsbCBldmVudHNcbiAgICAgICAgLy8kLmNvbnNvbGUubG9nKCBldmVudE5hbWUgKTtcbiAgICAgICAgdmFyIGhhbmRsZXIgPSB0aGlzLmdldEhhbmRsZXIoIGV2ZW50TmFtZSApO1xuXG4gICAgICAgIGlmICggaGFuZGxlciApIHtcbiAgICAgICAgICAgIGlmICggIWV2ZW50QXJncyApIHtcbiAgICAgICAgICAgICAgICBldmVudEFyZ3MgPSB7fTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaGFuZGxlciggdGhpcywgZXZlbnRBcmdzICk7XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG59KCBPcGVuU2VhZHJhZ29uICkpO1xuXG4vKlxuICogT3BlblNlYWRyYWdvbiAtIE1vdXNlVHJhY2tlclxuICpcbiAqIENvcHlyaWdodCAoQykgMjAwOSBDb2RlUGxleCBGb3VuZGF0aW9uXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMyBPcGVuU2VhZHJhZ29uIGNvbnRyaWJ1dG9yc1xuICpcbiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZVxuICogbWV0OlxuICpcbiAqIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuICogICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuICpcbiAqIC0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHRcbiAqICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZVxuICogICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuICpcbiAqIC0gTmVpdGhlciB0aGUgbmFtZSBvZiBDb2RlUGxleCBGb3VuZGF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzXG4gKiAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tXG4gKiAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4gKlxuICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SU1xuICogXCJBUyBJU1wiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVFxuICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SXG4gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFRcbiAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLFxuICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEXG4gKiBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SXG4gKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElOR1xuICogTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTXG4gKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiAqL1xuXG4oZnVuY3Rpb24gKCAkICkge1xuXG4gICAgLy8gQWxsIE1vdXNlVHJhY2tlciBpbnN0YW5jZXNcbiAgICB2YXIgTU9VU0VUUkFDS0VSUyAgPSBbXTtcblxuICAgIC8vIGRpY3Rpb25hcnkgZnJvbSBoYXNoIHRvIHByaXZhdGUgcHJvcGVydGllc1xuICAgIHZhciBUSElTICAgICAgICAgICA9IHt9O1xuXG5cbiAgICAvKipcbiAgICAgKiBAY2xhc3MgTW91c2VUcmFja2VyXG4gICAgICogQGNsYXNzZGVzYyBQcm92aWRlcyBzaW1wbGlmaWVkIGhhbmRsaW5nIG9mIGNvbW1vbiBwb2ludGVyIGRldmljZSAobW91c2UsIHRvdWNoLCBwZW4sIGV0Yy4pIGdlc3R1cmVzXG4gICAgICogICAgICAgICAgICBhbmQga2V5Ym9hcmQgZXZlbnRzIG9uIGEgc3BlY2lmaWVkIGVsZW1lbnQuXG4gICAgICogQG1lbWJlcm9mIE9wZW5TZWFkcmFnb25cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICAgICAqICAgICAgQWxsb3dzIGNvbmZpZ3VyYWJsZSBwcm9wZXJ0aWVzIHRvIGJlIGVudGlyZWx5IHNwZWNpZmllZCBieSBwYXNzaW5nXG4gICAgICogICAgICBhbiBvcHRpb25zIG9iamVjdCB0byB0aGUgY29uc3RydWN0b3IuICBUaGUgY29uc3RydWN0b3IgYWxzbyBzdXBwb3J0c1xuICAgICAqICAgICAgdGhlIG9yaWdpbmFsIHBvc2l0aW9uYWwgYXJndW1lbnRzICdlbGVtZW50JywgJ2NsaWNrVGltZVRocmVzaG9sZCcsXG4gICAgICogICAgICBhbmQgJ2NsaWNrRGlzdFRocmVzaG9sZCcgaW4gdGhhdCBvcmRlci5cbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR8U3RyaW5nfSBvcHRpb25zLmVsZW1lbnRcbiAgICAgKiAgICAgIEEgcmVmZXJlbmNlIHRvIGFuIGVsZW1lbnQgb3IgYW4gZWxlbWVudCBpZCBmb3Igd2hpY2ggdGhlIHBvaW50ZXIva2V5XG4gICAgICogICAgICBldmVudHMgd2lsbCBiZSBtb25pdG9yZWQuXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5zdGFydERpc2FibGVkPWZhbHNlXVxuICAgICAqICAgICAgSWYgdHJ1ZSwgZXZlbnQgdHJhY2tpbmcgb24gdGhlIGVsZW1lbnQgd2lsbCBub3Qgc3RhcnQgdW50aWxcbiAgICAgKiAgICAgIHtAbGluayBPcGVuU2VhZHJhZ29uLk1vdXNlVHJhY2tlci5zZXRUcmFja2luZ3xzZXRUcmFja2luZ30gaXMgY2FsbGVkLlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBvcHRpb25zLmNsaWNrVGltZVRocmVzaG9sZFxuICAgICAqICAgICAgVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgd2l0aGluIHdoaWNoIGEgcG9pbnRlciBkb3duLXVwIGV2ZW50IGNvbWJpbmF0aW9uXG4gICAgICogICAgICB3aWxsIGJlIHRyZWF0ZWQgYXMgYSBjbGljayBnZXN0dXJlLlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBvcHRpb25zLmNsaWNrRGlzdFRocmVzaG9sZFxuICAgICAqICAgICAgVGhlIG1heGltdW0gZGlzdGFuY2UgYWxsb3dlZCBiZXR3ZWVuIGEgcG9pbnRlciBkb3duIGV2ZW50IGFuZCBhIHBvaW50ZXIgdXAgZXZlbnRcbiAgICAgKiAgICAgIHRvIGJlIHRyZWF0ZWQgYXMgYSBjbGljayBnZXN0dXJlLlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBvcHRpb25zLmRibENsaWNrVGltZVRocmVzaG9sZFxuICAgICAqICAgICAgVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgd2l0aGluIHdoaWNoIHR3byBwb2ludGVyIGRvd24tdXAgZXZlbnQgY29tYmluYXRpb25zXG4gICAgICogICAgICB3aWxsIGJlIHRyZWF0ZWQgYXMgYSBkb3VibGUtY2xpY2sgZ2VzdHVyZS5cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gb3B0aW9ucy5kYmxDbGlja0Rpc3RUaHJlc2hvbGRcbiAgICAgKiAgICAgIFRoZSBtYXhpbXVtIGRpc3RhbmNlIGFsbG93ZWQgYmV0d2VlbiB0d28gcG9pbnRlciBjbGljayBldmVudHNcbiAgICAgKiAgICAgIHRvIGJlIHRyZWF0ZWQgYXMgYSBjbGljayBnZXN0dXJlLlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5zdG9wRGVsYXk9NTBdXG4gICAgICogICAgICBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB3aXRob3V0IHBvaW50ZXIgbW92ZSBiZWZvcmUgdGhlIHN0b3BcbiAgICAgKiAgICAgIGV2ZW50IGlzIGZpcmVkLlxuICAgICAqIEBwYXJhbSB7T3BlblNlYWRyYWdvbi5FdmVudEhhbmRsZXJ9IFtvcHRpb25zLmVudGVySGFuZGxlcj1udWxsXVxuICAgICAqICAgICAgQW4gb3B0aW9uYWwgaGFuZGxlciBmb3IgcG9pbnRlciBlbnRlci5cbiAgICAgKiBAcGFyYW0ge09wZW5TZWFkcmFnb24uRXZlbnRIYW5kbGVyfSBbb3B0aW9ucy5leGl0SGFuZGxlcj1udWxsXVxuICAgICAqICAgICAgQW4gb3B0aW9uYWwgaGFuZGxlciBmb3IgcG9pbnRlciBleGl0LlxuICAgICAqIEBwYXJhbSB7T3BlblNlYWRyYWdvbi5FdmVudEhhbmRsZXJ9IFtvcHRpb25zLnByZXNzSGFuZGxlcj1udWxsXVxuICAgICAqICAgICAgQW4gb3B0aW9uYWwgaGFuZGxlciBmb3IgcG9pbnRlciBwcmVzcy5cbiAgICAgKiBAcGFyYW0ge09wZW5TZWFkcmFnb24uRXZlbnRIYW5kbGVyfSBbb3B0aW9ucy5ub25QcmltYXJ5UHJlc3NIYW5kbGVyPW51bGxdXG4gICAgICogICAgICBBbiBvcHRpb25hbCBoYW5kbGVyIGZvciBwb2ludGVyIG5vbi1wcmltYXJ5IGJ1dHRvbiBwcmVzcy5cbiAgICAgKiBAcGFyYW0ge09wZW5TZWFkcmFnb24uRXZlbnRIYW5kbGVyfSBbb3B0aW9ucy5yZWxlYXNlSGFuZGxlcj1udWxsXVxuICAgICAqICAgICAgQW4gb3B0aW9uYWwgaGFuZGxlciBmb3IgcG9pbnRlciByZWxlYXNlLlxuICAgICAqIEBwYXJhbSB7T3BlblNlYWRyYWdvbi5FdmVudEhhbmRsZXJ9IFtvcHRpb25zLm5vblByaW1hcnlSZWxlYXNlSGFuZGxlcj1udWxsXVxuICAgICAqICAgICAgQW4gb3B0aW9uYWwgaGFuZGxlciBmb3IgcG9pbnRlciBub24tcHJpbWFyeSBidXR0b24gcmVsZWFzZS5cbiAgICAgKiBAcGFyYW0ge09wZW5TZWFkcmFnb24uRXZlbnRIYW5kbGVyfSBbb3B0aW9ucy5tb3ZlSGFuZGxlcj1udWxsXVxuICAgICAqICAgICAgQW4gb3B0aW9uYWwgaGFuZGxlciBmb3IgcG9pbnRlciBtb3ZlLlxuICAgICAqIEBwYXJhbSB7T3BlblNlYWRyYWdvbi5FdmVudEhhbmRsZXJ9IFtvcHRpb25zLnNjcm9sbEhhbmRsZXI9bnVsbF1cbiAgICAgKiAgICAgIEFuIG9wdGlvbmFsIGhhbmRsZXIgZm9yIG1vdXNlIHdoZWVsIHNjcm9sbC5cbiAgICAgKiBAcGFyYW0ge09wZW5TZWFkcmFnb24uRXZlbnRIYW5kbGVyfSBbb3B0aW9ucy5jbGlja0hhbmRsZXI9bnVsbF1cbiAgICAgKiAgICAgIEFuIG9wdGlvbmFsIGhhbmRsZXIgZm9yIHBvaW50ZXIgY2xpY2suXG4gICAgICogQHBhcmFtIHtPcGVuU2VhZHJhZ29uLkV2ZW50SGFuZGxlcn0gW29wdGlvbnMuZGJsQ2xpY2tIYW5kbGVyPW51bGxdXG4gICAgICogICAgICBBbiBvcHRpb25hbCBoYW5kbGVyIGZvciBwb2ludGVyIGRvdWJsZS1jbGljay5cbiAgICAgKiBAcGFyYW0ge09wZW5TZWFkcmFnb24uRXZlbnRIYW5kbGVyfSBbb3B0aW9ucy5kcmFnSGFuZGxlcj1udWxsXVxuICAgICAqICAgICAgQW4gb3B0aW9uYWwgaGFuZGxlciBmb3IgdGhlIGRyYWcgZ2VzdHVyZS5cbiAgICAgKiBAcGFyYW0ge09wZW5TZWFkcmFnb24uRXZlbnRIYW5kbGVyfSBbb3B0aW9ucy5kcmFnRW5kSGFuZGxlcj1udWxsXVxuICAgICAqICAgICAgQW4gb3B0aW9uYWwgaGFuZGxlciBmb3IgYWZ0ZXIgYSBkcmFnIGdlc3R1cmUuXG4gICAgICogQHBhcmFtIHtPcGVuU2VhZHJhZ29uLkV2ZW50SGFuZGxlcn0gW29wdGlvbnMucGluY2hIYW5kbGVyPW51bGxdXG4gICAgICogICAgICBBbiBvcHRpb25hbCBoYW5kbGVyIGZvciB0aGUgcGluY2ggZ2VzdHVyZS5cbiAgICAgKiBAcGFyYW0ge09wZW5TZWFkcmFnb24uRXZlbnRIYW5kbGVyfSBbb3B0aW9ucy5rZXlEb3duSGFuZGxlcj1udWxsXVxuICAgICAqICAgICAgQW4gb3B0aW9uYWwgaGFuZGxlciBmb3Iga2V5ZG93bi5cbiAgICAgKiBAcGFyYW0ge09wZW5TZWFkcmFnb24uRXZlbnRIYW5kbGVyfSBbb3B0aW9ucy5rZXlVcEhhbmRsZXI9bnVsbF1cbiAgICAgKiAgICAgIEFuIG9wdGlvbmFsIGhhbmRsZXIgZm9yIGtleXVwLlxuICAgICAqIEBwYXJhbSB7T3BlblNlYWRyYWdvbi5FdmVudEhhbmRsZXJ9IFtvcHRpb25zLmtleUhhbmRsZXI9bnVsbF1cbiAgICAgKiAgICAgIEFuIG9wdGlvbmFsIGhhbmRsZXIgZm9yIGtleXByZXNzLlxuICAgICAqIEBwYXJhbSB7T3BlblNlYWRyYWdvbi5FdmVudEhhbmRsZXJ9IFtvcHRpb25zLmZvY3VzSGFuZGxlcj1udWxsXVxuICAgICAqICAgICAgQW4gb3B0aW9uYWwgaGFuZGxlciBmb3IgZm9jdXMuXG4gICAgICogQHBhcmFtIHtPcGVuU2VhZHJhZ29uLkV2ZW50SGFuZGxlcn0gW29wdGlvbnMuYmx1ckhhbmRsZXI9bnVsbF1cbiAgICAgKiAgICAgIEFuIG9wdGlvbmFsIGhhbmRsZXIgZm9yIGJsdXIuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLnVzZXJEYXRhPW51bGxdXG4gICAgICogICAgICBBcmJpdHJhcnkgb2JqZWN0IHRvIGJlIHBhc3NlZCB1bmNoYW5nZWQgdG8gYW55IGF0dGFjaGVkIGhhbmRsZXIgbWV0aG9kcy5cbiAgICAgKi9cbiAgICAkLk1vdXNlVHJhY2tlciA9IGZ1bmN0aW9uICggb3B0aW9ucyApIHtcblxuICAgICAgICBNT1VTRVRSQUNLRVJTLnB1c2goIHRoaXMgKTtcblxuICAgICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cztcblxuICAgICAgICBpZiAoICEkLmlzUGxhaW5PYmplY3QoIG9wdGlvbnMgKSApIHtcbiAgICAgICAgICAgIG9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudDogICAgICAgICAgICBhcmdzWyAwIF0sXG4gICAgICAgICAgICAgICAgY2xpY2tUaW1lVGhyZXNob2xkOiBhcmdzWyAxIF0sXG4gICAgICAgICAgICAgICAgY2xpY2tEaXN0VGhyZXNob2xkOiBhcmdzWyAyIF1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmhhc2ggICAgICAgICAgICAgICA9IE1hdGgucmFuZG9tKCk7IC8vIEFuIHVuaXF1ZSBoYXNoIGZvciB0aGlzIHRyYWNrZXIuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgZWxlbWVudCBmb3Igd2hpY2ggcG9pbnRlciBldmVudHMgYXJlIGJlaW5nIG1vbml0b3JlZC5cbiAgICAgICAgICogQG1lbWJlciB7RWxlbWVudH0gZWxlbWVudFxuICAgICAgICAgKiBAbWVtYmVyb2YgT3BlblNlYWRyYWdvbi5Nb3VzZVRyYWNrZXIjXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmVsZW1lbnQgICAgICAgICAgICA9ICQuZ2V0RWxlbWVudCggb3B0aW9ucy5lbGVtZW50ICk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB3aXRoaW4gd2hpY2ggYSBwb2ludGVyIGRvd24tdXAgZXZlbnQgY29tYmluYXRpb25cbiAgICAgICAgICogd2lsbCBiZSB0cmVhdGVkIGFzIGEgY2xpY2sgZ2VzdHVyZS5cbiAgICAgICAgICogQG1lbWJlciB7TnVtYmVyfSBjbGlja1RpbWVUaHJlc2hvbGRcbiAgICAgICAgICogQG1lbWJlcm9mIE9wZW5TZWFkcmFnb24uTW91c2VUcmFja2VyI1xuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jbGlja1RpbWVUaHJlc2hvbGQgPSBvcHRpb25zLmNsaWNrVGltZVRocmVzaG9sZCB8fCAkLkRFRkFVTFRfU0VUVElOR1MuY2xpY2tUaW1lVGhyZXNob2xkO1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIG1heGltdW0gZGlzdGFuY2UgYWxsb3dlZCBiZXR3ZWVuIGEgcG9pbnRlciBkb3duIGV2ZW50IGFuZCBhIHBvaW50ZXIgdXAgZXZlbnRcbiAgICAgICAgICogdG8gYmUgdHJlYXRlZCBhcyBhIGNsaWNrIGdlc3R1cmUuXG4gICAgICAgICAqIEBtZW1iZXIge051bWJlcn0gY2xpY2tEaXN0VGhyZXNob2xkXG4gICAgICAgICAqIEBtZW1iZXJvZiBPcGVuU2VhZHJhZ29uLk1vdXNlVHJhY2tlciNcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuY2xpY2tEaXN0VGhyZXNob2xkID0gb3B0aW9ucy5jbGlja0Rpc3RUaHJlc2hvbGQgfHwgJC5ERUZBVUxUX1NFVFRJTkdTLmNsaWNrRGlzdFRocmVzaG9sZDtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHdpdGhpbiB3aGljaCB0d28gcG9pbnRlciBkb3duLXVwIGV2ZW50IGNvbWJpbmF0aW9uc1xuICAgICAgICAgKiB3aWxsIGJlIHRyZWF0ZWQgYXMgYSBkb3VibGUtY2xpY2sgZ2VzdHVyZS5cbiAgICAgICAgICogQG1lbWJlciB7TnVtYmVyfSBkYmxDbGlja1RpbWVUaHJlc2hvbGRcbiAgICAgICAgICogQG1lbWJlcm9mIE9wZW5TZWFkcmFnb24uTW91c2VUcmFja2VyI1xuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5kYmxDbGlja1RpbWVUaHJlc2hvbGQgPSBvcHRpb25zLmRibENsaWNrVGltZVRocmVzaG9sZCB8fCAkLkRFRkFVTFRfU0VUVElOR1MuZGJsQ2xpY2tUaW1lVGhyZXNob2xkO1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIG1heGltdW0gZGlzdGFuY2UgYWxsb3dlZCBiZXR3ZWVuIHR3byBwb2ludGVyIGNsaWNrIGV2ZW50c1xuICAgICAgICAgKiB0byBiZSB0cmVhdGVkIGFzIGEgY2xpY2sgZ2VzdHVyZS5cbiAgICAgICAgICogQG1lbWJlciB7TnVtYmVyfSBjbGlja0Rpc3RUaHJlc2hvbGRcbiAgICAgICAgICogQG1lbWJlcm9mIE9wZW5TZWFkcmFnb24uTW91c2VUcmFja2VyI1xuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5kYmxDbGlja0Rpc3RUaHJlc2hvbGQgPSBvcHRpb25zLmRibENsaWNrRGlzdFRocmVzaG9sZCB8fCAkLkRFRkFVTFRfU0VUVElOR1MuZGJsQ2xpY2tEaXN0VGhyZXNob2xkO1xuICAgICAgICB0aGlzLnVzZXJEYXRhICAgICAgICAgICAgICA9IG9wdGlvbnMudXNlckRhdGEgICAgICAgICAgfHwgbnVsbDtcbiAgICAgICAgdGhpcy5zdG9wRGVsYXkgICAgICAgICAgICAgPSBvcHRpb25zLnN0b3BEZWxheSAgICAgICAgIHx8IDUwO1xuXG4gICAgICAgIHRoaXMuZW50ZXJIYW5kbGVyICAgICAgICAgICAgID0gb3B0aW9ucy5lbnRlckhhbmRsZXIgICAgICAgICAgICAgfHwgbnVsbDtcbiAgICAgICAgdGhpcy5leGl0SGFuZGxlciAgICAgICAgICAgICAgPSBvcHRpb25zLmV4aXRIYW5kbGVyICAgICAgICAgICAgICB8fCBudWxsO1xuICAgICAgICB0aGlzLnByZXNzSGFuZGxlciAgICAgICAgICAgICA9IG9wdGlvbnMucHJlc3NIYW5kbGVyICAgICAgICAgICAgIHx8IG51bGw7XG4gICAgICAgIHRoaXMubm9uUHJpbWFyeVByZXNzSGFuZGxlciAgID0gb3B0aW9ucy5ub25QcmltYXJ5UHJlc3NIYW5kbGVyICAgfHwgbnVsbDtcbiAgICAgICAgdGhpcy5yZWxlYXNlSGFuZGxlciAgICAgICAgICAgPSBvcHRpb25zLnJlbGVhc2VIYW5kbGVyICAgICAgICAgICB8fCBudWxsO1xuICAgICAgICB0aGlzLm5vblByaW1hcnlSZWxlYXNlSGFuZGxlciA9IG9wdGlvbnMubm9uUHJpbWFyeVJlbGVhc2VIYW5kbGVyIHx8IG51bGw7XG4gICAgICAgIHRoaXMubW92ZUhhbmRsZXIgICAgICAgICAgICAgID0gb3B0aW9ucy5tb3ZlSGFuZGxlciAgICAgICAgICAgICAgfHwgbnVsbDtcbiAgICAgICAgdGhpcy5zY3JvbGxIYW5kbGVyICAgICAgICAgICAgPSBvcHRpb25zLnNjcm9sbEhhbmRsZXIgICAgICAgICAgICB8fCBudWxsO1xuICAgICAgICB0aGlzLmNsaWNrSGFuZGxlciAgICAgICAgICAgICA9IG9wdGlvbnMuY2xpY2tIYW5kbGVyICAgICAgICAgICAgIHx8IG51bGw7XG4gICAgICAgIHRoaXMuZGJsQ2xpY2tIYW5kbGVyICAgICAgICAgID0gb3B0aW9ucy5kYmxDbGlja0hhbmRsZXIgICAgICAgICAgfHwgbnVsbDtcbiAgICAgICAgdGhpcy5kcmFnSGFuZGxlciAgICAgICAgICAgICAgPSBvcHRpb25zLmRyYWdIYW5kbGVyICAgICAgICAgICAgICB8fCBudWxsO1xuICAgICAgICB0aGlzLmRyYWdFbmRIYW5kbGVyICAgICAgICAgICA9IG9wdGlvbnMuZHJhZ0VuZEhhbmRsZXIgICAgICAgICAgIHx8IG51bGw7XG4gICAgICAgIHRoaXMucGluY2hIYW5kbGVyICAgICAgICAgICAgID0gb3B0aW9ucy5waW5jaEhhbmRsZXIgICAgICAgICAgICAgfHwgbnVsbDtcbiAgICAgICAgdGhpcy5zdG9wSGFuZGxlciAgICAgICAgICAgICAgPSBvcHRpb25zLnN0b3BIYW5kbGVyICAgICAgICAgICAgICB8fCBudWxsO1xuICAgICAgICB0aGlzLmtleURvd25IYW5kbGVyICAgICAgICAgICA9IG9wdGlvbnMua2V5RG93bkhhbmRsZXIgICAgICAgICAgIHx8IG51bGw7XG4gICAgICAgIHRoaXMua2V5VXBIYW5kbGVyICAgICAgICAgICAgID0gb3B0aW9ucy5rZXlVcEhhbmRsZXIgICAgICAgICAgICAgfHwgbnVsbDtcbiAgICAgICAgdGhpcy5rZXlIYW5kbGVyICAgICAgICAgICAgICAgPSBvcHRpb25zLmtleUhhbmRsZXIgICAgICAgICAgICAgICB8fCBudWxsO1xuICAgICAgICB0aGlzLmZvY3VzSGFuZGxlciAgICAgICAgICAgICA9IG9wdGlvbnMuZm9jdXNIYW5kbGVyICAgICAgICAgICAgIHx8IG51bGw7XG4gICAgICAgIHRoaXMuYmx1ckhhbmRsZXIgICAgICAgICAgICAgID0gb3B0aW9ucy5ibHVySGFuZGxlciAgICAgICAgICAgICAgfHwgbnVsbDtcblxuICAgICAgICAvL1N0b3JlIHByaXZhdGUgcHJvcGVydGllcyBpbiBhIHNjb3BlIHNlYWxlZCBoYXNoIG1hcFxuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAcHJvcGVydHkge0Jvb2xlYW59IHRyYWNraW5nXG4gICAgICAgICAqICAgICAgQXJlIHdlIGN1cnJlbnRseSB0cmFja2luZyBwb2ludGVyIGV2ZW50cyBmb3IgdGhpcyBlbGVtZW50LlxuICAgICAgICAgKi9cbiAgICAgICAgVEhJU1sgdGhpcy5oYXNoIF0gPSB7XG4gICAgICAgICAgICBjbGljazogICAgICAgICAgICAgICAgIGZ1bmN0aW9uICggZXZlbnQgKSB7IG9uQ2xpY2soIF90aGlzLCBldmVudCApOyB9LFxuICAgICAgICAgICAgZGJsY2xpY2s6ICAgICAgICAgICAgICBmdW5jdGlvbiAoIGV2ZW50ICkgeyBvbkRibENsaWNrKCBfdGhpcywgZXZlbnQgKTsgfSxcbiAgICAgICAgICAgIGtleWRvd246ICAgICAgICAgICAgICAgZnVuY3Rpb24gKCBldmVudCApIHsgb25LZXlEb3duKCBfdGhpcywgZXZlbnQgKTsgfSxcbiAgICAgICAgICAgIGtleXVwOiAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKCBldmVudCApIHsgb25LZXlVcCggX3RoaXMsIGV2ZW50ICk7IH0sXG4gICAgICAgICAgICBrZXlwcmVzczogICAgICAgICAgICAgIGZ1bmN0aW9uICggZXZlbnQgKSB7IG9uS2V5UHJlc3MoIF90aGlzLCBldmVudCApOyB9LFxuICAgICAgICAgICAgZm9jdXM6ICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoIGV2ZW50ICkgeyBvbkZvY3VzKCBfdGhpcywgZXZlbnQgKTsgfSxcbiAgICAgICAgICAgIGJsdXI6ICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKCBldmVudCApIHsgb25CbHVyKCBfdGhpcywgZXZlbnQgKTsgfSxcblxuICAgICAgICAgICAgd2hlZWw6ICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoIGV2ZW50ICkgeyBvbldoZWVsKCBfdGhpcywgZXZlbnQgKTsgfSxcbiAgICAgICAgICAgIG1vdXNld2hlZWw6ICAgICAgICAgICAgZnVuY3Rpb24gKCBldmVudCApIHsgb25Nb3VzZVdoZWVsKCBfdGhpcywgZXZlbnQgKTsgfSxcbiAgICAgICAgICAgIERPTU1vdXNlU2Nyb2xsOiAgICAgICAgZnVuY3Rpb24gKCBldmVudCApIHsgb25Nb3VzZVdoZWVsKCBfdGhpcywgZXZlbnQgKTsgfSxcbiAgICAgICAgICAgIE1vek1vdXNlUGl4ZWxTY3JvbGw6ICAgZnVuY3Rpb24gKCBldmVudCApIHsgb25Nb3VzZVdoZWVsKCBfdGhpcywgZXZlbnQgKTsgfSxcblxuICAgICAgICAgICAgbW91c2VlbnRlcjogICAgICAgICAgICBmdW5jdGlvbiAoIGV2ZW50ICkgeyBvbk1vdXNlRW50ZXIoIF90aGlzLCBldmVudCApOyB9LCAvLyBVc2VkIG9uIElFOCBvbmx5XG4gICAgICAgICAgICBtb3VzZWxlYXZlOiAgICAgICAgICAgIGZ1bmN0aW9uICggZXZlbnQgKSB7IG9uTW91c2VMZWF2ZSggX3RoaXMsIGV2ZW50ICk7IH0sIC8vIFVzZWQgb24gSUU4IG9ubHlcbiAgICAgICAgICAgIG1vdXNlb3ZlcjogICAgICAgICAgICAgZnVuY3Rpb24gKCBldmVudCApIHsgb25Nb3VzZU92ZXIoIF90aGlzLCBldmVudCApOyB9LFxuICAgICAgICAgICAgbW91c2VvdXQ6ICAgICAgICAgICAgICBmdW5jdGlvbiAoIGV2ZW50ICkgeyBvbk1vdXNlT3V0KCBfdGhpcywgZXZlbnQgKTsgfSxcbiAgICAgICAgICAgIG1vdXNlZG93bjogICAgICAgICAgICAgZnVuY3Rpb24gKCBldmVudCApIHsgb25Nb3VzZURvd24oIF90aGlzLCBldmVudCApOyB9LFxuICAgICAgICAgICAgbW91c2V1cDogICAgICAgICAgICAgICBmdW5jdGlvbiAoIGV2ZW50ICkgeyBvbk1vdXNlVXAoIF90aGlzLCBldmVudCApOyB9LFxuICAgICAgICAgICAgbW91c2V1cGNhcHR1cmVkOiAgICAgICBmdW5jdGlvbiAoIGV2ZW50ICkgeyBvbk1vdXNlVXBDYXB0dXJlZCggX3RoaXMsIGV2ZW50ICk7IH0sXG4gICAgICAgICAgICBtb3VzZW1vdmU6ICAgICAgICAgICAgIGZ1bmN0aW9uICggZXZlbnQgKSB7IG9uTW91c2VNb3ZlKCBfdGhpcywgZXZlbnQgKTsgfSxcbiAgICAgICAgICAgIG1vdXNlbW92ZWNhcHR1cmVkOiAgICAgZnVuY3Rpb24gKCBldmVudCApIHsgb25Nb3VzZU1vdmVDYXB0dXJlZCggX3RoaXMsIGV2ZW50ICk7IH0sXG5cbiAgICAgICAgICAgIHRvdWNoc3RhcnQ6ICAgICAgICAgICAgZnVuY3Rpb24gKCBldmVudCApIHsgb25Ub3VjaFN0YXJ0KCBfdGhpcywgZXZlbnQgKTsgfSxcbiAgICAgICAgICAgIHRvdWNoZW5kOiAgICAgICAgICAgICAgZnVuY3Rpb24gKCBldmVudCApIHsgb25Ub3VjaEVuZCggX3RoaXMsIGV2ZW50ICk7IH0sXG4gICAgICAgICAgICB0b3VjaGVuZGNhcHR1cmVkOiAgICAgIGZ1bmN0aW9uICggZXZlbnQgKSB7IG9uVG91Y2hFbmRDYXB0dXJlZCggX3RoaXMsIGV2ZW50ICk7IH0sXG4gICAgICAgICAgICB0b3VjaG1vdmU6ICAgICAgICAgICAgIGZ1bmN0aW9uICggZXZlbnQgKSB7IG9uVG91Y2hNb3ZlKCBfdGhpcywgZXZlbnQgKTsgfSxcbiAgICAgICAgICAgIHRvdWNobW92ZWNhcHR1cmVkOiAgICAgZnVuY3Rpb24gKCBldmVudCApIHsgb25Ub3VjaE1vdmVDYXB0dXJlZCggX3RoaXMsIGV2ZW50ICk7IH0sXG4gICAgICAgICAgICB0b3VjaGNhbmNlbDogICAgICAgICAgIGZ1bmN0aW9uICggZXZlbnQgKSB7IG9uVG91Y2hDYW5jZWwoIF90aGlzLCBldmVudCApOyB9LFxuXG4gICAgICAgICAgICBnZXN0dXJlc3RhcnQ6ICAgICAgICAgIGZ1bmN0aW9uICggZXZlbnQgKSB7IG9uR2VzdHVyZVN0YXJ0KCBfdGhpcywgZXZlbnQgKTsgfSxcbiAgICAgICAgICAgIGdlc3R1cmVjaGFuZ2U6ICAgICAgICAgZnVuY3Rpb24gKCBldmVudCApIHsgb25HZXN0dXJlQ2hhbmdlKCBfdGhpcywgZXZlbnQgKTsgfSxcblxuICAgICAgICAgICAgcG9pbnRlcm92ZXI6ICAgICAgICAgICBmdW5jdGlvbiAoIGV2ZW50ICkgeyBvblBvaW50ZXJPdmVyKCBfdGhpcywgZXZlbnQgKTsgfSxcbiAgICAgICAgICAgIE1TUG9pbnRlck92ZXI6ICAgICAgICAgZnVuY3Rpb24gKCBldmVudCApIHsgb25Qb2ludGVyT3ZlciggX3RoaXMsIGV2ZW50ICk7IH0sXG4gICAgICAgICAgICBwb2ludGVyb3V0OiAgICAgICAgICAgIGZ1bmN0aW9uICggZXZlbnQgKSB7IG9uUG9pbnRlck91dCggX3RoaXMsIGV2ZW50ICk7IH0sXG4gICAgICAgICAgICBNU1BvaW50ZXJPdXQ6ICAgICAgICAgIGZ1bmN0aW9uICggZXZlbnQgKSB7IG9uUG9pbnRlck91dCggX3RoaXMsIGV2ZW50ICk7IH0sXG4gICAgICAgICAgICBwb2ludGVyZG93bjogICAgICAgICAgIGZ1bmN0aW9uICggZXZlbnQgKSB7IG9uUG9pbnRlckRvd24oIF90aGlzLCBldmVudCApOyB9LFxuICAgICAgICAgICAgTVNQb2ludGVyRG93bjogICAgICAgICBmdW5jdGlvbiAoIGV2ZW50ICkgeyBvblBvaW50ZXJEb3duKCBfdGhpcywgZXZlbnQgKTsgfSxcbiAgICAgICAgICAgIHBvaW50ZXJ1cDogICAgICAgICAgICAgZnVuY3Rpb24gKCBldmVudCApIHsgb25Qb2ludGVyVXAoIF90aGlzLCBldmVudCApOyB9LFxuICAgICAgICAgICAgTVNQb2ludGVyVXA6ICAgICAgICAgICBmdW5jdGlvbiAoIGV2ZW50ICkgeyBvblBvaW50ZXJVcCggX3RoaXMsIGV2ZW50ICk7IH0sXG4gICAgICAgICAgICBwb2ludGVybW92ZTogICAgICAgICAgIGZ1bmN0aW9uICggZXZlbnQgKSB7IG9uUG9pbnRlck1vdmUoIF90aGlzLCBldmVudCApOyB9LFxuICAgICAgICAgICAgTVNQb2ludGVyTW92ZTogICAgICAgICBmdW5jdGlvbiAoIGV2ZW50ICkgeyBvblBvaW50ZXJNb3ZlKCBfdGhpcywgZXZlbnQgKTsgfSxcbiAgICAgICAgICAgIHBvaW50ZXJjYW5jZWw6ICAgICAgICAgZnVuY3Rpb24gKCBldmVudCApIHsgb25Qb2ludGVyQ2FuY2VsKCBfdGhpcywgZXZlbnQgKTsgfSxcbiAgICAgICAgICAgIE1TUG9pbnRlckNhbmNlbDogICAgICAgZnVuY3Rpb24gKCBldmVudCApIHsgb25Qb2ludGVyQ2FuY2VsKCBfdGhpcywgZXZlbnQgKTsgfSxcbiAgICAgICAgICAgIHBvaW50ZXJ1cGNhcHR1cmVkOiAgICAgZnVuY3Rpb24gKCBldmVudCApIHsgb25Qb2ludGVyVXBDYXB0dXJlZCggX3RoaXMsIGV2ZW50ICk7IH0sXG4gICAgICAgICAgICBwb2ludGVybW92ZWNhcHR1cmVkOiAgIGZ1bmN0aW9uICggZXZlbnQgKSB7IG9uUG9pbnRlck1vdmVDYXB0dXJlZCggX3RoaXMsIGV2ZW50ICk7IH0sXG5cbiAgICAgICAgICAgIHRyYWNraW5nOiAgICAgICAgICAgICAgZmFsc2UsXG5cbiAgICAgICAgICAgIC8vIEFjdGl2ZSBwb2ludGVycyBsaXN0cy4gQXJyYXkgb2YgR2VzdHVyZVBvaW50TGlzdCBvYmplY3RzLCBvbmUgZm9yIGVhY2ggcG9pbnRlciBkZXZpY2UgdHlwZS5cbiAgICAgICAgICAgIC8vIEdlc3R1cmVQb2ludExpc3Qgb2JqZWN0cyBhcmUgYWRkZWQgZWFjaCB0aW1lIGEgcG9pbnRlciBpcyB0cmFja2VkIGJ5IGEgbmV3IHBvaW50ZXIgZGV2aWNlIHR5cGUgKHNlZSBnZXRBY3RpdmVQb2ludGVyc0xpc3RCeVR5cGUoKSkuXG4gICAgICAgICAgICAvLyBBY3RpdmUgcG9pbnRlcnMgYXJlIGFueSBwb2ludGVyIGJlaW5nIHRyYWNrZWQgZm9yIHRoaXMgZWxlbWVudCB3aGljaCBhcmUgaW4gdGhlIGhpdC10ZXN0IGFyZWFcbiAgICAgICAgICAgIC8vICAgICBvZiB0aGUgZWxlbWVudCAoZm9yIGhvdmVyLWNhcGFibGUgZGV2aWNlcykgYW5kL29yIGhhdmUgY29udGFjdCBvciBhIGJ1dHRvbiBwcmVzcyBpbml0aWF0ZWQgaW4gdGhlIGVsZW1lbnQuXG4gICAgICAgICAgICBhY3RpdmVQb2ludGVyc0xpc3RzOiAgIFtdLFxuXG4gICAgICAgICAgICAvLyBUcmFja2luZyBmb3IgZG91YmxlLWNsaWNrIGdlc3R1cmVcbiAgICAgICAgICAgIGxhc3RDbGlja1BvczogICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIGRibENsaWNrVGltZU91dDogICAgICAgbnVsbCxcblxuICAgICAgICAgICAgLy8gVHJhY2tpbmcgZm9yIHBpbmNoIGdlc3R1cmVcbiAgICAgICAgICAgIHBpbmNoR1BvaW50czogICAgICAgICAgW10sXG4gICAgICAgICAgICBsYXN0UGluY2hEaXN0OiAgICAgICAgIDAsXG4gICAgICAgICAgICBjdXJyZW50UGluY2hEaXN0OiAgICAgIDAsXG4gICAgICAgICAgICBsYXN0UGluY2hDZW50ZXI6ICAgICAgIG51bGwsXG4gICAgICAgICAgICBjdXJyZW50UGluY2hDZW50ZXI6ICAgIG51bGxcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoICFvcHRpb25zLnN0YXJ0RGlzYWJsZWQgKSB7XG4gICAgICAgICAgICB0aGlzLnNldFRyYWNraW5nKCB0cnVlICk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqIEBsZW5kcyBPcGVuU2VhZHJhZ29uLk1vdXNlVHJhY2tlci5wcm90b3R5cGUgKi9cbiAgICAkLk1vdXNlVHJhY2tlci5wcm90b3R5cGUgPSB7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIENsZWFuIHVwIGFueSBldmVudHMgb3Igb2JqZWN0cyBjcmVhdGVkIGJ5IHRoZSB0cmFja2VyLlxuICAgICAgICAgKiBAZnVuY3Rpb25cbiAgICAgICAgICovXG4gICAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBpO1xuXG4gICAgICAgICAgICBzdG9wVHJhY2tpbmcoIHRoaXMgKTtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudCA9IG51bGw7XG5cbiAgICAgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgTU9VU0VUUkFDS0VSUy5sZW5ndGg7IGkrKyApIHtcbiAgICAgICAgICAgICAgICBpZiAoIE1PVVNFVFJBQ0tFUlNbIGkgXSA9PT0gdGhpcyApIHtcbiAgICAgICAgICAgICAgICAgICAgTU9VU0VUUkFDS0VSUy5zcGxpY2UoIGksIDEgKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBUSElTWyB0aGlzLmhhc2ggXSA9IG51bGw7XG4gICAgICAgICAgICBkZWxldGUgVEhJU1sgdGhpcy5oYXNoIF07XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFyZSB3ZSBjdXJyZW50bHkgdHJhY2tpbmcgZXZlbnRzIG9uIHRoaXMgZWxlbWVudC5cbiAgICAgICAgICogQGRlcHJlY2F0ZWQgSnVzdCB1c2UgdGhpcy50cmFja2luZ1xuICAgICAgICAgKiBAZnVuY3Rpb25cbiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IEFyZSB3ZSBjdXJyZW50bHkgdHJhY2tpbmcgZXZlbnRzIG9uIHRoaXMgZWxlbWVudC5cbiAgICAgICAgICovXG4gICAgICAgIGlzVHJhY2tpbmc6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBUSElTWyB0aGlzLmhhc2ggXS50cmFja2luZztcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogRW5hYmxlIG9yIGRpc2FibGUgd2hldGhlciBvciBub3Qgd2UgYXJlIHRyYWNraW5nIGV2ZW50cyBvbiB0aGlzIGVsZW1lbnQuXG4gICAgICAgICAqIEBmdW5jdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IHRyYWNrIFRydWUgdG8gc3RhcnQgdHJhY2tpbmcsIGZhbHNlIHRvIHN0b3AgdHJhY2tpbmcuXG4gICAgICAgICAqIEByZXR1cm5zIHtPcGVuU2VhZHJhZ29uLk1vdXNlVHJhY2tlcn0gQ2hhaW5hYmxlLlxuICAgICAgICAgKi9cbiAgICAgICAgc2V0VHJhY2tpbmc6IGZ1bmN0aW9uICggdHJhY2sgKSB7XG4gICAgICAgICAgICBpZiAoIHRyYWNrICkge1xuICAgICAgICAgICAgICAgIHN0YXJ0VHJhY2tpbmcoIHRoaXMgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc3RvcFRyYWNraW5nKCB0aGlzICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvL2NoYWluXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyB0aGUge0BsaW5rIE9wZW5TZWFkcmFnb24uTW91c2VUcmFja2VyLkdlc3R1cmVQb2ludExpc3R8R2VzdHVyZVBvaW50TGlzdH0gZm9yIHRoZSBnaXZlbiBwb2ludGVyIGRldmljZSB0eXBlLFxuICAgICAgICAgKiBjcmVhdGluZyBhbmQgY2FjaGluZyBhIG5ldyB7QGxpbmsgT3BlblNlYWRyYWdvbi5Nb3VzZVRyYWNrZXIuR2VzdHVyZVBvaW50TGlzdHxHZXN0dXJlUG9pbnRMaXN0fSBpZiBvbmUgZG9lc24ndCBhbHJlYWR5IGV4aXN0IGZvciB0aGUgdHlwZS5cbiAgICAgICAgICogQGZ1bmN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIC0gVGhlIHBvaW50ZXIgZGV2aWNlIHR5cGU6IFwibW91c2VcIiwgXCJ0b3VjaFwiLCBcInBlblwiLCBldGMuXG4gICAgICAgICAqIEByZXR1cm5zIHtPcGVuU2VhZHJhZ29uLk1vdXNlVHJhY2tlci5HZXN0dXJlUG9pbnRMaXN0fVxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0QWN0aXZlUG9pbnRlcnNMaXN0QnlUeXBlOiBmdW5jdGlvbiAoIHR5cGUgKSB7XG4gICAgICAgICAgICB2YXIgZGVsZWdhdGUgPSBUSElTWyB0aGlzLmhhc2ggXSxcbiAgICAgICAgICAgICAgICBpLFxuICAgICAgICAgICAgICAgIGxlbiA9IGRlbGVnYXRlLmFjdGl2ZVBvaW50ZXJzTGlzdHMubGVuZ3RoLFxuICAgICAgICAgICAgICAgIGxpc3Q7XG5cbiAgICAgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgbGVuOyBpKysgKSB7XG4gICAgICAgICAgICAgICAgaWYgKCBkZWxlZ2F0ZS5hY3RpdmVQb2ludGVyc0xpc3RzWyBpIF0udHlwZSA9PT0gdHlwZSApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmFjdGl2ZVBvaW50ZXJzTGlzdHNbIGkgXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxpc3QgPSBuZXcgJC5Nb3VzZVRyYWNrZXIuR2VzdHVyZVBvaW50TGlzdCggdHlwZSApO1xuICAgICAgICAgICAgZGVsZWdhdGUuYWN0aXZlUG9pbnRlcnNMaXN0cy5wdXNoKCBsaXN0ICk7XG4gICAgICAgICAgICByZXR1cm4gbGlzdDtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIHBvaW50ZXJzIGN1cnJlbnRseSBhY3RpdmUgb24gdGhlIHRyYWNrZWQgZWxlbWVudC5cbiAgICAgICAgICogQGZ1bmN0aW9uXG4gICAgICAgICAqIEByZXR1cm5zIHtOdW1iZXJ9XG4gICAgICAgICAqL1xuICAgICAgICBnZXRBY3RpdmVQb2ludGVyQ291bnQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBkZWxlZ2F0ZSA9IFRISVNbIHRoaXMuaGFzaCBdLFxuICAgICAgICAgICAgICAgIGksXG4gICAgICAgICAgICAgICAgbGVuID0gZGVsZWdhdGUuYWN0aXZlUG9pbnRlcnNMaXN0cy5sZW5ndGgsXG4gICAgICAgICAgICAgICAgY291bnQgPSAwO1xuXG4gICAgICAgICAgICBmb3IgKCBpID0gMDsgaSA8IGxlbjsgaSsrICkge1xuICAgICAgICAgICAgICAgIGNvdW50ICs9IGRlbGVnYXRlLmFjdGl2ZVBvaW50ZXJzTGlzdHNbIGkgXS5nZXRMZW5ndGgoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGNvdW50O1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbXBsZW1lbnQgb3IgYXNzaWduIGltcGxlbWVudGF0aW9uIHRvIHRoZXNlIGhhbmRsZXJzIGR1cmluZyBvciBhZnRlclxuICAgICAgICAgKiBjYWxsaW5nIHRoZSBjb25zdHJ1Y3Rvci5cbiAgICAgICAgICogQGZ1bmN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudFxuICAgICAgICAgKiBAcGFyYW0ge09wZW5TZWFkcmFnb24uTW91c2VUcmFja2VyfSBldmVudC5ldmVudFNvdXJjZVxuICAgICAgICAgKiAgICAgIEEgcmVmZXJlbmNlIHRvIHRoZSB0cmFja2VyIGluc3RhbmNlLlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gZXZlbnQucG9pbnRlclR5cGVcbiAgICAgICAgICogICAgIFwibW91c2VcIiwgXCJ0b3VjaFwiLCBcInBlblwiLCBldGMuXG4gICAgICAgICAqIEBwYXJhbSB7T3BlblNlYWRyYWdvbi5Qb2ludH0gZXZlbnQucG9zaXRpb25cbiAgICAgICAgICogICAgICBUaGUgcG9zaXRpb24gb2YgdGhlIGV2ZW50IHJlbGF0aXZlIHRvIHRoZSB0cmFja2VkIGVsZW1lbnQuXG4gICAgICAgICAqIEBwYXJhbSB7TnVtYmVyfSBldmVudC5idXR0b25zXG4gICAgICAgICAqICAgICAgQ3VycmVudCBidXR0b25zIHByZXNzZWQuXG4gICAgICAgICAqICAgICAgQ29tYmluYXRpb24gb2YgYml0IGZsYWdzIDA6IG5vbmUsIDE6IHByaW1hcnkgKG9yIHRvdWNoIGNvbnRhY3QpLCAyOiBzZWNvbmRhcnksIDQ6IGF1eCAob2Z0ZW4gbWlkZGxlKSwgODogWDEgKG9mdGVuIGJhY2spLCAxNjogWDIgKG9mdGVuIGZvcndhcmQpLCAzMjogcGVuIGVyYXNlci5cbiAgICAgICAgICogQHBhcmFtIHtOdW1iZXJ9IGV2ZW50LnBvaW50ZXJzXG4gICAgICAgICAqICAgICAgTnVtYmVyIG9mIHBvaW50ZXJzIChhbGwgdHlwZXMpIGFjdGl2ZSBpbiB0aGUgdHJhY2tlZCBlbGVtZW50LlxuICAgICAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGV2ZW50Lmluc2lkZUVsZW1lbnRQcmVzc2VkXG4gICAgICAgICAqICAgICAgVHJ1ZSBpZiB0aGUgbGVmdCBtb3VzZSBidXR0b24gaXMgY3VycmVudGx5IGJlaW5nIHByZXNzZWQgYW5kIHdhc1xuICAgICAgICAgKiAgICAgIGluaXRpYXRlZCBpbnNpZGUgdGhlIHRyYWNrZWQgZWxlbWVudCwgb3RoZXJ3aXNlIGZhbHNlLlxuICAgICAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGV2ZW50LmJ1dHRvbkRvd25BbnlcbiAgICAgICAgICogICAgICBXYXMgdGhlIGJ1dHRvbiBkb3duIGFueXdoZXJlIGluIHRoZSBzY3JlZW4gZHVyaW5nIHRoZSBldmVudC4gPHNwYW4gc3R5bGU9XCJjb2xvcjpyZWQ7XCI+RGVwcmVjYXRlZC4gVXNlIGJ1dHRvbnMgaW5zdGVhZC48L3NwYW4+XG4gICAgICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gZXZlbnQuaXNUb3VjaEV2ZW50XG4gICAgICAgICAqICAgICAgVHJ1ZSBpZiB0aGUgb3JpZ2luYWwgZXZlbnQgaXMgYSB0b3VjaCBldmVudCwgb3RoZXJ3aXNlIGZhbHNlLiA8c3BhbiBzdHlsZT1cImNvbG9yOnJlZDtcIj5EZXByZWNhdGVkLiBVc2UgcG9pbnRlclR5cGUgYW5kL29yIG9yaWdpbmFsRXZlbnQgaW5zdGVhZC48L3NwYW4+XG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudC5vcmlnaW5hbEV2ZW50XG4gICAgICAgICAqICAgICAgVGhlIG9yaWdpbmFsIGV2ZW50IG9iamVjdC5cbiAgICAgICAgICogQHBhcmFtIHtCb29sZWFufSBldmVudC5wcmV2ZW50RGVmYXVsdEFjdGlvblxuICAgICAgICAgKiAgICAgIFNldCB0byB0cnVlIHRvIHByZXZlbnQgdGhlIHRyYWNrZXIgc3Vic2NyaWJlciBmcm9tIHBlcmZvcm1pbmcgaXRzIGRlZmF1bHQgYWN0aW9uIChzdWJzY3JpYmVyIGltcGxlbWVudGF0aW9uIGRlcGVuZGVudCkuIERlZmF1bHQ6IGZhbHNlLlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQudXNlckRhdGFcbiAgICAgICAgICogICAgICBBcmJpdHJhcnkgdXNlci1kZWZpbmVkIG9iamVjdC5cbiAgICAgICAgICovXG4gICAgICAgIGVudGVySGFuZGxlcjogZnVuY3Rpb24gKCkgeyB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbXBsZW1lbnQgb3IgYXNzaWduIGltcGxlbWVudGF0aW9uIHRvIHRoZXNlIGhhbmRsZXJzIGR1cmluZyBvciBhZnRlclxuICAgICAgICAgKiBjYWxsaW5nIHRoZSBjb25zdHJ1Y3Rvci5cbiAgICAgICAgICogQGZ1bmN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudFxuICAgICAgICAgKiBAcGFyYW0ge09wZW5TZWFkcmFnb24uTW91c2VUcmFja2VyfSBldmVudC5ldmVudFNvdXJjZVxuICAgICAgICAgKiAgICAgIEEgcmVmZXJlbmNlIHRvIHRoZSB0cmFja2VyIGluc3RhbmNlLlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gZXZlbnQucG9pbnRlclR5cGVcbiAgICAgICAgICogICAgIFwibW91c2VcIiwgXCJ0b3VjaFwiLCBcInBlblwiLCBldGMuXG4gICAgICAgICAqIEBwYXJhbSB7T3BlblNlYWRyYWdvbi5Qb2ludH0gZXZlbnQucG9zaXRpb25cbiAgICAgICAgICogICAgICBUaGUgcG9zaXRpb24gb2YgdGhlIGV2ZW50IHJlbGF0aXZlIHRvIHRoZSB0cmFja2VkIGVsZW1lbnQuXG4gICAgICAgICAqIEBwYXJhbSB7TnVtYmVyfSBldmVudC5idXR0b25zXG4gICAgICAgICAqICAgICAgQ3VycmVudCBidXR0b25zIHByZXNzZWQuXG4gICAgICAgICAqICAgICAgQ29tYmluYXRpb24gb2YgYml0IGZsYWdzIDA6IG5vbmUsIDE6IHByaW1hcnkgKG9yIHRvdWNoIGNvbnRhY3QpLCAyOiBzZWNvbmRhcnksIDQ6IGF1eCAob2Z0ZW4gbWlkZGxlKSwgODogWDEgKG9mdGVuIGJhY2spLCAxNjogWDIgKG9mdGVuIGZvcndhcmQpLCAzMjogcGVuIGVyYXNlci5cbiAgICAgICAgICogQHBhcmFtIHtOdW1iZXJ9IGV2ZW50LnBvaW50ZXJzXG4gICAgICAgICAqICAgICAgTnVtYmVyIG9mIHBvaW50ZXJzIChhbGwgdHlwZXMpIGFjdGl2ZSBpbiB0aGUgdHJhY2tlZCBlbGVtZW50LlxuICAgICAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGV2ZW50Lmluc2lkZUVsZW1lbnRQcmVzc2VkXG4gICAgICAgICAqICAgICAgVHJ1ZSBpZiB0aGUgbGVmdCBtb3VzZSBidXR0b24gaXMgY3VycmVudGx5IGJlaW5nIHByZXNzZWQgYW5kIHdhc1xuICAgICAgICAgKiAgICAgIGluaXRpYXRlZCBpbnNpZGUgdGhlIHRyYWNrZWQgZWxlbWVudCwgb3RoZXJ3aXNlIGZhbHNlLlxuICAgICAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGV2ZW50LmJ1dHRvbkRvd25BbnlcbiAgICAgICAgICogICAgICBXYXMgdGhlIGJ1dHRvbiBkb3duIGFueXdoZXJlIGluIHRoZSBzY3JlZW4gZHVyaW5nIHRoZSBldmVudC4gPHNwYW4gc3R5bGU9XCJjb2xvcjpyZWQ7XCI+RGVwcmVjYXRlZC4gVXNlIGJ1dHRvbnMgaW5zdGVhZC48L3NwYW4+XG4gICAgICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gZXZlbnQuaXNUb3VjaEV2ZW50XG4gICAgICAgICAqICAgICAgVHJ1ZSBpZiB0aGUgb3JpZ2luYWwgZXZlbnQgaXMgYSB0b3VjaCBldmVudCwgb3RoZXJ3aXNlIGZhbHNlLiA8c3BhbiBzdHlsZT1cImNvbG9yOnJlZDtcIj5EZXByZWNhdGVkLiBVc2UgcG9pbnRlclR5cGUgYW5kL29yIG9yaWdpbmFsRXZlbnQgaW5zdGVhZC48L3NwYW4+XG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudC5vcmlnaW5hbEV2ZW50XG4gICAgICAgICAqICAgICAgVGhlIG9yaWdpbmFsIGV2ZW50IG9iamVjdC5cbiAgICAgICAgICogQHBhcmFtIHtCb29sZWFufSBldmVudC5wcmV2ZW50RGVmYXVsdEFjdGlvblxuICAgICAgICAgKiAgICAgIFNldCB0byB0cnVlIHRvIHByZXZlbnQgdGhlIHRyYWNrZXIgc3Vic2NyaWJlciBmcm9tIHBlcmZvcm1pbmcgaXRzIGRlZmF1bHQgYWN0aW9uIChzdWJzY3JpYmVyIGltcGxlbWVudGF0aW9uIGRlcGVuZGVudCkuIERlZmF1bHQ6IGZhbHNlLlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQudXNlckRhdGFcbiAgICAgICAgICogICAgICBBcmJpdHJhcnkgdXNlci1kZWZpbmVkIG9iamVjdC5cbiAgICAgICAgICovXG4gICAgICAgIGV4aXRIYW5kbGVyOiBmdW5jdGlvbiAoKSB7IH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEltcGxlbWVudCBvciBhc3NpZ24gaW1wbGVtZW50YXRpb24gdG8gdGhlc2UgaGFuZGxlcnMgZHVyaW5nIG9yIGFmdGVyXG4gICAgICAgICAqIGNhbGxpbmcgdGhlIGNvbnN0cnVjdG9yLlxuICAgICAgICAgKiBAZnVuY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50XG4gICAgICAgICAqIEBwYXJhbSB7T3BlblNlYWRyYWdvbi5Nb3VzZVRyYWNrZXJ9IGV2ZW50LmV2ZW50U291cmNlXG4gICAgICAgICAqICAgICAgQSByZWZlcmVuY2UgdG8gdGhlIHRyYWNrZXIgaW5zdGFuY2UuXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBldmVudC5wb2ludGVyVHlwZVxuICAgICAgICAgKiAgICAgXCJtb3VzZVwiLCBcInRvdWNoXCIsIFwicGVuXCIsIGV0Yy5cbiAgICAgICAgICogQHBhcmFtIHtPcGVuU2VhZHJhZ29uLlBvaW50fSBldmVudC5wb3NpdGlvblxuICAgICAgICAgKiAgICAgIFRoZSBwb3NpdGlvbiBvZiB0aGUgZXZlbnQgcmVsYXRpdmUgdG8gdGhlIHRyYWNrZWQgZWxlbWVudC5cbiAgICAgICAgICogQHBhcmFtIHtOdW1iZXJ9IGV2ZW50LmJ1dHRvbnNcbiAgICAgICAgICogICAgICBDdXJyZW50IGJ1dHRvbnMgcHJlc3NlZC5cbiAgICAgICAgICogICAgICBDb21iaW5hdGlvbiBvZiBiaXQgZmxhZ3MgMDogbm9uZSwgMTogcHJpbWFyeSAob3IgdG91Y2ggY29udGFjdCksIDI6IHNlY29uZGFyeSwgNDogYXV4IChvZnRlbiBtaWRkbGUpLCA4OiBYMSAob2Z0ZW4gYmFjayksIDE2OiBYMiAob2Z0ZW4gZm9yd2FyZCksIDMyOiBwZW4gZXJhc2VyLlxuICAgICAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGV2ZW50LmlzVG91Y2hFdmVudFxuICAgICAgICAgKiAgICAgIFRydWUgaWYgdGhlIG9yaWdpbmFsIGV2ZW50IGlzIGEgdG91Y2ggZXZlbnQsIG90aGVyd2lzZSBmYWxzZS4gPHNwYW4gc3R5bGU9XCJjb2xvcjpyZWQ7XCI+RGVwcmVjYXRlZC4gVXNlIHBvaW50ZXJUeXBlIGFuZC9vciBvcmlnaW5hbEV2ZW50IGluc3RlYWQuPC9zcGFuPlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQub3JpZ2luYWxFdmVudFxuICAgICAgICAgKiAgICAgIFRoZSBvcmlnaW5hbCBldmVudCBvYmplY3QuXG4gICAgICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gZXZlbnQucHJldmVudERlZmF1bHRBY3Rpb25cbiAgICAgICAgICogICAgICBTZXQgdG8gdHJ1ZSB0byBwcmV2ZW50IHRoZSB0cmFja2VyIHN1YnNjcmliZXIgZnJvbSBwZXJmb3JtaW5nIGl0cyBkZWZhdWx0IGFjdGlvbiAoc3Vic2NyaWJlciBpbXBsZW1lbnRhdGlvbiBkZXBlbmRlbnQpLiBEZWZhdWx0OiBmYWxzZS5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50LnVzZXJEYXRhXG4gICAgICAgICAqICAgICAgQXJiaXRyYXJ5IHVzZXItZGVmaW5lZCBvYmplY3QuXG4gICAgICAgICAqL1xuICAgICAgICBwcmVzc0hhbmRsZXI6IGZ1bmN0aW9uICgpIHsgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogSW1wbGVtZW50IG9yIGFzc2lnbiBpbXBsZW1lbnRhdGlvbiB0byB0aGVzZSBoYW5kbGVycyBkdXJpbmcgb3IgYWZ0ZXJcbiAgICAgICAgICogY2FsbGluZyB0aGUgY29uc3RydWN0b3IuXG4gICAgICAgICAqIEBmdW5jdGlvblxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnRcbiAgICAgICAgICogQHBhcmFtIHtPcGVuU2VhZHJhZ29uLk1vdXNlVHJhY2tlcn0gZXZlbnQuZXZlbnRTb3VyY2VcbiAgICAgICAgICogICAgICBBIHJlZmVyZW5jZSB0byB0aGUgdHJhY2tlciBpbnN0YW5jZS5cbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50LnBvaW50ZXJUeXBlXG4gICAgICAgICAqICAgICBcIm1vdXNlXCIsIFwidG91Y2hcIiwgXCJwZW5cIiwgZXRjLlxuICAgICAgICAgKiBAcGFyYW0ge09wZW5TZWFkcmFnb24uUG9pbnR9IGV2ZW50LnBvc2l0aW9uXG4gICAgICAgICAqICAgICAgVGhlIHBvc2l0aW9uIG9mIHRoZSBldmVudCByZWxhdGl2ZSB0byB0aGUgdHJhY2tlZCBlbGVtZW50LlxuICAgICAgICAgKiBAcGFyYW0ge051bWJlcn0gZXZlbnQuYnV0dG9uXG4gICAgICAgICAqICAgICAgQnV0dG9uIHdoaWNoIGNhdXNlZCB0aGUgZXZlbnQuXG4gICAgICAgICAqICAgICAgLTE6IG5vbmUsIDA6IHByaW1hcnkvbGVmdCwgMTogYXV4L21pZGRsZSwgMjogc2Vjb25kYXJ5L3JpZ2h0LCAzOiBYMS9iYWNrLCA0OiBYMi9mb3J3YXJkLCA1OiBwZW4gZXJhc2VyLlxuICAgICAgICAgKiBAcGFyYW0ge051bWJlcn0gZXZlbnQuYnV0dG9uc1xuICAgICAgICAgKiAgICAgIEN1cnJlbnQgYnV0dG9ucyBwcmVzc2VkLlxuICAgICAgICAgKiAgICAgIENvbWJpbmF0aW9uIG9mIGJpdCBmbGFncyAwOiBub25lLCAxOiBwcmltYXJ5IChvciB0b3VjaCBjb250YWN0KSwgMjogc2Vjb25kYXJ5LCA0OiBhdXggKG9mdGVuIG1pZGRsZSksIDg6IFgxIChvZnRlbiBiYWNrKSwgMTY6IFgyIChvZnRlbiBmb3J3YXJkKSwgMzI6IHBlbiBlcmFzZXIuXG4gICAgICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gZXZlbnQuaXNUb3VjaEV2ZW50XG4gICAgICAgICAqICAgICAgVHJ1ZSBpZiB0aGUgb3JpZ2luYWwgZXZlbnQgaXMgYSB0b3VjaCBldmVudCwgb3RoZXJ3aXNlIGZhbHNlLiA8c3BhbiBzdHlsZT1cImNvbG9yOnJlZDtcIj5EZXByZWNhdGVkLiBVc2UgcG9pbnRlclR5cGUgYW5kL29yIG9yaWdpbmFsRXZlbnQgaW5zdGVhZC48L3NwYW4+XG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudC5vcmlnaW5hbEV2ZW50XG4gICAgICAgICAqICAgICAgVGhlIG9yaWdpbmFsIGV2ZW50IG9iamVjdC5cbiAgICAgICAgICogQHBhcmFtIHtCb29sZWFufSBldmVudC5wcmV2ZW50RGVmYXVsdEFjdGlvblxuICAgICAgICAgKiAgICAgIFNldCB0byB0cnVlIHRvIHByZXZlbnQgdGhlIHRyYWNrZXIgc3Vic2NyaWJlciBmcm9tIHBlcmZvcm1pbmcgaXRzIGRlZmF1bHQgYWN0aW9uIChzdWJzY3JpYmVyIGltcGxlbWVudGF0aW9uIGRlcGVuZGVudCkuIERlZmF1bHQ6IGZhbHNlLlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQudXNlckRhdGFcbiAgICAgICAgICogICAgICBBcmJpdHJhcnkgdXNlci1kZWZpbmVkIG9iamVjdC5cbiAgICAgICAgICovXG4gICAgICAgIG5vblByaW1hcnlQcmVzc0hhbmRsZXI6IGZ1bmN0aW9uICgpIHsgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogSW1wbGVtZW50IG9yIGFzc2lnbiBpbXBsZW1lbnRhdGlvbiB0byB0aGVzZSBoYW5kbGVycyBkdXJpbmcgb3IgYWZ0ZXJcbiAgICAgICAgICogY2FsbGluZyB0aGUgY29uc3RydWN0b3IuXG4gICAgICAgICAqIEBmdW5jdGlvblxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnRcbiAgICAgICAgICogQHBhcmFtIHtPcGVuU2VhZHJhZ29uLk1vdXNlVHJhY2tlcn0gZXZlbnQuZXZlbnRTb3VyY2VcbiAgICAgICAgICogICAgICBBIHJlZmVyZW5jZSB0byB0aGUgdHJhY2tlciBpbnN0YW5jZS5cbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50LnBvaW50ZXJUeXBlXG4gICAgICAgICAqICAgICBcIm1vdXNlXCIsIFwidG91Y2hcIiwgXCJwZW5cIiwgZXRjLlxuICAgICAgICAgKiBAcGFyYW0ge09wZW5TZWFkcmFnb24uUG9pbnR9IGV2ZW50LnBvc2l0aW9uXG4gICAgICAgICAqICAgICAgVGhlIHBvc2l0aW9uIG9mIHRoZSBldmVudCByZWxhdGl2ZSB0byB0aGUgdHJhY2tlZCBlbGVtZW50LlxuICAgICAgICAgKiBAcGFyYW0ge051bWJlcn0gZXZlbnQuYnV0dG9uc1xuICAgICAgICAgKiAgICAgIEN1cnJlbnQgYnV0dG9ucyBwcmVzc2VkLlxuICAgICAgICAgKiAgICAgIENvbWJpbmF0aW9uIG9mIGJpdCBmbGFncyAwOiBub25lLCAxOiBwcmltYXJ5IChvciB0b3VjaCBjb250YWN0KSwgMjogc2Vjb25kYXJ5LCA0OiBhdXggKG9mdGVuIG1pZGRsZSksIDg6IFgxIChvZnRlbiBiYWNrKSwgMTY6IFgyIChvZnRlbiBmb3J3YXJkKSwgMzI6IHBlbiBlcmFzZXIuXG4gICAgICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gZXZlbnQuaW5zaWRlRWxlbWVudFByZXNzZWRcbiAgICAgICAgICogICAgICBUcnVlIGlmIHRoZSBsZWZ0IG1vdXNlIGJ1dHRvbiBpcyBjdXJyZW50bHkgYmVpbmcgcHJlc3NlZCBhbmQgd2FzXG4gICAgICAgICAqICAgICAgaW5pdGlhdGVkIGluc2lkZSB0aGUgdHJhY2tlZCBlbGVtZW50LCBvdGhlcndpc2UgZmFsc2UuXG4gICAgICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gZXZlbnQuaW5zaWRlRWxlbWVudFJlbGVhc2VkXG4gICAgICAgICAqICAgICAgVHJ1ZSBpZiB0aGUgY3Vyc29yIGluc2lkZSB0aGUgdHJhY2tlZCBlbGVtZW50IHdoZW4gdGhlIGJ1dHRvbiB3YXMgcmVsZWFzZWQuXG4gICAgICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gZXZlbnQuaXNUb3VjaEV2ZW50XG4gICAgICAgICAqICAgICAgVHJ1ZSBpZiB0aGUgb3JpZ2luYWwgZXZlbnQgaXMgYSB0b3VjaCBldmVudCwgb3RoZXJ3aXNlIGZhbHNlLiA8c3BhbiBzdHlsZT1cImNvbG9yOnJlZDtcIj5EZXByZWNhdGVkLiBVc2UgcG9pbnRlclR5cGUgYW5kL29yIG9yaWdpbmFsRXZlbnQgaW5zdGVhZC48L3NwYW4+XG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudC5vcmlnaW5hbEV2ZW50XG4gICAgICAgICAqICAgICAgVGhlIG9yaWdpbmFsIGV2ZW50IG9iamVjdC5cbiAgICAgICAgICogQHBhcmFtIHtCb29sZWFufSBldmVudC5wcmV2ZW50RGVmYXVsdEFjdGlvblxuICAgICAgICAgKiAgICAgIFNldCB0byB0cnVlIHRvIHByZXZlbnQgdGhlIHRyYWNrZXIgc3Vic2NyaWJlciBmcm9tIHBlcmZvcm1pbmcgaXRzIGRlZmF1bHQgYWN0aW9uIChzdWJzY3JpYmVyIGltcGxlbWVudGF0aW9uIGRlcGVuZGVudCkuIERlZmF1bHQ6IGZhbHNlLlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQudXNlckRhdGFcbiAgICAgICAgICogICAgICBBcmJpdHJhcnkgdXNlci1kZWZpbmVkIG9iamVjdC5cbiAgICAgICAgICovXG4gICAgICAgIHJlbGVhc2VIYW5kbGVyOiBmdW5jdGlvbiAoKSB7IH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEltcGxlbWVudCBvciBhc3NpZ24gaW1wbGVtZW50YXRpb24gdG8gdGhlc2UgaGFuZGxlcnMgZHVyaW5nIG9yIGFmdGVyXG4gICAgICAgICAqIGNhbGxpbmcgdGhlIGNvbnN0cnVjdG9yLlxuICAgICAgICAgKiBAZnVuY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50XG4gICAgICAgICAqIEBwYXJhbSB7T3BlblNlYWRyYWdvbi5Nb3VzZVRyYWNrZXJ9IGV2ZW50LmV2ZW50U291cmNlXG4gICAgICAgICAqICAgICAgQSByZWZlcmVuY2UgdG8gdGhlIHRyYWNrZXIgaW5zdGFuY2UuXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBldmVudC5wb2ludGVyVHlwZVxuICAgICAgICAgKiAgICAgXCJtb3VzZVwiLCBcInRvdWNoXCIsIFwicGVuXCIsIGV0Yy5cbiAgICAgICAgICogQHBhcmFtIHtPcGVuU2VhZHJhZ29uLlBvaW50fSBldmVudC5wb3NpdGlvblxuICAgICAgICAgKiAgICAgIFRoZSBwb3NpdGlvbiBvZiB0aGUgZXZlbnQgcmVsYXRpdmUgdG8gdGhlIHRyYWNrZWQgZWxlbWVudC5cbiAgICAgICAgICogQHBhcmFtIHtOdW1iZXJ9IGV2ZW50LmJ1dHRvblxuICAgICAgICAgKiAgICAgIEJ1dHRvbiB3aGljaCBjYXVzZWQgdGhlIGV2ZW50LlxuICAgICAgICAgKiAgICAgIC0xOiBub25lLCAwOiBwcmltYXJ5L2xlZnQsIDE6IGF1eC9taWRkbGUsIDI6IHNlY29uZGFyeS9yaWdodCwgMzogWDEvYmFjaywgNDogWDIvZm9yd2FyZCwgNTogcGVuIGVyYXNlci5cbiAgICAgICAgICogQHBhcmFtIHtOdW1iZXJ9IGV2ZW50LmJ1dHRvbnNcbiAgICAgICAgICogICAgICBDdXJyZW50IGJ1dHRvbnMgcHJlc3NlZC5cbiAgICAgICAgICogICAgICBDb21iaW5hdGlvbiBvZiBiaXQgZmxhZ3MgMDogbm9uZSwgMTogcHJpbWFyeSAob3IgdG91Y2ggY29udGFjdCksIDI6IHNlY29uZGFyeSwgNDogYXV4IChvZnRlbiBtaWRkbGUpLCA4OiBYMSAob2Z0ZW4gYmFjayksIDE2OiBYMiAob2Z0ZW4gZm9yd2FyZCksIDMyOiBwZW4gZXJhc2VyLlxuICAgICAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGV2ZW50LmlzVG91Y2hFdmVudFxuICAgICAgICAgKiAgICAgIFRydWUgaWYgdGhlIG9yaWdpbmFsIGV2ZW50IGlzIGEgdG91Y2ggZXZlbnQsIG90aGVyd2lzZSBmYWxzZS4gPHNwYW4gc3R5bGU9XCJjb2xvcjpyZWQ7XCI+RGVwcmVjYXRlZC4gVXNlIHBvaW50ZXJUeXBlIGFuZC9vciBvcmlnaW5hbEV2ZW50IGluc3RlYWQuPC9zcGFuPlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQub3JpZ2luYWxFdmVudFxuICAgICAgICAgKiAgICAgIFRoZSBvcmlnaW5hbCBldmVudCBvYmplY3QuXG4gICAgICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gZXZlbnQucHJldmVudERlZmF1bHRBY3Rpb25cbiAgICAgICAgICogICAgICBTZXQgdG8gdHJ1ZSB0byBwcmV2ZW50IHRoZSB0cmFja2VyIHN1YnNjcmliZXIgZnJvbSBwZXJmb3JtaW5nIGl0cyBkZWZhdWx0IGFjdGlvbiAoc3Vic2NyaWJlciBpbXBsZW1lbnRhdGlvbiBkZXBlbmRlbnQpLiBEZWZhdWx0OiBmYWxzZS5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50LnVzZXJEYXRhXG4gICAgICAgICAqICAgICAgQXJiaXRyYXJ5IHVzZXItZGVmaW5lZCBvYmplY3QuXG4gICAgICAgICAqL1xuICAgICAgICBub25QcmltYXJ5UmVsZWFzZUhhbmRsZXI6IGZ1bmN0aW9uICgpIHsgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogSW1wbGVtZW50IG9yIGFzc2lnbiBpbXBsZW1lbnRhdGlvbiB0byB0aGVzZSBoYW5kbGVycyBkdXJpbmcgb3IgYWZ0ZXJcbiAgICAgICAgICogY2FsbGluZyB0aGUgY29uc3RydWN0b3IuXG4gICAgICAgICAqIEBmdW5jdGlvblxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnRcbiAgICAgICAgICogQHBhcmFtIHtPcGVuU2VhZHJhZ29uLk1vdXNlVHJhY2tlcn0gZXZlbnQuZXZlbnRTb3VyY2VcbiAgICAgICAgICogICAgICBBIHJlZmVyZW5jZSB0byB0aGUgdHJhY2tlciBpbnN0YW5jZS5cbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50LnBvaW50ZXJUeXBlXG4gICAgICAgICAqICAgICBcIm1vdXNlXCIsIFwidG91Y2hcIiwgXCJwZW5cIiwgZXRjLlxuICAgICAgICAgKiBAcGFyYW0ge09wZW5TZWFkcmFnb24uUG9pbnR9IGV2ZW50LnBvc2l0aW9uXG4gICAgICAgICAqICAgICAgVGhlIHBvc2l0aW9uIG9mIHRoZSBldmVudCByZWxhdGl2ZSB0byB0aGUgdHJhY2tlZCBlbGVtZW50LlxuICAgICAgICAgKiBAcGFyYW0ge051bWJlcn0gZXZlbnQuYnV0dG9uc1xuICAgICAgICAgKiAgICAgIEN1cnJlbnQgYnV0dG9ucyBwcmVzc2VkLlxuICAgICAgICAgKiAgICAgIENvbWJpbmF0aW9uIG9mIGJpdCBmbGFncyAwOiBub25lLCAxOiBwcmltYXJ5IChvciB0b3VjaCBjb250YWN0KSwgMjogc2Vjb25kYXJ5LCA0OiBhdXggKG9mdGVuIG1pZGRsZSksIDg6IFgxIChvZnRlbiBiYWNrKSwgMTY6IFgyIChvZnRlbiBmb3J3YXJkKSwgMzI6IHBlbiBlcmFzZXIuXG4gICAgICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gZXZlbnQuaXNUb3VjaEV2ZW50XG4gICAgICAgICAqICAgICAgVHJ1ZSBpZiB0aGUgb3JpZ2luYWwgZXZlbnQgaXMgYSB0b3VjaCBldmVudCwgb3RoZXJ3aXNlIGZhbHNlLiA8c3BhbiBzdHlsZT1cImNvbG9yOnJlZDtcIj5EZXByZWNhdGVkLiBVc2UgcG9pbnRlclR5cGUgYW5kL29yIG9yaWdpbmFsRXZlbnQgaW5zdGVhZC48L3NwYW4+XG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudC5vcmlnaW5hbEV2ZW50XG4gICAgICAgICAqICAgICAgVGhlIG9yaWdpbmFsIGV2ZW50IG9iamVjdC5cbiAgICAgICAgICogQHBhcmFtIHtCb29sZWFufSBldmVudC5wcmV2ZW50RGVmYXVsdEFjdGlvblxuICAgICAgICAgKiAgICAgIFNldCB0byB0cnVlIHRvIHByZXZlbnQgdGhlIHRyYWNrZXIgc3Vic2NyaWJlciBmcm9tIHBlcmZvcm1pbmcgaXRzIGRlZmF1bHQgYWN0aW9uIChzdWJzY3JpYmVyIGltcGxlbWVudGF0aW9uIGRlcGVuZGVudCkuIERlZmF1bHQ6IGZhbHNlLlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQudXNlckRhdGFcbiAgICAgICAgICogICAgICBBcmJpdHJhcnkgdXNlci1kZWZpbmVkIG9iamVjdC5cbiAgICAgICAgICovXG4gICAgICAgIG1vdmVIYW5kbGVyOiBmdW5jdGlvbiAoKSB7IH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEltcGxlbWVudCBvciBhc3NpZ24gaW1wbGVtZW50YXRpb24gdG8gdGhlc2UgaGFuZGxlcnMgZHVyaW5nIG9yIGFmdGVyXG4gICAgICAgICAqIGNhbGxpbmcgdGhlIGNvbnN0cnVjdG9yLlxuICAgICAgICAgKiBAZnVuY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50XG4gICAgICAgICAqIEBwYXJhbSB7T3BlblNlYWRyYWdvbi5Nb3VzZVRyYWNrZXJ9IGV2ZW50LmV2ZW50U291cmNlXG4gICAgICAgICAqICAgICAgQSByZWZlcmVuY2UgdG8gdGhlIHRyYWNrZXIgaW5zdGFuY2UuXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBldmVudC5wb2ludGVyVHlwZVxuICAgICAgICAgKiAgICAgXCJtb3VzZVwiLCBcInRvdWNoXCIsIFwicGVuXCIsIGV0Yy5cbiAgICAgICAgICogQHBhcmFtIHtPcGVuU2VhZHJhZ29uLlBvaW50fSBldmVudC5wb3NpdGlvblxuICAgICAgICAgKiAgICAgIFRoZSBwb3NpdGlvbiBvZiB0aGUgZXZlbnQgcmVsYXRpdmUgdG8gdGhlIHRyYWNrZWQgZWxlbWVudC5cbiAgICAgICAgICogQHBhcmFtIHtOdW1iZXJ9IGV2ZW50LnNjcm9sbFxuICAgICAgICAgKiAgICAgIFRoZSBzY3JvbGwgZGVsdGEgZm9yIHRoZSBldmVudC5cbiAgICAgICAgICogQHBhcmFtIHtCb29sZWFufSBldmVudC5zaGlmdFxuICAgICAgICAgKiAgICAgIFRydWUgaWYgdGhlIHNoaWZ0IGtleSB3YXMgcHJlc3NlZCBkdXJpbmcgdGhpcyBldmVudC5cbiAgICAgICAgICogQHBhcmFtIHtCb29sZWFufSBldmVudC5pc1RvdWNoRXZlbnRcbiAgICAgICAgICogICAgICBUcnVlIGlmIHRoZSBvcmlnaW5hbCBldmVudCBpcyBhIHRvdWNoIGV2ZW50LCBvdGhlcndpc2UgZmFsc2UuIDxzcGFuIHN0eWxlPVwiY29sb3I6cmVkO1wiPkRlcHJlY2F0ZWQuIFVzZSBwb2ludGVyVHlwZSBhbmQvb3Igb3JpZ2luYWxFdmVudCBpbnN0ZWFkLiBUb3VjaCBkZXZpY2VzIG5vIGxvbmdlciBnZW5lcmF0ZSBzY3JvbGwgZXZlbnQuPC9zcGFuPlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQub3JpZ2luYWxFdmVudFxuICAgICAgICAgKiAgICAgIFRoZSBvcmlnaW5hbCBldmVudCBvYmplY3QuXG4gICAgICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gZXZlbnQucHJldmVudERlZmF1bHRBY3Rpb25cbiAgICAgICAgICogICAgICBTZXQgdG8gdHJ1ZSB0byBwcmV2ZW50IHRoZSB0cmFja2VyIHN1YnNjcmliZXIgZnJvbSBwZXJmb3JtaW5nIGl0cyBkZWZhdWx0IGFjdGlvbiAoc3Vic2NyaWJlciBpbXBsZW1lbnRhdGlvbiBkZXBlbmRlbnQpLiBEZWZhdWx0OiBmYWxzZS5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50LnVzZXJEYXRhXG4gICAgICAgICAqICAgICAgQXJiaXRyYXJ5IHVzZXItZGVmaW5lZCBvYmplY3QuXG4gICAgICAgICAqL1xuICAgICAgICBzY3JvbGxIYW5kbGVyOiBmdW5jdGlvbiAoKSB7IH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEltcGxlbWVudCBvciBhc3NpZ24gaW1wbGVtZW50YXRpb24gdG8gdGhlc2UgaGFuZGxlcnMgZHVyaW5nIG9yIGFmdGVyXG4gICAgICAgICAqIGNhbGxpbmcgdGhlIGNvbnN0cnVjdG9yLlxuICAgICAgICAgKiBAZnVuY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50XG4gICAgICAgICAqIEBwYXJhbSB7T3BlblNlYWRyYWdvbi5Nb3VzZVRyYWNrZXJ9IGV2ZW50LmV2ZW50U291cmNlXG4gICAgICAgICAqICAgICAgQSByZWZlcmVuY2UgdG8gdGhlIHRyYWNrZXIgaW5zdGFuY2UuXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBldmVudC5wb2ludGVyVHlwZVxuICAgICAgICAgKiAgICAgXCJtb3VzZVwiLCBcInRvdWNoXCIsIFwicGVuXCIsIGV0Yy5cbiAgICAgICAgICogQHBhcmFtIHtPcGVuU2VhZHJhZ29uLlBvaW50fSBldmVudC5wb3NpdGlvblxuICAgICAgICAgKiAgICAgIFRoZSBwb3NpdGlvbiBvZiB0aGUgZXZlbnQgcmVsYXRpdmUgdG8gdGhlIHRyYWNrZWQgZWxlbWVudC5cbiAgICAgICAgICogQHBhcmFtIHtCb29sZWFufSBldmVudC5xdWlja1xuICAgICAgICAgKiAgICAgIFRydWUgb25seSBpZiB0aGUgY2xpY2tEaXN0VGhyZXNob2xkIGFuZCBjbGlja1RpbWVUaHJlc2hvbGQgYXJlIGJvdGggcGFzc2VkLiBVc2VmdWwgZm9yIGlnbm9yaW5nIGRyYWcgZXZlbnRzLlxuICAgICAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGV2ZW50LnNoaWZ0XG4gICAgICAgICAqICAgICAgVHJ1ZSBpZiB0aGUgc2hpZnQga2V5IHdhcyBwcmVzc2VkIGR1cmluZyB0aGlzIGV2ZW50LlxuICAgICAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGV2ZW50LmlzVG91Y2hFdmVudFxuICAgICAgICAgKiAgICAgIFRydWUgaWYgdGhlIG9yaWdpbmFsIGV2ZW50IGlzIGEgdG91Y2ggZXZlbnQsIG90aGVyd2lzZSBmYWxzZS4gPHNwYW4gc3R5bGU9XCJjb2xvcjpyZWQ7XCI+RGVwcmVjYXRlZC4gVXNlIHBvaW50ZXJUeXBlIGFuZC9vciBvcmlnaW5hbEV2ZW50IGluc3RlYWQuPC9zcGFuPlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQub3JpZ2luYWxFdmVudFxuICAgICAgICAgKiAgICAgIFRoZSBvcmlnaW5hbCBldmVudCBvYmplY3QuXG4gICAgICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gZXZlbnQucHJldmVudERlZmF1bHRBY3Rpb25cbiAgICAgICAgICogICAgICBTZXQgdG8gdHJ1ZSB0byBwcmV2ZW50IHRoZSB0cmFja2VyIHN1YnNjcmliZXIgZnJvbSBwZXJmb3JtaW5nIGl0cyBkZWZhdWx0IGFjdGlvbiAoc3Vic2NyaWJlciBpbXBsZW1lbnRhdGlvbiBkZXBlbmRlbnQpLiBEZWZhdWx0OiBmYWxzZS5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50LnVzZXJEYXRhXG4gICAgICAgICAqICAgICAgQXJiaXRyYXJ5IHVzZXItZGVmaW5lZCBvYmplY3QuXG4gICAgICAgICAqL1xuICAgICAgICBjbGlja0hhbmRsZXI6IGZ1bmN0aW9uICgpIHsgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogSW1wbGVtZW50IG9yIGFzc2lnbiBpbXBsZW1lbnRhdGlvbiB0byB0aGVzZSBoYW5kbGVycyBkdXJpbmcgb3IgYWZ0ZXJcbiAgICAgICAgICogY2FsbGluZyB0aGUgY29uc3RydWN0b3IuXG4gICAgICAgICAqIEBmdW5jdGlvblxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnRcbiAgICAgICAgICogQHBhcmFtIHtPcGVuU2VhZHJhZ29uLk1vdXNlVHJhY2tlcn0gZXZlbnQuZXZlbnRTb3VyY2VcbiAgICAgICAgICogICAgICBBIHJlZmVyZW5jZSB0byB0aGUgdHJhY2tlciBpbnN0YW5jZS5cbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50LnBvaW50ZXJUeXBlXG4gICAgICAgICAqICAgICBcIm1vdXNlXCIsIFwidG91Y2hcIiwgXCJwZW5cIiwgZXRjLlxuICAgICAgICAgKiBAcGFyYW0ge09wZW5TZWFkcmFnb24uUG9pbnR9IGV2ZW50LnBvc2l0aW9uXG4gICAgICAgICAqICAgICAgVGhlIHBvc2l0aW9uIG9mIHRoZSBldmVudCByZWxhdGl2ZSB0byB0aGUgdHJhY2tlZCBlbGVtZW50LlxuICAgICAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGV2ZW50LnNoaWZ0XG4gICAgICAgICAqICAgICAgVHJ1ZSBpZiB0aGUgc2hpZnQga2V5IHdhcyBwcmVzc2VkIGR1cmluZyB0aGlzIGV2ZW50LlxuICAgICAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGV2ZW50LmlzVG91Y2hFdmVudFxuICAgICAgICAgKiAgICAgIFRydWUgaWYgdGhlIG9yaWdpbmFsIGV2ZW50IGlzIGEgdG91Y2ggZXZlbnQsIG90aGVyd2lzZSBmYWxzZS4gPHNwYW4gc3R5bGU9XCJjb2xvcjpyZWQ7XCI+RGVwcmVjYXRlZC4gVXNlIHBvaW50ZXJUeXBlIGFuZC9vciBvcmlnaW5hbEV2ZW50IGluc3RlYWQuPC9zcGFuPlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQub3JpZ2luYWxFdmVudFxuICAgICAgICAgKiAgICAgIFRoZSBvcmlnaW5hbCBldmVudCBvYmplY3QuXG4gICAgICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gZXZlbnQucHJldmVudERlZmF1bHRBY3Rpb25cbiAgICAgICAgICogICAgICBTZXQgdG8gdHJ1ZSB0byBwcmV2ZW50IHRoZSB0cmFja2VyIHN1YnNjcmliZXIgZnJvbSBwZXJmb3JtaW5nIGl0cyBkZWZhdWx0IGFjdGlvbiAoc3Vic2NyaWJlciBpbXBsZW1lbnRhdGlvbiBkZXBlbmRlbnQpLiBEZWZhdWx0OiBmYWxzZS5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50LnVzZXJEYXRhXG4gICAgICAgICAqICAgICAgQXJiaXRyYXJ5IHVzZXItZGVmaW5lZCBvYmplY3QuXG4gICAgICAgICAqL1xuICAgICAgICBkYmxDbGlja0hhbmRsZXI6IGZ1bmN0aW9uICgpIHsgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogSW1wbGVtZW50IG9yIGFzc2lnbiBpbXBsZW1lbnRhdGlvbiB0byB0aGVzZSBoYW5kbGVycyBkdXJpbmcgb3IgYWZ0ZXJcbiAgICAgICAgICogY2FsbGluZyB0aGUgY29uc3RydWN0b3IuXG4gICAgICAgICAqIEBmdW5jdGlvblxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnRcbiAgICAgICAgICogQHBhcmFtIHtPcGVuU2VhZHJhZ29uLk1vdXNlVHJhY2tlcn0gZXZlbnQuZXZlbnRTb3VyY2VcbiAgICAgICAgICogICAgICBBIHJlZmVyZW5jZSB0byB0aGUgdHJhY2tlciBpbnN0YW5jZS5cbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50LnBvaW50ZXJUeXBlXG4gICAgICAgICAqICAgICBcIm1vdXNlXCIsIFwidG91Y2hcIiwgXCJwZW5cIiwgZXRjLlxuICAgICAgICAgKiBAcGFyYW0ge09wZW5TZWFkcmFnb24uUG9pbnR9IGV2ZW50LnBvc2l0aW9uXG4gICAgICAgICAqICAgICAgVGhlIHBvc2l0aW9uIG9mIHRoZSBldmVudCByZWxhdGl2ZSB0byB0aGUgdHJhY2tlZCBlbGVtZW50LlxuICAgICAgICAgKiBAcGFyYW0ge051bWJlcn0gZXZlbnQuYnV0dG9uc1xuICAgICAgICAgKiAgICAgIEN1cnJlbnQgYnV0dG9ucyBwcmVzc2VkLlxuICAgICAgICAgKiAgICAgIENvbWJpbmF0aW9uIG9mIGJpdCBmbGFncyAwOiBub25lLCAxOiBwcmltYXJ5IChvciB0b3VjaCBjb250YWN0KSwgMjogc2Vjb25kYXJ5LCA0OiBhdXggKG9mdGVuIG1pZGRsZSksIDg6IFgxIChvZnRlbiBiYWNrKSwgMTY6IFgyIChvZnRlbiBmb3J3YXJkKSwgMzI6IHBlbiBlcmFzZXIuXG4gICAgICAgICAqIEBwYXJhbSB7T3BlblNlYWRyYWdvbi5Qb2ludH0gZXZlbnQuZGVsdGFcbiAgICAgICAgICogICAgICBUaGUgeCx5IGNvbXBvbmVudHMgb2YgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgY3VycmVudCBwb3NpdGlvbiBhbmQgdGhlIGxhc3QgZHJhZyBldmVudCBwb3NpdGlvbi4gIFVzZWZ1bCBmb3IgaWdub3Jpbmcgb3Igd2VpZ2h0aW5nIHRoZSBldmVudHMuXG4gICAgICAgICAqIEBwYXJhbSB7TnVtYmVyfSBldmVudC5zcGVlZFxuICAgICAgICAgKiAgICAgQ3VycmVudCBjb21wdXRlZCBzcGVlZCwgaW4gcGl4ZWxzIHBlciBzZWNvbmQuXG4gICAgICAgICAqIEBwYXJhbSB7TnVtYmVyfSBldmVudC5kaXJlY3Rpb25cbiAgICAgICAgICogICAgIEN1cnJlbnQgY29tcHV0ZWQgZGlyZWN0aW9uLCBleHByZXNzZWQgYXMgYW4gYW5nbGUgY291bnRlcmNsb2Nrd2lzZSByZWxhdGl2ZSB0byB0aGUgcG9zaXRpdmUgWCBheGlzICgtcGkgdG8gcGksIGluIHJhZGlhbnMpLiBPbmx5IHZhbGlkIGlmIHNwZWVkID4gMC5cbiAgICAgICAgICogQHBhcmFtIHtCb29sZWFufSBldmVudC5zaGlmdFxuICAgICAgICAgKiAgICAgIFRydWUgaWYgdGhlIHNoaWZ0IGtleSB3YXMgcHJlc3NlZCBkdXJpbmcgdGhpcyBldmVudC5cbiAgICAgICAgICogQHBhcmFtIHtCb29sZWFufSBldmVudC5pc1RvdWNoRXZlbnRcbiAgICAgICAgICogICAgICBUcnVlIGlmIHRoZSBvcmlnaW5hbCBldmVudCBpcyBhIHRvdWNoIGV2ZW50LCBvdGhlcndpc2UgZmFsc2UuIDxzcGFuIHN0eWxlPVwiY29sb3I6cmVkO1wiPkRlcHJlY2F0ZWQuIFVzZSBwb2ludGVyVHlwZSBhbmQvb3Igb3JpZ2luYWxFdmVudCBpbnN0ZWFkLjwvc3Bhbj5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50Lm9yaWdpbmFsRXZlbnRcbiAgICAgICAgICogICAgICBUaGUgb3JpZ2luYWwgZXZlbnQgb2JqZWN0LlxuICAgICAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGV2ZW50LnByZXZlbnREZWZhdWx0QWN0aW9uXG4gICAgICAgICAqICAgICAgU2V0IHRvIHRydWUgdG8gcHJldmVudCB0aGUgdHJhY2tlciBzdWJzY3JpYmVyIGZyb20gcGVyZm9ybWluZyBpdHMgZGVmYXVsdCBhY3Rpb24gKHN1YnNjcmliZXIgaW1wbGVtZW50YXRpb24gZGVwZW5kZW50KS4gRGVmYXVsdDogZmFsc2UuXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudC51c2VyRGF0YVxuICAgICAgICAgKiAgICAgIEFyYml0cmFyeSB1c2VyLWRlZmluZWQgb2JqZWN0LlxuICAgICAgICAgKi9cbiAgICAgICAgZHJhZ0hhbmRsZXI6IGZ1bmN0aW9uICgpIHsgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogSW1wbGVtZW50IG9yIGFzc2lnbiBpbXBsZW1lbnRhdGlvbiB0byB0aGVzZSBoYW5kbGVycyBkdXJpbmcgb3IgYWZ0ZXJcbiAgICAgICAgICogY2FsbGluZyB0aGUgY29uc3RydWN0b3IuXG4gICAgICAgICAqIEBmdW5jdGlvblxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnRcbiAgICAgICAgICogQHBhcmFtIHtPcGVuU2VhZHJhZ29uLk1vdXNlVHJhY2tlcn0gZXZlbnQuZXZlbnRTb3VyY2VcbiAgICAgICAgICogICAgICBBIHJlZmVyZW5jZSB0byB0aGUgdHJhY2tlciBpbnN0YW5jZS5cbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50LnBvaW50ZXJUeXBlXG4gICAgICAgICAqICAgICBcIm1vdXNlXCIsIFwidG91Y2hcIiwgXCJwZW5cIiwgZXRjLlxuICAgICAgICAgKiBAcGFyYW0ge09wZW5TZWFkcmFnb24uUG9pbnR9IGV2ZW50LnBvc2l0aW9uXG4gICAgICAgICAqICAgICAgVGhlIHBvc2l0aW9uIG9mIHRoZSBldmVudCByZWxhdGl2ZSB0byB0aGUgdHJhY2tlZCBlbGVtZW50LlxuICAgICAgICAgKiBAcGFyYW0ge051bWJlcn0gZXZlbnQuc3BlZWRcbiAgICAgICAgICogICAgIFNwZWVkIGF0IHRoZSBlbmQgb2YgYSBkcmFnIGdlc3R1cmUsIGluIHBpeGVscyBwZXIgc2Vjb25kLlxuICAgICAgICAgKiBAcGFyYW0ge051bWJlcn0gZXZlbnQuZGlyZWN0aW9uXG4gICAgICAgICAqICAgICBEaXJlY3Rpb24gYXQgdGhlIGVuZCBvZiBhIGRyYWcgZ2VzdHVyZSwgZXhwcmVzc2VkIGFzIGFuIGFuZ2xlIGNvdW50ZXJjbG9ja3dpc2UgcmVsYXRpdmUgdG8gdGhlIHBvc2l0aXZlIFggYXhpcyAoLXBpIHRvIHBpLCBpbiByYWRpYW5zKS4gT25seSB2YWxpZCBpZiBzcGVlZCA+IDAuXG4gICAgICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gZXZlbnQuc2hpZnRcbiAgICAgICAgICogICAgICBUcnVlIGlmIHRoZSBzaGlmdCBrZXkgd2FzIHByZXNzZWQgZHVyaW5nIHRoaXMgZXZlbnQuXG4gICAgICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gZXZlbnQuaXNUb3VjaEV2ZW50XG4gICAgICAgICAqICAgICAgVHJ1ZSBpZiB0aGUgb3JpZ2luYWwgZXZlbnQgaXMgYSB0b3VjaCBldmVudCwgb3RoZXJ3aXNlIGZhbHNlLiA8c3BhbiBzdHlsZT1cImNvbG9yOnJlZDtcIj5EZXByZWNhdGVkLiBVc2UgcG9pbnRlclR5cGUgYW5kL29yIG9yaWdpbmFsRXZlbnQgaW5zdGVhZC48L3NwYW4+XG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudC5vcmlnaW5hbEV2ZW50XG4gICAgICAgICAqICAgICAgVGhlIG9yaWdpbmFsIGV2ZW50IG9iamVjdC5cbiAgICAgICAgICogQHBhcmFtIHtCb29sZWFufSBldmVudC5wcmV2ZW50RGVmYXVsdEFjdGlvblxuICAgICAgICAgKiAgICAgIFNldCB0byB0cnVlIHRvIHByZXZlbnQgdGhlIHRyYWNrZXIgc3Vic2NyaWJlciBmcm9tIHBlcmZvcm1pbmcgaXRzIGRlZmF1bHQgYWN0aW9uIChzdWJzY3JpYmVyIGltcGxlbWVudGF0aW9uIGRlcGVuZGVudCkuIERlZmF1bHQ6IGZhbHNlLlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQudXNlckRhdGFcbiAgICAgICAgICogICAgICBBcmJpdHJhcnkgdXNlci1kZWZpbmVkIG9iamVjdC5cbiAgICAgICAgICovXG4gICAgICAgIGRyYWdFbmRIYW5kbGVyOiBmdW5jdGlvbiAoKSB7IH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEltcGxlbWVudCBvciBhc3NpZ24gaW1wbGVtZW50YXRpb24gdG8gdGhlc2UgaGFuZGxlcnMgZHVyaW5nIG9yIGFmdGVyXG4gICAgICAgICAqIGNhbGxpbmcgdGhlIGNvbnN0cnVjdG9yLlxuICAgICAgICAgKiBAZnVuY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50XG4gICAgICAgICAqIEBwYXJhbSB7T3BlblNlYWRyYWdvbi5Nb3VzZVRyYWNrZXJ9IGV2ZW50LmV2ZW50U291cmNlXG4gICAgICAgICAqICAgICAgQSByZWZlcmVuY2UgdG8gdGhlIHRyYWNrZXIgaW5zdGFuY2UuXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBldmVudC5wb2ludGVyVHlwZVxuICAgICAgICAgKiAgICAgXCJtb3VzZVwiLCBcInRvdWNoXCIsIFwicGVuXCIsIGV0Yy5cbiAgICAgICAgICogQHBhcmFtIHtBcnJheS48T3BlblNlYWRyYWdvbi5Nb3VzZVRyYWNrZXIuR2VzdHVyZVBvaW50Pn0gZXZlbnQuZ2VzdHVyZVBvaW50c1xuICAgICAgICAgKiAgICAgIEdlc3R1cmUgcG9pbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2VzdHVyZS4gVmVsb2NpdHkgZGF0YSBjYW4gYmUgZm91bmQgaGVyZS5cbiAgICAgICAgICogQHBhcmFtIHtPcGVuU2VhZHJhZ29uLlBvaW50fSBldmVudC5sYXN0Q2VudGVyXG4gICAgICAgICAqICAgICAgVGhlIHByZXZpb3VzIGNlbnRlciBwb2ludCBvZiB0aGUgdHdvIHBpbmNoIGNvbnRhY3QgcG9pbnRzIHJlbGF0aXZlIHRvIHRoZSB0cmFja2VkIGVsZW1lbnQuXG4gICAgICAgICAqIEBwYXJhbSB7T3BlblNlYWRyYWdvbi5Qb2ludH0gZXZlbnQuY2VudGVyXG4gICAgICAgICAqICAgICAgVGhlIGNlbnRlciBwb2ludCBvZiB0aGUgdHdvIHBpbmNoIGNvbnRhY3QgcG9pbnRzIHJlbGF0aXZlIHRvIHRoZSB0cmFja2VkIGVsZW1lbnQuXG4gICAgICAgICAqIEBwYXJhbSB7TnVtYmVyfSBldmVudC5sYXN0RGlzdGFuY2VcbiAgICAgICAgICogICAgICBUaGUgcHJldmlvdXMgZGlzdGFuY2UgYmV0d2VlbiB0aGUgdHdvIHBpbmNoIGNvbnRhY3QgcG9pbnRzIGluIENTUyBwaXhlbHMuXG4gICAgICAgICAqIEBwYXJhbSB7TnVtYmVyfSBldmVudC5kaXN0YW5jZVxuICAgICAgICAgKiAgICAgIFRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSB0d28gcGluY2ggY29udGFjdCBwb2ludHMgaW4gQ1NTIHBpeGVscy5cbiAgICAgICAgICogQHBhcmFtIHtCb29sZWFufSBldmVudC5zaGlmdFxuICAgICAgICAgKiAgICAgIFRydWUgaWYgdGhlIHNoaWZ0IGtleSB3YXMgcHJlc3NlZCBkdXJpbmcgdGhpcyBldmVudC5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50Lm9yaWdpbmFsRXZlbnRcbiAgICAgICAgICogICAgICBUaGUgb3JpZ2luYWwgZXZlbnQgb2JqZWN0LlxuICAgICAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGV2ZW50LnByZXZlbnREZWZhdWx0QWN0aW9uXG4gICAgICAgICAqICAgICAgU2V0IHRvIHRydWUgdG8gcHJldmVudCB0aGUgdHJhY2tlciBzdWJzY3JpYmVyIGZyb20gcGVyZm9ybWluZyBpdHMgZGVmYXVsdCBhY3Rpb24gKHN1YnNjcmliZXIgaW1wbGVtZW50YXRpb24gZGVwZW5kZW50KS4gRGVmYXVsdDogZmFsc2UuXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudC51c2VyRGF0YVxuICAgICAgICAgKiAgICAgIEFyYml0cmFyeSB1c2VyLWRlZmluZWQgb2JqZWN0LlxuICAgICAgICAgKi9cbiAgICAgICAgcGluY2hIYW5kbGVyOiBmdW5jdGlvbiAoKSB7IH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEltcGxlbWVudCBvciBhc3NpZ24gaW1wbGVtZW50YXRpb24gdG8gdGhlc2UgaGFuZGxlcnMgZHVyaW5nIG9yIGFmdGVyXG4gICAgICAgICAqIGNhbGxpbmcgdGhlIGNvbnN0cnVjdG9yLlxuICAgICAgICAgKiBAZnVuY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50XG4gICAgICAgICAqIEBwYXJhbSB7T3BlblNlYWRyYWdvbi5Nb3VzZVRyYWNrZXJ9IGV2ZW50LmV2ZW50U291cmNlXG4gICAgICAgICAqICAgICAgQSByZWZlcmVuY2UgdG8gdGhlIHRyYWNrZXIgaW5zdGFuY2UuXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBldmVudC5wb2ludGVyVHlwZVxuICAgICAgICAgKiAgICAgXCJtb3VzZVwiLCBcInRvdWNoXCIsIFwicGVuXCIsIGV0Yy5cbiAgICAgICAgICogQHBhcmFtIHtPcGVuU2VhZHJhZ29uLlBvaW50fSBldmVudC5wb3NpdGlvblxuICAgICAgICAgKiAgICAgIFRoZSBwb3NpdGlvbiBvZiB0aGUgZXZlbnQgcmVsYXRpdmUgdG8gdGhlIHRyYWNrZWQgZWxlbWVudC5cbiAgICAgICAgICogQHBhcmFtIHtOdW1iZXJ9IGV2ZW50LmJ1dHRvbnNcbiAgICAgICAgICogICAgICBDdXJyZW50IGJ1dHRvbnMgcHJlc3NlZC5cbiAgICAgICAgICogICAgICBDb21iaW5hdGlvbiBvZiBiaXQgZmxhZ3MgMDogbm9uZSwgMTogcHJpbWFyeSAob3IgdG91Y2ggY29udGFjdCksIDI6IHNlY29uZGFyeSwgNDogYXV4IChvZnRlbiBtaWRkbGUpLCA4OiBYMSAob2Z0ZW4gYmFjayksIDE2OiBYMiAob2Z0ZW4gZm9yd2FyZCksIDMyOiBwZW4gZXJhc2VyLlxuICAgICAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGV2ZW50LmlzVG91Y2hFdmVudFxuICAgICAgICAgKiAgICAgIFRydWUgaWYgdGhlIG9yaWdpbmFsIGV2ZW50IGlzIGEgdG91Y2ggZXZlbnQsIG90aGVyd2lzZSBmYWxzZS4gPHNwYW4gc3R5bGU9XCJjb2xvcjpyZWQ7XCI+RGVwcmVjYXRlZC4gVXNlIHBvaW50ZXJUeXBlIGFuZC9vciBvcmlnaW5hbEV2ZW50IGluc3RlYWQuPC9zcGFuPlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQub3JpZ2luYWxFdmVudFxuICAgICAgICAgKiAgICAgIFRoZSBvcmlnaW5hbCBldmVudCBvYmplY3QuXG4gICAgICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gZXZlbnQucHJldmVudERlZmF1bHRBY3Rpb25cbiAgICAgICAgICogICAgICBTZXQgdG8gdHJ1ZSB0byBwcmV2ZW50IHRoZSB0cmFja2VyIHN1YnNjcmliZXIgZnJvbSBwZXJmb3JtaW5nIGl0cyBkZWZhdWx0IGFjdGlvbiAoc3Vic2NyaWJlciBpbXBsZW1lbnRhdGlvbiBkZXBlbmRlbnQpLiBEZWZhdWx0OiBmYWxzZS5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50LnVzZXJEYXRhXG4gICAgICAgICAqICAgICAgQXJiaXRyYXJ5IHVzZXItZGVmaW5lZCBvYmplY3QuXG4gICAgICAgICAqL1xuICAgICAgICBzdG9wSGFuZGxlcjogZnVuY3Rpb24gKCkgeyB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbXBsZW1lbnQgb3IgYXNzaWduIGltcGxlbWVudGF0aW9uIHRvIHRoZXNlIGhhbmRsZXJzIGR1cmluZyBvciBhZnRlclxuICAgICAgICAgKiBjYWxsaW5nIHRoZSBjb25zdHJ1Y3Rvci5cbiAgICAgICAgICogQGZ1bmN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudFxuICAgICAgICAgKiBAcGFyYW0ge09wZW5TZWFkcmFnb24uTW91c2VUcmFja2VyfSBldmVudC5ldmVudFNvdXJjZVxuICAgICAgICAgKiAgICAgIEEgcmVmZXJlbmNlIHRvIHRoZSB0cmFja2VyIGluc3RhbmNlLlxuICAgICAgICAgKiBAcGFyYW0ge051bWJlcn0gZXZlbnQua2V5Q29kZVxuICAgICAgICAgKiAgICAgIFRoZSBrZXkgY29kZSB0aGF0IHdhcyBwcmVzc2VkLlxuICAgICAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGV2ZW50LmN0cmxcbiAgICAgICAgICogICAgICBUcnVlIGlmIHRoZSBjdHJsIGtleSB3YXMgcHJlc3NlZCBkdXJpbmcgdGhpcyBldmVudC5cbiAgICAgICAgICogQHBhcmFtIHtCb29sZWFufSBldmVudC5zaGlmdFxuICAgICAgICAgKiAgICAgIFRydWUgaWYgdGhlIHNoaWZ0IGtleSB3YXMgcHJlc3NlZCBkdXJpbmcgdGhpcyBldmVudC5cbiAgICAgICAgICogQHBhcmFtIHtCb29sZWFufSBldmVudC5hbHRcbiAgICAgICAgICogICAgICBUcnVlIGlmIHRoZSBhbHQga2V5IHdhcyBwcmVzc2VkIGR1cmluZyB0aGlzIGV2ZW50LlxuICAgICAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGV2ZW50Lm1ldGFcbiAgICAgICAgICogICAgICBUcnVlIGlmIHRoZSBtZXRhIGtleSB3YXMgcHJlc3NlZCBkdXJpbmcgdGhpcyBldmVudC5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50Lm9yaWdpbmFsRXZlbnRcbiAgICAgICAgICogICAgICBUaGUgb3JpZ2luYWwgZXZlbnQgb2JqZWN0LlxuICAgICAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGV2ZW50LnByZXZlbnREZWZhdWx0QWN0aW9uXG4gICAgICAgICAqICAgICAgU2V0IHRvIHRydWUgdG8gcHJldmVudCB0aGUgdHJhY2tlciBzdWJzY3JpYmVyIGZyb20gcGVyZm9ybWluZyBpdHMgZGVmYXVsdCBhY3Rpb24gKHN1YnNjcmliZXIgaW1wbGVtZW50YXRpb24gZGVwZW5kZW50KS4gRGVmYXVsdDogZmFsc2UuXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudC51c2VyRGF0YVxuICAgICAgICAgKiAgICAgIEFyYml0cmFyeSB1c2VyLWRlZmluZWQgb2JqZWN0LlxuICAgICAgICAgKi9cbiAgICAgICAga2V5RG93bkhhbmRsZXI6IGZ1bmN0aW9uICgpIHsgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogSW1wbGVtZW50IG9yIGFzc2lnbiBpbXBsZW1lbnRhdGlvbiB0byB0aGVzZSBoYW5kbGVycyBkdXJpbmcgb3IgYWZ0ZXJcbiAgICAgICAgICogY2FsbGluZyB0aGUgY29uc3RydWN0b3IuXG4gICAgICAgICAqIEBmdW5jdGlvblxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnRcbiAgICAgICAgICogQHBhcmFtIHtPcGVuU2VhZHJhZ29uLk1vdXNlVHJhY2tlcn0gZXZlbnQuZXZlbnRTb3VyY2VcbiAgICAgICAgICogICAgICBBIHJlZmVyZW5jZSB0byB0aGUgdHJhY2tlciBpbnN0YW5jZS5cbiAgICAgICAgICogQHBhcmFtIHtOdW1iZXJ9IGV2ZW50LmtleUNvZGVcbiAgICAgICAgICogICAgICBUaGUga2V5IGNvZGUgdGhhdCB3YXMgcHJlc3NlZC5cbiAgICAgICAgICogQHBhcmFtIHtCb29sZWFufSBldmVudC5jdHJsXG4gICAgICAgICAqICAgICAgVHJ1ZSBpZiB0aGUgY3RybCBrZXkgd2FzIHByZXNzZWQgZHVyaW5nIHRoaXMgZXZlbnQuXG4gICAgICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gZXZlbnQuc2hpZnRcbiAgICAgICAgICogICAgICBUcnVlIGlmIHRoZSBzaGlmdCBrZXkgd2FzIHByZXNzZWQgZHVyaW5nIHRoaXMgZXZlbnQuXG4gICAgICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gZXZlbnQuYWx0XG4gICAgICAgICAqICAgICAgVHJ1ZSBpZiB0aGUgYWx0IGtleSB3YXMgcHJlc3NlZCBkdXJpbmcgdGhpcyBldmVudC5cbiAgICAgICAgICogQHBhcmFtIHtCb29sZWFufSBldmVudC5tZXRhXG4gICAgICAgICAqICAgICAgVHJ1ZSBpZiB0aGUgbWV0YSBrZXkgd2FzIHByZXNzZWQgZHVyaW5nIHRoaXMgZXZlbnQuXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudC5vcmlnaW5hbEV2ZW50XG4gICAgICAgICAqICAgICAgVGhlIG9yaWdpbmFsIGV2ZW50IG9iamVjdC5cbiAgICAgICAgICogQHBhcmFtIHtCb29sZWFufSBldmVudC5wcmV2ZW50RGVmYXVsdEFjdGlvblxuICAgICAgICAgKiAgICAgIFNldCB0byB0cnVlIHRvIHByZXZlbnQgdGhlIHRyYWNrZXIgc3Vic2NyaWJlciBmcm9tIHBlcmZvcm1pbmcgaXRzIGRlZmF1bHQgYWN0aW9uIChzdWJzY3JpYmVyIGltcGxlbWVudGF0aW9uIGRlcGVuZGVudCkuIERlZmF1bHQ6IGZhbHNlLlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQudXNlckRhdGFcbiAgICAgICAgICogICAgICBBcmJpdHJhcnkgdXNlci1kZWZpbmVkIG9iamVjdC5cbiAgICAgICAgICovXG4gICAgICAgIGtleVVwSGFuZGxlcjogZnVuY3Rpb24gKCkgeyB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbXBsZW1lbnQgb3IgYXNzaWduIGltcGxlbWVudGF0aW9uIHRvIHRoZXNlIGhhbmRsZXJzIGR1cmluZyBvciBhZnRlclxuICAgICAgICAgKiBjYWxsaW5nIHRoZSBjb25zdHJ1Y3Rvci5cbiAgICAgICAgICogQGZ1bmN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudFxuICAgICAgICAgKiBAcGFyYW0ge09wZW5TZWFkcmFnb24uTW91c2VUcmFja2VyfSBldmVudC5ldmVudFNvdXJjZVxuICAgICAgICAgKiAgICAgIEEgcmVmZXJlbmNlIHRvIHRoZSB0cmFja2VyIGluc3RhbmNlLlxuICAgICAgICAgKiBAcGFyYW0ge051bWJlcn0gZXZlbnQua2V5Q29kZVxuICAgICAgICAgKiAgICAgIFRoZSBrZXkgY29kZSB0aGF0IHdhcyBwcmVzc2VkLlxuICAgICAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGV2ZW50LmN0cmxcbiAgICAgICAgICogICAgICBUcnVlIGlmIHRoZSBjdHJsIGtleSB3YXMgcHJlc3NlZCBkdXJpbmcgdGhpcyBldmVudC5cbiAgICAgICAgICogQHBhcmFtIHtCb29sZWFufSBldmVudC5zaGlmdFxuICAgICAgICAgKiAgICAgIFRydWUgaWYgdGhlIHNoaWZ0IGtleSB3YXMgcHJlc3NlZCBkdXJpbmcgdGhpcyBldmVudC5cbiAgICAgICAgICogQHBhcmFtIHtCb29sZWFufSBldmVudC5hbHRcbiAgICAgICAgICogICAgICBUcnVlIGlmIHRoZSBhbHQga2V5IHdhcyBwcmVzc2VkIGR1cmluZyB0aGlzIGV2ZW50LlxuICAgICAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGV2ZW50Lm1ldGFcbiAgICAgICAgICogICAgICBUcnVlIGlmIHRoZSBtZXRhIGtleSB3YXMgcHJlc3NlZCBkdXJpbmcgdGhpcyBldmVudC5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50Lm9yaWdpbmFsRXZlbnRcbiAgICAgICAgICogICAgICBUaGUgb3JpZ2luYWwgZXZlbnQgb2JqZWN0LlxuICAgICAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGV2ZW50LnByZXZlbnREZWZhdWx0QWN0aW9uXG4gICAgICAgICAqICAgICAgU2V0IHRvIHRydWUgdG8gcHJldmVudCB0aGUgdHJhY2tlciBzdWJzY3JpYmVyIGZyb20gcGVyZm9ybWluZyBpdHMgZGVmYXVsdCBhY3Rpb24gKHN1YnNjcmliZXIgaW1wbGVtZW50YXRpb24gZGVwZW5kZW50KS4gRGVmYXVsdDogZmFsc2UuXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudC51c2VyRGF0YVxuICAgICAgICAgKiAgICAgIEFyYml0cmFyeSB1c2VyLWRlZmluZWQgb2JqZWN0LlxuICAgICAgICAgKi9cbiAgICAgICAga2V5SGFuZGxlcjogZnVuY3Rpb24gKCkgeyB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbXBsZW1lbnQgb3IgYXNzaWduIGltcGxlbWVudGF0aW9uIHRvIHRoZXNlIGhhbmRsZXJzIGR1cmluZyBvciBhZnRlclxuICAgICAgICAgKiBjYWxsaW5nIHRoZSBjb25zdHJ1Y3Rvci5cbiAgICAgICAgICogQGZ1bmN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudFxuICAgICAgICAgKiBAcGFyYW0ge09wZW5TZWFkcmFnb24uTW91c2VUcmFja2VyfSBldmVudC5ldmVudFNvdXJjZVxuICAgICAgICAgKiAgICAgIEEgcmVmZXJlbmNlIHRvIHRoZSB0cmFja2VyIGluc3RhbmNlLlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQub3JpZ2luYWxFdmVudFxuICAgICAgICAgKiAgICAgIFRoZSBvcmlnaW5hbCBldmVudCBvYmplY3QuXG4gICAgICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gZXZlbnQucHJldmVudERlZmF1bHRBY3Rpb25cbiAgICAgICAgICogICAgICBTZXQgdG8gdHJ1ZSB0byBwcmV2ZW50IHRoZSB0cmFja2VyIHN1YnNjcmliZXIgZnJvbSBwZXJmb3JtaW5nIGl0cyBkZWZhdWx0IGFjdGlvbiAoc3Vic2NyaWJlciBpbXBsZW1lbnRhdGlvbiBkZXBlbmRlbnQpLiBEZWZhdWx0OiBmYWxzZS5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50LnVzZXJEYXRhXG4gICAgICAgICAqICAgICAgQXJiaXRyYXJ5IHVzZXItZGVmaW5lZCBvYmplY3QuXG4gICAgICAgICAqL1xuICAgICAgICBmb2N1c0hhbmRsZXI6IGZ1bmN0aW9uICgpIHsgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogSW1wbGVtZW50IG9yIGFzc2lnbiBpbXBsZW1lbnRhdGlvbiB0byB0aGVzZSBoYW5kbGVycyBkdXJpbmcgb3IgYWZ0ZXJcbiAgICAgICAgICogY2FsbGluZyB0aGUgY29uc3RydWN0b3IuXG4gICAgICAgICAqIEBmdW5jdGlvblxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnRcbiAgICAgICAgICogQHBhcmFtIHtPcGVuU2VhZHJhZ29uLk1vdXNlVHJhY2tlcn0gZXZlbnQuZXZlbnRTb3VyY2VcbiAgICAgICAgICogICAgICBBIHJlZmVyZW5jZSB0byB0aGUgdHJhY2tlciBpbnN0YW5jZS5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50Lm9yaWdpbmFsRXZlbnRcbiAgICAgICAgICogICAgICBUaGUgb3JpZ2luYWwgZXZlbnQgb2JqZWN0LlxuICAgICAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGV2ZW50LnByZXZlbnREZWZhdWx0QWN0aW9uXG4gICAgICAgICAqICAgICAgU2V0IHRvIHRydWUgdG8gcHJldmVudCB0aGUgdHJhY2tlciBzdWJzY3JpYmVyIGZyb20gcGVyZm9ybWluZyBpdHMgZGVmYXVsdCBhY3Rpb24gKHN1YnNjcmliZXIgaW1wbGVtZW50YXRpb24gZGVwZW5kZW50KS4gRGVmYXVsdDogZmFsc2UuXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudC51c2VyRGF0YVxuICAgICAgICAgKiAgICAgIEFyYml0cmFyeSB1c2VyLWRlZmluZWQgb2JqZWN0LlxuICAgICAgICAgKi9cbiAgICAgICAgYmx1ckhhbmRsZXI6IGZ1bmN0aW9uICgpIHsgfVxuICAgIH07XG5cblxuICAgIC8qKlxuICAgICAqIFByb3ZpZGVzIGNvbnRpbnVvdXMgY29tcHV0YXRpb24gb2YgdmVsb2NpdHkgKHNwZWVkIGFuZCBkaXJlY3Rpb24pIG9mIGFjdGl2ZSBwb2ludGVycy5cbiAgICAgKiBUaGlzIGlzIGEgc2luZ2xldG9uLCB1c2VkIGJ5IGFsbCBNb3VzZVRyYWNrZXIgaW5zdGFuY2VzLCBhcyBpdCBpcyB1bmxpa2VseSB0aGVyZSB3aWxsIGV2ZXIgYmUgbW9yZSB0aGFuXG4gICAgICogdHdvIGFjdGl2ZSBnZXN0dXJlIHBvaW50ZXJzIGF0IGEgdGltZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG1lbWJlciBnZXN0dXJlUG9pbnRWZWxvY2l0eVRyYWNrZXJcbiAgICAgKiBAbWVtYmVyb2YgT3BlblNlYWRyYWdvbi5Nb3VzZVRyYWNrZXJcbiAgICAgKi9cbiAgICAkLk1vdXNlVHJhY2tlci5nZXN0dXJlUG9pbnRWZWxvY2l0eVRyYWNrZXIgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdHJhY2tlclBvaW50cyA9IFtdLFxuICAgICAgICAgICAgaW50ZXJ2YWxJZCA9IDAsXG4gICAgICAgICAgICBsYXN0VGltZSA9IDA7XG5cbiAgICAgICAgLy8gR2VuZXJhdGVzIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgdHJhY2tlZCBnZXN0dXJlIHBvaW50XG4gICAgICAgIHZhciBfZ2VuZXJhdGVHdWlkID0gZnVuY3Rpb24gKCB0cmFja2VyLCBnUG9pbnQgKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJhY2tlci5oYXNoLnRvU3RyaW5nKCkgKyBnUG9pbnQudHlwZSArIGdQb2ludC5pZC50b1N0cmluZygpO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIEludGVydmFsIHRpbWVyIGNhbGxiYWNrLiBDb21wdXRlcyB2ZWxvY2l0eSBmb3IgYWxsIHRyYWNrZWQgZ2VzdHVyZSBwb2ludHMuXG4gICAgICAgIHZhciBfZG9UcmFja2luZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBpLFxuICAgICAgICAgICAgICAgIGxlbiA9IHRyYWNrZXJQb2ludHMubGVuZ3RoLFxuICAgICAgICAgICAgICAgIHRyYWNrUG9pbnQsXG4gICAgICAgICAgICAgICAgZ1BvaW50LFxuICAgICAgICAgICAgICAgIG5vdyA9ICQubm93KCksXG4gICAgICAgICAgICAgICAgZWxhcHNlZFRpbWUsXG4gICAgICAgICAgICAgICAgZGlzdGFuY2UsXG4gICAgICAgICAgICAgICAgc3BlZWQ7XG5cbiAgICAgICAgICAgIGVsYXBzZWRUaW1lID0gbm93IC0gbGFzdFRpbWU7XG4gICAgICAgICAgICBsYXN0VGltZSA9IG5vdztcblxuICAgICAgICAgICAgZm9yICggaSA9IDA7IGkgPCBsZW47IGkrKyApIHtcbiAgICAgICAgICAgICAgICB0cmFja1BvaW50ID0gdHJhY2tlclBvaW50c1sgaSBdO1xuICAgICAgICAgICAgICAgIGdQb2ludCA9IHRyYWNrUG9pbnQuZ1BvaW50O1xuICAgICAgICAgICAgICAgIC8vIE1hdGguYXRhbjIgZ2l2ZXMgdXMganVzdCB3aGF0IHdlIG5lZWQgZm9yIGEgdmVsb2NpdHkgdmVjdG9yLCBhcyB3ZSBjYW4gc2ltcGx5XG4gICAgICAgICAgICAgICAgLy8gICB1c2UgY29zKCkvc2luKCkgdG8gZXh0cmFjdCB0aGUgeC95IHZlbG9jaXR5IGNvbXBvbmVudHMuXG4gICAgICAgICAgICAgICAgZ1BvaW50LmRpcmVjdGlvbiA9IE1hdGguYXRhbjIoIGdQb2ludC5jdXJyZW50UG9zLnkgLSB0cmFja1BvaW50Lmxhc3RQb3MueSwgZ1BvaW50LmN1cnJlbnRQb3MueCAtIHRyYWNrUG9pbnQubGFzdFBvcy54ICk7XG4gICAgICAgICAgICAgICAgLy8gc3BlZWQgPSBkaXN0YW5jZSAvIGVsYXBzZWQgdGltZVxuICAgICAgICAgICAgICAgIGRpc3RhbmNlID0gdHJhY2tQb2ludC5sYXN0UG9zLmRpc3RhbmNlVG8oIGdQb2ludC5jdXJyZW50UG9zICk7XG4gICAgICAgICAgICAgICAgdHJhY2tQb2ludC5sYXN0UG9zID0gZ1BvaW50LmN1cnJlbnRQb3M7XG4gICAgICAgICAgICAgICAgc3BlZWQgPSAxMDAwICogZGlzdGFuY2UgLyAoIGVsYXBzZWRUaW1lICsgMSApO1xuICAgICAgICAgICAgICAgIC8vIFNpbXBsZSBiaWFzZWQgYXZlcmFnZSwgZmF2b3JzIHRoZSBtb3N0IHJlY2VudCBzcGVlZCBjb21wdXRhdGlvbi4gU21vb3RocyBvdXQgZXJyYXRpYyBnZXN0dXJlcyBhIGJpdC5cbiAgICAgICAgICAgICAgICBnUG9pbnQuc3BlZWQgPSAwLjc1ICogc3BlZWQgKyAwLjI1ICogZ1BvaW50LnNwZWVkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIFB1YmxpYy4gQWRkIGEgZ2VzdHVyZSBwb2ludCB0byBiZSB0cmFja2VkXG4gICAgICAgIHZhciBhZGRQb2ludCA9IGZ1bmN0aW9uICggdHJhY2tlciwgZ1BvaW50ICkge1xuICAgICAgICAgICAgdmFyIGd1aWQgPSBfZ2VuZXJhdGVHdWlkKCB0cmFja2VyLCBnUG9pbnQgKTtcblxuICAgICAgICAgICAgdHJhY2tlclBvaW50cy5wdXNoKFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZ3VpZDogZ3VpZCxcbiAgICAgICAgICAgICAgICAgICAgZ1BvaW50OiBnUG9pbnQsXG4gICAgICAgICAgICAgICAgICAgIGxhc3RQb3M6IGdQb2ludC5jdXJyZW50UG9zXG4gICAgICAgICAgICAgICAgfSApO1xuXG4gICAgICAgICAgICAvLyBPbmx5IGZpcmUgdXAgdGhlIGludGVydmFsIHRpbWVyIHdoZW4gdGhlcmUncyBnZXN0dXJlIHBvaW50ZXJzIHRvIHRyYWNrXG4gICAgICAgICAgICBpZiAoIHRyYWNrZXJQb2ludHMubGVuZ3RoID09PSAxICkge1xuICAgICAgICAgICAgICAgIGxhc3RUaW1lID0gJC5ub3coKTtcbiAgICAgICAgICAgICAgICBpbnRlcnZhbElkID0gd2luZG93LnNldEludGVydmFsKCBfZG9UcmFja2luZywgNTAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICAvLyBQdWJsaWMuIFN0b3AgdHJhY2tpbmcgYSBnZXN0dXJlIHBvaW50XG4gICAgICAgIHZhciByZW1vdmVQb2ludCA9IGZ1bmN0aW9uICggdHJhY2tlciwgZ1BvaW50ICkge1xuICAgICAgICAgICAgdmFyIGd1aWQgPSBfZ2VuZXJhdGVHdWlkKCB0cmFja2VyLCBnUG9pbnQgKSxcbiAgICAgICAgICAgICAgICBpLFxuICAgICAgICAgICAgICAgIGxlbiA9IHRyYWNrZXJQb2ludHMubGVuZ3RoO1xuICAgICAgICAgICAgZm9yICggaSA9IDA7IGkgPCBsZW47IGkrKyApIHtcbiAgICAgICAgICAgICAgICBpZiAoIHRyYWNrZXJQb2ludHNbIGkgXS5ndWlkID09PSBndWlkICkge1xuICAgICAgICAgICAgICAgICAgICB0cmFja2VyUG9pbnRzLnNwbGljZSggaSwgMSApO1xuICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IHJ1biB0aGUgaW50ZXJ2YWwgdGltZXIgaWYgdGhlcmVzIGdlc3R1cmUgcG9pbnRlcnMgdG8gdHJhY2tcbiAgICAgICAgICAgICAgICAgICAgbGVuLS07XG4gICAgICAgICAgICAgICAgICAgIGlmICggbGVuID09PSAwICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmNsZWFySW50ZXJ2YWwoIGludGVydmFsSWQgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGFkZFBvaW50OiAgICBhZGRQb2ludCxcbiAgICAgICAgICAgIHJlbW92ZVBvaW50OiByZW1vdmVQb2ludFxuICAgICAgICB9O1xuICAgIH0gKSgpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFBvaW50ZXIgZXZlbnQgbW9kZWwgYW5kIGZlYXR1cmUgZGV0ZWN0aW9uXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbiAgICAkLk1vdXNlVHJhY2tlci5jYXB0dXJlRWxlbWVudCA9IGRvY3VtZW50O1xuXG4gICAgLyoqXG4gICAgICogRGV0ZWN0IGF2YWlsYWJsZSBtb3VzZSB3aGVlbCBldmVudCBuYW1lLlxuICAgICAqL1xuICAgICQuTW91c2VUcmFja2VyLndoZWVsRXZlbnROYW1lID0gKCAkLkJyb3dzZXIudmVuZG9yID09ICQuQlJPV1NFUlMuSUUgJiYgJC5Ccm93c2VyLnZlcnNpb24gPiA4ICkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggJ29ud2hlZWwnIGluIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICdkaXYnICkgKSA/ICd3aGVlbCcgOiAvLyBNb2Rlcm4gYnJvd3NlcnMgc3VwcG9ydCAnd2hlZWwnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5vbm1vdXNld2hlZWwgIT09IHVuZGVmaW5lZCA/ICdtb3VzZXdoZWVsJyA6ICAgICAgICAgICAgICAgICAgICAgLy8gV2Via2l0IGFuZCBJRSBzdXBwb3J0IGF0IGxlYXN0ICdtb3VzZXdoZWVsJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0RPTU1vdXNlU2Nyb2xsJzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFzc3VtZSBvbGQgRmlyZWZveFxuXG4gICAgLyoqXG4gICAgICogRGV0ZWN0IGxlZ2FjeSBtb3VzZSBjYXB0dXJlIHN1cHBvcnQuXG4gICAgICovXG4gICAgJC5Nb3VzZVRyYWNrZXIuc3VwcG9ydHNNb3VzZUNhcHR1cmUgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZGl2RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICdkaXYnICk7XG4gICAgICAgIHJldHVybiAkLmlzRnVuY3Rpb24oIGRpdkVsZW1lbnQuc2V0Q2FwdHVyZSApICYmICQuaXNGdW5jdGlvbiggZGl2RWxlbWVudC5yZWxlYXNlQ2FwdHVyZSApO1xuICAgIH0oKSk7XG5cbiAgICAvKipcbiAgICAgKiBEZXRlY3QgYnJvd3NlciBwb2ludGVyIGRldmljZSBldmVudCBtb2RlbChzKSBhbmQgYnVpbGQgYXBwcm9wcmlhdGUgbGlzdCBvZiBldmVudHMgdG8gc3Vic2NyaWJlIHRvLlxuICAgICAqL1xuICAgICQuTW91c2VUcmFja2VyLnN1YnNjcmliZUV2ZW50cyA9IFsgXCJjbGlja1wiLCBcImRibGNsaWNrXCIsIFwia2V5ZG93blwiLCBcImtleXVwXCIsIFwia2V5cHJlc3NcIiwgXCJmb2N1c1wiLCBcImJsdXJcIiwgJC5Nb3VzZVRyYWNrZXIud2hlZWxFdmVudE5hbWUgXTtcblxuICAgIGlmKCAkLk1vdXNlVHJhY2tlci53aGVlbEV2ZW50TmFtZSA9PSBcIkRPTU1vdXNlU2Nyb2xsXCIgKSB7XG4gICAgICAgIC8vIE9sZGVyIEZpcmVmb3hcbiAgICAgICAgJC5Nb3VzZVRyYWNrZXIuc3Vic2NyaWJlRXZlbnRzLnB1c2goIFwiTW96TW91c2VQaXhlbFNjcm9sbFwiICk7XG4gICAgfVxuXG4gICAgLy8gTm90ZTogd2luZG93Lm5hdmlnYXRvci5wb2ludGVyRW5hYmxlIGlzIGRlcHJlY2F0ZWQgb24gSUUgMTEgYW5kIG5vdCBwYXJ0IG9mIFczQyBzcGVjLlxuICAgIGlmICggd2luZG93LlBvaW50ZXJFdmVudCAmJiAoIHdpbmRvdy5uYXZpZ2F0b3IucG9pbnRlckVuYWJsZWQgfHwgJC5Ccm93c2VyLnZlbmRvciAhPT0gJC5CUk9XU0VSUy5JRSApICkge1xuICAgICAgICAvLyBJRTExIGFuZCBvdGhlciBXM0MgUG9pbnRlciBFdmVudCBpbXBsZW1lbnRhdGlvbnMgKHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9wb2ludGVyZXZlbnRzKVxuICAgICAgICAkLk1vdXNlVHJhY2tlci5oYXZlUG9pbnRlckV2ZW50cyA9IHRydWU7XG4gICAgICAgICQuTW91c2VUcmFja2VyLnN1YnNjcmliZUV2ZW50cy5wdXNoKCBcInBvaW50ZXJvdmVyXCIsIFwicG9pbnRlcm91dFwiLCBcInBvaW50ZXJkb3duXCIsIFwicG9pbnRlcnVwXCIsIFwicG9pbnRlcm1vdmVcIiwgXCJwb2ludGVyY2FuY2VsXCIgKTtcbiAgICAgICAgJC5Nb3VzZVRyYWNrZXIudW5wcmVmaXhlZFBvaW50ZXJFdmVudHMgPSB0cnVlO1xuICAgICAgICBpZiggbmF2aWdhdG9yLm1heFRvdWNoUG9pbnRzICkge1xuICAgICAgICAgICAgJC5Nb3VzZVRyYWNrZXIubWF4VG91Y2hQb2ludHMgPSBuYXZpZ2F0b3IubWF4VG91Y2hQb2ludHM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAkLk1vdXNlVHJhY2tlci5tYXhUb3VjaFBvaW50cyA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgJC5Nb3VzZVRyYWNrZXIuaGF2ZU1vdXNlRW50ZXIgPSBmYWxzZTtcbiAgICB9IGVsc2UgaWYgKCB3aW5kb3cuTVNQb2ludGVyRXZlbnQgJiYgd2luZG93Lm5hdmlnYXRvci5tc1BvaW50ZXJFbmFibGVkICkge1xuICAgICAgICAvLyBJRTEwXG4gICAgICAgICQuTW91c2VUcmFja2VyLmhhdmVQb2ludGVyRXZlbnRzID0gdHJ1ZTtcbiAgICAgICAgJC5Nb3VzZVRyYWNrZXIuc3Vic2NyaWJlRXZlbnRzLnB1c2goIFwiTVNQb2ludGVyT3ZlclwiLCBcIk1TUG9pbnRlck91dFwiLCBcIk1TUG9pbnRlckRvd25cIiwgXCJNU1BvaW50ZXJVcFwiLCBcIk1TUG9pbnRlck1vdmVcIiwgXCJNU1BvaW50ZXJDYW5jZWxcIiApO1xuICAgICAgICAkLk1vdXNlVHJhY2tlci51bnByZWZpeGVkUG9pbnRlckV2ZW50cyA9IGZhbHNlO1xuICAgICAgICBpZiggbmF2aWdhdG9yLm1zTWF4VG91Y2hQb2ludHMgKSB7XG4gICAgICAgICAgICAkLk1vdXNlVHJhY2tlci5tYXhUb3VjaFBvaW50cyA9IG5hdmlnYXRvci5tc01heFRvdWNoUG9pbnRzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgJC5Nb3VzZVRyYWNrZXIubWF4VG91Y2hQb2ludHMgPSAwO1xuICAgICAgICB9XG4gICAgICAgICQuTW91c2VUcmFja2VyLmhhdmVNb3VzZUVudGVyID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gTGVnYWN5IFczQyBtb3VzZSBldmVudHNcbiAgICAgICAgJC5Nb3VzZVRyYWNrZXIuaGF2ZVBvaW50ZXJFdmVudHMgPSBmYWxzZTtcbiAgICAgICAgaWYgKCAkLkJyb3dzZXIudmVuZG9yID09PSAkLkJST1dTRVJTLklFICYmICQuQnJvd3Nlci52ZXJzaW9uIDwgOSApIHtcbiAgICAgICAgICAgICQuTW91c2VUcmFja2VyLnN1YnNjcmliZUV2ZW50cy5wdXNoKCBcIm1vdXNlZW50ZXJcIiwgXCJtb3VzZWxlYXZlXCIgKTtcbiAgICAgICAgICAgICQuTW91c2VUcmFja2VyLmhhdmVNb3VzZUVudGVyID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICQuTW91c2VUcmFja2VyLnN1YnNjcmliZUV2ZW50cy5wdXNoKCBcIm1vdXNlb3ZlclwiLCBcIm1vdXNlb3V0XCIgKTtcbiAgICAgICAgICAgICQuTW91c2VUcmFja2VyLmhhdmVNb3VzZUVudGVyID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgJC5Nb3VzZVRyYWNrZXIuc3Vic2NyaWJlRXZlbnRzLnB1c2goIFwibW91c2Vkb3duXCIsIFwibW91c2V1cFwiLCBcIm1vdXNlbW92ZVwiICk7XG4gICAgICAgIGlmICggJ29udG91Y2hzdGFydCcgaW4gd2luZG93ICkge1xuICAgICAgICAgICAgLy8gaU9TLCBBbmRyb2lkLCBhbmQgb3RoZXIgVzNjIFRvdWNoIEV2ZW50IGltcGxlbWVudGF0aW9uc1xuICAgICAgICAgICAgLy8gICAgKHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi90b3VjaC1ldmVudHMvKVxuICAgICAgICAgICAgLy8gICAgKHNlZSBodHRwczovL2RldmVsb3Blci5hcHBsZS5jb20vbGlicmFyeS9pb3MvZG9jdW1lbnRhdGlvbi9BcHBsZUFwcGxpY2F0aW9ucy9SZWZlcmVuY2UvU2FmYXJpV2ViQ29udGVudC9IYW5kbGluZ0V2ZW50cy9IYW5kbGluZ0V2ZW50cy5odG1sKVxuICAgICAgICAgICAgLy8gICAgKHNlZSBodHRwczovL2RldmVsb3Blci5hcHBsZS5jb20vbGlicmFyeS9zYWZhcmkvZG9jdW1lbnRhdGlvbi9BcHBsZUFwcGxpY2F0aW9ucy9SZWZlcmVuY2UvU2FmYXJpV2ViQ29udGVudC9IYW5kbGluZ0V2ZW50cy9IYW5kbGluZ0V2ZW50cy5odG1sKVxuICAgICAgICAgICAgJC5Nb3VzZVRyYWNrZXIuc3Vic2NyaWJlRXZlbnRzLnB1c2goIFwidG91Y2hzdGFydFwiLCBcInRvdWNoZW5kXCIsIFwidG91Y2htb3ZlXCIsIFwidG91Y2hjYW5jZWxcIiApO1xuICAgICAgICB9XG4gICAgICAgIGlmICggJ29uZ2VzdHVyZXN0YXJ0JyBpbiB3aW5kb3cgKSB7XG4gICAgICAgICAgICAvLyBpT1MgKHNlZSBodHRwczovL2RldmVsb3Blci5hcHBsZS5jb20vbGlicmFyeS9pb3MvZG9jdW1lbnRhdGlvbi9BcHBsZUFwcGxpY2F0aW9ucy9SZWZlcmVuY2UvU2FmYXJpV2ViQ29udGVudC9IYW5kbGluZ0V2ZW50cy9IYW5kbGluZ0V2ZW50cy5odG1sKVxuICAgICAgICAgICAgLy8gICBTdWJzY3JpYmUgdG8gdGhlc2UgdG8gcHJldmVudCBkZWZhdWx0IGdlc3R1cmUgaGFuZGxpbmdcbiAgICAgICAgICAgICQuTW91c2VUcmFja2VyLnN1YnNjcmliZUV2ZW50cy5wdXNoKCBcImdlc3R1cmVzdGFydFwiLCBcImdlc3R1cmVjaGFuZ2VcIiApO1xuICAgICAgICB9XG4gICAgICAgICQuTW91c2VUcmFja2VyLm1vdXNlUG9pbnRlcklkID0gXCJsZWdhY3ktbW91c2VcIjtcbiAgICAgICAgJC5Nb3VzZVRyYWNrZXIubWF4VG91Y2hQb2ludHMgPSAxMDtcbiAgICB9XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gQ2xhc3NlcyBhbmQgdHlwZWRlZnNcbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYSBwb2ludCBvZiBjb250YWN0IG9uIHRoZSBzY3JlZW4gbWFkZSBieSBhIG1vdXNlIGN1cnNvciwgcGVuLCB0b3VjaCwgb3Igb3RoZXIgcG9pbnRlciBkZXZpY2UuXG4gICAgICpcbiAgICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBHZXN0dXJlUG9pbnRcbiAgICAgKiBAbWVtYmVyb2YgT3BlblNlYWRyYWdvbi5Nb3VzZVRyYWNrZXJcbiAgICAgKlxuICAgICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBpZFxuICAgICAqICAgICBJZGVudGlmaWVyIHVuaXF1ZSBmcm9tIGFsbCBvdGhlciBhY3RpdmUgR2VzdHVyZVBvaW50cyBmb3IgYSBnaXZlbiBwb2ludGVyIGRldmljZS5cbiAgICAgKiBAcHJvcGVydHkge1N0cmluZ30gdHlwZVxuICAgICAqICAgICBUaGUgcG9pbnRlciBkZXZpY2UgdHlwZTogXCJtb3VzZVwiLCBcInRvdWNoXCIsIFwicGVuXCIsIGV0Yy5cbiAgICAgKiBAcHJvcGVydHkge0Jvb2xlYW59IGNhcHR1cmVkXG4gICAgICogICAgIFRydWUgaWYgZXZlbnRzIGZvciB0aGUgZ2VzdHVyZSBwb2ludCBhcmUgY2FwdHVyZWQgdG8gdGhlIHRyYWNrZWQgZWxlbWVudC5cbiAgICAgKiBAcHJvcGVydHkge0Jvb2xlYW59IGlzUHJpbWFyeVxuICAgICAqICAgICBUcnVlIGlmIHRoZSBnZXN0dXJlIHBvaW50IGlzIGEgbWFzdGVyIHBvaW50ZXIgYW1vbmdzdCB0aGUgc2V0IG9mIGFjdGl2ZSBwb2ludGVycyBmb3IgZWFjaCBwb2ludGVyIHR5cGUuIFRydWUgZm9yIG1vdXNlIGFuZCBwcmltYXJ5IChmaXJzdCkgdG91Y2gvcGVuIHBvaW50ZXJzLlxuICAgICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gaW5zaWRlRWxlbWVudFByZXNzZWRcbiAgICAgKiAgICAgVHJ1ZSBpZiBidXR0b24gcHJlc3NlZCBvciBjb250YWN0IHBvaW50IGluaXRpYXRlZCBpbnNpZGUgdGhlIHNjcmVlbiBhcmVhIG9mIHRoZSB0cmFja2VkIGVsZW1lbnQuXG4gICAgICogQHByb3BlcnR5IHtCb29sZWFufSBpbnNpZGVFbGVtZW50XG4gICAgICogICAgIFRydWUgaWYgcG9pbnRlciBvciBjb250YWN0IHBvaW50IGlzIGN1cnJlbnRseSBpbnNpZGUgdGhlIGJvdW5kcyBvZiB0aGUgdHJhY2tlZCBlbGVtZW50LlxuICAgICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBzcGVlZFxuICAgICAqICAgICBDdXJyZW50IGNvbXB1dGVkIHNwZWVkLCBpbiBwaXhlbHMgcGVyIHNlY29uZC5cbiAgICAgKiBAcHJvcGVydHkge051bWJlcn0gZGlyZWN0aW9uXG4gICAgICogICAgIEN1cnJlbnQgY29tcHV0ZWQgZGlyZWN0aW9uLCBleHByZXNzZWQgYXMgYW4gYW5nbGUgY291bnRlcmNsb2Nrd2lzZSByZWxhdGl2ZSB0byB0aGUgcG9zaXRpdmUgWCBheGlzICgtcGkgdG8gcGksIGluIHJhZGlhbnMpLiBPbmx5IHZhbGlkIGlmIHNwZWVkID4gMC5cbiAgICAgKiBAcHJvcGVydHkge09wZW5TZWFkcmFnb24uUG9pbnR9IGNvbnRhY3RQb3NcbiAgICAgKiAgICAgVGhlIGluaXRpYWwgcG9pbnRlciBjb250YWN0IHBvc2l0aW9uLCByZWxhdGl2ZSB0byB0aGUgcGFnZSBpbmNsdWRpbmcgYW55IHNjcm9sbGluZy4gT25seSB2YWxpZCBpZiB0aGUgcG9pbnRlciBoYXMgY29udGFjdCAocHJlc3NlZCwgdG91Y2ggY29udGFjdCwgcGVuIGNvbnRhY3QpLlxuICAgICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBjb250YWN0VGltZVxuICAgICAqICAgICBUaGUgaW5pdGlhbCBwb2ludGVyIGNvbnRhY3QgdGltZSwgaW4gbWlsbGlzZWNvbmRzLiBPbmx5IHZhbGlkIGlmIHRoZSBwb2ludGVyIGhhcyBjb250YWN0IChwcmVzc2VkLCB0b3VjaCBjb250YWN0LCBwZW4gY29udGFjdCkuXG4gICAgICogQHByb3BlcnR5IHtPcGVuU2VhZHJhZ29uLlBvaW50fSBsYXN0UG9zXG4gICAgICogICAgIFRoZSBsYXN0IHBvaW50ZXIgcG9zaXRpb24sIHJlbGF0aXZlIHRvIHRoZSBwYWdlIGluY2x1ZGluZyBhbnkgc2Nyb2xsaW5nLlxuICAgICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBsYXN0VGltZVxuICAgICAqICAgICBUaGUgbGFzdCBwb2ludGVyIGNvbnRhY3QgdGltZSwgaW4gbWlsbGlzZWNvbmRzLlxuICAgICAqIEBwcm9wZXJ0eSB7T3BlblNlYWRyYWdvbi5Qb2ludH0gY3VycmVudFBvc1xuICAgICAqICAgICBUaGUgY3VycmVudCBwb2ludGVyIHBvc2l0aW9uLCByZWxhdGl2ZSB0byB0aGUgcGFnZSBpbmNsdWRpbmcgYW55IHNjcm9sbGluZy5cbiAgICAgKiBAcHJvcGVydHkge051bWJlcn0gY3VycmVudFRpbWVcbiAgICAgKiAgICAgVGhlIGN1cnJlbnQgcG9pbnRlciBjb250YWN0IHRpbWUsIGluIG1pbGxpc2Vjb25kcy5cbiAgICAgKi9cblxuXG4gICAgLyoqXG4gICAgICogQGNsYXNzIEdlc3R1cmVQb2ludExpc3RcbiAgICAgKiBAY2xhc3NkZXNjIFByb3ZpZGVzIGFuIGFic3RyYWN0aW9uIGZvciBhIHNldCBvZiBhY3RpdmUge0BsaW5rIE9wZW5TZWFkcmFnb24uTW91c2VUcmFja2VyLkdlc3R1cmVQb2ludHxHZXN0dXJlUG9pbnR9IG9iamVjdHMgZm9yIGEgZ2l2ZW4gcG9pbnRlciBkZXZpY2UgdHlwZS5cbiAgICAgKiAgICAgICAgICAgIEFjdGl2ZSBwb2ludGVycyBhcmUgYW55IHBvaW50ZXIgYmVpbmcgdHJhY2tlZCBmb3IgdGhpcyBlbGVtZW50IHdoaWNoIGFyZSBpbiB0aGUgaGl0LXRlc3QgYXJlYVxuICAgICAqICAgICAgICAgICAgb2YgdGhlIGVsZW1lbnQgKGZvciBob3Zlci1jYXBhYmxlIGRldmljZXMpIGFuZC9vciBoYXZlIGNvbnRhY3Qgb3IgYSBidXR0b24gcHJlc3MgaW5pdGlhdGVkIGluIHRoZSBlbGVtZW50LlxuICAgICAqIEBtZW1iZXJvZiBPcGVuU2VhZHJhZ29uLk1vdXNlVHJhY2tlclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIC0gVGhlIHBvaW50ZXIgZGV2aWNlIHR5cGU6IFwibW91c2VcIiwgXCJ0b3VjaFwiLCBcInBlblwiLCBldGMuXG4gICAgICovXG4gICAgJC5Nb3VzZVRyYWNrZXIuR2VzdHVyZVBvaW50TGlzdCA9IGZ1bmN0aW9uICggdHlwZSApIHtcbiAgICAgICAgdGhpcy5fZ1BvaW50cyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIHBvaW50ZXIgZGV2aWNlIHR5cGU6IFwibW91c2VcIiwgXCJ0b3VjaFwiLCBcInBlblwiLCBldGMuXG4gICAgICAgICAqIEBtZW1iZXIge1N0cmluZ30gdHlwZVxuICAgICAgICAgKiBAbWVtYmVyb2YgT3BlblNlYWRyYWdvbi5Nb3VzZVRyYWNrZXIuR2VzdHVyZVBvaW50TGlzdCNcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDdXJyZW50IGJ1dHRvbnMgcHJlc3NlZCBmb3IgdGhlIGRldmljZS5cbiAgICAgICAgICogQ29tYmluYXRpb24gb2YgYml0IGZsYWdzIDA6IG5vbmUsIDE6IHByaW1hcnkgKG9yIHRvdWNoIGNvbnRhY3QpLCAyOiBzZWNvbmRhcnksIDQ6IGF1eCAob2Z0ZW4gbWlkZGxlKSwgODogWDEgKG9mdGVuIGJhY2spLCAxNjogWDIgKG9mdGVuIGZvcndhcmQpLCAzMjogcGVuIGVyYXNlci5cbiAgICAgICAgICogQG1lbWJlciB7TnVtYmVyfSBidXR0b25zXG4gICAgICAgICAqIEBtZW1iZXJvZiBPcGVuU2VhZHJhZ29uLk1vdXNlVHJhY2tlci5HZXN0dXJlUG9pbnRMaXN0I1xuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5idXR0b25zID0gMDtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEN1cnJlbnQgbnVtYmVyIG9mIGNvbnRhY3QgcG9pbnRzICh0b3VjaCBwb2ludHMsIG1vdXNlIGRvd24sIGV0Yy4pIGZvciB0aGUgZGV2aWNlLlxuICAgICAgICAgKiBAbWVtYmVyIHtOdW1iZXJ9IGNvbnRhY3RzXG4gICAgICAgICAqIEBtZW1iZXJvZiBPcGVuU2VhZHJhZ29uLk1vdXNlVHJhY2tlci5HZXN0dXJlUG9pbnRMaXN0I1xuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jb250YWN0cyA9IDA7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDdXJyZW50IG51bWJlciBvZiBjbGlja3MgZm9yIHRoZSBkZXZpY2UuIFVzZWQgZm9yIG11bHRpcGxlIGNsaWNrIGdlc3R1cmUgdHJhY2tpbmcuXG4gICAgICAgICAqIEBtZW1iZXIge051bWJlcn0gY2xpY2tzXG4gICAgICAgICAqIEBtZW1iZXJvZiBPcGVuU2VhZHJhZ29uLk1vdXNlVHJhY2tlci5HZXN0dXJlUG9pbnRMaXN0I1xuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jbGlja3MgPSAwO1xuICAgICAgICAvKipcbiAgICAgICAgICogQ3VycmVudCBudW1iZXIgb2YgY2FwdHVyZWQgcG9pbnRlcnMgZm9yIHRoZSBkZXZpY2UuXG4gICAgICAgICAqIEBtZW1iZXIge051bWJlcn0gY2FwdHVyZUNvdW50XG4gICAgICAgICAqIEBtZW1iZXJvZiBPcGVuU2VhZHJhZ29uLk1vdXNlVHJhY2tlci5HZXN0dXJlUG9pbnRMaXN0I1xuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jYXB0dXJlQ291bnQgPSAwO1xuICAgIH07XG5cbiAgICAvKiogQGxlbmRzIE9wZW5TZWFkcmFnb24uTW91c2VUcmFja2VyLkdlc3R1cmVQb2ludExpc3QucHJvdG90eXBlICovXG4gICAgJC5Nb3VzZVRyYWNrZXIuR2VzdHVyZVBvaW50TGlzdC5wcm90b3R5cGUgPSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAZnVuY3Rpb25cbiAgICAgICAgICogQHJldHVybnMge051bWJlcn0gTnVtYmVyIG9mIGdlc3R1cmUgcG9pbnRzIGluIHRoZSBsaXN0LlxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0TGVuZ3RoOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZ1BvaW50cy5sZW5ndGg7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAZnVuY3Rpb25cbiAgICAgICAgICogQHJldHVybnMge0FycmF5LjxPcGVuU2VhZHJhZ29uLk1vdXNlVHJhY2tlci5HZXN0dXJlUG9pbnQ+fSBUaGUgbGlzdCBvZiBnZXN0dXJlIHBvaW50cyBpbiB0aGUgbGlzdCBhcyBhbiBhcnJheSAocmVhZC1vbmx5KS5cbiAgICAgICAgICovXG4gICAgICAgIGFzQXJyYXk6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9nUG9pbnRzO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQGZ1bmN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7T3BlblNlYWRyYWdvbi5Nb3VzZVRyYWNrZXIuR2VzdHVyZVBvaW50fSBnZXN0dXJlUG9pbnQgLSBBIGdlc3R1cmUgcG9pbnQgdG8gYWRkIHRvIHRoZSBsaXN0LlxuICAgICAgICAgKiBAcmV0dXJucyB7TnVtYmVyfSBOdW1iZXIgb2YgZ2VzdHVyZSBwb2ludHMgaW4gdGhlIGxpc3QuXG4gICAgICAgICAqL1xuICAgICAgICBhZGQ6IGZ1bmN0aW9uICggZ3AgKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZ1BvaW50cy5wdXNoKCBncCApO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQGZ1bmN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7TnVtYmVyfSBpZCAtIFRoZSBpZCBvZiB0aGUgZ2VzdHVyZSBwb2ludCB0byByZW1vdmUgZnJvbSB0aGUgbGlzdC5cbiAgICAgICAgICogQHJldHVybnMge051bWJlcn0gTnVtYmVyIG9mIGdlc3R1cmUgcG9pbnRzIGluIHRoZSBsaXN0LlxuICAgICAgICAgKi9cbiAgICAgICAgcmVtb3ZlQnlJZDogZnVuY3Rpb24gKCBpZCApIHtcbiAgICAgICAgICAgIHZhciBpLFxuICAgICAgICAgICAgICAgIGxlbiA9IHRoaXMuX2dQb2ludHMubGVuZ3RoO1xuICAgICAgICAgICAgZm9yICggaSA9IDA7IGkgPCBsZW47IGkrKyApIHtcbiAgICAgICAgICAgICAgICBpZiAoIHRoaXMuX2dQb2ludHNbIGkgXS5pZCA9PT0gaWQgKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2dQb2ludHMuc3BsaWNlKCBpLCAxICk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9nUG9pbnRzLmxlbmd0aDtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBmdW5jdGlvblxuICAgICAgICAgKiBAcGFyYW0ge051bWJlcn0gaW5kZXggLSBUaGUgaW5kZXggb2YgdGhlIGdlc3R1cmUgcG9pbnQgdG8gcmV0cmlldmUgZnJvbSB0aGUgbGlzdC5cbiAgICAgICAgICogQHJldHVybnMge09wZW5TZWFkcmFnb24uTW91c2VUcmFja2VyLkdlc3R1cmVQb2ludHxudWxsfSBUaGUgZ2VzdHVyZSBwb2ludCBhdCB0aGUgZ2l2ZW4gaW5kZXgsIG9yIG51bGwgaWYgbm90IGZvdW5kLlxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0QnlJbmRleDogZnVuY3Rpb24gKCBpbmRleCApIHtcbiAgICAgICAgICAgIGlmICggaW5kZXggPCB0aGlzLl9nUG9pbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9nUG9pbnRzWyBpbmRleCBdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBmdW5jdGlvblxuICAgICAgICAgKiBAcGFyYW0ge051bWJlcn0gaWQgLSBUaGUgaWQgb2YgdGhlIGdlc3R1cmUgcG9pbnQgdG8gcmV0cmlldmUgZnJvbSB0aGUgbGlzdC5cbiAgICAgICAgICogQHJldHVybnMge09wZW5TZWFkcmFnb24uTW91c2VUcmFja2VyLkdlc3R1cmVQb2ludHxudWxsfSBUaGUgZ2VzdHVyZSBwb2ludCB3aXRoIHRoZSBnaXZlbiBpZCwgb3IgbnVsbCBpZiBub3QgZm91bmQuXG4gICAgICAgICAqL1xuICAgICAgICBnZXRCeUlkOiBmdW5jdGlvbiAoIGlkICkge1xuICAgICAgICAgICAgdmFyIGksXG4gICAgICAgICAgICAgICAgbGVuID0gdGhpcy5fZ1BvaW50cy5sZW5ndGg7XG4gICAgICAgICAgICBmb3IgKCBpID0gMDsgaSA8IGxlbjsgaSsrICkge1xuICAgICAgICAgICAgICAgIGlmICggdGhpcy5fZ1BvaW50c1sgaSBdLmlkID09PSBpZCApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dQb2ludHNbIGkgXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBmdW5jdGlvblxuICAgICAgICAgKiBAcmV0dXJucyB7T3BlblNlYWRyYWdvbi5Nb3VzZVRyYWNrZXIuR2VzdHVyZVBvaW50fG51bGx9IFRoZSBwcmltYXJ5IGdlc3R1cmUgcG9pbnQgaW4gdGhlIGxpc3QsIG9yIG51bGwgaWYgbm90IGZvdW5kLlxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0UHJpbWFyeTogZnVuY3Rpb24gKCBpZCApIHtcbiAgICAgICAgICAgIHZhciBpLFxuICAgICAgICAgICAgICAgIGxlbiA9IHRoaXMuX2dQb2ludHMubGVuZ3RoO1xuICAgICAgICAgICAgZm9yICggaSA9IDA7IGkgPCBsZW47IGkrKyApIHtcbiAgICAgICAgICAgICAgICBpZiAoIHRoaXMuX2dQb2ludHNbIGkgXS5pc1ByaW1hcnkgKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9nUG9pbnRzWyBpIF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9O1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFV0aWxpdHkgZnVuY3Rpb25zXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGFsbCB0cmFja2VkIHBvaW50ZXJzLlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQGlubmVyXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2xlYXJUcmFja2VkUG9pbnRlcnMoIHRyYWNrZXIgKSB7XG4gICAgICAgIHZhciBkZWxlZ2F0ZSA9IFRISVNbIHRyYWNrZXIuaGFzaCBdLFxuICAgICAgICAgICAgaSxcbiAgICAgICAgICAgIHBvaW50ZXJMaXN0Q291bnQgPSBkZWxlZ2F0ZS5hY3RpdmVQb2ludGVyc0xpc3RzLmxlbmd0aDtcblxuICAgICAgICBmb3IgKCBpID0gMDsgaSA8IHBvaW50ZXJMaXN0Q291bnQ7IGkrKyApIHtcbiAgICAgICAgICAgIGlmICggZGVsZWdhdGUuYWN0aXZlUG9pbnRlcnNMaXN0c1sgaSBdLmNhcHR1cmVDb3VudCA+IDAgKSB7XG4gICAgICAgICAgICAgICAgJC5yZW1vdmVFdmVudChcbiAgICAgICAgICAgICAgICAgICAgJC5Nb3VzZVRyYWNrZXIuY2FwdHVyZUVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgICdtb3VzZW1vdmUnLFxuICAgICAgICAgICAgICAgICAgICBkZWxlZ2F0ZS5tb3VzZW1vdmVjYXB0dXJlZCxcbiAgICAgICAgICAgICAgICAgICAgdHJ1ZVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgJC5yZW1vdmVFdmVudChcbiAgICAgICAgICAgICAgICAgICAgJC5Nb3VzZVRyYWNrZXIuY2FwdHVyZUVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgICdtb3VzZXVwJyxcbiAgICAgICAgICAgICAgICAgICAgZGVsZWdhdGUubW91c2V1cGNhcHR1cmVkLFxuICAgICAgICAgICAgICAgICAgICB0cnVlXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAkLnJlbW92ZUV2ZW50KFxuICAgICAgICAgICAgICAgICAgICAkLk1vdXNlVHJhY2tlci5jYXB0dXJlRWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgJC5Nb3VzZVRyYWNrZXIudW5wcmVmaXhlZFBvaW50ZXJFdmVudHMgPyAncG9pbnRlcm1vdmUnIDogJ01TUG9pbnRlck1vdmUnLFxuICAgICAgICAgICAgICAgICAgICBkZWxlZ2F0ZS5wb2ludGVybW92ZWNhcHR1cmVkLFxuICAgICAgICAgICAgICAgICAgICB0cnVlXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAkLnJlbW92ZUV2ZW50KFxuICAgICAgICAgICAgICAgICAgICAkLk1vdXNlVHJhY2tlci5jYXB0dXJlRWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgJC5Nb3VzZVRyYWNrZXIudW5wcmVmaXhlZFBvaW50ZXJFdmVudHMgPyAncG9pbnRlcnVwJyA6ICdNU1BvaW50ZXJVcCcsXG4gICAgICAgICAgICAgICAgICAgIGRlbGVnYXRlLnBvaW50ZXJ1cGNhcHR1cmVkLFxuICAgICAgICAgICAgICAgICAgICB0cnVlXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAkLnJlbW92ZUV2ZW50KFxuICAgICAgICAgICAgICAgICAgICAkLk1vdXNlVHJhY2tlci5jYXB0dXJlRWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgJ3RvdWNobW92ZScsXG4gICAgICAgICAgICAgICAgICAgIGRlbGVnYXRlLnRvdWNobW92ZWNhcHR1cmVkLFxuICAgICAgICAgICAgICAgICAgICB0cnVlXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAkLnJlbW92ZUV2ZW50KFxuICAgICAgICAgICAgICAgICAgICAkLk1vdXNlVHJhY2tlci5jYXB0dXJlRWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgJ3RvdWNoZW5kJyxcbiAgICAgICAgICAgICAgICAgICAgZGVsZWdhdGUudG91Y2hlbmRjYXB0dXJlZCxcbiAgICAgICAgICAgICAgICAgICAgdHJ1ZVxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICBkZWxlZ2F0ZS5hY3RpdmVQb2ludGVyc0xpc3RzWyBpIF0uY2FwdHVyZUNvdW50ID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoIGkgPSAwOyBpIDwgcG9pbnRlckxpc3RDb3VudDsgaSsrICkge1xuICAgICAgICAgICAgZGVsZWdhdGUuYWN0aXZlUG9pbnRlcnNMaXN0cy5wb3AoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFN0YXJ0cyB0cmFja2luZyBwb2ludGVyIGV2ZW50cyBvbiB0aGUgdHJhY2tlZCBlbGVtZW50LlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQGlubmVyXG4gICAgICovXG4gICAgZnVuY3Rpb24gc3RhcnRUcmFja2luZyggdHJhY2tlciApIHtcbiAgICAgICAgdmFyIGRlbGVnYXRlID0gVEhJU1sgdHJhY2tlci5oYXNoIF0sXG4gICAgICAgICAgICBldmVudCxcbiAgICAgICAgICAgIGk7XG5cbiAgICAgICAgaWYgKCAhZGVsZWdhdGUudHJhY2tpbmcgKSB7XG4gICAgICAgICAgICBmb3IgKCBpID0gMDsgaSA8ICQuTW91c2VUcmFja2VyLnN1YnNjcmliZUV2ZW50cy5sZW5ndGg7IGkrKyApIHtcbiAgICAgICAgICAgICAgICBldmVudCA9ICQuTW91c2VUcmFja2VyLnN1YnNjcmliZUV2ZW50c1sgaSBdO1xuICAgICAgICAgICAgICAgICQuYWRkRXZlbnQoXG4gICAgICAgICAgICAgICAgICAgIHRyYWNrZXIuZWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICAgICAgICAgIGRlbGVnYXRlWyBldmVudCBdLFxuICAgICAgICAgICAgICAgICAgICBmYWxzZVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNsZWFyVHJhY2tlZFBvaW50ZXJzKCB0cmFja2VyICk7XG5cbiAgICAgICAgICAgIGRlbGVnYXRlLnRyYWNraW5nID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFN0b3BzIHRyYWNraW5nIHBvaW50ZXIgZXZlbnRzIG9uIHRoZSB0cmFja2VkIGVsZW1lbnQuXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAaW5uZXJcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzdG9wVHJhY2tpbmcoIHRyYWNrZXIgKSB7XG4gICAgICAgIHZhciBkZWxlZ2F0ZSA9IFRISVNbIHRyYWNrZXIuaGFzaCBdLFxuICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICBpO1xuXG4gICAgICAgIGlmICggZGVsZWdhdGUudHJhY2tpbmcgKSB7XG4gICAgICAgICAgICBmb3IgKCBpID0gMDsgaSA8ICQuTW91c2VUcmFja2VyLnN1YnNjcmliZUV2ZW50cy5sZW5ndGg7IGkrKyApIHtcbiAgICAgICAgICAgICAgICBldmVudCA9ICQuTW91c2VUcmFja2VyLnN1YnNjcmliZUV2ZW50c1sgaSBdO1xuICAgICAgICAgICAgICAgICQucmVtb3ZlRXZlbnQoXG4gICAgICAgICAgICAgICAgICAgIHRyYWNrZXIuZWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICAgICAgICAgIGRlbGVnYXRlWyBldmVudCBdLFxuICAgICAgICAgICAgICAgICAgICBmYWxzZVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNsZWFyVHJhY2tlZFBvaW50ZXJzKCB0cmFja2VyICk7XG5cbiAgICAgICAgICAgIGRlbGVnYXRlLnRyYWNraW5nID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBpbm5lclxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldENhcHR1cmVFdmVudFBhcmFtcyggdHJhY2tlciwgcG9pbnRlclR5cGUgKSB7XG4gICAgICAgIHZhciBkZWxlZ2F0ZSA9IFRISVNbIHRyYWNrZXIuaGFzaCBdO1xuXG4gICAgICAgIGlmICggcG9pbnRlclR5cGUgPT09ICdwb2ludGVyZXZlbnQnICkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cE5hbWU6ICQuTW91c2VUcmFja2VyLnVucHJlZml4ZWRQb2ludGVyRXZlbnRzID8gJ3BvaW50ZXJ1cCcgOiAnTVNQb2ludGVyVXAnLFxuICAgICAgICAgICAgICAgIHVwSGFuZGxlcjogZGVsZWdhdGUucG9pbnRlcnVwY2FwdHVyZWQsXG4gICAgICAgICAgICAgICAgbW92ZU5hbWU6ICQuTW91c2VUcmFja2VyLnVucHJlZml4ZWRQb2ludGVyRXZlbnRzID8gJ3BvaW50ZXJtb3ZlJyA6ICdNU1BvaW50ZXJNb3ZlJyxcbiAgICAgICAgICAgICAgICBtb3ZlSGFuZGxlcjogZGVsZWdhdGUucG9pbnRlcm1vdmVjYXB0dXJlZFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIGlmICggcG9pbnRlclR5cGUgPT09ICdtb3VzZScgKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVwTmFtZTogJ21vdXNldXAnLFxuICAgICAgICAgICAgICAgIHVwSGFuZGxlcjogZGVsZWdhdGUubW91c2V1cGNhcHR1cmVkLFxuICAgICAgICAgICAgICAgIG1vdmVOYW1lOiAnbW91c2Vtb3ZlJyxcbiAgICAgICAgICAgICAgICBtb3ZlSGFuZGxlcjogZGVsZWdhdGUubW91c2Vtb3ZlY2FwdHVyZWRcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSBpZiAoIHBvaW50ZXJUeXBlID09PSAndG91Y2gnICkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cE5hbWU6ICd0b3VjaGVuZCcsXG4gICAgICAgICAgICAgICAgdXBIYW5kbGVyOiBkZWxlZ2F0ZS50b3VjaGVuZGNhcHR1cmVkLFxuICAgICAgICAgICAgICAgIG1vdmVOYW1lOiAndG91Y2htb3ZlJyxcbiAgICAgICAgICAgICAgICBtb3ZlSGFuZGxlcjogZGVsZWdhdGUudG91Y2htb3ZlY2FwdHVyZWRcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIFwiTW91c2VUcmFja2VyLmdldENhcHR1cmVFdmVudFBhcmFtczogVW5rbm93biBwb2ludGVyIHR5cGUuXCIgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEJlZ2luIGNhcHR1cmluZyBwb2ludGVyIGV2ZW50cyB0byB0aGUgdHJhY2tlZCBlbGVtZW50LlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQGlubmVyXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2FwdHVyZVBvaW50ZXIoIHRyYWNrZXIsIHBvaW50ZXJUeXBlLCBwb2ludGVyQ291bnQgKSB7XG4gICAgICAgIHZhciBwb2ludHNMaXN0ID0gdHJhY2tlci5nZXRBY3RpdmVQb2ludGVyc0xpc3RCeVR5cGUoIHBvaW50ZXJUeXBlICksXG4gICAgICAgICAgICBldmVudFBhcmFtcztcblxuICAgICAgICBwb2ludHNMaXN0LmNhcHR1cmVDb3VudCArPSAocG9pbnRlckNvdW50IHx8IDEpO1xuXG4gICAgICAgIGlmICggcG9pbnRzTGlzdC5jYXB0dXJlQ291bnQgPT09IDEgKSB7XG4gICAgICAgICAgICBpZiAoICQuQnJvd3Nlci52ZW5kb3IgPT09ICQuQlJPV1NFUlMuSUUgJiYgJC5Ccm93c2VyLnZlcnNpb24gPCA5ICkge1xuICAgICAgICAgICAgICAgIHRyYWNrZXIuZWxlbWVudC5zZXRDYXB0dXJlKCB0cnVlICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGV2ZW50UGFyYW1zID0gZ2V0Q2FwdHVyZUV2ZW50UGFyYW1zKCB0cmFja2VyLCAkLk1vdXNlVHJhY2tlci5oYXZlUG9pbnRlckV2ZW50cyA/ICdwb2ludGVyZXZlbnQnIDogcG9pbnRlclR5cGUgKTtcbiAgICAgICAgICAgICAgICAvLyBXZSBlbXVsYXRlIG1vdXNlIGNhcHR1cmUgYnkgaGFuZ2luZyBsaXN0ZW5lcnMgb24gdGhlIGRvY3VtZW50IG9iamVjdC5cbiAgICAgICAgICAgICAgICAvLyAgICAoTm90ZSB3ZSBsaXN0ZW4gb24gdGhlIGNhcHR1cmUgcGhhc2Ugc28gdGhlIGNhcHR1cmVkIGhhbmRsZXJzIHdpbGwgZ2V0IGNhbGxlZCBmaXJzdClcbiAgICAgICAgICAgICAgICBpZiAoaXNJbklmcmFtZSAmJiBjYW5BY2Nlc3NFdmVudHMod2luZG93LnRvcCkpIHtcbiAgICAgICAgICAgICAgICAgICAgJC5hZGRFdmVudChcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy50b3AsXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudFBhcmFtcy51cE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudFBhcmFtcy51cEhhbmRsZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICB0cnVlXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICQuYWRkRXZlbnQoXG4gICAgICAgICAgICAgICAgICAgICQuTW91c2VUcmFja2VyLmNhcHR1cmVFbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICBldmVudFBhcmFtcy51cE5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50UGFyYW1zLnVwSGFuZGxlcixcbiAgICAgICAgICAgICAgICAgICAgdHJ1ZVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgJC5hZGRFdmVudChcbiAgICAgICAgICAgICAgICAgICAgJC5Nb3VzZVRyYWNrZXIuY2FwdHVyZUVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50UGFyYW1zLm1vdmVOYW1lLFxuICAgICAgICAgICAgICAgICAgICBldmVudFBhcmFtcy5tb3ZlSGFuZGxlcixcbiAgICAgICAgICAgICAgICAgICAgdHJ1ZVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIFN0b3AgY2FwdHVyaW5nIHBvaW50ZXIgZXZlbnRzIHRvIHRoZSB0cmFja2VkIGVsZW1lbnQuXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAaW5uZXJcbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZWxlYXNlUG9pbnRlciggdHJhY2tlciwgcG9pbnRlclR5cGUsIHBvaW50ZXJDb3VudCApIHtcbiAgICAgICAgdmFyIHBvaW50c0xpc3QgPSB0cmFja2VyLmdldEFjdGl2ZVBvaW50ZXJzTGlzdEJ5VHlwZSggcG9pbnRlclR5cGUgKSxcbiAgICAgICAgICAgIGV2ZW50UGFyYW1zO1xuXG4gICAgICAgIHBvaW50c0xpc3QuY2FwdHVyZUNvdW50IC09IChwb2ludGVyQ291bnQgfHwgMSk7XG5cbiAgICAgICAgaWYgKCBwb2ludHNMaXN0LmNhcHR1cmVDb3VudCA9PT0gMCApIHtcbiAgICAgICAgICAgIGlmICggJC5Ccm93c2VyLnZlbmRvciA9PT0gJC5CUk9XU0VSUy5JRSAmJiAkLkJyb3dzZXIudmVyc2lvbiA8IDkgKSB7XG4gICAgICAgICAgICAgICAgdHJhY2tlci5lbGVtZW50LnJlbGVhc2VDYXB0dXJlKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGV2ZW50UGFyYW1zID0gZ2V0Q2FwdHVyZUV2ZW50UGFyYW1zKCB0cmFja2VyLCAkLk1vdXNlVHJhY2tlci5oYXZlUG9pbnRlckV2ZW50cyA/ICdwb2ludGVyZXZlbnQnIDogcG9pbnRlclR5cGUgKTtcbiAgICAgICAgICAgICAgICAvLyBXZSBlbXVsYXRlIG1vdXNlIGNhcHR1cmUgYnkgaGFuZ2luZyBsaXN0ZW5lcnMgb24gdGhlIGRvY3VtZW50IG9iamVjdC5cbiAgICAgICAgICAgICAgICAvLyAgICAoTm90ZSB3ZSBsaXN0ZW4gb24gdGhlIGNhcHR1cmUgcGhhc2Ugc28gdGhlIGNhcHR1cmVkIGhhbmRsZXJzIHdpbGwgZ2V0IGNhbGxlZCBmaXJzdClcbiAgICAgICAgICAgICAgICBpZiAoaXNJbklmcmFtZSAmJiBjYW5BY2Nlc3NFdmVudHMod2luZG93LnRvcCkpIHtcbiAgICAgICAgICAgICAgICAgICAgJC5yZW1vdmVFdmVudChcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy50b3AsXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudFBhcmFtcy51cE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudFBhcmFtcy51cEhhbmRsZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICB0cnVlXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICQucmVtb3ZlRXZlbnQoXG4gICAgICAgICAgICAgICAgICAgICQuTW91c2VUcmFja2VyLmNhcHR1cmVFbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICBldmVudFBhcmFtcy5tb3ZlTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRQYXJhbXMubW92ZUhhbmRsZXIsXG4gICAgICAgICAgICAgICAgICAgIHRydWVcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICQucmVtb3ZlRXZlbnQoXG4gICAgICAgICAgICAgICAgICAgICQuTW91c2VUcmFja2VyLmNhcHR1cmVFbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICBldmVudFBhcmFtcy51cE5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50UGFyYW1zLnVwSGFuZGxlcixcbiAgICAgICAgICAgICAgICAgICAgdHJ1ZVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIEdldHMgYSBXM0MgUG9pbnRlciBFdmVudHMgbW9kZWwgY29tcGF0aWJsZSBwb2ludGVyIHR5cGUgc3RyaW5nIGZyb20gYSBET00gcG9pbnRlciBldmVudC5cbiAgICAgKiBJRTEwIHVzZWQgYSBsb25nIGludGVnZXIgdmFsdWUsIGJ1dCB0aGUgVzNDIHNwZWNpZmljYXRpb24gKGFuZCBJRTExKykgdXNlIGEgc3RyaW5nIFwibW91c2VcIiwgXCJ0b3VjaFwiLCBcInBlblwiLCBldGMuXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAaW5uZXJcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRQb2ludGVyVHlwZSggZXZlbnQgKSB7XG4gICAgICAgIHZhciBwb2ludGVyVHlwZVN0cjtcbiAgICAgICAgaWYgKCAkLk1vdXNlVHJhY2tlci51bnByZWZpeGVkUG9pbnRlckV2ZW50cyApIHtcbiAgICAgICAgICAgIHBvaW50ZXJUeXBlU3RyID0gZXZlbnQucG9pbnRlclR5cGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBJRTEwXG4gICAgICAgICAgICAvLyAgTVNQT0lOVEVSX1RZUEVfVE9VQ0g6IDB4MDAwMDAwMDJcbiAgICAgICAgICAgIC8vICBNU1BPSU5URVJfVFlQRV9QRU46ICAgMHgwMDAwMDAwM1xuICAgICAgICAgICAgLy8gIE1TUE9JTlRFUl9UWVBFX01PVVNFOiAweDAwMDAwMDA0XG4gICAgICAgICAgICBzd2l0Y2goIGV2ZW50LnBvaW50ZXJUeXBlIClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjYXNlIDB4MDAwMDAwMDI6XG4gICAgICAgICAgICAgICAgICAgIHBvaW50ZXJUeXBlU3RyID0gJ3RvdWNoJztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAweDAwMDAwMDAzOlxuICAgICAgICAgICAgICAgICAgICBwb2ludGVyVHlwZVN0ciA9ICdwZW4nO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDB4MDAwMDAwMDQ6XG4gICAgICAgICAgICAgICAgICAgIHBvaW50ZXJUeXBlU3RyID0gJ21vdXNlJztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcG9pbnRlclR5cGVTdHIgPSAnJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcG9pbnRlclR5cGVTdHI7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBpbm5lclxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldE1vdXNlQWJzb2x1dGUoIGV2ZW50ICkge1xuICAgICAgICByZXR1cm4gJC5nZXRNb3VzZVBvc2l0aW9uKCBldmVudCApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQGlubmVyXG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2V0TW91c2VSZWxhdGl2ZSggZXZlbnQsIGVsZW1lbnQgKSB7XG4gICAgICAgIHJldHVybiBnZXRQb2ludFJlbGF0aXZlVG9BYnNvbHV0ZSggZ2V0TW91c2VBYnNvbHV0ZSggZXZlbnQgKSwgZWxlbWVudCApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQGlubmVyXG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2V0UG9pbnRSZWxhdGl2ZVRvQWJzb2x1dGUoIHBvaW50LCBlbGVtZW50ICkge1xuICAgICAgICB2YXIgb2Zmc2V0ID0gJC5nZXRFbGVtZW50T2Zmc2V0KCBlbGVtZW50ICk7XG4gICAgICAgIHJldHVybiBwb2ludC5taW51cyggb2Zmc2V0ICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAaW5uZXJcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRDZW50ZXJQb2ludCggcG9pbnQxLCBwb2ludDIgKSB7XG4gICAgICAgIHJldHVybiBuZXcgJC5Qb2ludCggKCBwb2ludDEueCArIHBvaW50Mi54ICkgLyAyLCAoIHBvaW50MS55ICsgcG9pbnQyLnkgKSAvIDIgKTtcbiAgICB9XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gRGV2aWNlLXNwZWNpZmljIERPTSBldmVudCBoYW5kbGVyc1xuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAaW5uZXJcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBvbkNsaWNrKCB0cmFja2VyLCBldmVudCApIHtcbiAgICAgICAgaWYgKCB0cmFja2VyLmNsaWNrSGFuZGxlciApIHtcbiAgICAgICAgICAgICQuY2FuY2VsRXZlbnQoIGV2ZW50ICk7XG4gICAgICAgIH1cbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQGlubmVyXG4gICAgICovXG4gICAgZnVuY3Rpb24gb25EYmxDbGljayggdHJhY2tlciwgZXZlbnQgKSB7XG4gICAgICAgIGlmICggdHJhY2tlci5kYmxDbGlja0hhbmRsZXIgKSB7XG4gICAgICAgICAgICAkLmNhbmNlbEV2ZW50KCBldmVudCApO1xuICAgICAgICB9XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBpbm5lclxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG9uS2V5RG93biggdHJhY2tlciwgZXZlbnQgKSB7XG4gICAgICAgIC8vJC5jb25zb2xlLmxvZyggXCJrZXlkb3duICVzICVzICVzICVzICVzXCIsIGV2ZW50LmtleUNvZGUsIGV2ZW50LmNoYXJDb2RlLCBldmVudC5jdHJsS2V5LCBldmVudC5zaGlmdEtleSwgZXZlbnQuYWx0S2V5ICk7XG4gICAgICAgIHZhciBwcm9wYWdhdGU7XG4gICAgICAgIGlmICggdHJhY2tlci5rZXlEb3duSGFuZGxlciApIHtcbiAgICAgICAgICAgIGV2ZW50ID0gJC5nZXRFdmVudCggZXZlbnQgKTtcbiAgICAgICAgICAgIHByb3BhZ2F0ZSA9IHRyYWNrZXIua2V5RG93bkhhbmRsZXIoXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBldmVudFNvdXJjZTogICAgICAgICAgdHJhY2tlcixcbiAgICAgICAgICAgICAgICAgICAga2V5Q29kZTogICAgICAgICAgICAgIGV2ZW50LmtleUNvZGUgPyBldmVudC5rZXlDb2RlIDogZXZlbnQuY2hhckNvZGUsXG4gICAgICAgICAgICAgICAgICAgIGN0cmw6ICAgICAgICAgICAgICAgICBldmVudC5jdHJsS2V5LFxuICAgICAgICAgICAgICAgICAgICBzaGlmdDogICAgICAgICAgICAgICAgZXZlbnQuc2hpZnRLZXksXG4gICAgICAgICAgICAgICAgICAgIGFsdDogICAgICAgICAgICAgICAgICBldmVudC5hbHRLZXksXG4gICAgICAgICAgICAgICAgICAgIG1ldGE6ICAgICAgICAgICAgICAgICBldmVudC5tZXRhS2V5LFxuICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbEV2ZW50OiAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICAgICAgICAgIHByZXZlbnREZWZhdWx0QWN0aW9uOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgdXNlckRhdGE6ICAgICAgICAgICAgIHRyYWNrZXIudXNlckRhdGFcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKCAhcHJvcGFnYXRlICkge1xuICAgICAgICAgICAgICAgICQuY2FuY2VsRXZlbnQoIGV2ZW50ICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQGlubmVyXG4gICAgICovXG4gICAgZnVuY3Rpb24gb25LZXlVcCggdHJhY2tlciwgZXZlbnQgKSB7XG4gICAgICAgIC8vJC5jb25zb2xlLmxvZyggXCJrZXl1cCAlcyAlcyAlcyAlcyAlc1wiLCBldmVudC5rZXlDb2RlLCBldmVudC5jaGFyQ29kZSwgZXZlbnQuY3RybEtleSwgZXZlbnQuc2hpZnRLZXksIGV2ZW50LmFsdEtleSApO1xuICAgICAgICB2YXIgcHJvcGFnYXRlO1xuICAgICAgICBpZiAoIHRyYWNrZXIua2V5VXBIYW5kbGVyICkge1xuICAgICAgICAgICAgZXZlbnQgPSAkLmdldEV2ZW50KCBldmVudCApO1xuICAgICAgICAgICAgcHJvcGFnYXRlID0gdHJhY2tlci5rZXlVcEhhbmRsZXIoXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBldmVudFNvdXJjZTogICAgICAgICAgdHJhY2tlcixcbiAgICAgICAgICAgICAgICAgICAga2V5Q29kZTogICAgICAgICAgICAgIGV2ZW50LmtleUNvZGUgPyBldmVudC5rZXlDb2RlIDogZXZlbnQuY2hhckNvZGUsXG4gICAgICAgICAgICAgICAgICAgIGN0cmw6ICAgICAgICAgICAgICAgICBldmVudC5jdHJsS2V5LFxuICAgICAgICAgICAgICAgICAgICBzaGlmdDogICAgICAgICAgICAgICAgZXZlbnQuc2hpZnRLZXksXG4gICAgICAgICAgICAgICAgICAgIGFsdDogICAgICAgICAgICAgICAgICBldmVudC5hbHRLZXksXG4gICAgICAgICAgICAgICAgICAgIG1ldGE6ICAgICAgICAgICAgICAgICBldmVudC5tZXRhS2V5LFxuICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbEV2ZW50OiAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICAgICAgICAgIHByZXZlbnREZWZhdWx0QWN0aW9uOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgdXNlckRhdGE6ICAgICAgICAgICAgIHRyYWNrZXIudXNlckRhdGFcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKCAhcHJvcGFnYXRlICkge1xuICAgICAgICAgICAgICAgICQuY2FuY2VsRXZlbnQoIGV2ZW50ICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQGlubmVyXG4gICAgICovXG4gICAgZnVuY3Rpb24gb25LZXlQcmVzcyggdHJhY2tlciwgZXZlbnQgKSB7XG4gICAgICAgIC8vJC5jb25zb2xlLmxvZyggXCJrZXlwcmVzcyAlcyAlcyAlcyAlcyAlc1wiLCBldmVudC5rZXlDb2RlLCBldmVudC5jaGFyQ29kZSwgZXZlbnQuY3RybEtleSwgZXZlbnQuc2hpZnRLZXksIGV2ZW50LmFsdEtleSApO1xuICAgICAgICB2YXIgcHJvcGFnYXRlO1xuICAgICAgICBpZiAoIHRyYWNrZXIua2V5SGFuZGxlciApIHtcbiAgICAgICAgICAgIGV2ZW50ID0gJC5nZXRFdmVudCggZXZlbnQgKTtcbiAgICAgICAgICAgIHByb3BhZ2F0ZSA9IHRyYWNrZXIua2V5SGFuZGxlcihcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50U291cmNlOiAgICAgICAgICB0cmFja2VyLFxuICAgICAgICAgICAgICAgICAgICBrZXlDb2RlOiAgICAgICAgICAgICAgZXZlbnQua2V5Q29kZSA/IGV2ZW50LmtleUNvZGUgOiBldmVudC5jaGFyQ29kZSxcbiAgICAgICAgICAgICAgICAgICAgY3RybDogICAgICAgICAgICAgICAgIGV2ZW50LmN0cmxLZXksXG4gICAgICAgICAgICAgICAgICAgIHNoaWZ0OiAgICAgICAgICAgICAgICBldmVudC5zaGlmdEtleSxcbiAgICAgICAgICAgICAgICAgICAgYWx0OiAgICAgICAgICAgICAgICAgIGV2ZW50LmFsdEtleSxcbiAgICAgICAgICAgICAgICAgICAgbWV0YTogICAgICAgICAgICAgICAgIGV2ZW50Lm1ldGFLZXksXG4gICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6ICAgICAgICBldmVudCxcbiAgICAgICAgICAgICAgICAgICAgcHJldmVudERlZmF1bHRBY3Rpb246IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICB1c2VyRGF0YTogICAgICAgICAgICAgdHJhY2tlci51c2VyRGF0YVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoICFwcm9wYWdhdGUgKSB7XG4gICAgICAgICAgICAgICAgJC5jYW5jZWxFdmVudCggZXZlbnQgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAaW5uZXJcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBvbkZvY3VzKCB0cmFja2VyLCBldmVudCApIHtcbiAgICAgICAgLy9jb25zb2xlLmxvZyggXCJmb2N1cyAlc1wiLCBldmVudCApO1xuICAgICAgICB2YXIgcHJvcGFnYXRlO1xuICAgICAgICBpZiAoIHRyYWNrZXIuZm9jdXNIYW5kbGVyICkge1xuICAgICAgICAgICAgZXZlbnQgPSAkLmdldEV2ZW50KCBldmVudCApO1xuICAgICAgICAgICAgcHJvcGFnYXRlID0gdHJhY2tlci5mb2N1c0hhbmRsZXIoXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBldmVudFNvdXJjZTogICAgICAgICAgdHJhY2tlcixcbiAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxFdmVudDogICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgICAgICAgICBwcmV2ZW50RGVmYXVsdEFjdGlvbjogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIHVzZXJEYXRhOiAgICAgICAgICAgICB0cmFja2VyLnVzZXJEYXRhXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmICggcHJvcGFnYXRlID09PSBmYWxzZSApIHtcbiAgICAgICAgICAgICAgICAkLmNhbmNlbEV2ZW50KCBldmVudCApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBpbm5lclxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG9uQmx1ciggdHJhY2tlciwgZXZlbnQgKSB7XG4gICAgICAgIC8vY29uc29sZS5sb2coIFwiYmx1ciAlc1wiLCBldmVudCApO1xuICAgICAgICB2YXIgcHJvcGFnYXRlO1xuICAgICAgICBpZiAoIHRyYWNrZXIuYmx1ckhhbmRsZXIgKSB7XG4gICAgICAgICAgICBldmVudCA9ICQuZ2V0RXZlbnQoIGV2ZW50ICk7XG4gICAgICAgICAgICBwcm9wYWdhdGUgPSB0cmFja2VyLmJsdXJIYW5kbGVyKFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRTb3VyY2U6ICAgICAgICAgIHRyYWNrZXIsXG4gICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6ICAgICAgICBldmVudCxcbiAgICAgICAgICAgICAgICAgICAgcHJldmVudERlZmF1bHRBY3Rpb246IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICB1c2VyRGF0YTogICAgICAgICAgICAgdHJhY2tlci51c2VyRGF0YVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoIHByb3BhZ2F0ZSA9PT0gZmFsc2UgKSB7XG4gICAgICAgICAgICAgICAgJC5jYW5jZWxFdmVudCggZXZlbnQgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogSGFuZGxlciBmb3IgJ3doZWVsJyBldmVudHNcbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQGlubmVyXG4gICAgICovXG4gICAgZnVuY3Rpb24gb25XaGVlbCggdHJhY2tlciwgZXZlbnQgKSB7XG4gICAgICAgIGhhbmRsZVdoZWVsRXZlbnQoIHRyYWNrZXIsIGV2ZW50LCBldmVudCApO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogSGFuZGxlciBmb3IgJ21vdXNld2hlZWwnLCAnRE9NTW91c2VTY3JvbGwnLCBhbmQgJ01vek1vdXNlUGl4ZWxTY3JvbGwnIGV2ZW50c1xuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAaW5uZXJcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBvbk1vdXNlV2hlZWwoIHRyYWNrZXIsIGV2ZW50ICkge1xuICAgICAgICBldmVudCA9ICQuZ2V0RXZlbnQoIGV2ZW50ICk7XG5cbiAgICAgICAgLy8gU2ltdWxhdGUgYSAnd2hlZWwnIGV2ZW50XG4gICAgICAgIHZhciBzaW11bGF0ZWRFdmVudCA9IHtcbiAgICAgICAgICAgIHRhcmdldDogICAgIGV2ZW50LnRhcmdldCB8fCBldmVudC5zcmNFbGVtZW50LFxuICAgICAgICAgICAgdHlwZTogICAgICAgXCJ3aGVlbFwiLFxuICAgICAgICAgICAgc2hpZnRLZXk6ICAgZXZlbnQuc2hpZnRLZXkgfHwgZmFsc2UsXG4gICAgICAgICAgICBjbGllbnRYOiAgICBldmVudC5jbGllbnRYLFxuICAgICAgICAgICAgY2xpZW50WTogICAgZXZlbnQuY2xpZW50WSxcbiAgICAgICAgICAgIHBhZ2VYOiAgICAgIGV2ZW50LnBhZ2VYID8gZXZlbnQucGFnZVggOiBldmVudC5jbGllbnRYLFxuICAgICAgICAgICAgcGFnZVk6ICAgICAgZXZlbnQucGFnZVkgPyBldmVudC5wYWdlWSA6IGV2ZW50LmNsaWVudFksXG4gICAgICAgICAgICBkZWx0YU1vZGU6ICBldmVudC50eXBlID09IFwiTW96TW91c2VQaXhlbFNjcm9sbFwiID8gMCA6IDEsIC8vIDA9cGl4ZWwsIDE9bGluZSwgMj1wYWdlXG4gICAgICAgICAgICBkZWx0YVg6ICAgICAwLFxuICAgICAgICAgICAgZGVsdGFaOiAgICAgMFxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIENhbGN1bGF0ZSBkZWx0YVlcbiAgICAgICAgaWYgKCAkLk1vdXNlVHJhY2tlci53aGVlbEV2ZW50TmFtZSA9PSBcIm1vdXNld2hlZWxcIiApIHtcbiAgICAgICAgICAgIHNpbXVsYXRlZEV2ZW50LmRlbHRhWSA9IC0gMSAvICQuREVGQVVMVF9TRVRUSU5HUy5waXhlbHNQZXJXaGVlbExpbmUgKiBldmVudC53aGVlbERlbHRhO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2ltdWxhdGVkRXZlbnQuZGVsdGFZID0gZXZlbnQuZGV0YWlsO1xuICAgICAgICB9XG5cbiAgICAgICAgaGFuZGxlV2hlZWxFdmVudCggdHJhY2tlciwgc2ltdWxhdGVkRXZlbnQsIGV2ZW50ICk7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzICd3aGVlbCcgZXZlbnRzLlxuICAgICAqIFRoZSBldmVudCBtYXkgYmUgc2ltdWxhdGVkIGJ5IHRoZSBsZWdhY3kgbW91c2Ugd2hlZWwgZXZlbnQgaGFuZGxlciAob25Nb3VzZVdoZWVsKCkpLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAaW5uZXJcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBoYW5kbGVXaGVlbEV2ZW50KCB0cmFja2VyLCBldmVudCwgb3JpZ2luYWxFdmVudCApIHtcbiAgICAgICAgdmFyIG5EZWx0YSA9IDAsXG4gICAgICAgICAgICBwcm9wYWdhdGU7XG5cbiAgICAgICAgLy8gVGhlIG5EZWx0YSB2YXJpYWJsZSBpcyBnYXRlZCB0byBwcm92aWRlIHNtb290aCB6LWluZGV4IHNjcm9sbGluZ1xuICAgICAgICAvLyAgIHNpbmNlIHRoZSBtb3VzZSB3aGVlbCBhbGxvd3MgZm9yIHN1YnN0YW50aWFsIGRlbHRhcyBtZWFudCBmb3IgcmFwaWRcbiAgICAgICAgLy8gICB5LWluZGV4IHNjcm9sbGluZy5cbiAgICAgICAgLy8gZXZlbnQuZGVsdGFNb2RlOiAwPXBpeGVsLCAxPWxpbmUsIDI9cGFnZVxuICAgICAgICAvLyBUT0RPOiBEZWx0YXMgaW4gcGl4ZWwgbW9kZSBzaG91bGQgYmUgYWNjdW11bGF0ZWQgdGhlbiBhIHNjcm9sbCB2YWx1ZSBjb21wdXRlZCBhZnRlciAkLkRFRkFVTFRfU0VUVElOR1MucGl4ZWxzUGVyV2hlZWxMaW5lIHRocmVzaG9sZCByZWFjaGVkXG4gICAgICAgIG5EZWx0YSA9IGV2ZW50LmRlbHRhWSA8IDAgPyAxIDogLTE7XG5cbiAgICAgICAgaWYgKCB0cmFja2VyLnNjcm9sbEhhbmRsZXIgKSB7XG4gICAgICAgICAgICBwcm9wYWdhdGUgPSB0cmFja2VyLnNjcm9sbEhhbmRsZXIoXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBldmVudFNvdXJjZTogICAgICAgICAgdHJhY2tlcixcbiAgICAgICAgICAgICAgICAgICAgcG9pbnRlclR5cGU6ICAgICAgICAgICdtb3VzZScsXG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAgICAgICAgICAgICBnZXRNb3VzZVJlbGF0aXZlKCBldmVudCwgdHJhY2tlci5lbGVtZW50ICksXG4gICAgICAgICAgICAgICAgICAgIHNjcm9sbDogICAgICAgICAgICAgICBuRGVsdGEsXG4gICAgICAgICAgICAgICAgICAgIHNoaWZ0OiAgICAgICAgICAgICAgICBldmVudC5zaGlmdEtleSxcbiAgICAgICAgICAgICAgICAgICAgaXNUb3VjaEV2ZW50OiAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbEV2ZW50OiAgICAgICAgb3JpZ2luYWxFdmVudCxcbiAgICAgICAgICAgICAgICAgICAgcHJldmVudERlZmF1bHRBY3Rpb246IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICB1c2VyRGF0YTogICAgICAgICAgICAgdHJhY2tlci51c2VyRGF0YVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoIHByb3BhZ2F0ZSA9PT0gZmFsc2UgKSB7XG4gICAgICAgICAgICAgICAgJC5jYW5jZWxFdmVudCggb3JpZ2luYWxFdmVudCApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBpbm5lclxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzUGFyZW50Q2hpbGQoIHBhcmVudCwgY2hpbGQgKVxuICAgIHtcbiAgICAgICBpZiAoIHBhcmVudCA9PT0gY2hpbGQgKSB7XG4gICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICB9XG4gICAgICAgd2hpbGUgKCBjaGlsZCAmJiBjaGlsZCAhPT0gcGFyZW50ICkge1xuICAgICAgICAgICBjaGlsZCA9IGNoaWxkLnBhcmVudE5vZGU7XG4gICAgICAgfVxuICAgICAgIHJldHVybiBjaGlsZCA9PT0gcGFyZW50O1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogT25seSB1c2VkIG9uIElFIDhcbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQGlubmVyXG4gICAgICovXG4gICAgZnVuY3Rpb24gb25Nb3VzZUVudGVyKCB0cmFja2VyLCBldmVudCApIHtcbiAgICAgICAgZXZlbnQgPSAkLmdldEV2ZW50KCBldmVudCApO1xuXG4gICAgICAgIGhhbmRsZU1vdXNlRW50ZXIoIHRyYWNrZXIsIGV2ZW50ICk7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBpbm5lclxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG9uTW91c2VPdmVyKCB0cmFja2VyLCBldmVudCApIHtcbiAgICAgICAgZXZlbnQgPSAkLmdldEV2ZW50KCBldmVudCApO1xuXG4gICAgICAgIGlmICggZXZlbnQuY3VycmVudFRhcmdldCA9PT0gZXZlbnQucmVsYXRlZFRhcmdldCB8fCBpc1BhcmVudENoaWxkKCBldmVudC5jdXJyZW50VGFyZ2V0LCBldmVudC5yZWxhdGVkVGFyZ2V0ICkgKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBoYW5kbGVNb3VzZUVudGVyKCB0cmFja2VyLCBldmVudCApO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAaW5uZXJcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBoYW5kbGVNb3VzZUVudGVyKCB0cmFja2VyLCBldmVudCApIHtcbiAgICAgICAgdmFyIGdQb2ludCA9IHtcbiAgICAgICAgICAgIGlkOiAkLk1vdXNlVHJhY2tlci5tb3VzZVBvaW50ZXJJZCxcbiAgICAgICAgICAgIHR5cGU6ICdtb3VzZScsXG4gICAgICAgICAgICBpc1ByaW1hcnk6IHRydWUsXG4gICAgICAgICAgICBjdXJyZW50UG9zOiBnZXRNb3VzZUFic29sdXRlKCBldmVudCApLFxuICAgICAgICAgICAgY3VycmVudFRpbWU6ICQubm93KClcbiAgICAgICAgfTtcblxuICAgICAgICB1cGRhdGVQb2ludGVyc0VudGVyKCB0cmFja2VyLCBldmVudCwgWyBnUG9pbnQgXSApO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogT25seSB1c2VkIG9uIElFIDhcbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQGlubmVyXG4gICAgICovXG4gICAgZnVuY3Rpb24gb25Nb3VzZUxlYXZlKCB0cmFja2VyLCBldmVudCApIHtcbiAgICAgICAgZXZlbnQgPSAkLmdldEV2ZW50KCBldmVudCApO1xuXG4gICAgICAgIGhhbmRsZU1vdXNlRXhpdCggdHJhY2tlciwgZXZlbnQgKTtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQGlubmVyXG4gICAgICovXG4gICAgZnVuY3Rpb24gb25Nb3VzZU91dCggdHJhY2tlciwgZXZlbnQgKSB7XG4gICAgICAgIGV2ZW50ID0gJC5nZXRFdmVudCggZXZlbnQgKTtcblxuICAgICAgICBpZiAoIGV2ZW50LmN1cnJlbnRUYXJnZXQgPT09IGV2ZW50LnJlbGF0ZWRUYXJnZXQgfHwgaXNQYXJlbnRDaGlsZCggZXZlbnQuY3VycmVudFRhcmdldCwgZXZlbnQucmVsYXRlZFRhcmdldCApICkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaGFuZGxlTW91c2VFeGl0KCB0cmFja2VyLCBldmVudCApO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAaW5uZXJcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBoYW5kbGVNb3VzZUV4aXQoIHRyYWNrZXIsIGV2ZW50ICkge1xuICAgICAgICB2YXIgZ1BvaW50ID0ge1xuICAgICAgICAgICAgaWQ6ICQuTW91c2VUcmFja2VyLm1vdXNlUG9pbnRlcklkLFxuICAgICAgICAgICAgdHlwZTogJ21vdXNlJyxcbiAgICAgICAgICAgIGlzUHJpbWFyeTogdHJ1ZSxcbiAgICAgICAgICAgIGN1cnJlbnRQb3M6IGdldE1vdXNlQWJzb2x1dGUoIGV2ZW50ICksXG4gICAgICAgICAgICBjdXJyZW50VGltZTogJC5ub3coKVxuICAgICAgICB9O1xuXG4gICAgICAgIHVwZGF0ZVBvaW50ZXJzRXhpdCggdHJhY2tlciwgZXZlbnQsIFsgZ1BvaW50IF0gKTtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBXM0MgRE9NIGxldmVsIDMgc3RhbmRhcmQgYnV0dG9uIHZhbHVlIGdpdmVuIGFuIGV2ZW50LmJ1dHRvbiBwcm9wZXJ0eTpcbiAgICAgKiAgIC0xID09IG5vbmUsIDAgPT0gcHJpbWFyeS9sZWZ0LCAxID09IG1pZGRsZSwgMiA9PSBzZWNvbmRhcnkvcmlnaHQsIDMgPT0gWDEvYmFjaywgNCA9PSBYMi9mb3J3YXJkLCA1ID09IGVyYXNlciAocGVuKVxuICAgICAqIEBwcml2YXRlXG4gICAgICogQGlubmVyXG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2V0U3RhbmRhcmRpemVkQnV0dG9uKCBidXR0b24gKSB7XG4gICAgICAgIGlmICggJC5Ccm93c2VyLnZlbmRvciA9PT0gJC5CUk9XU0VSUy5JRSAmJiAkLkJyb3dzZXIudmVyc2lvbiA8IDkgKSB7XG4gICAgICAgICAgICAvLyBPbiBJRSA4LCAwID09IG5vbmUsIDEgPT0gbGVmdCwgMiA9PSByaWdodCwgMyA9PSBsZWZ0IGFuZCByaWdodCwgNCA9PSBtaWRkbGUsIDUgPT0gbGVmdCBhbmQgbWlkZGxlLCA2ID09IHJpZ2h0IGFuZCBtaWRkbGUsIDcgPT0gYWxsIHRocmVlXG4gICAgICAgICAgICAvLyBUT0RPOiBTdXBwb3J0IGNob3JkZWQgKG11bHRpcGxlKSBidXR0b24gcHJlc3NlcyBvbiBJRSA4P1xuICAgICAgICAgICAgaWYgKCBidXR0b24gPT09IDEgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCBidXR0b24gPT09IDIgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCBidXR0b24gPT09IDQgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBidXR0b247XG4gICAgICAgIH1cbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQGlubmVyXG4gICAgICovXG4gICAgZnVuY3Rpb24gb25Nb3VzZURvd24oIHRyYWNrZXIsIGV2ZW50ICkge1xuICAgICAgICB2YXIgZ1BvaW50O1xuXG4gICAgICAgIGV2ZW50ID0gJC5nZXRFdmVudCggZXZlbnQgKTtcblxuICAgICAgICBnUG9pbnQgPSB7XG4gICAgICAgICAgICBpZDogJC5Nb3VzZVRyYWNrZXIubW91c2VQb2ludGVySWQsXG4gICAgICAgICAgICB0eXBlOiAnbW91c2UnLFxuICAgICAgICAgICAgaXNQcmltYXJ5OiB0cnVlLFxuICAgICAgICAgICAgY3VycmVudFBvczogZ2V0TW91c2VBYnNvbHV0ZSggZXZlbnQgKSxcbiAgICAgICAgICAgIGN1cnJlbnRUaW1lOiAkLm5vdygpXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKCB1cGRhdGVQb2ludGVyc0Rvd24oIHRyYWNrZXIsIGV2ZW50LCBbIGdQb2ludCBdLCBnZXRTdGFuZGFyZGl6ZWRCdXR0b24oIGV2ZW50LmJ1dHRvbiApICkgKSB7XG4gICAgICAgICAgICAkLnN0b3BFdmVudCggZXZlbnQgKTtcbiAgICAgICAgICAgIGNhcHR1cmVQb2ludGVyKCB0cmFja2VyLCAnbW91c2UnICk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIHRyYWNrZXIuY2xpY2tIYW5kbGVyIHx8IHRyYWNrZXIuZGJsQ2xpY2tIYW5kbGVyIHx8IHRyYWNrZXIucHJlc3NIYW5kbGVyIHx8IHRyYWNrZXIuZHJhZ0hhbmRsZXIgfHwgdHJhY2tlci5kcmFnRW5kSGFuZGxlciApIHtcbiAgICAgICAgICAgICQuY2FuY2VsRXZlbnQoIGV2ZW50ICk7XG4gICAgICAgIH1cbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQGlubmVyXG4gICAgICovXG4gICAgZnVuY3Rpb24gb25Nb3VzZVVwKCB0cmFja2VyLCBldmVudCApIHtcbiAgICAgICAgaGFuZGxlTW91c2VVcCggdHJhY2tlciwgZXZlbnQgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGhhbmRsZXIgaXMgYXR0YWNoZWQgdG8gdGhlIHdpbmRvdyBvYmplY3QgKG9uIHRoZSBjYXB0dXJlIHBoYXNlKSB0byBlbXVsYXRlIG1vdXNlIGNhcHR1cmUuXG4gICAgICogb25Nb3VzZVVwIGlzIHN0aWxsIGF0dGFjaGVkIHRvIHRoZSB0cmFja2VkIGVsZW1lbnQsIHNvIHN0b3AgcHJvcGFnYXRpb24gdG8gYXZvaWQgcHJvY2Vzc2luZyB0d2ljZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQGlubmVyXG4gICAgICovXG4gICAgZnVuY3Rpb24gb25Nb3VzZVVwQ2FwdHVyZWQoIHRyYWNrZXIsIGV2ZW50ICkge1xuICAgICAgICBoYW5kbGVNb3VzZVVwKCB0cmFja2VyLCBldmVudCApO1xuICAgICAgICAkLnN0b3BFdmVudCggZXZlbnQgKTtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQGlubmVyXG4gICAgICovXG4gICAgZnVuY3Rpb24gaGFuZGxlTW91c2VVcCggdHJhY2tlciwgZXZlbnQgKSB7XG4gICAgICAgIHZhciBnUG9pbnQ7XG5cbiAgICAgICAgZXZlbnQgPSAkLmdldEV2ZW50KCBldmVudCApO1xuXG4gICAgICAgIGdQb2ludCA9IHtcbiAgICAgICAgICAgIGlkOiAkLk1vdXNlVHJhY2tlci5tb3VzZVBvaW50ZXJJZCxcbiAgICAgICAgICAgIHR5cGU6ICdtb3VzZScsXG4gICAgICAgICAgICBpc1ByaW1hcnk6IHRydWUsXG4gICAgICAgICAgICBjdXJyZW50UG9zOiBnZXRNb3VzZUFic29sdXRlKCBldmVudCApLFxuICAgICAgICAgICAgY3VycmVudFRpbWU6ICQubm93KClcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoIHVwZGF0ZVBvaW50ZXJzVXAoIHRyYWNrZXIsIGV2ZW50LCBbIGdQb2ludCBdLCBnZXRTdGFuZGFyZGl6ZWRCdXR0b24oIGV2ZW50LmJ1dHRvbiApICkgKSB7XG4gICAgICAgICAgICByZWxlYXNlUG9pbnRlciggdHJhY2tlciwgJ21vdXNlJyApO1xuICAgICAgICB9XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBpbm5lclxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG9uTW91c2VNb3ZlKCB0cmFja2VyLCBldmVudCApIHtcbiAgICAgICAgaGFuZGxlTW91c2VNb3ZlKCB0cmFja2VyLCBldmVudCApO1xuICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGhhbmRsZXIgaXMgYXR0YWNoZWQgdG8gdGhlIHdpbmRvdyBvYmplY3QgKG9uIHRoZSBjYXB0dXJlIHBoYXNlKSB0byBlbXVsYXRlIG1vdXNlIGNhcHR1cmUuXG4gICAgICogb25Nb3VzZU1vdmUgaXMgc3RpbGwgYXR0YWNoZWQgdG8gdGhlIHRyYWNrZWQgZWxlbWVudCwgc28gc3RvcCBwcm9wYWdhdGlvbiB0byBhdm9pZCBwcm9jZXNzaW5nIHR3aWNlLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAaW5uZXJcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBvbk1vdXNlTW92ZUNhcHR1cmVkKCB0cmFja2VyLCBldmVudCApIHtcbiAgICAgICAgaGFuZGxlTW91c2VNb3ZlKCB0cmFja2VyLCBldmVudCApO1xuICAgICAgICAkLnN0b3BFdmVudCggZXZlbnQgKTtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQGlubmVyXG4gICAgICovXG4gICAgZnVuY3Rpb24gaGFuZGxlTW91c2VNb3ZlKCB0cmFja2VyLCBldmVudCApIHtcbiAgICAgICAgdmFyIGdQb2ludDtcblxuICAgICAgICBldmVudCA9ICQuZ2V0RXZlbnQoIGV2ZW50ICk7XG5cbiAgICAgICAgZ1BvaW50ID0ge1xuICAgICAgICAgICAgaWQ6ICQuTW91c2VUcmFja2VyLm1vdXNlUG9pbnRlcklkLFxuICAgICAgICAgICAgdHlwZTogJ21vdXNlJyxcbiAgICAgICAgICAgIGlzUHJpbWFyeTogdHJ1ZSxcbiAgICAgICAgICAgIGN1cnJlbnRQb3M6IGdldE1vdXNlQWJzb2x1dGUoIGV2ZW50ICksXG4gICAgICAgICAgICBjdXJyZW50VGltZTogJC5ub3coKVxuICAgICAgICB9O1xuXG4gICAgICAgIHVwZGF0ZVBvaW50ZXJzTW92ZSggdHJhY2tlciwgZXZlbnQsIFsgZ1BvaW50IF0gKTtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQGlubmVyXG4gICAgICovXG4gICAgZnVuY3Rpb24gYWJvcnRUb3VjaENvbnRhY3RzKCB0cmFja2VyLCBldmVudCwgcG9pbnRzTGlzdCApIHtcbiAgICAgICAgdmFyIGksXG4gICAgICAgICAgICBnUG9pbnRDb3VudCA9IHBvaW50c0xpc3QuZ2V0TGVuZ3RoKCksXG4gICAgICAgICAgICBhYm9ydEdQb2ludHMgPSBbXTtcblxuICAgICAgICBmb3IgKCBpID0gMDsgaSA8IGdQb2ludENvdW50OyBpKysgKSB7XG4gICAgICAgICAgICBhYm9ydEdQb2ludHMucHVzaCggcG9pbnRzTGlzdC5nZXRCeUluZGV4KCBpICkgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICggYWJvcnRHUG9pbnRzLmxlbmd0aCA+IDAgKSB7XG4gICAgICAgICAgICAvLyBzaW11bGF0ZSB0b3VjaGVuZFxuICAgICAgICAgICAgdXBkYXRlUG9pbnRlcnNVcCggdHJhY2tlciwgZXZlbnQsIGFib3J0R1BvaW50cywgMCApOyAvLyAwIG1lYW5zIHByaW1hcnkgYnV0dG9uIHByZXNzL3JlbGVhc2Ugb3IgdG91Y2ggY29udGFjdFxuICAgICAgICAgICAgLy8gcmVsZWFzZSBwb2ludGVyIGNhcHR1cmVcbiAgICAgICAgICAgIHBvaW50c0xpc3QuY2FwdHVyZUNvdW50ID0gMTtcbiAgICAgICAgICAgIHJlbGVhc2VQb2ludGVyKCB0cmFja2VyLCAndG91Y2gnICk7XG4gICAgICAgICAgICAvLyBzaW11bGF0ZSB0b3VjaGxlYXZlXG4gICAgICAgICAgICB1cGRhdGVQb2ludGVyc0V4aXQoIHRyYWNrZXIsIGV2ZW50LCBhYm9ydEdQb2ludHMgKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAaW5uZXJcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBvblRvdWNoU3RhcnQoIHRyYWNrZXIsIGV2ZW50ICkge1xuICAgICAgICB2YXIgdGltZSxcbiAgICAgICAgICAgIGksXG4gICAgICAgICAgICBqLFxuICAgICAgICAgICAgdG91Y2hDb3VudCA9IGV2ZW50LmNoYW5nZWRUb3VjaGVzLmxlbmd0aCxcbiAgICAgICAgICAgIGdQb2ludHMgPSBbXSxcbiAgICAgICAgICAgIHBhcmVudEdQb2ludHMsXG4gICAgICAgICAgICBwb2ludHNMaXN0ID0gdHJhY2tlci5nZXRBY3RpdmVQb2ludGVyc0xpc3RCeVR5cGUoICd0b3VjaCcgKTtcblxuICAgICAgICB0aW1lID0gJC5ub3coKTtcblxuICAgICAgICBpZiAoIHBvaW50c0xpc3QuZ2V0TGVuZ3RoKCkgPiBldmVudC50b3VjaGVzLmxlbmd0aCAtIHRvdWNoQ291bnQgKSB7XG4gICAgICAgICAgICAkLmNvbnNvbGUud2FybignVHJhY2tlZCB0b3VjaCBjb250YWN0IGNvdW50IGRvZXNuXFwndCBtYXRjaCBldmVudC50b3VjaGVzLmxlbmd0aC4gUmVtb3ZpbmcgYWxsIHRyYWNrZWQgdG91Y2ggcG9pbnRlcnMuJyk7XG4gICAgICAgICAgICBhYm9ydFRvdWNoQ29udGFjdHMoIHRyYWNrZXIsIGV2ZW50LCBwb2ludHNMaXN0ICk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKCBpID0gMDsgaSA8IHRvdWNoQ291bnQ7IGkrKyApIHtcbiAgICAgICAgICAgIGdQb2ludHMucHVzaCgge1xuICAgICAgICAgICAgICAgIGlkOiBldmVudC5jaGFuZ2VkVG91Y2hlc1sgaSBdLmlkZW50aWZpZXIsXG4gICAgICAgICAgICAgICAgdHlwZTogJ3RvdWNoJyxcbiAgICAgICAgICAgICAgICAvLyBpc1ByaW1hcnkgbm90IHNldCAtIGxldCB0aGUgdXBkYXRlUG9pbnRlcnMgZnVuY3Rpb25zIGRldGVybWluZSBpdFxuICAgICAgICAgICAgICAgIGN1cnJlbnRQb3M6IGdldE1vdXNlQWJzb2x1dGUoIGV2ZW50LmNoYW5nZWRUb3VjaGVzWyBpIF0gKSxcbiAgICAgICAgICAgICAgICBjdXJyZW50VGltZTogdGltZVxuICAgICAgICAgICAgfSApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gc2ltdWxhdGUgdG91Y2hlbnRlciBvbiBvdXIgdHJhY2tlZCBlbGVtZW50XG4gICAgICAgIHVwZGF0ZVBvaW50ZXJzRW50ZXIoIHRyYWNrZXIsIGV2ZW50LCBnUG9pbnRzICk7XG5cbiAgICAgICAgLy8gc2ltdWxhdGUgdG91Y2hlbnRlciBvbiBvdXIgdHJhY2tlZCBlbGVtZW50J3MgdHJhY2tlZCBhbmNlc3RvciBlbGVtZW50c1xuICAgICAgICBmb3IgKCBpID0gMDsgaSA8IE1PVVNFVFJBQ0tFUlMubGVuZ3RoOyBpKysgKSB7XG4gICAgICAgICAgICBpZiAoIE1PVVNFVFJBQ0tFUlNbIGkgXSAhPT0gdHJhY2tlciAmJiBNT1VTRVRSQUNLRVJTWyBpIF0uaXNUcmFja2luZygpICYmIGlzUGFyZW50Q2hpbGQoIE1PVVNFVFJBQ0tFUlNbIGkgXS5lbGVtZW50LCB0cmFja2VyLmVsZW1lbnQgKSApIHtcbiAgICAgICAgICAgICAgICBwYXJlbnRHUG9pbnRzID0gW107XG4gICAgICAgICAgICAgICAgZm9yICggaiA9IDA7IGogPCB0b3VjaENvdW50OyBqKysgKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudEdQb2ludHMucHVzaCgge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IGV2ZW50LmNoYW5nZWRUb3VjaGVzWyBqIF0uaWRlbnRpZmllcixcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd0b3VjaCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpc1ByaW1hcnkgbm90IHNldCAtIGxldCB0aGUgdXBkYXRlUG9pbnRlcnMgZnVuY3Rpb25zIGRldGVybWluZSBpdFxuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFBvczogZ2V0TW91c2VBYnNvbHV0ZSggZXZlbnQuY2hhbmdlZFRvdWNoZXNbIGogXSApLFxuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFRpbWU6IHRpbWVcbiAgICAgICAgICAgICAgICAgICAgfSApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB1cGRhdGVQb2ludGVyc0VudGVyKCBNT1VTRVRSQUNLRVJTWyBpIF0sIGV2ZW50LCBwYXJlbnRHUG9pbnRzICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIHVwZGF0ZVBvaW50ZXJzRG93biggdHJhY2tlciwgZXZlbnQsIGdQb2ludHMsIDAgKSApIHsgLy8gMCBtZWFucyBwcmltYXJ5IGJ1dHRvbiBwcmVzcy9yZWxlYXNlIG9yIHRvdWNoIGNvbnRhY3RcbiAgICAgICAgICAgICQuc3RvcEV2ZW50KCBldmVudCApO1xuICAgICAgICAgICAgY2FwdHVyZVBvaW50ZXIoIHRyYWNrZXIsICd0b3VjaCcsIHRvdWNoQ291bnQgKTtcbiAgICAgICAgfVxuXG4gICAgICAgICQuY2FuY2VsRXZlbnQoIGV2ZW50ICk7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBpbm5lclxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG9uVG91Y2hFbmQoIHRyYWNrZXIsIGV2ZW50ICkge1xuICAgICAgICBoYW5kbGVUb3VjaEVuZCggdHJhY2tlciwgZXZlbnQgKTtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIFRoaXMgaGFuZGxlciBpcyBhdHRhY2hlZCB0byB0aGUgd2luZG93IG9iamVjdCAob24gdGhlIGNhcHR1cmUgcGhhc2UpIHRvIGVtdWxhdGUgcG9pbnRlciBjYXB0dXJlLlxuICAgICAqIG9uVG91Y2hFbmQgaXMgc3RpbGwgYXR0YWNoZWQgdG8gdGhlIHRyYWNrZWQgZWxlbWVudCwgc28gc3RvcCBwcm9wYWdhdGlvbiB0byBhdm9pZCBwcm9jZXNzaW5nIHR3aWNlLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAaW5uZXJcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBvblRvdWNoRW5kQ2FwdHVyZWQoIHRyYWNrZXIsIGV2ZW50ICkge1xuICAgICAgICBoYW5kbGVUb3VjaEVuZCggdHJhY2tlciwgZXZlbnQgKTtcbiAgICAgICAgJC5zdG9wRXZlbnQoIGV2ZW50ICk7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBpbm5lclxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGhhbmRsZVRvdWNoRW5kKCB0cmFja2VyLCBldmVudCApIHtcbiAgICAgICAgdmFyIHRpbWUsXG4gICAgICAgICAgICBpLFxuICAgICAgICAgICAgaixcbiAgICAgICAgICAgIHRvdWNoQ291bnQgPSBldmVudC5jaGFuZ2VkVG91Y2hlcy5sZW5ndGgsXG4gICAgICAgICAgICBnUG9pbnRzID0gW10sXG4gICAgICAgICAgICBwYXJlbnRHUG9pbnRzO1xuXG4gICAgICAgIHRpbWUgPSAkLm5vdygpO1xuXG4gICAgICAgIGZvciAoIGkgPSAwOyBpIDwgdG91Y2hDb3VudDsgaSsrICkge1xuICAgICAgICAgICAgZ1BvaW50cy5wdXNoKCB7XG4gICAgICAgICAgICAgICAgaWQ6IGV2ZW50LmNoYW5nZWRUb3VjaGVzWyBpIF0uaWRlbnRpZmllcixcbiAgICAgICAgICAgICAgICB0eXBlOiAndG91Y2gnLFxuICAgICAgICAgICAgICAgIC8vIGlzUHJpbWFyeSBub3Qgc2V0IC0gbGV0IHRoZSB1cGRhdGVQb2ludGVycyBmdW5jdGlvbnMgZGV0ZXJtaW5lIGl0XG4gICAgICAgICAgICAgICAgY3VycmVudFBvczogZ2V0TW91c2VBYnNvbHV0ZSggZXZlbnQuY2hhbmdlZFRvdWNoZXNbIGkgXSApLFxuICAgICAgICAgICAgICAgIGN1cnJlbnRUaW1lOiB0aW1lXG4gICAgICAgICAgICB9ICk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIHVwZGF0ZVBvaW50ZXJzVXAoIHRyYWNrZXIsIGV2ZW50LCBnUG9pbnRzLCAwICkgKSB7XG4gICAgICAgICAgICByZWxlYXNlUG9pbnRlciggdHJhY2tlciwgJ3RvdWNoJywgdG91Y2hDb3VudCApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gc2ltdWxhdGUgdG91Y2hsZWF2ZSBvbiBvdXIgdHJhY2tlZCBlbGVtZW50XG4gICAgICAgIHVwZGF0ZVBvaW50ZXJzRXhpdCggdHJhY2tlciwgZXZlbnQsIGdQb2ludHMgKTtcblxuICAgICAgICAvLyBzaW11bGF0ZSB0b3VjaGxlYXZlIG9uIG91ciB0cmFja2VkIGVsZW1lbnQncyB0cmFja2VkIGFuY2VzdG9yIGVsZW1lbnRzXG4gICAgICAgIGZvciAoIGkgPSAwOyBpIDwgTU9VU0VUUkFDS0VSUy5sZW5ndGg7IGkrKyApIHtcbiAgICAgICAgICAgIGlmICggTU9VU0VUUkFDS0VSU1sgaSBdICE9PSB0cmFja2VyICYmIE1PVVNFVFJBQ0tFUlNbIGkgXS5pc1RyYWNraW5nKCkgJiYgaXNQYXJlbnRDaGlsZCggTU9VU0VUUkFDS0VSU1sgaSBdLmVsZW1lbnQsIHRyYWNrZXIuZWxlbWVudCApICkge1xuICAgICAgICAgICAgICAgIHBhcmVudEdQb2ludHMgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKCBqID0gMDsgaiA8IHRvdWNoQ291bnQ7IGorKyApIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50R1BvaW50cy5wdXNoKCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZDogZXZlbnQuY2hhbmdlZFRvdWNoZXNbIGogXS5pZGVudGlmaWVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3RvdWNoJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzUHJpbWFyeSBub3Qgc2V0IC0gbGV0IHRoZSB1cGRhdGVQb2ludGVycyBmdW5jdGlvbnMgZGV0ZXJtaW5lIGl0XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50UG9zOiBnZXRNb3VzZUFic29sdXRlKCBldmVudC5jaGFuZ2VkVG91Y2hlc1sgaiBdICksXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50VGltZTogdGltZVxuICAgICAgICAgICAgICAgICAgICB9ICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHVwZGF0ZVBvaW50ZXJzRXhpdCggTU9VU0VUUkFDS0VSU1sgaSBdLCBldmVudCwgcGFyZW50R1BvaW50cyApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgJC5jYW5jZWxFdmVudCggZXZlbnQgKTtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQGlubmVyXG4gICAgICovXG4gICAgZnVuY3Rpb24gb25Ub3VjaE1vdmUoIHRyYWNrZXIsIGV2ZW50ICkge1xuICAgICAgICBoYW5kbGVUb3VjaE1vdmUoIHRyYWNrZXIsIGV2ZW50ICk7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGhhbmRsZXIgaXMgYXR0YWNoZWQgdG8gdGhlIHdpbmRvdyBvYmplY3QgKG9uIHRoZSBjYXB0dXJlIHBoYXNlKSB0byBlbXVsYXRlIHBvaW50ZXIgY2FwdHVyZS5cbiAgICAgKiBvblRvdWNoTW92ZSBpcyBzdGlsbCBhdHRhY2hlZCB0byB0aGUgdHJhY2tlZCBlbGVtZW50LCBzbyBzdG9wIHByb3BhZ2F0aW9uIHRvIGF2b2lkIHByb2Nlc3NpbmcgdHdpY2UuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBpbm5lclxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG9uVG91Y2hNb3ZlQ2FwdHVyZWQoIHRyYWNrZXIsIGV2ZW50ICkge1xuICAgICAgICBoYW5kbGVUb3VjaE1vdmUoIHRyYWNrZXIsIGV2ZW50ICk7XG4gICAgICAgICQuc3RvcEV2ZW50KCBldmVudCApO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAaW5uZXJcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBoYW5kbGVUb3VjaE1vdmUoIHRyYWNrZXIsIGV2ZW50ICkge1xuICAgICAgICB2YXIgaSxcbiAgICAgICAgICAgIHRvdWNoQ291bnQgPSBldmVudC5jaGFuZ2VkVG91Y2hlcy5sZW5ndGgsXG4gICAgICAgICAgICBnUG9pbnRzID0gW107XG5cbiAgICAgICAgZm9yICggaSA9IDA7IGkgPCB0b3VjaENvdW50OyBpKysgKSB7XG4gICAgICAgICAgICBnUG9pbnRzLnB1c2goIHtcbiAgICAgICAgICAgICAgICBpZDogZXZlbnQuY2hhbmdlZFRvdWNoZXNbIGkgXS5pZGVudGlmaWVyLFxuICAgICAgICAgICAgICAgIHR5cGU6ICd0b3VjaCcsXG4gICAgICAgICAgICAgICAgLy8gaXNQcmltYXJ5IG5vdCBzZXQgLSBsZXQgdGhlIHVwZGF0ZVBvaW50ZXJzIGZ1bmN0aW9ucyBkZXRlcm1pbmUgaXRcbiAgICAgICAgICAgICAgICBjdXJyZW50UG9zOiBnZXRNb3VzZUFic29sdXRlKCBldmVudC5jaGFuZ2VkVG91Y2hlc1sgaSBdICksXG4gICAgICAgICAgICAgICAgY3VycmVudFRpbWU6ICQubm93KClcbiAgICAgICAgICAgIH0gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHVwZGF0ZVBvaW50ZXJzTW92ZSggdHJhY2tlciwgZXZlbnQsIGdQb2ludHMgKTtcblxuICAgICAgICAkLmNhbmNlbEV2ZW50KCBldmVudCApO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAaW5uZXJcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBvblRvdWNoQ2FuY2VsKCB0cmFja2VyLCBldmVudCApIHtcbiAgICAgICAgdmFyIGksXG4gICAgICAgICAgICB0b3VjaENvdW50ID0gZXZlbnQuY2hhbmdlZFRvdWNoZXMubGVuZ3RoLFxuICAgICAgICAgICAgZ1BvaW50cyA9IFtdLFxuICAgICAgICAgICAgcG9pbnRzTGlzdCA9IHRyYWNrZXIuZ2V0QWN0aXZlUG9pbnRlcnNMaXN0QnlUeXBlKCAndG91Y2gnICk7XG4gICAgICAgIFxuICAgICAgICBhYm9ydFRvdWNoQ29udGFjdHMoIHRyYWNrZXIsIGV2ZW50LCBwb2ludHNMaXN0ICk7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBpbm5lclxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG9uR2VzdHVyZVN0YXJ0KCB0cmFja2VyLCBldmVudCApIHtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQGlubmVyXG4gICAgICovXG4gICAgZnVuY3Rpb24gb25HZXN0dXJlQ2hhbmdlKCB0cmFja2VyLCBldmVudCApIHtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQGlubmVyXG4gICAgICovXG4gICAgZnVuY3Rpb24gb25Qb2ludGVyT3ZlciggdHJhY2tlciwgZXZlbnQgKSB7XG4gICAgICAgIHZhciBnUG9pbnQ7XG5cbiAgICAgICAgaWYgKCBldmVudC5jdXJyZW50VGFyZ2V0ID09PSBldmVudC5yZWxhdGVkVGFyZ2V0IHx8IGlzUGFyZW50Q2hpbGQoIGV2ZW50LmN1cnJlbnRUYXJnZXQsIGV2ZW50LnJlbGF0ZWRUYXJnZXQgKSApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGdQb2ludCA9IHtcbiAgICAgICAgICAgIGlkOiBldmVudC5wb2ludGVySWQsXG4gICAgICAgICAgICB0eXBlOiBnZXRQb2ludGVyVHlwZSggZXZlbnQgKSxcbiAgICAgICAgICAgIGlzUHJpbWFyeTogZXZlbnQuaXNQcmltYXJ5LFxuICAgICAgICAgICAgY3VycmVudFBvczogZ2V0TW91c2VBYnNvbHV0ZSggZXZlbnQgKSxcbiAgICAgICAgICAgIGN1cnJlbnRUaW1lOiAkLm5vdygpXG4gICAgICAgIH07XG5cbiAgICAgICAgdXBkYXRlUG9pbnRlcnNFbnRlciggdHJhY2tlciwgZXZlbnQsIFsgZ1BvaW50IF0gKTtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQGlubmVyXG4gICAgICovXG4gICAgZnVuY3Rpb24gb25Qb2ludGVyT3V0KCB0cmFja2VyLCBldmVudCApIHtcbiAgICAgICAgdmFyIGdQb2ludDtcblxuICAgICAgICBpZiAoIGV2ZW50LmN1cnJlbnRUYXJnZXQgPT09IGV2ZW50LnJlbGF0ZWRUYXJnZXQgfHwgaXNQYXJlbnRDaGlsZCggZXZlbnQuY3VycmVudFRhcmdldCwgZXZlbnQucmVsYXRlZFRhcmdldCApICkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZ1BvaW50ID0ge1xuICAgICAgICAgICAgaWQ6IGV2ZW50LnBvaW50ZXJJZCxcbiAgICAgICAgICAgIHR5cGU6IGdldFBvaW50ZXJUeXBlKCBldmVudCApLFxuICAgICAgICAgICAgaXNQcmltYXJ5OiBldmVudC5pc1ByaW1hcnksXG4gICAgICAgICAgICBjdXJyZW50UG9zOiBnZXRNb3VzZUFic29sdXRlKCBldmVudCApLFxuICAgICAgICAgICAgY3VycmVudFRpbWU6ICQubm93KClcbiAgICAgICAgfTtcblxuICAgICAgICB1cGRhdGVQb2ludGVyc0V4aXQoIHRyYWNrZXIsIGV2ZW50LCBbIGdQb2ludCBdICk7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBpbm5lclxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG9uUG9pbnRlckRvd24oIHRyYWNrZXIsIGV2ZW50ICkge1xuICAgICAgICB2YXIgZ1BvaW50O1xuXG4gICAgICAgIGdQb2ludCA9IHtcbiAgICAgICAgICAgIGlkOiBldmVudC5wb2ludGVySWQsXG4gICAgICAgICAgICB0eXBlOiBnZXRQb2ludGVyVHlwZSggZXZlbnQgKSxcbiAgICAgICAgICAgIGlzUHJpbWFyeTogZXZlbnQuaXNQcmltYXJ5LFxuICAgICAgICAgICAgY3VycmVudFBvczogZ2V0TW91c2VBYnNvbHV0ZSggZXZlbnQgKSxcbiAgICAgICAgICAgIGN1cnJlbnRUaW1lOiAkLm5vdygpXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKCB1cGRhdGVQb2ludGVyc0Rvd24oIHRyYWNrZXIsIGV2ZW50LCBbIGdQb2ludCBdLCBldmVudC5idXR0b24gKSApIHtcbiAgICAgICAgICAgICQuc3RvcEV2ZW50KCBldmVudCApO1xuICAgICAgICAgICAgY2FwdHVyZVBvaW50ZXIoIHRyYWNrZXIsIGdQb2ludC50eXBlICk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIHRyYWNrZXIuY2xpY2tIYW5kbGVyIHx8IHRyYWNrZXIuZGJsQ2xpY2tIYW5kbGVyIHx8IHRyYWNrZXIucHJlc3NIYW5kbGVyIHx8IHRyYWNrZXIuZHJhZ0hhbmRsZXIgfHwgdHJhY2tlci5kcmFnRW5kSGFuZGxlciB8fCB0cmFja2VyLnBpbmNoSGFuZGxlciApIHtcbiAgICAgICAgICAgICQuY2FuY2VsRXZlbnQoIGV2ZW50ICk7XG4gICAgICAgIH1cbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQGlubmVyXG4gICAgICovXG4gICAgZnVuY3Rpb24gb25Qb2ludGVyVXAoIHRyYWNrZXIsIGV2ZW50ICkge1xuICAgICAgICBoYW5kbGVQb2ludGVyVXAoIHRyYWNrZXIsIGV2ZW50ICk7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGhhbmRsZXIgaXMgYXR0YWNoZWQgdG8gdGhlIHdpbmRvdyBvYmplY3QgKG9uIHRoZSBjYXB0dXJlIHBoYXNlKSB0byBlbXVsYXRlIG1vdXNlIGNhcHR1cmUuXG4gICAgICogb25Qb2ludGVyVXAgaXMgc3RpbGwgYXR0YWNoZWQgdG8gdGhlIHRyYWNrZWQgZWxlbWVudCwgc28gc3RvcCBwcm9wYWdhdGlvbiB0byBhdm9pZCBwcm9jZXNzaW5nIHR3aWNlLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAaW5uZXJcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBvblBvaW50ZXJVcENhcHR1cmVkKCB0cmFja2VyLCBldmVudCApIHtcbiAgICAgICAgdmFyIHBvaW50c0xpc3QgPSB0cmFja2VyLmdldEFjdGl2ZVBvaW50ZXJzTGlzdEJ5VHlwZSggZ2V0UG9pbnRlclR5cGUoIGV2ZW50ICkgKTtcbiAgICAgICAgaWYgKCBwb2ludHNMaXN0LmdldEJ5SWQoIGV2ZW50LnBvaW50ZXJJZCApICkge1xuICAgICAgICAgICAgaGFuZGxlUG9pbnRlclVwKCB0cmFja2VyLCBldmVudCApO1xuICAgICAgICB9XG4gICAgICAgICQuc3RvcEV2ZW50KCBldmVudCApO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAaW5uZXJcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBoYW5kbGVQb2ludGVyVXAoIHRyYWNrZXIsIGV2ZW50ICkge1xuICAgICAgICB2YXIgZ1BvaW50O1xuXG4gICAgICAgIGdQb2ludCA9IHtcbiAgICAgICAgICAgIGlkOiBldmVudC5wb2ludGVySWQsXG4gICAgICAgICAgICB0eXBlOiBnZXRQb2ludGVyVHlwZSggZXZlbnQgKSxcbiAgICAgICAgICAgIGlzUHJpbWFyeTogZXZlbnQuaXNQcmltYXJ5LFxuICAgICAgICAgICAgY3VycmVudFBvczogZ2V0TW91c2VBYnNvbHV0ZSggZXZlbnQgKSxcbiAgICAgICAgICAgIGN1cnJlbnRUaW1lOiAkLm5vdygpXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKCB1cGRhdGVQb2ludGVyc1VwKCB0cmFja2VyLCBldmVudCwgWyBnUG9pbnQgXSwgZXZlbnQuYnV0dG9uICkgKSB7XG4gICAgICAgICAgICByZWxlYXNlUG9pbnRlciggdHJhY2tlciwgZ1BvaW50LnR5cGUgKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAaW5uZXJcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBvblBvaW50ZXJNb3ZlKCB0cmFja2VyLCBldmVudCApIHtcbiAgICAgICAgaGFuZGxlUG9pbnRlck1vdmUoIHRyYWNrZXIsIGV2ZW50ICk7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGhhbmRsZXIgaXMgYXR0YWNoZWQgdG8gdGhlIHdpbmRvdyBvYmplY3QgKG9uIHRoZSBjYXB0dXJlIHBoYXNlKSB0byBlbXVsYXRlIG1vdXNlIGNhcHR1cmUuXG4gICAgICogb25Qb2ludGVyTW92ZSBpcyBzdGlsbCBhdHRhY2hlZCB0byB0aGUgdHJhY2tlZCBlbGVtZW50LCBzbyBzdG9wIHByb3BhZ2F0aW9uIHRvIGF2b2lkIHByb2Nlc3NpbmcgdHdpY2UuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBpbm5lclxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG9uUG9pbnRlck1vdmVDYXB0dXJlZCggdHJhY2tlciwgZXZlbnQgKSB7XG4gICAgICAgIHZhciBwb2ludHNMaXN0ID0gdHJhY2tlci5nZXRBY3RpdmVQb2ludGVyc0xpc3RCeVR5cGUoIGdldFBvaW50ZXJUeXBlKCBldmVudCApICk7XG4gICAgICAgIGlmICggcG9pbnRzTGlzdC5nZXRCeUlkKCBldmVudC5wb2ludGVySWQgKSApIHtcbiAgICAgICAgICAgIGhhbmRsZVBvaW50ZXJNb3ZlKCB0cmFja2VyLCBldmVudCApO1xuICAgICAgICB9XG4gICAgICAgICQuc3RvcEV2ZW50KCBldmVudCApO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAaW5uZXJcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBoYW5kbGVQb2ludGVyTW92ZSggdHJhY2tlciwgZXZlbnQgKSB7XG4gICAgICAgIC8vIFBvaW50ZXIgY2hhbmdlZCBjb29yZGluYXRlcywgYnV0dG9uIHN0YXRlLCBwcmVzc3VyZSwgdGlsdCwgb3IgY29udGFjdCBnZW9tZXRyeSAoZS5nLiB3aWR0aCBhbmQgaGVpZ2h0KVxuICAgICAgICB2YXIgZ1BvaW50O1xuXG4gICAgICAgIGdQb2ludCA9IHtcbiAgICAgICAgICAgIGlkOiBldmVudC5wb2ludGVySWQsXG4gICAgICAgICAgICB0eXBlOiBnZXRQb2ludGVyVHlwZSggZXZlbnQgKSxcbiAgICAgICAgICAgIGlzUHJpbWFyeTogZXZlbnQuaXNQcmltYXJ5LFxuICAgICAgICAgICAgY3VycmVudFBvczogZ2V0TW91c2VBYnNvbHV0ZSggZXZlbnQgKSxcbiAgICAgICAgICAgIGN1cnJlbnRUaW1lOiAkLm5vdygpXG4gICAgICAgIH07XG5cbiAgICAgICAgdXBkYXRlUG9pbnRlcnNNb3ZlKCB0cmFja2VyLCBldmVudCwgWyBnUG9pbnQgXSApO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAaW5uZXJcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBvblBvaW50ZXJDYW5jZWwoIHRyYWNrZXIsIGV2ZW50ICkge1xuICAgICAgICB2YXIgZ1BvaW50O1xuXG4gICAgICAgIGdQb2ludCA9IHtcbiAgICAgICAgICAgIGlkOiBldmVudC5wb2ludGVySWQsXG4gICAgICAgICAgICB0eXBlOiBnZXRQb2ludGVyVHlwZSggZXZlbnQgKVxuICAgICAgICB9O1xuXG4gICAgICAgIHVwZGF0ZVBvaW50ZXJzQ2FuY2VsKCB0cmFja2VyLCBldmVudCwgWyBnUG9pbnQgXSApO1xuICAgIH1cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBEZXZpY2UtYWdub3N0aWMgRE9NIGV2ZW50IGhhbmRsZXJzXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbiAgICAvKipcbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBpbm5lclxuICAgICAqIEBwYXJhbSB7T3BlblNlYWRyYWdvbi5Nb3VzZVRyYWNrZXIuR2VzdHVyZVBvaW50TGlzdH0gcG9pbnRzTGlzdFxuICAgICAqICAgICBUaGUgR2VzdHVyZVBvaW50TGlzdCB0byB0cmFjayB0aGUgcG9pbnRlciBpbi5cbiAgICAgKiBAcGFyYW0ge09wZW5TZWFkcmFnb24uTW91c2VUcmFja2VyLkdlc3R1cmVQb2ludH0gZ1BvaW50XG4gICAgICogICAgICBHZXN0dXJlIHBvaW50IHRvIHRyYWNrLlxuICAgICAqIEByZXR1cm5zIHtOdW1iZXJ9IE51bWJlciBvZiBnZXN0dXJlIHBvaW50cyBpbiBwb2ludHNMaXN0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHN0YXJ0VHJhY2tpbmdQb2ludGVyKCBwb2ludHNMaXN0LCBnUG9pbnQgKSB7XG5cbiAgICAgICAgLy8gSWYgaXNQcmltYXJ5IGlzIG5vdCBrbm93biBmb3IgdGhlIHBvaW50ZXIgdGhlbiBzZXQgaXQgYWNjb3JkaW5nIHRvIG91ciBydWxlczpcbiAgICAgICAgLy8gICAgdHJ1ZSBpZiB0aGUgZmlyc3QgcG9pbnRlciBpbiB0aGUgZ2VzdHVyZSwgb3RoZXJ3aXNlIGZhbHNlXG4gICAgICAgIGlmICggIWdQb2ludC5oYXNPd25Qcm9wZXJ0eSggJ2lzUHJpbWFyeScgKSApIHtcbiAgICAgICAgICAgIGlmICggcG9pbnRzTGlzdC5nZXRMZW5ndGgoKSA9PT0gMCApIHtcbiAgICAgICAgICAgICAgICBnUG9pbnQuaXNQcmltYXJ5ID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZ1BvaW50LmlzUHJpbWFyeSA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGdQb2ludC5zcGVlZCA9IDA7XG4gICAgICAgIGdQb2ludC5kaXJlY3Rpb24gPSAwO1xuICAgICAgICBnUG9pbnQuY29udGFjdFBvcyA9IGdQb2ludC5jdXJyZW50UG9zO1xuICAgICAgICBnUG9pbnQuY29udGFjdFRpbWUgPSBnUG9pbnQuY3VycmVudFRpbWU7XG4gICAgICAgIGdQb2ludC5sYXN0UG9zID0gZ1BvaW50LmN1cnJlbnRQb3M7XG4gICAgICAgIGdQb2ludC5sYXN0VGltZSA9IGdQb2ludC5jdXJyZW50VGltZTtcblxuICAgICAgICByZXR1cm4gcG9pbnRzTGlzdC5hZGQoIGdQb2ludCApO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAaW5uZXJcbiAgICAgKiBAcGFyYW0ge09wZW5TZWFkcmFnb24uTW91c2VUcmFja2VyLkdlc3R1cmVQb2ludExpc3R9IHBvaW50c0xpc3RcbiAgICAgKiAgICAgVGhlIEdlc3R1cmVQb2ludExpc3QgdG8gc3RvcCB0cmFja2luZyB0aGUgcG9pbnRlciBvbi5cbiAgICAgKiBAcGFyYW0ge09wZW5TZWFkcmFnb24uTW91c2VUcmFja2VyLkdlc3R1cmVQb2ludH0gZ1BvaW50XG4gICAgICogICAgICBHZXN0dXJlIHBvaW50IHRvIHN0b3AgdHJhY2tpbmcuXG4gICAgICogQHJldHVybnMge051bWJlcn0gTnVtYmVyIG9mIGdlc3R1cmUgcG9pbnRzIGluIHBvaW50c0xpc3QuXG4gICAgICovXG4gICAgZnVuY3Rpb24gc3RvcFRyYWNraW5nUG9pbnRlciggcG9pbnRzTGlzdCwgZ1BvaW50ICkge1xuICAgICAgICB2YXIgbGlzdExlbmd0aCxcbiAgICAgICAgICAgIHByaW1hcnlQb2ludDtcblxuICAgICAgICBpZiAoIHBvaW50c0xpc3QuZ2V0QnlJZCggZ1BvaW50LmlkICkgKSB7XG4gICAgICAgICAgICBsaXN0TGVuZ3RoID0gcG9pbnRzTGlzdC5yZW1vdmVCeUlkKCBnUG9pbnQuaWQgKTtcblxuICAgICAgICAgICAgLy8gSWYgaXNQcmltYXJ5IGlzIG5vdCBrbm93biBmb3IgdGhlIHBvaW50ZXIgYW5kIHdlIGp1c3QgcmVtb3ZlZCB0aGUgcHJpbWFyeSBwb2ludGVyIGZyb20gdGhlIGxpc3QgdGhlbiB3ZSBuZWVkIHRvIHNldCBhbm90aGVyIHBvaW50ZXIgYXMgcHJpbWFyeVxuICAgICAgICAgICAgaWYgKCAhZ1BvaW50Lmhhc093blByb3BlcnR5KCAnaXNQcmltYXJ5JyApICkge1xuICAgICAgICAgICAgICAgIHByaW1hcnlQb2ludCA9IHBvaW50c0xpc3QuZ2V0UHJpbWFyeSgpO1xuICAgICAgICAgICAgICAgIGlmICggIXByaW1hcnlQb2ludCApIHtcbiAgICAgICAgICAgICAgICAgICAgcHJpbWFyeVBvaW50ID0gcG9pbnRzTGlzdC5nZXRCeUluZGV4KCAwICk7XG4gICAgICAgICAgICAgICAgICAgIGlmICggcHJpbWFyeVBvaW50ICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWFyeVBvaW50LmlzUHJpbWFyeSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsaXN0TGVuZ3RoID0gcG9pbnRzTGlzdC5nZXRMZW5ndGgoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBsaXN0TGVuZ3RoO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAaW5uZXJcbiAgICAgKiBAcGFyYW0ge09wZW5TZWFkcmFnb24uTW91c2VUcmFja2VyfSB0cmFja2VyXG4gICAgICogICAgIEEgcmVmZXJlbmNlIHRvIHRoZSBNb3VzZVRyYWNrZXIgaW5zdGFuY2UuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50XG4gICAgICogICAgIEEgcmVmZXJlbmNlIHRvIHRoZSBvcmlnaW5hdGluZyBET00gZXZlbnQuXG4gICAgICogQHBhcmFtIHtBcnJheS48T3BlblNlYWRyYWdvbi5Nb3VzZVRyYWNrZXIuR2VzdHVyZVBvaW50Pn0gZ1BvaW50c1xuICAgICAqICAgICAgR2VzdHVyZSBwb2ludHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBldmVudC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB1cGRhdGVQb2ludGVyc0VudGVyKCB0cmFja2VyLCBldmVudCwgZ1BvaW50cyApIHtcbiAgICAgICAgdmFyIHBvaW50c0xpc3QgPSB0cmFja2VyLmdldEFjdGl2ZVBvaW50ZXJzTGlzdEJ5VHlwZSggZ1BvaW50c1sgMCBdLnR5cGUgKSxcbiAgICAgICAgICAgIGksXG4gICAgICAgICAgICBnUG9pbnRDb3VudCA9IGdQb2ludHMubGVuZ3RoLFxuICAgICAgICAgICAgY3VyR1BvaW50LFxuICAgICAgICAgICAgdXBkYXRlR1BvaW50LFxuICAgICAgICAgICAgcHJvcGFnYXRlO1xuXG4gICAgICAgIGZvciAoIGkgPSAwOyBpIDwgZ1BvaW50Q291bnQ7IGkrKyApIHtcbiAgICAgICAgICAgIGN1ckdQb2ludCA9IGdQb2ludHNbIGkgXTtcbiAgICAgICAgICAgIHVwZGF0ZUdQb2ludCA9IHBvaW50c0xpc3QuZ2V0QnlJZCggY3VyR1BvaW50LmlkICk7XG5cbiAgICAgICAgICAgIGlmICggdXBkYXRlR1BvaW50ICkge1xuICAgICAgICAgICAgICAgIC8vIEFscmVhZHkgdHJhY2tpbmcgdGhlIHBvaW50ZXIuLi51cGRhdGUgaXRcbiAgICAgICAgICAgICAgICB1cGRhdGVHUG9pbnQuaW5zaWRlRWxlbWVudCA9IHRydWU7XG4gICAgICAgICAgICAgICAgdXBkYXRlR1BvaW50Lmxhc3RQb3MgPSB1cGRhdGVHUG9pbnQuY3VycmVudFBvcztcbiAgICAgICAgICAgICAgICB1cGRhdGVHUG9pbnQubGFzdFRpbWUgPSB1cGRhdGVHUG9pbnQuY3VycmVudFRpbWU7XG4gICAgICAgICAgICAgICAgdXBkYXRlR1BvaW50LmN1cnJlbnRQb3MgPSBjdXJHUG9pbnQuY3VycmVudFBvcztcbiAgICAgICAgICAgICAgICB1cGRhdGVHUG9pbnQuY3VycmVudFRpbWUgPSBjdXJHUG9pbnQuY3VycmVudFRpbWU7XG5cbiAgICAgICAgICAgICAgICBjdXJHUG9pbnQgPSB1cGRhdGVHUG9pbnQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIEluaXRpYWxpemUgZm9yIHRyYWNraW5nIGFuZCBhZGQgdG8gdGhlIHRyYWNraW5nIGxpc3RcbiAgICAgICAgICAgICAgICBjdXJHUG9pbnQuY2FwdHVyZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBjdXJHUG9pbnQuaW5zaWRlRWxlbWVudFByZXNzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBjdXJHUG9pbnQuaW5zaWRlRWxlbWVudCA9IHRydWU7XG4gICAgICAgICAgICAgICAgc3RhcnRUcmFja2luZ1BvaW50ZXIoIHBvaW50c0xpc3QsIGN1ckdQb2ludCApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBFbnRlclxuICAgICAgICAgICAgaWYgKCB0cmFja2VyLmVudGVySGFuZGxlciApIHtcbiAgICAgICAgICAgICAgICBwcm9wYWdhdGUgPSB0cmFja2VyLmVudGVySGFuZGxlcihcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRTb3VyY2U6ICAgICAgICAgIHRyYWNrZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyVHlwZTogICAgICAgICAgY3VyR1BvaW50LnR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogICAgICAgICAgICAgZ2V0UG9pbnRSZWxhdGl2ZVRvQWJzb2x1dGUoIGN1ckdQb2ludC5jdXJyZW50UG9zLCB0cmFja2VyLmVsZW1lbnQgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvbnM6ICAgICAgICAgICAgICBwb2ludHNMaXN0LmJ1dHRvbnMsXG4gICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyczogICAgICAgICAgICAgdHJhY2tlci5nZXRBY3RpdmVQb2ludGVyQ291bnQoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGluc2lkZUVsZW1lbnRQcmVzc2VkOiBjdXJHUG9pbnQuaW5zaWRlRWxlbWVudFByZXNzZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBidXR0b25Eb3duQW55OiAgICAgICAgcG9pbnRzTGlzdC5idXR0b25zICE9PSAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgaXNUb3VjaEV2ZW50OiAgICAgICAgIGN1ckdQb2ludC50eXBlID09PSAndG91Y2gnLFxuICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxFdmVudDogICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJldmVudERlZmF1bHRBY3Rpb246IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdXNlckRhdGE6ICAgICAgICAgICAgIHRyYWNrZXIudXNlckRhdGFcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgaWYgKCBwcm9wYWdhdGUgPT09IGZhbHNlICkge1xuICAgICAgICAgICAgICAgICAgICAkLmNhbmNlbEV2ZW50KCBldmVudCApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAaW5uZXJcbiAgICAgKiBAcGFyYW0ge09wZW5TZWFkcmFnb24uTW91c2VUcmFja2VyfSB0cmFja2VyXG4gICAgICogICAgIEEgcmVmZXJlbmNlIHRvIHRoZSBNb3VzZVRyYWNrZXIgaW5zdGFuY2UuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50XG4gICAgICogICAgIEEgcmVmZXJlbmNlIHRvIHRoZSBvcmlnaW5hdGluZyBET00gZXZlbnQuXG4gICAgICogQHBhcmFtIHtBcnJheS48T3BlblNlYWRyYWdvbi5Nb3VzZVRyYWNrZXIuR2VzdHVyZVBvaW50Pn0gZ1BvaW50c1xuICAgICAqICAgICAgR2VzdHVyZSBwb2ludHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBldmVudC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB1cGRhdGVQb2ludGVyc0V4aXQoIHRyYWNrZXIsIGV2ZW50LCBnUG9pbnRzICkge1xuICAgICAgICB2YXIgZGVsZWdhdGUgPSBUSElTWyB0cmFja2VyLmhhc2ggXSxcbiAgICAgICAgICAgIHBvaW50c0xpc3QgPSB0cmFja2VyLmdldEFjdGl2ZVBvaW50ZXJzTGlzdEJ5VHlwZSggZ1BvaW50c1sgMCBdLnR5cGUgKSxcbiAgICAgICAgICAgIGksXG4gICAgICAgICAgICBnUG9pbnRDb3VudCA9IGdQb2ludHMubGVuZ3RoLFxuICAgICAgICAgICAgY3VyR1BvaW50LFxuICAgICAgICAgICAgdXBkYXRlR1BvaW50LFxuICAgICAgICAgICAgcHJvcGFnYXRlO1xuXG4gICAgICAgIGZvciAoIGkgPSAwOyBpIDwgZ1BvaW50Q291bnQ7IGkrKyApIHtcbiAgICAgICAgICAgIGN1ckdQb2ludCA9IGdQb2ludHNbIGkgXTtcbiAgICAgICAgICAgIHVwZGF0ZUdQb2ludCA9IHBvaW50c0xpc3QuZ2V0QnlJZCggY3VyR1BvaW50LmlkICk7XG5cbiAgICAgICAgICAgIGlmICggdXBkYXRlR1BvaW50ICkge1xuICAgICAgICAgICAgICAgIC8vIEFscmVhZHkgdHJhY2tpbmcgdGhlIHBvaW50ZXIuIElmIGNhcHR1cmVkIHRoZW4gdXBkYXRlIGl0LCBlbHNlIHN0b3AgdHJhY2tpbmcgaXRcbiAgICAgICAgICAgICAgICBpZiAoIHVwZGF0ZUdQb2ludC5jYXB0dXJlZCApIHtcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlR1BvaW50Lmluc2lkZUVsZW1lbnQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlR1BvaW50Lmxhc3RQb3MgPSB1cGRhdGVHUG9pbnQuY3VycmVudFBvcztcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlR1BvaW50Lmxhc3RUaW1lID0gdXBkYXRlR1BvaW50LmN1cnJlbnRUaW1lO1xuICAgICAgICAgICAgICAgICAgICB1cGRhdGVHUG9pbnQuY3VycmVudFBvcyA9IGN1ckdQb2ludC5jdXJyZW50UG9zO1xuICAgICAgICAgICAgICAgICAgICB1cGRhdGVHUG9pbnQuY3VycmVudFRpbWUgPSBjdXJHUG9pbnQuY3VycmVudFRpbWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc3RvcFRyYWNraW5nUG9pbnRlciggcG9pbnRzTGlzdCwgdXBkYXRlR1BvaW50ICk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY3VyR1BvaW50ID0gdXBkYXRlR1BvaW50O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBFeGl0XG4gICAgICAgICAgICBpZiAoIHRyYWNrZXIuZXhpdEhhbmRsZXIgKSB7XG4gICAgICAgICAgICAgICAgcHJvcGFnYXRlID0gdHJhY2tlci5leGl0SGFuZGxlcihcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRTb3VyY2U6ICAgICAgICAgIHRyYWNrZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyVHlwZTogICAgICAgICAgY3VyR1BvaW50LnR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogICAgICAgICAgICAgZ2V0UG9pbnRSZWxhdGl2ZVRvQWJzb2x1dGUoIGN1ckdQb2ludC5jdXJyZW50UG9zLCB0cmFja2VyLmVsZW1lbnQgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvbnM6ICAgICAgICAgICAgICBwb2ludHNMaXN0LmJ1dHRvbnMsXG4gICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyczogICAgICAgICAgICAgdHJhY2tlci5nZXRBY3RpdmVQb2ludGVyQ291bnQoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGluc2lkZUVsZW1lbnRQcmVzc2VkOiB1cGRhdGVHUG9pbnQgPyB1cGRhdGVHUG9pbnQuaW5zaWRlRWxlbWVudFByZXNzZWQgOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvbkRvd25Bbnk6ICAgICAgICBwb2ludHNMaXN0LmJ1dHRvbnMgIT09IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICBpc1RvdWNoRXZlbnQ6ICAgICAgICAgY3VyR1BvaW50LnR5cGUgPT09ICd0b3VjaCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbEV2ZW50OiAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmV2ZW50RGVmYXVsdEFjdGlvbjogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VyRGF0YTogICAgICAgICAgICAgdHJhY2tlci51c2VyRGF0YVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIGlmICggcHJvcGFnYXRlID09PSBmYWxzZSApIHtcbiAgICAgICAgICAgICAgICAgICAgJC5jYW5jZWxFdmVudCggZXZlbnQgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwcml2YXRlXG4gICAgICogQGlubmVyXG4gICAgICogQHBhcmFtIHtPcGVuU2VhZHJhZ29uLk1vdXNlVHJhY2tlcn0gdHJhY2tlclxuICAgICAqICAgICBBIHJlZmVyZW5jZSB0byB0aGUgTW91c2VUcmFja2VyIGluc3RhbmNlLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudFxuICAgICAqICAgICBBIHJlZmVyZW5jZSB0byB0aGUgb3JpZ2luYXRpbmcgRE9NIGV2ZW50LlxuICAgICAqIEBwYXJhbSB7QXJyYXkuPE9wZW5TZWFkcmFnb24uTW91c2VUcmFja2VyLkdlc3R1cmVQb2ludD59IGdQb2ludHNcbiAgICAgKiAgICAgIEdlc3R1cmUgcG9pbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZXZlbnQuXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGJ1dHRvbkNoYW5nZWRcbiAgICAgKiAgICAgIFRoZSBidXR0b24gaW52b2x2ZWQgaW4gdGhlIGV2ZW50OiAtMTogbm9uZSwgMDogcHJpbWFyeS9sZWZ0LCAxOiBhdXgvbWlkZGxlLCAyOiBzZWNvbmRhcnkvcmlnaHQsIDM6IFgxL2JhY2ssIDQ6IFgyL2ZvcndhcmQsIDU6IHBlbiBlcmFzZXIuXG4gICAgICogICAgICBOb3RlIG9uIGNob3JkZWQgYnV0dG9uIHByZXNzZXMgKGEgYnV0dG9uIHByZXNzZWQgd2hlbiBhbm90aGVyIGJ1dHRvbiBpcyBhbHJlYWR5IHByZXNzZWQpOiBJbiB0aGUgVzNDIFBvaW50ZXIgRXZlbnRzIG1vZGVsLFxuICAgICAqICAgICAgb25seSBvbmUgcG9pbnRlcmRvd24vcG9pbnRlcnVwIGV2ZW50IGNvbWJvIGlzIGZpcmVkLiBDaG9yZGVkIGJ1dHRvbiBzdGF0ZSBjaGFuZ2VzIGluc3RlYWQgZmlyZSBwb2ludGVybW92ZSBldmVudHMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiBwb2ludGVycyBzaG91bGQgYmUgY2FwdHVyZWQgdG8gdGhlIHRyYWNrZWQgZWxlbWVudCwgb3RoZXJ3aXNlIGZhbHNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVwZGF0ZVBvaW50ZXJzRG93biggdHJhY2tlciwgZXZlbnQsIGdQb2ludHMsIGJ1dHRvbkNoYW5nZWQgKSB7XG4gICAgICAgIHZhciBkZWxlZ2F0ZSA9IFRISVNbIHRyYWNrZXIuaGFzaCBdLFxuICAgICAgICAgICAgcHJvcGFnYXRlLFxuICAgICAgICAgICAgcG9pbnRzTGlzdCA9IHRyYWNrZXIuZ2V0QWN0aXZlUG9pbnRlcnNMaXN0QnlUeXBlKCBnUG9pbnRzWyAwIF0udHlwZSApLFxuICAgICAgICAgICAgaSxcbiAgICAgICAgICAgIGdQb2ludENvdW50ID0gZ1BvaW50cy5sZW5ndGgsXG4gICAgICAgICAgICBjdXJHUG9pbnQsXG4gICAgICAgICAgICB1cGRhdGVHUG9pbnQ7XG5cbiAgICAgICAgaWYgKCB0eXBlb2YgZXZlbnQuYnV0dG9ucyAhPT0gJ3VuZGVmaW5lZCcgKSB7XG4gICAgICAgICAgICBwb2ludHNMaXN0LmJ1dHRvbnMgPSBldmVudC5idXR0b25zO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKCAkLkJyb3dzZXIudmVuZG9yID09PSAkLkJST1dTRVJTLklFICYmICQuQnJvd3Nlci52ZXJzaW9uIDwgOSApIHtcbiAgICAgICAgICAgICAgICBpZiAoIGJ1dHRvbkNoYW5nZWQgPT09IDAgKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFByaW1hcnlcbiAgICAgICAgICAgICAgICAgICAgcG9pbnRzTGlzdC5idXR0b25zICs9IDE7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICggYnV0dG9uQ2hhbmdlZCA9PT0gMSApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQXV4XG4gICAgICAgICAgICAgICAgICAgIHBvaW50c0xpc3QuYnV0dG9ucyArPSA0O1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIGJ1dHRvbkNoYW5nZWQgPT09IDIgKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFNlY29uZGFyeVxuICAgICAgICAgICAgICAgICAgICBwb2ludHNMaXN0LmJ1dHRvbnMgKz0gMjtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCBidXR0b25DaGFuZ2VkID09PSAzICkge1xuICAgICAgICAgICAgICAgICAgICAvLyBYMSAoQmFjaylcbiAgICAgICAgICAgICAgICAgICAgcG9pbnRzTGlzdC5idXR0b25zICs9IDg7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICggYnV0dG9uQ2hhbmdlZCA9PT0gNCApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gWDIgKEZvcndhcmQpXG4gICAgICAgICAgICAgICAgICAgIHBvaW50c0xpc3QuYnV0dG9ucyArPSAxNjtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCBidXR0b25DaGFuZ2VkID09PSA1ICkge1xuICAgICAgICAgICAgICAgICAgICAvLyBQZW4gRXJhc2VyXG4gICAgICAgICAgICAgICAgICAgIHBvaW50c0xpc3QuYnV0dG9ucyArPSAzMjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICggYnV0dG9uQ2hhbmdlZCA9PT0gMCApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gUHJpbWFyeVxuICAgICAgICAgICAgICAgICAgICBwb2ludHNMaXN0LmJ1dHRvbnMgfD0gMTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCBidXR0b25DaGFuZ2VkID09PSAxICkge1xuICAgICAgICAgICAgICAgICAgICAvLyBBdXhcbiAgICAgICAgICAgICAgICAgICAgcG9pbnRzTGlzdC5idXR0b25zIHw9IDQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICggYnV0dG9uQ2hhbmdlZCA9PT0gMiApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gU2Vjb25kYXJ5XG4gICAgICAgICAgICAgICAgICAgIHBvaW50c0xpc3QuYnV0dG9ucyB8PSAyO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIGJ1dHRvbkNoYW5nZWQgPT09IDMgKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFgxIChCYWNrKVxuICAgICAgICAgICAgICAgICAgICBwb2ludHNMaXN0LmJ1dHRvbnMgfD0gODtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCBidXR0b25DaGFuZ2VkID09PSA0ICkge1xuICAgICAgICAgICAgICAgICAgICAvLyBYMiAoRm9yd2FyZClcbiAgICAgICAgICAgICAgICAgICAgcG9pbnRzTGlzdC5idXR0b25zIHw9IDE2O1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIGJ1dHRvbkNoYW5nZWQgPT09IDUgKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFBlbiBFcmFzZXJcbiAgICAgICAgICAgICAgICAgICAgcG9pbnRzTGlzdC5idXR0b25zIHw9IDMyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE9ubHkgY2FwdHVyZSBhbmQgdHJhY2sgcHJpbWFyeSBidXR0b24sIHBlbiwgYW5kIHRvdWNoIGNvbnRhY3RzXG4gICAgICAgIGlmICggYnV0dG9uQ2hhbmdlZCAhPT0gMCApIHtcbiAgICAgICAgICAgIC8vIEF1eCBQcmVzc1xuICAgICAgICAgICAgaWYgKCB0cmFja2VyLm5vblByaW1hcnlQcmVzc0hhbmRsZXIgKSB7XG4gICAgICAgICAgICAgICAgcHJvcGFnYXRlID0gdHJhY2tlci5ub25QcmltYXJ5UHJlc3NIYW5kbGVyKFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudFNvdXJjZTogICAgICAgICAgdHJhY2tlcixcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXJUeXBlOiAgICAgICAgICBnUG9pbnRzWyAwIF0udHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAgICAgICAgICAgICBnZXRQb2ludFJlbGF0aXZlVG9BYnNvbHV0ZSggZ1BvaW50c1sgMCBdLmN1cnJlbnRQb3MsIHRyYWNrZXIuZWxlbWVudCApLFxuICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9uOiAgICAgICAgICAgICAgIGJ1dHRvbkNoYW5nZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBidXR0b25zOiAgICAgICAgICAgICAgcG9pbnRzTGlzdC5idXR0b25zLFxuICAgICAgICAgICAgICAgICAgICAgICAgaXNUb3VjaEV2ZW50OiAgICAgICAgIGdQb2ludHNbIDAgXS50eXBlID09PSAndG91Y2gnLFxuICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxFdmVudDogICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJldmVudERlZmF1bHRBY3Rpb246IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdXNlckRhdGE6ICAgICAgICAgICAgIHRyYWNrZXIudXNlckRhdGFcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgaWYgKCBwcm9wYWdhdGUgPT09IGZhbHNlICkge1xuICAgICAgICAgICAgICAgICAgICAkLmNhbmNlbEV2ZW50KCBldmVudCApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yICggaSA9IDA7IGkgPCBnUG9pbnRDb3VudDsgaSsrICkge1xuICAgICAgICAgICAgY3VyR1BvaW50ID0gZ1BvaW50c1sgaSBdO1xuICAgICAgICAgICAgdXBkYXRlR1BvaW50ID0gcG9pbnRzTGlzdC5nZXRCeUlkKCBjdXJHUG9pbnQuaWQgKTtcblxuICAgICAgICAgICAgaWYgKCB1cGRhdGVHUG9pbnQgKSB7XG4gICAgICAgICAgICAgICAgLy8gQWxyZWFkeSB0cmFja2luZyB0aGUgcG9pbnRlci4uLnVwZGF0ZSBpdFxuICAgICAgICAgICAgICAgIHVwZGF0ZUdQb2ludC5jYXB0dXJlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgdXBkYXRlR1BvaW50Lmluc2lkZUVsZW1lbnRQcmVzc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB1cGRhdGVHUG9pbnQuaW5zaWRlRWxlbWVudCA9IHRydWU7XG4gICAgICAgICAgICAgICAgdXBkYXRlR1BvaW50LmNvbnRhY3RQb3MgPSBjdXJHUG9pbnQuY3VycmVudFBvcztcbiAgICAgICAgICAgICAgICB1cGRhdGVHUG9pbnQuY29udGFjdFRpbWUgPSBjdXJHUG9pbnQuY3VycmVudFRpbWU7XG4gICAgICAgICAgICAgICAgdXBkYXRlR1BvaW50Lmxhc3RQb3MgPSB1cGRhdGVHUG9pbnQuY3VycmVudFBvcztcbiAgICAgICAgICAgICAgICB1cGRhdGVHUG9pbnQubGFzdFRpbWUgPSB1cGRhdGVHUG9pbnQuY3VycmVudFRpbWU7XG4gICAgICAgICAgICAgICAgdXBkYXRlR1BvaW50LmN1cnJlbnRQb3MgPSBjdXJHUG9pbnQuY3VycmVudFBvcztcbiAgICAgICAgICAgICAgICB1cGRhdGVHUG9pbnQuY3VycmVudFRpbWUgPSBjdXJHUG9pbnQuY3VycmVudFRpbWU7XG5cbiAgICAgICAgICAgICAgICBjdXJHUG9pbnQgPSB1cGRhdGVHUG9pbnQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIEluaXRpYWxpemUgZm9yIHRyYWNraW5nIGFuZCBhZGQgdG8gdGhlIHRyYWNraW5nIGxpc3QgKG5vIHBvaW50ZXJvdmVyIG9yIHBvaW50ZXJtb3ZlIGV2ZW50IG9jY3VycmVkIGJlZm9yZSB0aGlzKVxuICAgICAgICAgICAgICAgIGN1ckdQb2ludC5jYXB0dXJlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgY3VyR1BvaW50Lmluc2lkZUVsZW1lbnRQcmVzc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjdXJHUG9pbnQuaW5zaWRlRWxlbWVudCA9IHRydWU7XG4gICAgICAgICAgICAgICAgc3RhcnRUcmFja2luZ1BvaW50ZXIoIHBvaW50c0xpc3QsIGN1ckdQb2ludCApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwb2ludHNMaXN0LmNvbnRhY3RzKys7XG4gICAgICAgICAgICAvLyQuY29uc29sZS5sb2coJ2NvbnRhY3RzKysgJywgcG9pbnRzTGlzdC5jb250YWN0cyk7XG5cbiAgICAgICAgICAgIGlmICggdHJhY2tlci5kcmFnSGFuZGxlciB8fCB0cmFja2VyLmRyYWdFbmRIYW5kbGVyIHx8IHRyYWNrZXIucGluY2hIYW5kbGVyICkge1xuICAgICAgICAgICAgICAgICQuTW91c2VUcmFja2VyLmdlc3R1cmVQb2ludFZlbG9jaXR5VHJhY2tlci5hZGRQb2ludCggdHJhY2tlciwgY3VyR1BvaW50ICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICggcG9pbnRzTGlzdC5jb250YWN0cyA9PT0gMSApIHtcbiAgICAgICAgICAgICAgICAvLyBQcmVzc1xuICAgICAgICAgICAgICAgIGlmICggdHJhY2tlci5wcmVzc0hhbmRsZXIgKSB7XG4gICAgICAgICAgICAgICAgICAgIHByb3BhZ2F0ZSA9IHRyYWNrZXIucHJlc3NIYW5kbGVyKFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50U291cmNlOiAgICAgICAgICB0cmFja2VyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXJUeXBlOiAgICAgICAgICBjdXJHUG9pbnQudHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogICAgICAgICAgICAgZ2V0UG9pbnRSZWxhdGl2ZVRvQWJzb2x1dGUoIGN1ckdQb2ludC5jb250YWN0UG9zLCB0cmFja2VyLmVsZW1lbnQgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXR0b25zOiAgICAgICAgICAgICAgcG9pbnRzTGlzdC5idXR0b25zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzVG91Y2hFdmVudDogICAgICAgICBjdXJHUG9pbnQudHlwZSA9PT0gJ3RvdWNoJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbEV2ZW50OiAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmVudERlZmF1bHRBY3Rpb246IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJEYXRhOiAgICAgICAgICAgICB0cmFja2VyLnVzZXJEYXRhXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGlmICggcHJvcGFnYXRlID09PSBmYWxzZSApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICQuY2FuY2VsRXZlbnQoIGV2ZW50ICk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCBwb2ludHNMaXN0LmNvbnRhY3RzID09PSAyICkge1xuICAgICAgICAgICAgICAgIGlmICggdHJhY2tlci5waW5jaEhhbmRsZXIgJiYgY3VyR1BvaW50LnR5cGUgPT09ICd0b3VjaCcgKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEluaXRpYWxpemUgZm9yIHBpbmNoXG4gICAgICAgICAgICAgICAgICAgIGRlbGVnYXRlLnBpbmNoR1BvaW50cyA9IHBvaW50c0xpc3QuYXNBcnJheSgpO1xuICAgICAgICAgICAgICAgICAgICBkZWxlZ2F0ZS5sYXN0UGluY2hEaXN0ID0gZGVsZWdhdGUuY3VycmVudFBpbmNoRGlzdCA9IGRlbGVnYXRlLnBpbmNoR1BvaW50c1sgMCBdLmN1cnJlbnRQb3MuZGlzdGFuY2VUbyggZGVsZWdhdGUucGluY2hHUG9pbnRzWyAxIF0uY3VycmVudFBvcyApO1xuICAgICAgICAgICAgICAgICAgICBkZWxlZ2F0ZS5sYXN0UGluY2hDZW50ZXIgPSBkZWxlZ2F0ZS5jdXJyZW50UGluY2hDZW50ZXIgPSBnZXRDZW50ZXJQb2ludCggZGVsZWdhdGUucGluY2hHUG9pbnRzWyAwIF0uY3VycmVudFBvcywgZGVsZWdhdGUucGluY2hHUG9pbnRzWyAxIF0uY3VycmVudFBvcyApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAaW5uZXJcbiAgICAgKiBAcGFyYW0ge09wZW5TZWFkcmFnb24uTW91c2VUcmFja2VyfSB0cmFja2VyXG4gICAgICogICAgIEEgcmVmZXJlbmNlIHRvIHRoZSBNb3VzZVRyYWNrZXIgaW5zdGFuY2UuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50XG4gICAgICogICAgIEEgcmVmZXJlbmNlIHRvIHRoZSBvcmlnaW5hdGluZyBET00gZXZlbnQuXG4gICAgICogQHBhcmFtIHtBcnJheS48T3BlblNlYWRyYWdvbi5Nb3VzZVRyYWNrZXIuR2VzdHVyZVBvaW50Pn0gZ1BvaW50c1xuICAgICAqICAgICAgR2VzdHVyZSBwb2ludHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBldmVudC5cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gYnV0dG9uQ2hhbmdlZFxuICAgICAqICAgICAgVGhlIGJ1dHRvbiBpbnZvbHZlZCBpbiB0aGUgZXZlbnQ6IC0xOiBub25lLCAwOiBwcmltYXJ5L2xlZnQsIDE6IGF1eC9taWRkbGUsIDI6IHNlY29uZGFyeS9yaWdodCwgMzogWDEvYmFjaywgNDogWDIvZm9yd2FyZCwgNTogcGVuIGVyYXNlci5cbiAgICAgKiAgICAgIE5vdGUgb24gY2hvcmRlZCBidXR0b24gcHJlc3NlcyAoYSBidXR0b24gcHJlc3NlZCB3aGVuIGFub3RoZXIgYnV0dG9uIGlzIGFscmVhZHkgcHJlc3NlZCk6IEluIHRoZSBXM0MgUG9pbnRlciBFdmVudHMgbW9kZWwsXG4gICAgICogICAgICBvbmx5IG9uZSBwb2ludGVyZG93bi9wb2ludGVydXAgZXZlbnQgY29tYm8gaXMgZmlyZWQuIENob3JkZWQgYnV0dG9uIHN0YXRlIGNoYW5nZXMgaW5zdGVhZCBmaXJlIHBvaW50ZXJtb3ZlIGV2ZW50cy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHBvaW50ZXIgY2FwdHVyZSBzaG91bGQgYmUgcmVsZWFzZWQgZnJvbSB0aGUgdHJhY2tlZCBlbGVtZW50LCBvdGhlcndpc2UgZmFsc2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gdXBkYXRlUG9pbnRlcnNVcCggdHJhY2tlciwgZXZlbnQsIGdQb2ludHMsIGJ1dHRvbkNoYW5nZWQgKSB7XG4gICAgICAgIHZhciBkZWxlZ2F0ZSA9IFRISVNbIHRyYWNrZXIuaGFzaCBdLFxuICAgICAgICAgICAgcG9pbnRzTGlzdCA9IHRyYWNrZXIuZ2V0QWN0aXZlUG9pbnRlcnNMaXN0QnlUeXBlKCBnUG9pbnRzWyAwIF0udHlwZSApLFxuICAgICAgICAgICAgcHJvcGFnYXRlLFxuICAgICAgICAgICAgaW5zaWRlRWxlbWVudFJlbGVhc2VkLFxuICAgICAgICAgICAgcmVsZWFzZVBvaW50LFxuICAgICAgICAgICAgcmVsZWFzZVRpbWUsXG4gICAgICAgICAgICBpLFxuICAgICAgICAgICAgZ1BvaW50Q291bnQgPSBnUG9pbnRzLmxlbmd0aCxcbiAgICAgICAgICAgIGN1ckdQb2ludCxcbiAgICAgICAgICAgIHVwZGF0ZUdQb2ludCxcbiAgICAgICAgICAgIHJlbGVhc2VDYXB0dXJlID0gZmFsc2UsXG4gICAgICAgICAgICB3YXNDYXB0dXJlZCA9IGZhbHNlLFxuICAgICAgICAgICAgcXVpY2s7XG5cbiAgICAgICAgaWYgKCB0eXBlb2YgZXZlbnQuYnV0dG9ucyAhPT0gJ3VuZGVmaW5lZCcgKSB7XG4gICAgICAgICAgICBwb2ludHNMaXN0LmJ1dHRvbnMgPSBldmVudC5idXR0b25zO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKCAkLkJyb3dzZXIudmVuZG9yID09PSAkLkJST1dTRVJTLklFICYmICQuQnJvd3Nlci52ZXJzaW9uIDwgOSApIHtcbiAgICAgICAgICAgICAgICBpZiAoIGJ1dHRvbkNoYW5nZWQgPT09IDAgKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFByaW1hcnlcbiAgICAgICAgICAgICAgICAgICAgcG9pbnRzTGlzdC5idXR0b25zIC09IDE7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICggYnV0dG9uQ2hhbmdlZCA9PT0gMSApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQXV4XG4gICAgICAgICAgICAgICAgICAgIHBvaW50c0xpc3QuYnV0dG9ucyAtPSA0O1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIGJ1dHRvbkNoYW5nZWQgPT09IDIgKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFNlY29uZGFyeVxuICAgICAgICAgICAgICAgICAgICBwb2ludHNMaXN0LmJ1dHRvbnMgLT0gMjtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCBidXR0b25DaGFuZ2VkID09PSAzICkge1xuICAgICAgICAgICAgICAgICAgICAvLyBYMSAoQmFjaylcbiAgICAgICAgICAgICAgICAgICAgcG9pbnRzTGlzdC5idXR0b25zIC09IDg7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICggYnV0dG9uQ2hhbmdlZCA9PT0gNCApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gWDIgKEZvcndhcmQpXG4gICAgICAgICAgICAgICAgICAgIHBvaW50c0xpc3QuYnV0dG9ucyAtPSAxNjtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCBidXR0b25DaGFuZ2VkID09PSA1ICkge1xuICAgICAgICAgICAgICAgICAgICAvLyBQZW4gRXJhc2VyXG4gICAgICAgICAgICAgICAgICAgIHBvaW50c0xpc3QuYnV0dG9ucyAtPSAzMjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICggYnV0dG9uQ2hhbmdlZCA9PT0gMCApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gUHJpbWFyeVxuICAgICAgICAgICAgICAgICAgICBwb2ludHNMaXN0LmJ1dHRvbnMgXj0gfjE7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICggYnV0dG9uQ2hhbmdlZCA9PT0gMSApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQXV4XG4gICAgICAgICAgICAgICAgICAgIHBvaW50c0xpc3QuYnV0dG9ucyBePSB+NDtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCBidXR0b25DaGFuZ2VkID09PSAyICkge1xuICAgICAgICAgICAgICAgICAgICAvLyBTZWNvbmRhcnlcbiAgICAgICAgICAgICAgICAgICAgcG9pbnRzTGlzdC5idXR0b25zIF49IH4yO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIGJ1dHRvbkNoYW5nZWQgPT09IDMgKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFgxIChCYWNrKVxuICAgICAgICAgICAgICAgICAgICBwb2ludHNMaXN0LmJ1dHRvbnMgXj0gfjg7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICggYnV0dG9uQ2hhbmdlZCA9PT0gNCApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gWDIgKEZvcndhcmQpXG4gICAgICAgICAgICAgICAgICAgIHBvaW50c0xpc3QuYnV0dG9ucyBePSB+MTY7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICggYnV0dG9uQ2hhbmdlZCA9PT0gNSApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gUGVuIEVyYXNlclxuICAgICAgICAgICAgICAgICAgICBwb2ludHNMaXN0LmJ1dHRvbnMgXj0gfjMyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE9ubHkgY2FwdHVyZSBhbmQgdHJhY2sgcHJpbWFyeSBidXR0b24sIHBlbiwgYW5kIHRvdWNoIGNvbnRhY3RzXG4gICAgICAgIGlmICggYnV0dG9uQ2hhbmdlZCAhPT0gMCApIHtcbiAgICAgICAgICAgIC8vIEF1eCBSZWxlYXNlXG4gICAgICAgICAgICBpZiAoIHRyYWNrZXIubm9uUHJpbWFyeVJlbGVhc2VIYW5kbGVyICkge1xuICAgICAgICAgICAgICAgIHByb3BhZ2F0ZSA9IHRyYWNrZXIubm9uUHJpbWFyeVJlbGVhc2VIYW5kbGVyKFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudFNvdXJjZTogICAgICAgICAgIHRyYWNrZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyVHlwZTogICAgICAgICAgIGdQb2ludHNbIDAgXS50eXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246ICAgICAgICAgICAgICBnZXRQb2ludFJlbGF0aXZlVG9BYnNvbHV0ZSggIGdQb2ludHNbIDAgXS5jdXJyZW50UG9zLCB0cmFja2VyLmVsZW1lbnQgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvbjogICAgICAgICAgICAgICAgYnV0dG9uQ2hhbmdlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvbnM6ICAgICAgICAgICAgICAgcG9pbnRzTGlzdC5idXR0b25zLFxuICAgICAgICAgICAgICAgICAgICAgICAgaXNUb3VjaEV2ZW50OiAgICAgICAgICBnUG9pbnRzWyAwIF0udHlwZSA9PT0gJ3RvdWNoJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6ICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmV2ZW50RGVmYXVsdEFjdGlvbjogIGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdXNlckRhdGE6ICAgICAgICAgICAgICB0cmFja2VyLnVzZXJEYXRhXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGlmICggcHJvcGFnYXRlID09PSBmYWxzZSApIHtcbiAgICAgICAgICAgICAgICAgICAgJC5jYW5jZWxFdmVudCggZXZlbnQgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoIGkgPSAwOyBpIDwgZ1BvaW50Q291bnQ7IGkrKyApIHtcbiAgICAgICAgICAgIGN1ckdQb2ludCA9IGdQb2ludHNbIGkgXTtcbiAgICAgICAgICAgIHVwZGF0ZUdQb2ludCA9IHBvaW50c0xpc3QuZ2V0QnlJZCggY3VyR1BvaW50LmlkICk7XG5cbiAgICAgICAgICAgIGlmICggdXBkYXRlR1BvaW50ICkge1xuICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgcG9pbnRlciwgc3RvcCB0cmFja2luZyBpdCBpZiBub3Qgc3RpbGwgaW4gdGhpcyBlbGVtZW50XG4gICAgICAgICAgICAgICAgaWYgKCB1cGRhdGVHUG9pbnQuY2FwdHVyZWQgKSB7XG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZUdQb2ludC5jYXB0dXJlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICByZWxlYXNlQ2FwdHVyZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHdhc0NhcHR1cmVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdXBkYXRlR1BvaW50Lmxhc3RQb3MgPSB1cGRhdGVHUG9pbnQuY3VycmVudFBvcztcbiAgICAgICAgICAgICAgICB1cGRhdGVHUG9pbnQubGFzdFRpbWUgPSB1cGRhdGVHUG9pbnQuY3VycmVudFRpbWU7XG4gICAgICAgICAgICAgICAgdXBkYXRlR1BvaW50LmN1cnJlbnRQb3MgPSBjdXJHUG9pbnQuY3VycmVudFBvcztcbiAgICAgICAgICAgICAgICB1cGRhdGVHUG9pbnQuY3VycmVudFRpbWUgPSBjdXJHUG9pbnQuY3VycmVudFRpbWU7XG4gICAgICAgICAgICAgICAgaWYgKCAhdXBkYXRlR1BvaW50Lmluc2lkZUVsZW1lbnQgKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0b3BUcmFja2luZ1BvaW50ZXIoIHBvaW50c0xpc3QsIHVwZGF0ZUdQb2ludCApO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJlbGVhc2VQb2ludCA9IHVwZGF0ZUdQb2ludC5jdXJyZW50UG9zO1xuICAgICAgICAgICAgICAgIHJlbGVhc2VUaW1lID0gdXBkYXRlR1BvaW50LmN1cnJlbnRUaW1lO1xuXG4gICAgICAgICAgICAgICAgaWYgKCB3YXNDYXB0dXJlZCApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gUG9pbnRlciB3YXMgYWN0aXZhdGVkIGluIG91ciBlbGVtZW50IGJ1dCBjb3VsZCBoYXZlIGJlZW4gcmVtb3ZlZCBpbiBhbnkgZWxlbWVudCBzaW5jZSBldmVudHMgYXJlIGNhcHR1cmVkIHRvIG91ciBlbGVtZW50XG5cbiAgICAgICAgICAgICAgICAgICAgcG9pbnRzTGlzdC5jb250YWN0cy0tO1xuICAgICAgICAgICAgICAgICAgICAvLyQuY29uc29sZS5sb2coJ2NvbnRhY3RzLS0gJywgcG9pbnRzTGlzdC5jb250YWN0cyk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCB0cmFja2VyLmRyYWdIYW5kbGVyIHx8IHRyYWNrZXIuZHJhZ0VuZEhhbmRsZXIgfHwgdHJhY2tlci5waW5jaEhhbmRsZXIgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAkLk1vdXNlVHJhY2tlci5nZXN0dXJlUG9pbnRWZWxvY2l0eVRyYWNrZXIucmVtb3ZlUG9pbnQoIHRyYWNrZXIsIHVwZGF0ZUdQb2ludCApO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCBwb2ludHNMaXN0LmNvbnRhY3RzID09PSAwICkge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBSZWxlYXNlIChwcmVzc2VkIGluIG91ciBlbGVtZW50KVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCB0cmFja2VyLnJlbGVhc2VIYW5kbGVyICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BhZ2F0ZSA9IHRyYWNrZXIucmVsZWFzZUhhbmRsZXIoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50U291cmNlOiAgICAgICAgICAgdHJhY2tlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXJUeXBlOiAgICAgICAgICAgdXBkYXRlR1BvaW50LnR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogICAgICAgICAgICAgIGdldFBvaW50UmVsYXRpdmVUb0Fic29sdXRlKCByZWxlYXNlUG9pbnQsIHRyYWNrZXIuZWxlbWVudCApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9uczogICAgICAgICAgICAgICBwb2ludHNMaXN0LmJ1dHRvbnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNpZGVFbGVtZW50UHJlc3NlZDogIHVwZGF0ZUdQb2ludC5pbnNpZGVFbGVtZW50UHJlc3NlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc2lkZUVsZW1lbnRSZWxlYXNlZDogdXBkYXRlR1BvaW50Lmluc2lkZUVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1RvdWNoRXZlbnQ6ICAgICAgICAgIHVwZGF0ZUdQb2ludC50eXBlID09PSAndG91Y2gnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxFdmVudDogICAgICAgICBldmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZlbnREZWZhdWx0QWN0aW9uOiAgZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyRGF0YTogICAgICAgICAgICAgIHRyYWNrZXIudXNlckRhdGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwcm9wYWdhdGUgPT09IGZhbHNlICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkLmNhbmNlbEV2ZW50KCBldmVudCApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRHJhZyBFbmRcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggdHJhY2tlci5kcmFnRW5kSGFuZGxlciAmJiAhdXBkYXRlR1BvaW50LmN1cnJlbnRQb3MuZXF1YWxzKCB1cGRhdGVHUG9pbnQuY29udGFjdFBvcyApICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BhZ2F0ZSA9IHRyYWNrZXIuZHJhZ0VuZEhhbmRsZXIoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50U291cmNlOiAgICAgICAgICB0cmFja2VyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlclR5cGU6ICAgICAgICAgIHVwZGF0ZUdQb2ludC50eXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246ICAgICAgICAgICAgIGdldFBvaW50UmVsYXRpdmVUb0Fic29sdXRlKCB1cGRhdGVHUG9pbnQuY3VycmVudFBvcywgdHJhY2tlci5lbGVtZW50ICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVlZDogICAgICAgICAgICAgICAgdXBkYXRlR1BvaW50LnNwZWVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uOiAgICAgICAgICAgIHVwZGF0ZUdQb2ludC5kaXJlY3Rpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGlmdDogICAgICAgICAgICAgICAgZXZlbnQuc2hpZnRLZXksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1RvdWNoRXZlbnQ6ICAgICAgICAgdXBkYXRlR1BvaW50LnR5cGUgPT09ICd0b3VjaCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbEV2ZW50OiAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2ZW50RGVmYXVsdEFjdGlvbjogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyRGF0YTogICAgICAgICAgICAgdHJhY2tlci51c2VyRGF0YVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHByb3BhZ2F0ZSA9PT0gZmFsc2UgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQuY2FuY2VsRXZlbnQoIGV2ZW50ICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDbGljayAvIERvdWJsZS1DbGlja1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoIHRyYWNrZXIuY2xpY2tIYW5kbGVyIHx8IHRyYWNrZXIuZGJsQ2xpY2tIYW5kbGVyICkgJiYgdXBkYXRlR1BvaW50Lmluc2lkZUVsZW1lbnQgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVpY2sgPSByZWxlYXNlVGltZSAtIHVwZGF0ZUdQb2ludC5jb250YWN0VGltZSA8PSB0cmFja2VyLmNsaWNrVGltZVRocmVzaG9sZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVHUG9pbnQuY29udGFjdFBvcy5kaXN0YW5jZVRvKCByZWxlYXNlUG9pbnQgKSA8PSB0cmFja2VyLmNsaWNrRGlzdFRocmVzaG9sZDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENsaWNrXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCB0cmFja2VyLmNsaWNrSGFuZGxlciApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGFnYXRlID0gdHJhY2tlci5jbGlja0hhbmRsZXIoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRTb3VyY2U6ICAgICAgICAgIHRyYWNrZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlclR5cGU6ICAgICAgICAgIHVwZGF0ZUdQb2ludC50eXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAgICAgICAgICAgICBnZXRQb2ludFJlbGF0aXZlVG9BYnNvbHV0ZSggdXBkYXRlR1BvaW50LmN1cnJlbnRQb3MsIHRyYWNrZXIuZWxlbWVudCApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1aWNrOiAgICAgICAgICAgICAgICBxdWljayxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGlmdDogICAgICAgICAgICAgICAgZXZlbnQuc2hpZnRLZXksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNUb3VjaEV2ZW50OiAgICAgICAgIHVwZGF0ZUdQb2ludC50eXBlID09PSAndG91Y2gnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6ICAgICAgICBldmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2ZW50RGVmYXVsdEFjdGlvbjogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckRhdGE6ICAgICAgICAgICAgIHRyYWNrZXIudXNlckRhdGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwcm9wYWdhdGUgPT09IGZhbHNlICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJC5jYW5jZWxFdmVudCggZXZlbnQgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERvdWJsZS1DbGlja1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggdHJhY2tlci5kYmxDbGlja0hhbmRsZXIgJiYgcXVpY2sgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50c0xpc3QuY2xpY2tzKys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcG9pbnRzTGlzdC5jbGlja3MgPT09IDEgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxlZ2F0ZS5sYXN0Q2xpY2tQb3MgPSByZWxlYXNlUG9pbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmpzaGludCBsb29wZnVuYzp0cnVlKi9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGVnYXRlLmRibENsaWNrVGltZU91dCA9IHNldFRpbWVvdXQoIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50c0xpc3QuY2xpY2tzID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRyYWNrZXIuZGJsQ2xpY2tUaW1lVGhyZXNob2xkICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmpzaGludCBsb29wZnVuYzpmYWxzZSovXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIHBvaW50c0xpc3QuY2xpY2tzID09PSAyICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KCBkZWxlZ2F0ZS5kYmxDbGlja1RpbWVPdXQgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50c0xpc3QuY2xpY2tzID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggZGVsZWdhdGUubGFzdENsaWNrUG9zLmRpc3RhbmNlVG8oIHJlbGVhc2VQb2ludCApIDw9IHRyYWNrZXIuZGJsQ2xpY2tEaXN0VGhyZXNob2xkICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BhZ2F0ZSA9IHRyYWNrZXIuZGJsQ2xpY2tIYW5kbGVyKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudFNvdXJjZTogICAgICAgICAgdHJhY2tlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXJUeXBlOiAgICAgICAgICB1cGRhdGVHUG9pbnQudHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAgICAgICAgICAgICBnZXRQb2ludFJlbGF0aXZlVG9BYnNvbHV0ZSggdXBkYXRlR1BvaW50LmN1cnJlbnRQb3MsIHRyYWNrZXIuZWxlbWVudCApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hpZnQ6ICAgICAgICAgICAgICAgIGV2ZW50LnNoaWZ0S2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNUb3VjaEV2ZW50OiAgICAgICAgIHVwZGF0ZUdQb2ludC50eXBlID09PSAndG91Y2gnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxFdmVudDogICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmVudERlZmF1bHRBY3Rpb246IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckRhdGE6ICAgICAgICAgICAgIHRyYWNrZXIudXNlckRhdGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwcm9wYWdhdGUgPT09IGZhbHNlICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkLmNhbmNlbEV2ZW50KCBldmVudCApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGVnYXRlLmxhc3RDbGlja1BvcyA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIHBvaW50c0xpc3QuY29udGFjdHMgPT09IDIgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHRyYWNrZXIucGluY2hIYW5kbGVyICYmIHVwZGF0ZUdQb2ludC50eXBlID09PSAndG91Y2gnICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlc2V0IGZvciBwaW5jaFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGVnYXRlLnBpbmNoR1BvaW50cyA9IHBvaW50c0xpc3QuYXNBcnJheSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGVnYXRlLmxhc3RQaW5jaERpc3QgPSBkZWxlZ2F0ZS5jdXJyZW50UGluY2hEaXN0ID0gZGVsZWdhdGUucGluY2hHUG9pbnRzWyAwIF0uY3VycmVudFBvcy5kaXN0YW5jZVRvKCBkZWxlZ2F0ZS5waW5jaEdQb2ludHNbIDEgXS5jdXJyZW50UG9zICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZWdhdGUubGFzdFBpbmNoQ2VudGVyID0gZGVsZWdhdGUuY3VycmVudFBpbmNoQ2VudGVyID0gZ2V0Q2VudGVyUG9pbnQoIGRlbGVnYXRlLnBpbmNoR1BvaW50c1sgMCBdLmN1cnJlbnRQb3MsIGRlbGVnYXRlLnBpbmNoR1BvaW50c1sgMSBdLmN1cnJlbnRQb3MgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFBvaW50ZXIgd2FzIGFjdGl2YXRlZCBpbiBhbm90aGVyIGVsZW1lbnQgYnV0IHJlbW92ZWQgaW4gb3VyIGVsZW1lbnRcblxuICAgICAgICAgICAgICAgICAgICAvLyBSZWxlYXNlIChwcmVzc2VkIGluIGFub3RoZXIgZWxlbWVudClcbiAgICAgICAgICAgICAgICAgICAgaWYgKCB0cmFja2VyLnJlbGVhc2VIYW5kbGVyICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGFnYXRlID0gdHJhY2tlci5yZWxlYXNlSGFuZGxlcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50U291cmNlOiAgICAgICAgICAgdHJhY2tlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlclR5cGU6ICAgICAgICAgICB1cGRhdGVHUG9pbnQudHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246ICAgICAgICAgICAgICBnZXRQb2ludFJlbGF0aXZlVG9BYnNvbHV0ZSggcmVsZWFzZVBvaW50LCB0cmFja2VyLmVsZW1lbnQgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9uczogICAgICAgICAgICAgICBwb2ludHNMaXN0LmJ1dHRvbnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc2lkZUVsZW1lbnRQcmVzc2VkOiAgdXBkYXRlR1BvaW50Lmluc2lkZUVsZW1lbnRQcmVzc2VkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNpZGVFbGVtZW50UmVsZWFzZWQ6IHVwZGF0ZUdQb2ludC5pbnNpZGVFbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1RvdWNoRXZlbnQ6ICAgICAgICAgIHVwZGF0ZUdQb2ludC50eXBlID09PSAndG91Y2gnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbEV2ZW50OiAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2ZW50RGVmYXVsdEFjdGlvbjogIGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyRGF0YTogICAgICAgICAgICAgIHRyYWNrZXIudXNlckRhdGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwcm9wYWdhdGUgPT09IGZhbHNlICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICQuY2FuY2VsRXZlbnQoIGV2ZW50ICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVsZWFzZUNhcHR1cmU7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBDYWxsIHdoZW4gcG9pbnRlcihzKSBjaGFuZ2UgY29vcmRpbmF0ZXMsIGJ1dHRvbiBzdGF0ZSwgcHJlc3N1cmUsIHRpbHQsIG9yIGNvbnRhY3QgZ2VvbWV0cnkgKGUuZy4gd2lkdGggYW5kIGhlaWdodClcbiAgICAgKlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwcml2YXRlXG4gICAgICogQGlubmVyXG4gICAgICogQHBhcmFtIHtPcGVuU2VhZHJhZ29uLk1vdXNlVHJhY2tlcn0gdHJhY2tlclxuICAgICAqICAgICBBIHJlZmVyZW5jZSB0byB0aGUgTW91c2VUcmFja2VyIGluc3RhbmNlLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudFxuICAgICAqICAgICBBIHJlZmVyZW5jZSB0byB0aGUgb3JpZ2luYXRpbmcgRE9NIGV2ZW50LlxuICAgICAqIEBwYXJhbSB7QXJyYXkuPE9wZW5TZWFkcmFnb24uTW91c2VUcmFja2VyLkdlc3R1cmVQb2ludD59IGdQb2ludHNcbiAgICAgKiAgICAgIEdlc3R1cmUgcG9pbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZXZlbnQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gdXBkYXRlUG9pbnRlcnNNb3ZlKCB0cmFja2VyLCBldmVudCwgZ1BvaW50cyApIHtcbiAgICAgICAgdmFyIGRlbGVnYXRlID0gVEhJU1sgdHJhY2tlci5oYXNoIF0sXG4gICAgICAgICAgICBwb2ludHNMaXN0ID0gdHJhY2tlci5nZXRBY3RpdmVQb2ludGVyc0xpc3RCeVR5cGUoIGdQb2ludHNbIDAgXS50eXBlICksXG4gICAgICAgICAgICBpLFxuICAgICAgICAgICAgZ1BvaW50Q291bnQgPSBnUG9pbnRzLmxlbmd0aCxcbiAgICAgICAgICAgIGN1ckdQb2ludCxcbiAgICAgICAgICAgIHVwZGF0ZUdQb2ludCxcbiAgICAgICAgICAgIGdQb2ludEFycmF5LFxuICAgICAgICAgICAgZGVsdGEsXG4gICAgICAgICAgICBwcm9wYWdhdGU7XG5cbiAgICAgICAgaWYgKCB0eXBlb2YgZXZlbnQuYnV0dG9ucyAhPT0gJ3VuZGVmaW5lZCcgKSB7XG4gICAgICAgICAgICBwb2ludHNMaXN0LmJ1dHRvbnMgPSBldmVudC5idXR0b25zO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yICggaSA9IDA7IGkgPCBnUG9pbnRDb3VudDsgaSsrICkge1xuICAgICAgICAgICAgY3VyR1BvaW50ID0gZ1BvaW50c1sgaSBdO1xuICAgICAgICAgICAgdXBkYXRlR1BvaW50ID0gcG9pbnRzTGlzdC5nZXRCeUlkKCBjdXJHUG9pbnQuaWQgKTtcblxuICAgICAgICAgICAgaWYgKCB1cGRhdGVHUG9pbnQgKSB7XG4gICAgICAgICAgICAgICAgLy8gQWxyZWFkeSB0cmFja2luZyB0aGUgcG9pbnRlci4uLnVwZGF0ZSBpdFxuICAgICAgICAgICAgICAgIGlmICggY3VyR1BvaW50Lmhhc093blByb3BlcnR5KCAnaXNQcmltYXJ5JyApICkge1xuICAgICAgICAgICAgICAgICAgICB1cGRhdGVHUG9pbnQuaXNQcmltYXJ5ID0gY3VyR1BvaW50LmlzUHJpbWFyeTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdXBkYXRlR1BvaW50Lmxhc3RQb3MgPSB1cGRhdGVHUG9pbnQuY3VycmVudFBvcztcbiAgICAgICAgICAgICAgICB1cGRhdGVHUG9pbnQubGFzdFRpbWUgPSB1cGRhdGVHUG9pbnQuY3VycmVudFRpbWU7XG4gICAgICAgICAgICAgICAgdXBkYXRlR1BvaW50LmN1cnJlbnRQb3MgPSBjdXJHUG9pbnQuY3VycmVudFBvcztcbiAgICAgICAgICAgICAgICB1cGRhdGVHUG9pbnQuY3VycmVudFRpbWUgPSBjdXJHUG9pbnQuY3VycmVudFRpbWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIEluaXRpYWxpemUgZm9yIHRyYWNraW5nIGFuZCBhZGQgdG8gdGhlIHRyYWNraW5nIGxpc3QgKG5vIHBvaW50ZXJvdmVyIG9yIHBvaW50ZXJkb3duIGV2ZW50IG9jY3VycmVkIGJlZm9yZSB0aGlzKVxuICAgICAgICAgICAgICAgIGN1ckdQb2ludC5jYXB0dXJlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGN1ckdQb2ludC5pbnNpZGVFbGVtZW50UHJlc3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGN1ckdQb2ludC5pbnNpZGVFbGVtZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBzdGFydFRyYWNraW5nUG9pbnRlciggcG9pbnRzTGlzdCwgY3VyR1BvaW50ICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdG9wIChtb3VzZSBvbmx5KVxuICAgICAgICBpZiAoIHRyYWNrZXIuc3RvcEhhbmRsZXIgJiYgZ1BvaW50c1sgMCBdLnR5cGUgPT09ICdtb3VzZScgKSB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoIHRyYWNrZXIuc3RvcFRpbWVPdXQgKTtcbiAgICAgICAgICAgIHRyYWNrZXIuc3RvcFRpbWVPdXQgPSBzZXRUaW1lb3V0KCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVQb2ludGVyU3RvcCggdHJhY2tlciwgZXZlbnQsIGdQb2ludHNbIDAgXS50eXBlICk7XG4gICAgICAgICAgICB9LCB0cmFja2VyLnN0b3BEZWxheSApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCBwb2ludHNMaXN0LmNvbnRhY3RzID09PSAwICkge1xuICAgICAgICAgICAgLy8gTW92ZSAobm8gY29udGFjdHM6IGhvdmVyaW5nIG1vdXNlIG9yIG90aGVyIGhvdmVyLWNhcGFibGUgZGV2aWNlKVxuICAgICAgICAgICAgaWYgKCB0cmFja2VyLm1vdmVIYW5kbGVyICkge1xuICAgICAgICAgICAgICAgIHByb3BhZ2F0ZSA9IHRyYWNrZXIubW92ZUhhbmRsZXIoXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50U291cmNlOiAgICAgICAgICB0cmFja2VyLFxuICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlclR5cGU6ICAgICAgICAgIGdQb2ludHNbIDAgXS50eXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246ICAgICAgICAgICAgIGdldFBvaW50UmVsYXRpdmVUb0Fic29sdXRlKCBnUG9pbnRzWyAwIF0uY3VycmVudFBvcywgdHJhY2tlci5lbGVtZW50ICksXG4gICAgICAgICAgICAgICAgICAgICAgICBidXR0b25zOiAgICAgICAgICAgICAgcG9pbnRzTGlzdC5idXR0b25zLFxuICAgICAgICAgICAgICAgICAgICAgICAgaXNUb3VjaEV2ZW50OiAgICAgICAgIGdQb2ludHNbIDAgXS50eXBlID09PSAndG91Y2gnLFxuICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxFdmVudDogICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJldmVudERlZmF1bHRBY3Rpb246IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdXNlckRhdGE6ICAgICAgICAgICAgIHRyYWNrZXIudXNlckRhdGFcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgaWYgKCBwcm9wYWdhdGUgPT09IGZhbHNlICkge1xuICAgICAgICAgICAgICAgICAgICAkLmNhbmNlbEV2ZW50KCBldmVudCApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICggcG9pbnRzTGlzdC5jb250YWN0cyA9PT0gMSApIHtcbiAgICAgICAgICAgIC8vIE1vdmUgKDEgY29udGFjdClcbiAgICAgICAgICAgIGlmICggdHJhY2tlci5tb3ZlSGFuZGxlciApIHtcbiAgICAgICAgICAgICAgICB1cGRhdGVHUG9pbnQgPSBwb2ludHNMaXN0LmFzQXJyYXkoKVsgMCBdO1xuICAgICAgICAgICAgICAgIHByb3BhZ2F0ZSA9IHRyYWNrZXIubW92ZUhhbmRsZXIoXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50U291cmNlOiAgICAgICAgICB0cmFja2VyLFxuICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlclR5cGU6ICAgICAgICAgIHVwZGF0ZUdQb2ludC50eXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246ICAgICAgICAgICAgIGdldFBvaW50UmVsYXRpdmVUb0Fic29sdXRlKCB1cGRhdGVHUG9pbnQuY3VycmVudFBvcywgdHJhY2tlci5lbGVtZW50ICksXG4gICAgICAgICAgICAgICAgICAgICAgICBidXR0b25zOiAgICAgICAgICAgICAgcG9pbnRzTGlzdC5idXR0b25zLFxuICAgICAgICAgICAgICAgICAgICAgICAgaXNUb3VjaEV2ZW50OiAgICAgICAgIHVwZGF0ZUdQb2ludC50eXBlID09PSAndG91Y2gnLFxuICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxFdmVudDogICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJldmVudERlZmF1bHRBY3Rpb246IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdXNlckRhdGE6ICAgICAgICAgICAgIHRyYWNrZXIudXNlckRhdGFcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgaWYgKCBwcm9wYWdhdGUgPT09IGZhbHNlICkge1xuICAgICAgICAgICAgICAgICAgICAkLmNhbmNlbEV2ZW50KCBldmVudCApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRHJhZ1xuICAgICAgICAgICAgaWYgKCB0cmFja2VyLmRyYWdIYW5kbGVyICkge1xuICAgICAgICAgICAgICAgIHVwZGF0ZUdQb2ludCA9IHBvaW50c0xpc3QuYXNBcnJheSgpWyAwIF07XG4gICAgICAgICAgICAgICAgZGVsdGEgPSB1cGRhdGVHUG9pbnQuY3VycmVudFBvcy5taW51cyggdXBkYXRlR1BvaW50Lmxhc3RQb3MgKTtcbiAgICAgICAgICAgICAgICBwcm9wYWdhdGUgPSB0cmFja2VyLmRyYWdIYW5kbGVyKFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudFNvdXJjZTogICAgICAgICAgdHJhY2tlcixcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXJUeXBlOiAgICAgICAgICB1cGRhdGVHUG9pbnQudHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAgICAgICAgICAgICBnZXRQb2ludFJlbGF0aXZlVG9BYnNvbHV0ZSggdXBkYXRlR1BvaW50LmN1cnJlbnRQb3MsIHRyYWNrZXIuZWxlbWVudCApLFxuICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9uczogICAgICAgICAgICAgIHBvaW50c0xpc3QuYnV0dG9ucyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhOiAgICAgICAgICAgICAgICBkZWx0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNwZWVkOiAgICAgICAgICAgICAgICB1cGRhdGVHUG9pbnQuc3BlZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb246ICAgICAgICAgICAgdXBkYXRlR1BvaW50LmRpcmVjdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIHNoaWZ0OiAgICAgICAgICAgICAgICBldmVudC5zaGlmdEtleSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzVG91Y2hFdmVudDogICAgICAgICB1cGRhdGVHUG9pbnQudHlwZSA9PT0gJ3RvdWNoJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6ICAgICAgICBldmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZXZlbnREZWZhdWx0QWN0aW9uOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJEYXRhOiAgICAgICAgICAgICB0cmFja2VyLnVzZXJEYXRhXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGlmICggcHJvcGFnYXRlID09PSBmYWxzZSApIHtcbiAgICAgICAgICAgICAgICAgICAgJC5jYW5jZWxFdmVudCggZXZlbnQgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoIHBvaW50c0xpc3QuY29udGFjdHMgPT09IDIgKSB7XG4gICAgICAgICAgICAvLyBNb3ZlICgyIGNvbnRhY3RzLCB1c2UgY2VudGVyKVxuICAgICAgICAgICAgaWYgKCB0cmFja2VyLm1vdmVIYW5kbGVyICkge1xuICAgICAgICAgICAgICAgIGdQb2ludEFycmF5ID0gcG9pbnRzTGlzdC5hc0FycmF5KCk7XG4gICAgICAgICAgICAgICAgcHJvcGFnYXRlID0gdHJhY2tlci5tb3ZlSGFuZGxlcihcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRTb3VyY2U6ICAgICAgICAgIHRyYWNrZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyVHlwZTogICAgICAgICAgZ1BvaW50QXJyYXlbIDAgXS50eXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246ICAgICAgICAgICAgIGdldFBvaW50UmVsYXRpdmVUb0Fic29sdXRlKCBnZXRDZW50ZXJQb2ludCggZ1BvaW50QXJyYXlbIDAgXS5jdXJyZW50UG9zLCBnUG9pbnRBcnJheVsgMSBdLmN1cnJlbnRQb3MgKSwgdHJhY2tlci5lbGVtZW50ICksXG4gICAgICAgICAgICAgICAgICAgICAgICBidXR0b25zOiAgICAgICAgICAgICAgcG9pbnRzTGlzdC5idXR0b25zLFxuICAgICAgICAgICAgICAgICAgICAgICAgaXNUb3VjaEV2ZW50OiAgICAgICAgIGdQb2ludEFycmF5WyAwIF0udHlwZSA9PT0gJ3RvdWNoJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6ICAgICAgICBldmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZXZlbnREZWZhdWx0QWN0aW9uOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJEYXRhOiAgICAgICAgICAgICB0cmFja2VyLnVzZXJEYXRhXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGlmICggcHJvcGFnYXRlID09PSBmYWxzZSApIHtcbiAgICAgICAgICAgICAgICAgICAgJC5jYW5jZWxFdmVudCggZXZlbnQgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFBpbmNoXG4gICAgICAgICAgICBpZiAoIHRyYWNrZXIucGluY2hIYW5kbGVyICYmIGdQb2ludHNbIDAgXS50eXBlID09PSAndG91Y2gnICkge1xuICAgICAgICAgICAgICAgIGRlbHRhID0gZGVsZWdhdGUucGluY2hHUG9pbnRzWyAwIF0uY3VycmVudFBvcy5kaXN0YW5jZVRvKCBkZWxlZ2F0ZS5waW5jaEdQb2ludHNbIDEgXS5jdXJyZW50UG9zICk7XG4gICAgICAgICAgICAgICAgaWYgKCBkZWx0YSAhPSBkZWxlZ2F0ZS5jdXJyZW50UGluY2hEaXN0ICkge1xuICAgICAgICAgICAgICAgICAgICBkZWxlZ2F0ZS5sYXN0UGluY2hEaXN0ID0gZGVsZWdhdGUuY3VycmVudFBpbmNoRGlzdDtcbiAgICAgICAgICAgICAgICAgICAgZGVsZWdhdGUuY3VycmVudFBpbmNoRGlzdCA9IGRlbHRhO1xuICAgICAgICAgICAgICAgICAgICBkZWxlZ2F0ZS5sYXN0UGluY2hDZW50ZXIgPSBkZWxlZ2F0ZS5jdXJyZW50UGluY2hDZW50ZXI7XG4gICAgICAgICAgICAgICAgICAgIGRlbGVnYXRlLmN1cnJlbnRQaW5jaENlbnRlciA9IGdldENlbnRlclBvaW50KCBkZWxlZ2F0ZS5waW5jaEdQb2ludHNbIDAgXS5jdXJyZW50UG9zLCBkZWxlZ2F0ZS5waW5jaEdQb2ludHNbIDEgXS5jdXJyZW50UG9zICk7XG4gICAgICAgICAgICAgICAgICAgIHByb3BhZ2F0ZSA9IHRyYWNrZXIucGluY2hIYW5kbGVyKFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50U291cmNlOiAgICAgICAgICB0cmFja2VyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXJUeXBlOiAgICAgICAgICAndG91Y2gnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlc3R1cmVQb2ludHM6ICAgICAgICBkZWxlZ2F0ZS5waW5jaEdQb2ludHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdENlbnRlcjogICAgICAgICAgIGdldFBvaW50UmVsYXRpdmVUb0Fic29sdXRlKCBkZWxlZ2F0ZS5sYXN0UGluY2hDZW50ZXIsIHRyYWNrZXIuZWxlbWVudCApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbnRlcjogICAgICAgICAgICAgICBnZXRQb2ludFJlbGF0aXZlVG9BYnNvbHV0ZSggZGVsZWdhdGUuY3VycmVudFBpbmNoQ2VudGVyLCB0cmFja2VyLmVsZW1lbnQgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0RGlzdGFuY2U6ICAgICAgICAgZGVsZWdhdGUubGFzdFBpbmNoRGlzdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0YW5jZTogICAgICAgICAgICAgZGVsZWdhdGUuY3VycmVudFBpbmNoRGlzdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGlmdDogICAgICAgICAgICAgICAgZXZlbnQuc2hpZnRLZXksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxFdmVudDogICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZlbnREZWZhdWx0QWN0aW9uOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyRGF0YTogICAgICAgICAgICAgdHJhY2tlci51c2VyRGF0YVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIHByb3BhZ2F0ZSA9PT0gZmFsc2UgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAkLmNhbmNlbEV2ZW50KCBldmVudCApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBpbm5lclxuICAgICAqIEBwYXJhbSB7T3BlblNlYWRyYWdvbi5Nb3VzZVRyYWNrZXJ9IHRyYWNrZXJcbiAgICAgKiAgICAgQSByZWZlcmVuY2UgdG8gdGhlIE1vdXNlVHJhY2tlciBpbnN0YW5jZS5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnRcbiAgICAgKiAgICAgQSByZWZlcmVuY2UgdG8gdGhlIG9yaWdpbmF0aW5nIERPTSBldmVudC5cbiAgICAgKiBAcGFyYW0ge0FycmF5LjxPcGVuU2VhZHJhZ29uLk1vdXNlVHJhY2tlci5HZXN0dXJlUG9pbnQ+fSBnUG9pbnRzXG4gICAgICogICAgICBHZXN0dXJlIHBvaW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIGV2ZW50LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVwZGF0ZVBvaW50ZXJzQ2FuY2VsKCB0cmFja2VyLCBldmVudCwgZ1BvaW50cyApIHtcbiAgICAgICAgdXBkYXRlUG9pbnRlcnNVcCggdHJhY2tlciwgZXZlbnQsIGdQb2ludHMsIDAgKTtcbiAgICAgICAgdXBkYXRlUG9pbnRlcnNFeGl0KCB0cmFja2VyLCBldmVudCwgZ1BvaW50cyApO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAaW5uZXJcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBoYW5kbGVQb2ludGVyU3RvcCggdHJhY2tlciwgb3JpZ2luYWxNb3ZlRXZlbnQsIHBvaW50ZXJUeXBlICkge1xuICAgICAgICBpZiAoIHRyYWNrZXIuc3RvcEhhbmRsZXIgKSB7XG4gICAgICAgICAgICB0cmFja2VyLnN0b3BIYW5kbGVyKCB7XG4gICAgICAgICAgICAgICAgZXZlbnRTb3VyY2U6ICAgICAgICAgIHRyYWNrZXIsXG4gICAgICAgICAgICAgICAgcG9pbnRlclR5cGU6ICAgICAgICAgIHBvaW50ZXJUeXBlLFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAgICAgICAgICAgICBnZXRNb3VzZVJlbGF0aXZlKCBvcmlnaW5hbE1vdmVFdmVudCwgdHJhY2tlci5lbGVtZW50ICksXG4gICAgICAgICAgICAgICAgYnV0dG9uczogICAgICAgICAgICAgIHRyYWNrZXIuZ2V0QWN0aXZlUG9pbnRlcnNMaXN0QnlUeXBlKCBwb2ludGVyVHlwZSApLmJ1dHRvbnMsXG4gICAgICAgICAgICAgICAgaXNUb3VjaEV2ZW50OiAgICAgICAgIHBvaW50ZXJUeXBlID09PSAndG91Y2gnLFxuICAgICAgICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6ICAgICAgICBvcmlnaW5hbE1vdmVFdmVudCxcbiAgICAgICAgICAgICAgICBwcmV2ZW50RGVmYXVsdEFjdGlvbjogZmFsc2UsXG4gICAgICAgICAgICAgICAgdXNlckRhdGE6ICAgICAgICAgICAgIHRyYWNrZXIudXNlckRhdGFcbiAgICAgICAgICAgIH0gKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyBUcnVlIGlmIGluc2lkZSBhbiBpZnJhbWUsIG90aGVyd2lzZSBmYWxzZS5cbiAgICAvLyBAbWVtYmVyIHtCb29sZWFufSBpc0luSWZyYW1lXG4gICAgLy8gQHByaXZhdGVcbiAgICAvLyBAaW5uZXJcbiAgICB2YXIgaXNJbklmcmFtZSA9IChmdW5jdGlvbigpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiB3aW5kb3cuc2VsZiAhPT0gd2luZG93LnRvcDtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9KSgpO1xuIFxuICAgIC8vIEBmdW5jdGlvblxuICAgIC8vIEBwcml2YXRlXG4gICAgLy8gQGlubmVyXG4gICAgLy8gQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHRhcmdldCBoYXMgYWNjZXNzIHJpZ2h0cyB0byBldmVudHMsIG90aGVyd2lzZSBmYWxzZS5cbiAgICBmdW5jdGlvbiBjYW5BY2Nlc3NFdmVudHMgKHRhcmdldCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIHRhcmdldC5hZGRFdmVudExpc3RlbmVyICYmIHRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbn0gKCBPcGVuU2VhZHJhZ29uICkgKTtcblxuLypcbiAqIE9wZW5TZWFkcmFnb24gLSBDb250cm9sXG4gKlxuICogQ29weXJpZ2h0IChDKSAyMDA5IENvZGVQbGV4IEZvdW5kYXRpb25cbiAqIENvcHlyaWdodCAoQykgMjAxMC0yMDEzIE9wZW5TZWFkcmFnb24gY29udHJpYnV0b3JzXG4gKlxuICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlXG4gKiBtZXQ6XG4gKlxuICogLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4gKiAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4gKlxuICogLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodFxuICogICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlXG4gKiAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uXG4gKlxuICogLSBOZWl0aGVyIHRoZSBuYW1lIG9mIENvZGVQbGV4IEZvdW5kYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHNcbiAqICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb21cbiAqICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbiAqXG4gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTXG4gKiBcIkFTIElTXCIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UXG4gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1JcbiAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVFxuICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsXG4gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURURcbiAqIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1JcbiAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0ZcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HXG4gKiBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVNcbiAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICovXG5cbihmdW5jdGlvbiggJCApe1xuXG4vKipcbiAqIEFuIGVudW1lcmF0aW9uIG9mIHN1cHBvcnRlZCBsb2NhdGlvbnMgd2hlcmUgY29udHJvbHMgY2FuIGJlIGFuY2hvcmVkLlxuICogVGhlIGFuY2hvcmluZyBpcyBhbHdheXMgcmVsYXRpdmUgdG8gdGhlIGNvbnRhaW5lci5cbiAqIEBtZW1iZXIgQ29udHJvbEFuY2hvclxuICogQG1lbWJlcm9mIE9wZW5TZWFkcmFnb25cbiAqIEBzdGF0aWNcbiAqIEB0eXBlIHtPYmplY3R9XG4gKiBAcHJvcGVydHkge051bWJlcn0gTk9ORVxuICogQHByb3BlcnR5IHtOdW1iZXJ9IFRPUF9MRUZUXG4gKiBAcHJvcGVydHkge051bWJlcn0gVE9QX1JJR0hUXG4gKiBAcHJvcGVydHkge051bWJlcn0gQk9UVE9NX0xFRlRcbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBCT1RUT01fUklHSFRcbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBBQlNPTFVURVxuICovXG4kLkNvbnRyb2xBbmNob3IgPSB7XG4gICAgTk9ORTogMCxcbiAgICBUT1BfTEVGVDogMSxcbiAgICBUT1BfUklHSFQ6IDIsXG4gICAgQk9UVE9NX1JJR0hUOiAzLFxuICAgIEJPVFRPTV9MRUZUOiA0LFxuICAgIEFCU09MVVRFOiA1XG59O1xuXG4vKipcbiAqIEBjbGFzcyBDb250cm9sXG4gKiBAY2xhc3NkZXNjIEEgQ29udHJvbCByZXByZXNlbnRzIGFueSBpbnRlcmZhY2UgZWxlbWVudCB3aGljaCBpcyBtZWFudCB0byBhbGxvdyB0aGUgdXNlclxuICogdG8gaW50ZXJhY3Qgd2l0aCB0aGUgem9vbWFibGUgaW50ZXJmYWNlLiBBbnkgY29udHJvbCBjYW4gYmUgYW5jaG9yZWQgdG8gYW55XG4gKiBlbGVtZW50LlxuICpcbiAqIEBtZW1iZXJvZiBPcGVuU2VhZHJhZ29uXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSB0aGUgY29udHJvbCBlbGVtZW50IHRvIGJlIGFuY2hvcmVkIGluIHRoZSBjb250YWluZXIuXG4gKiBAcGFyYW0ge09iamVjdCB9IG9wdGlvbnMgLSBBbGwgcmVxdWlyZWQgYW5kIG9wdGlvbmFsIHNldHRpbmdzIGZvciBjb25maWd1cmluZyBhIGNvbnRyb2wgZWxlbWVudC5cbiAqIEBwYXJhbSB7T3BlblNlYWRyYWdvbi5Db250cm9sQW5jaG9yfSBbb3B0aW9ucy5hbmNob3I9T3BlblNlYWRyYWdvbi5Db250cm9sQW5jaG9yLk5PTkVdIC0gdGhlIHBvc2l0aW9uIG9mIHRoZSBjb250cm9sXG4gKiAgcmVsYXRpdmUgdG8gdGhlIGNvbnRhaW5lci5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuYXR0YWNoVG9WaWV3ZXI9dHJ1ZV0gLSBXaGV0aGVyIHRoZSBjb250cm9sIHNob3VsZCBiZSBhZGRlZCBkaXJlY3RseSB0byB0aGUgdmlld2VyLCBvclxuICogIGRpcmVjdGx5IHRvIHRoZSBjb250YWluZXJcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuYXV0b0ZhZGU9dHJ1ZV0gLSBXaGV0aGVyIHRoZSBjb250cm9sIHNob3VsZCBoYXZlIHRoZSBhdXRvZmFkZSBiZWhhdmlvclxuICogQHBhcmFtIHtFbGVtZW50fSBjb250YWluZXIgLSB0aGUgZWxlbWVudCB0byBjb250cm9sIHdpbGwgYmUgYW5jaG9yZWQgdG9vLlxuICovXG4kLkNvbnRyb2wgPSBmdW5jdGlvbiAoIGVsZW1lbnQsIG9wdGlvbnMsIGNvbnRhaW5lciApIHtcbiAgICB2YXIgcGFyZW50ID0gZWxlbWVudC5wYXJlbnROb2RlO1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ251bWJlcicpXG4gICAge1xuICAgICAgICAkLmNvbnNvbGUuZXJyb3IoXCJQYXNzaW5nIGFuIGFuY2hvciBkaXJlY3RseSBpbnRvIHRoZSBPcGVuU2VhZHJhZ29uLkNvbnRyb2wgY29uc3RydWN0b3IgaXMgZGVwcmVjYXRlZDsgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJwbGVhc2UgdXNlIGFuIG9wdGlvbnMgb2JqZWN0IGluc3RlYWQuICBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlN1cHBvcnQgZm9yIHRoaXMgZGVwcmVjYXRlZCB2YXJpYW50IGlzIHNjaGVkdWxlZCBmb3IgcmVtb3ZhbCBpbiBEZWNlbWJlciAyMDEzXCIpO1xuICAgICAgICAgb3B0aW9ucyA9IHthbmNob3I6IG9wdGlvbnN9O1xuICAgIH1cbiAgICBvcHRpb25zLmF0dGFjaFRvVmlld2VyID0gKHR5cGVvZiBvcHRpb25zLmF0dGFjaFRvVmlld2VyID09PSAndW5kZWZpbmVkJykgPyB0cnVlIDogb3B0aW9ucy5hdHRhY2hUb1ZpZXdlcjtcbiAgICAvKipcbiAgICAgKiBUcnVlIGlmIHRoZSBjb250cm9sIHNob3VsZCBoYXZlIGF1dG9mYWRlIGJlaGF2aW9yLlxuICAgICAqIEBtZW1iZXIge0Jvb2xlYW59IGF1dG9GYWRlXG4gICAgICogQG1lbWJlcm9mIE9wZW5TZWFkcmFnb24uQ29udHJvbCNcbiAgICAgKi9cbiAgICB0aGlzLmF1dG9GYWRlID0gKHR5cGVvZiBvcHRpb25zLmF1dG9GYWRlID09PSAndW5kZWZpbmVkJykgPyB0cnVlIDogb3B0aW9ucy5hdXRvRmFkZTtcbiAgICAvKipcbiAgICAgKiBUaGUgZWxlbWVudCBwcm92aWRpbmcgdGhlIHVzZXIgaW50ZXJmYWNlIHdpdGggc29tZSB0eXBlIG9mIGNvbnRyb2wgKGUuZy4gYSB6b29tLWluIGJ1dHRvbikuXG4gICAgICogQG1lbWJlciB7RWxlbWVudH0gZWxlbWVudFxuICAgICAqIEBtZW1iZXJvZiBPcGVuU2VhZHJhZ29uLkNvbnRyb2wjXG4gICAgICovXG4gICAgdGhpcy5lbGVtZW50ICAgID0gZWxlbWVudDtcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zaXRpb24gb2YgdGhlIENvbnRyb2wgcmVsYXRpdmUgdG8gaXRzIGNvbnRhaW5lci5cbiAgICAgKiBAbWVtYmVyIHtPcGVuU2VhZHJhZ29uLkNvbnRyb2xBbmNob3J9IGFuY2hvclxuICAgICAqIEBtZW1iZXJvZiBPcGVuU2VhZHJhZ29uLkNvbnRyb2wjXG4gICAgICovXG4gICAgdGhpcy5hbmNob3IgICAgID0gb3B0aW9ucy5hbmNob3I7XG4gICAgLyoqXG4gICAgICogVGhlIENvbnRyb2wncyBjb250YWluaW5nIGVsZW1lbnQuXG4gICAgICogQG1lbWJlciB7RWxlbWVudH0gY29udGFpbmVyXG4gICAgICogQG1lbWJlcm9mIE9wZW5TZWFkcmFnb24uQ29udHJvbCNcbiAgICAgKi9cbiAgICB0aGlzLmNvbnRhaW5lciAgPSBjb250YWluZXI7XG4gICAgLyoqXG4gICAgICogQSBuZXV0cmFsIGVsZW1lbnQgc3Vycm91bmRpbmcgdGhlIGNvbnRyb2wgZWxlbWVudC5cbiAgICAgKiBAbWVtYmVyIHtFbGVtZW50fSB3cmFwcGVyXG4gICAgICogQG1lbWJlcm9mIE9wZW5TZWFkcmFnb24uQ29udHJvbCNcbiAgICAgKi9cbiAgICBpZiAoIHRoaXMuYW5jaG9yID09ICQuQ29udHJvbEFuY2hvci5BQlNPTFVURSApIHtcbiAgICAgICAgdGhpcy53cmFwcGVyICAgID0gJC5tYWtlTmV1dHJhbEVsZW1lbnQoIFwiZGl2XCIgKTtcbiAgICAgICAgdGhpcy53cmFwcGVyLnN0eWxlLnBvc2l0aW9uID0gXCJhYnNvbHV0ZVwiO1xuICAgICAgICB0aGlzLndyYXBwZXIuc3R5bGUudG9wID0gdHlwZW9mICggb3B0aW9ucy50b3AgKSAgPT0gXCJudW1iZXJcIiA/ICggb3B0aW9ucy50b3AgKyAncHgnICkgOiBvcHRpb25zLnRvcDtcbiAgICAgICAgdGhpcy53cmFwcGVyLnN0eWxlLmxlZnQgID0gdHlwZW9mICggb3B0aW9ucy5sZWZ0ICkgID09IFwibnVtYmVyXCIgPyAgKG9wdGlvbnMubGVmdCArICdweCcgKSA6IG9wdGlvbnMubGVmdDtcbiAgICAgICAgdGhpcy53cmFwcGVyLnN0eWxlLmhlaWdodCA9IHR5cGVvZiAoIG9wdGlvbnMuaGVpZ2h0ICkgID09IFwibnVtYmVyXCIgPyAoIG9wdGlvbnMuaGVpZ2h0ICsgJ3B4JyApIDogb3B0aW9ucy5oZWlnaHQ7XG4gICAgICAgIHRoaXMud3JhcHBlci5zdHlsZS53aWR0aCAgPSB0eXBlb2YgKCBvcHRpb25zLndpZHRoICkgID09IFwibnVtYmVyXCIgPyAoIG9wdGlvbnMud2lkdGggKyAncHgnICkgOiBvcHRpb25zLndpZHRoO1xuICAgICAgICB0aGlzLndyYXBwZXIuc3R5bGUubWFyZ2luID0gXCIwcHhcIjtcbiAgICAgICAgdGhpcy53cmFwcGVyLnN0eWxlLnBhZGRpbmcgPSBcIjBweFwiO1xuXG4gICAgICAgIHRoaXMuZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9IFwicmVsYXRpdmVcIjtcbiAgICAgICAgdGhpcy5lbGVtZW50LnN0eWxlLnRvcCA9IFwiMHB4XCI7XG4gICAgICAgIHRoaXMuZWxlbWVudC5zdHlsZS5sZWZ0ID0gXCIwcHhcIjtcbiAgICAgICAgdGhpcy5lbGVtZW50LnN0eWxlLmhlaWdodCA9IFwiMTAwJVwiO1xuICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUud2lkdGggPSBcIjEwMCVcIjtcbiAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLndyYXBwZXIgICAgPSAkLm1ha2VOZXV0cmFsRWxlbWVudCggXCJkaXZcIiApO1xuICAgICAgICB0aGlzLndyYXBwZXIuc3R5bGUuZGlzcGxheSA9IFwiaW5saW5lLWJsb2NrXCI7XG4gICAgICAgIGlmICggdGhpcy5hbmNob3IgPT0gJC5Db250cm9sQW5jaG9yLk5PTkUgKSB7XG4gICAgICAgICAgICAvLyBJRTYgZml4XG4gICAgICAgICAgICB0aGlzLndyYXBwZXIuc3R5bGUud2lkdGggPSB0aGlzLndyYXBwZXIuc3R5bGUuaGVpZ2h0ID0gXCIxMDAlXCI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdGhpcy53cmFwcGVyLmFwcGVuZENoaWxkKCB0aGlzLmVsZW1lbnQgKTtcblxuICAgIGlmIChvcHRpb25zLmF0dGFjaFRvVmlld2VyICkge1xuICAgICAgICBpZiAoIHRoaXMuYW5jaG9yID09ICQuQ29udHJvbEFuY2hvci5UT1BfUklHSFQgfHxcbiAgICAgICAgICAgICB0aGlzLmFuY2hvciA9PSAkLkNvbnRyb2xBbmNob3IuQk9UVE9NX1JJR0hUICkge1xuICAgICAgICAgICAgdGhpcy5jb250YWluZXIuaW5zZXJ0QmVmb3JlKFxuICAgICAgICAgICAgICAgIHRoaXMud3JhcHBlcixcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5maXJzdENoaWxkXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQoIHRoaXMud3JhcHBlciApO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcGFyZW50LmFwcGVuZENoaWxkKCB0aGlzLndyYXBwZXIgKTtcbiAgICB9XG59O1xuXG4vKiogQGxlbmRzIE9wZW5TZWFkcmFnb24uQ29udHJvbC5wcm90b3R5cGUgKi9cbiQuQ29udHJvbC5wcm90b3R5cGUgPSB7XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRoZSBjb250cm9sIGZyb20gdGhlIGNvbnRhaW5lci5cbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKi9cbiAgICBkZXN0cm95OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy53cmFwcGVyLnJlbW92ZUNoaWxkKCB0aGlzLmVsZW1lbnQgKTtcbiAgICAgICAgdGhpcy5jb250YWluZXIucmVtb3ZlQ2hpbGQoIHRoaXMud3JhcHBlciApO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBEZXRlcm1pbmVzIGlmIHRoZSBjb250cm9sIGlzIGN1cnJlbnRseSB2aXNpYmxlLlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59IHRydWUgaWYgY3VycmVubHkgdmlzaWJsZSwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIGlzVmlzaWJsZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLndyYXBwZXIuc3R5bGUuZGlzcGxheSAhPSBcIm5vbmVcIjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogVG9nZ2xlcyB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgY29udHJvbC5cbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IHZpc2libGUgLSB0cnVlIHRvIG1ha2UgdmlzaWJsZSwgZmFsc2UgdG8gaGlkZS5cbiAgICAgKi9cbiAgICBzZXRWaXNpYmxlOiBmdW5jdGlvbiggdmlzaWJsZSApIHtcbiAgICAgICAgdGhpcy53cmFwcGVyLnN0eWxlLmRpc3BsYXkgPSB2aXNpYmxlID9cbiAgICAgICAgICAgICggdGhpcy5hbmNob3IgPT0gJC5Db250cm9sQW5jaG9yLkFCU09MVVRFID8gJ2Jsb2NrJyA6ICdpbmxpbmUtYmxvY2snICkgOlxuICAgICAgICAgICAgXCJub25lXCI7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIG9wYWNpdHkgbGV2ZWwgZm9yIHRoZSBjb250cm9sLlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBvcGFjdGl5IC0gYSB2YWx1ZSBiZXR3ZWVuIDEgYW5kIDAgaW5jbHVzaXZlbHkuXG4gICAgICovXG4gICAgc2V0T3BhY2l0eTogZnVuY3Rpb24oIG9wYWNpdHkgKSB7XG4gICAgICAgIGlmICggdGhpcy5lbGVtZW50WyAkLlNJR05BTCBdICYmICQuQnJvd3Nlci52ZW5kb3IgPT0gJC5CUk9XU0VSUy5JRSApIHtcbiAgICAgICAgICAgICQuc2V0RWxlbWVudE9wYWNpdHkoIHRoaXMuZWxlbWVudCwgb3BhY2l0eSwgdHJ1ZSApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgJC5zZXRFbGVtZW50T3BhY2l0eSggdGhpcy53cmFwcGVyLCBvcGFjaXR5LCB0cnVlICk7XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG59KCBPcGVuU2VhZHJhZ29uICkpO1xuXG4vKlxuICogT3BlblNlYWRyYWdvbiAtIENvbnRyb2xEb2NrXG4gKlxuICogQ29weXJpZ2h0IChDKSAyMDA5IENvZGVQbGV4IEZvdW5kYXRpb25cbiAqIENvcHlyaWdodCAoQykgMjAxMC0yMDEzIE9wZW5TZWFkcmFnb24gY29udHJpYnV0b3JzXG4gKlxuICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlXG4gKiBtZXQ6XG4gKlxuICogLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4gKiAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4gKlxuICogLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodFxuICogICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlXG4gKiAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uXG4gKlxuICogLSBOZWl0aGVyIHRoZSBuYW1lIG9mIENvZGVQbGV4IEZvdW5kYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHNcbiAqICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb21cbiAqICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbiAqXG4gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTXG4gKiBcIkFTIElTXCIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UXG4gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1JcbiAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVFxuICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsXG4gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURURcbiAqIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1JcbiAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0ZcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HXG4gKiBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVNcbiAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICovXG5cbihmdW5jdGlvbiggJCApe1xuICAgIC8qKlxuICAgICAqIEBjbGFzcyBDb250cm9sRG9ja1xuICAgICAqIEBjbGFzc2Rlc2MgUHJvdmlkZXMgYSBjb250YWluZXIgZWxlbWVudCAoYSAmbHQ7Zm9ybSZndDsgZWxlbWVudCkgd2l0aCBzdXBwb3J0IGZvciB0aGUgbGF5b3V0IG9mIGNvbnRyb2wgZWxlbWVudHMuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgT3BlblNlYWRyYWdvblxuICAgICAqL1xuICAgICQuQ29udHJvbERvY2sgPSBmdW5jdGlvbiggb3B0aW9ucyApe1xuICAgICAgICB2YXIgbGF5b3V0cyA9IFsgJ3RvcGxlZnQnLCAndG9wcmlnaHQnLCAnYm90dG9tcmlnaHQnLCAnYm90dG9tbGVmdCddLFxuICAgICAgICAgICAgbGF5b3V0LFxuICAgICAgICAgICAgaTtcblxuICAgICAgICAkLmV4dGVuZCggdHJ1ZSwgdGhpcywge1xuICAgICAgICAgICAgaWQ6ICdjb250cm9sZG9jay0nKyQubm93KCkrJy0nK01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSoxMDAwMDAwKSxcbiAgICAgICAgICAgIGNvbnRhaW5lcjogJC5tYWtlTmV1dHJhbEVsZW1lbnQoICdkaXYnICksXG4gICAgICAgICAgICBjb250cm9sczogW11cbiAgICAgICAgfSwgb3B0aW9ucyApO1xuXG4gICAgICAgIC8vIERpc2FibGUgdGhlIGZvcm0ncyBzdWJtaXQ7IG90aGVyd2lzZSBidXR0b24gY2xpY2tzIGFuZCByZXR1cm4ga2V5c1xuICAgICAgICAvLyBjYW4gdHJpZ2dlciBpdC5cbiAgICAgICAgdGhpcy5jb250YWluZXIub25zdWJtaXQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfTtcblxuICAgICAgICBpZiggdGhpcy5lbGVtZW50ICl7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQgPSAkLmdldEVsZW1lbnQoIHRoaXMuZWxlbWVudCApO1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKCB0aGlzLmNvbnRhaW5lciApO1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJztcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLnN0eWxlLndpZHRoID0gJzEwMCUnO1xuICAgICAgICAgICAgdGhpcy5jb250YWluZXIuc3R5bGUuaGVpZ2h0ID0gJzEwMCUnO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yKCBpID0gMDsgaSA8IGxheW91dHMubGVuZ3RoOyBpKysgKXtcbiAgICAgICAgICAgIGxheW91dCA9IGxheW91dHNbIGkgXTtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbHNbIGxheW91dCBdID0gJC5tYWtlTmV1dHJhbEVsZW1lbnQoIFwiZGl2XCIgKTtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbHNbIGxheW91dCBdLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICAgICAgICAgIGlmICggbGF5b3V0Lm1hdGNoKCAnbGVmdCcgKSApe1xuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbHNbIGxheW91dCBdLnN0eWxlLmxlZnQgPSAnMHB4JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICggbGF5b3V0Lm1hdGNoKCAncmlnaHQnICkgKXtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xzWyBsYXlvdXQgXS5zdHlsZS5yaWdodCA9ICcwcHgnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCBsYXlvdXQubWF0Y2goICd0b3AnICkgKXtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xzWyBsYXlvdXQgXS5zdHlsZS50b3AgPSAnMHB4JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICggbGF5b3V0Lm1hdGNoKCAnYm90dG9tJyApICl7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sc1sgbGF5b3V0IF0uc3R5bGUuYm90dG9tID0gJzBweCc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZCggdGhpcy5jb250cm9scy50b3BsZWZ0ICk7XG4gICAgICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKCB0aGlzLmNvbnRyb2xzLnRvcHJpZ2h0ICk7XG4gICAgICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKCB0aGlzLmNvbnRyb2xzLmJvdHRvbXJpZ2h0ICk7XG4gICAgICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKCB0aGlzLmNvbnRyb2xzLmJvdHRvbWxlZnQgKTtcbiAgICB9O1xuXG4gICAgLyoqIEBsZW5kcyBPcGVuU2VhZHJhZ29uLkNvbnRyb2xEb2NrLnByb3RvdHlwZSAqL1xuICAgICQuQ29udHJvbERvY2sucHJvdG90eXBlID0ge1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAZnVuY3Rpb25cbiAgICAgICAgICovXG4gICAgICAgIGFkZENvbnRyb2w6IGZ1bmN0aW9uICggZWxlbWVudCwgY29udHJvbE9wdGlvbnMgKSB7XG4gICAgICAgICAgICBlbGVtZW50ID0gJC5nZXRFbGVtZW50KCBlbGVtZW50ICk7XG4gICAgICAgICAgICB2YXIgZGl2ID0gbnVsbDtcblxuICAgICAgICAgICAgaWYgKCBnZXRDb250cm9sSW5kZXgoIHRoaXMsIGVsZW1lbnQgKSA+PSAwICkge1xuICAgICAgICAgICAgICAgIHJldHVybjsgICAgIC8vIHRoZXkncmUgdHJ5aW5nIHRvIGFkZCBhIGR1cGxpY2F0ZSBjb250cm9sXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHN3aXRjaCAoIGNvbnRyb2xPcHRpb25zLmFuY2hvciApIHtcbiAgICAgICAgICAgICAgICBjYXNlICQuQ29udHJvbEFuY2hvci5UT1BfUklHSFQ6XG4gICAgICAgICAgICAgICAgICAgIGRpdiA9IHRoaXMuY29udHJvbHMudG9wcmlnaHQ7XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSBcInJlbGF0aXZlXCI7XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUucGFkZGluZ1JpZ2h0ID0gXCIwcHhcIjtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5wYWRkaW5nVG9wID0gXCIwcHhcIjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAkLkNvbnRyb2xBbmNob3IuQk9UVE9NX1JJR0hUOlxuICAgICAgICAgICAgICAgICAgICBkaXYgPSB0aGlzLmNvbnRyb2xzLmJvdHRvbXJpZ2h0O1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gXCJyZWxhdGl2ZVwiO1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LnN0eWxlLnBhZGRpbmdSaWdodCA9IFwiMHB4XCI7XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUucGFkZGluZ0JvdHRvbSA9IFwiMHB4XCI7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJC5Db250cm9sQW5jaG9yLkJPVFRPTV9MRUZUOlxuICAgICAgICAgICAgICAgICAgICBkaXYgPSB0aGlzLmNvbnRyb2xzLmJvdHRvbWxlZnQ7XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSBcInJlbGF0aXZlXCI7XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUucGFkZGluZ0xlZnQgPSBcIjBweFwiO1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LnN0eWxlLnBhZGRpbmdCb3R0b20gPSBcIjBweFwiO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICQuQ29udHJvbEFuY2hvci5UT1BfTEVGVDpcbiAgICAgICAgICAgICAgICAgICAgZGl2ID0gdGhpcy5jb250cm9scy50b3BsZWZ0O1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gXCJyZWxhdGl2ZVwiO1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LnN0eWxlLnBhZGRpbmdMZWZ0ID0gXCIwcHhcIjtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5wYWRkaW5nVG9wID0gXCIwcHhcIjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAkLkNvbnRyb2xBbmNob3IuQUJTT0xVVEU6XG4gICAgICAgICAgICAgICAgICAgIGRpdiA9IHRoaXMuY29udGFpbmVyO1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LnN0eWxlLm1hcmdpbiA9IFwiMHB4XCI7XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUucGFkZGluZyA9IFwiMHB4XCI7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgY2FzZSAkLkNvbnRyb2xBbmNob3IuTk9ORTpcbiAgICAgICAgICAgICAgICAgICAgZGl2ID0gdGhpcy5jb250YWluZXI7XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUubWFyZ2luID0gXCIwcHhcIjtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5wYWRkaW5nID0gXCIwcHhcIjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuY29udHJvbHMucHVzaChcbiAgICAgICAgICAgICAgICBuZXcgJC5Db250cm9sKCBlbGVtZW50LCBjb250cm9sT3B0aW9ucywgZGl2IClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLmRpc3BsYXkgPSBcImlubGluZS1ibG9ja1wiO1xuICAgICAgICB9LFxuXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBmdW5jdGlvblxuICAgICAgICAgKiBAcmV0dXJuIHtPcGVuU2VhZHJhZ29uLkNvbnRyb2xEb2NrfSBDaGFpbmFibGUuXG4gICAgICAgICAqL1xuICAgICAgICByZW1vdmVDb250cm9sOiBmdW5jdGlvbiAoIGVsZW1lbnQgKSB7XG4gICAgICAgICAgICBlbGVtZW50ID0gJC5nZXRFbGVtZW50KCBlbGVtZW50ICk7XG4gICAgICAgICAgICB2YXIgaSA9IGdldENvbnRyb2xJbmRleCggdGhpcywgZWxlbWVudCApO1xuXG4gICAgICAgICAgICBpZiAoIGkgPj0gMCApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xzWyBpIF0uZGVzdHJveSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbHMuc3BsaWNlKCBpLCAxICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAZnVuY3Rpb25cbiAgICAgICAgICogQHJldHVybiB7T3BlblNlYWRyYWdvbi5Db250cm9sRG9ja30gQ2hhaW5hYmxlLlxuICAgICAgICAgKi9cbiAgICAgICAgY2xlYXJDb250cm9sczogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgd2hpbGUgKCB0aGlzLmNvbnRyb2xzLmxlbmd0aCA+IDAgKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9scy5wb3AoKS5kZXN0cm95KCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9LFxuXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBmdW5jdGlvblxuICAgICAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAgICAgKi9cbiAgICAgICAgYXJlQ29udHJvbHNFbmFibGVkOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgaTtcblxuICAgICAgICAgICAgZm9yICggaSA9IHRoaXMuY29udHJvbHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0gKSB7XG4gICAgICAgICAgICAgICAgaWYgKCB0aGlzLmNvbnRyb2xzWyBpIF0uaXNWaXNpYmxlKCkgKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9LFxuXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBmdW5jdGlvblxuICAgICAgICAgKiBAcmV0dXJuIHtPcGVuU2VhZHJhZ29uLkNvbnRyb2xEb2NrfSBDaGFpbmFibGUuXG4gICAgICAgICAqL1xuICAgICAgICBzZXRDb250cm9sc0VuYWJsZWQ6IGZ1bmN0aW9uKCBlbmFibGVkICkge1xuICAgICAgICAgICAgdmFyIGk7XG5cbiAgICAgICAgICAgIGZvciAoIGkgPSB0aGlzLmNvbnRyb2xzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tICkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbHNbIGkgXS5zZXRWaXNpYmxlKCBlbmFibGVkICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG5cbiAgICB9O1xuXG5cbiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgLy8gVXRpbGl0eSBtZXRob2RzXG4gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAgIGZ1bmN0aW9uIGdldENvbnRyb2xJbmRleCggZG9jaywgZWxlbWVudCApIHtcbiAgICAgICAgdmFyIGNvbnRyb2xzID0gZG9jay5jb250cm9scyxcbiAgICAgICAgICAgIGk7XG5cbiAgICAgICAgZm9yICggaSA9IGNvbnRyb2xzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tICkge1xuICAgICAgICAgICAgaWYgKCBjb250cm9sc1sgaSBdLmVsZW1lbnQgPT0gZWxlbWVudCApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAtMTtcbiAgICB9XG5cbn0oIE9wZW5TZWFkcmFnb24gKSk7XG5cbi8qXG4gKiBPcGVuU2VhZHJhZ29uIC0gUGxhY2VtZW50XG4gKlxuICogQ29weXJpZ2h0IChDKSAyMDEwLTIwMTYgT3BlblNlYWRyYWdvbiBjb250cmlidXRvcnNcbiAqXG4gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmVcbiAqIG1ldDpcbiAqXG4gKiAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiAqICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAqXG4gKiAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0XG4gKiAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGVcbiAqICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cbiAqXG4gKiAtIE5laXRoZXIgdGhlIG5hbWUgb2YgQ29kZVBsZXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0c1xuICogICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbVxuICogICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuICpcbiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlNcbiAqIFwiQVMgSVNcIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1RcbiAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUlxuICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUXG4gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCxcbiAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRFxuICogVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUlxuICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkdcbiAqIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJU1xuICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4gKi9cblxuKGZ1bmN0aW9uKCQpIHtcblxuICAgIC8qKlxuICAgICAqIEFuIGVudW1lcmF0aW9uIG9mIHBvc2l0aW9ucyB0byBhbmNob3IgYW4gZWxlbWVudC5cbiAgICAgKiBAbWVtYmVyIFBsYWNlbWVudFxuICAgICAqIEBtZW1iZXJPZiBPcGVuU2VhZHJhZ29uXG4gICAgICogQHN0YXRpY1xuICAgICAqIEByZWFkb25seVxuICAgICAqIEBwcm9wZXJ0eSB7T3BlblNlYWRyYWdvbi5QbGFjZW1lbnR9IENFTlRFUlxuICAgICAqIEBwcm9wZXJ0eSB7T3BlblNlYWRyYWdvbi5QbGFjZW1lbnR9IFRPUF9MRUZUXG4gICAgICogQHByb3BlcnR5IHtPcGVuU2VhZHJhZ29uLlBsYWNlbWVudH0gVE9QXG4gICAgICogQHByb3BlcnR5IHtPcGVuU2VhZHJhZ29uLlBsYWNlbWVudH0gVE9QX1JJR0hUXG4gICAgICogQHByb3BlcnR5IHtPcGVuU2VhZHJhZ29uLlBsYWNlbWVudH0gUklHSFRcbiAgICAgKiBAcHJvcGVydHkge09wZW5TZWFkcmFnb24uUGxhY2VtZW50fSBCT1RUT01fUklHSFRcbiAgICAgKiBAcHJvcGVydHkge09wZW5TZWFkcmFnb24uUGxhY2VtZW50fSBCT1RUT01cbiAgICAgKiBAcHJvcGVydHkge09wZW5TZWFkcmFnb24uUGxhY2VtZW50fSBCT1RUT01fTEVGVFxuICAgICAqIEBwcm9wZXJ0eSB7T3BlblNlYWRyYWdvbi5QbGFjZW1lbnR9IExFRlRcbiAgICAgKi9cbiAgICAkLlBsYWNlbWVudCA9ICQuZnJlZXplT2JqZWN0KHtcbiAgICAgICAgQ0VOVEVSOiAgICAgICAwLFxuICAgICAgICBUT1BfTEVGVDogICAgIDEsXG4gICAgICAgIFRPUDogICAgICAgICAgMixcbiAgICAgICAgVE9QX1JJR0hUOiAgICAzLFxuICAgICAgICBSSUdIVDogICAgICAgIDQsXG4gICAgICAgIEJPVFRPTV9SSUdIVDogNSxcbiAgICAgICAgQk9UVE9NOiAgICAgICA2LFxuICAgICAgICBCT1RUT01fTEVGVDogIDcsXG4gICAgICAgIExFRlQ6ICAgICAgICAgOCxcbiAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgICAgMDoge1xuICAgICAgICAgICAgICAgIGlzTGVmdDogZmFsc2UsXG4gICAgICAgICAgICAgICAgaXNIb3Jpem9udGFsbHlDZW50ZXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBpc1JpZ2h0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICBpc1RvcDogZmFsc2UsXG4gICAgICAgICAgICAgICAgaXNWZXJ0aWNhbGx5Q2VudGVyZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgaXNCb3R0b206IGZhbHNlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgMToge1xuICAgICAgICAgICAgICAgIGlzTGVmdDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBpc0hvcml6b250YWxseUNlbnRlcmVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBpc1JpZ2h0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICBpc1RvcDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBpc1ZlcnRpY2FsbHlDZW50ZXJlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgaXNCb3R0b206IGZhbHNlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgMjoge1xuICAgICAgICAgICAgICAgIGlzTGVmdDogZmFsc2UsXG4gICAgICAgICAgICAgICAgaXNIb3Jpem9udGFsbHlDZW50ZXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBpc1JpZ2h0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICBpc1RvcDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBpc1ZlcnRpY2FsbHlDZW50ZXJlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgaXNCb3R0b206IGZhbHNlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgMzoge1xuICAgICAgICAgICAgICAgIGlzTGVmdDogZmFsc2UsXG4gICAgICAgICAgICAgICAgaXNIb3Jpem9udGFsbHlDZW50ZXJlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgaXNSaWdodDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBpc1RvcDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBpc1ZlcnRpY2FsbHlDZW50ZXJlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgaXNCb3R0b206IGZhbHNlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgNDoge1xuICAgICAgICAgICAgICAgIGlzTGVmdDogZmFsc2UsXG4gICAgICAgICAgICAgICAgaXNIb3Jpem9udGFsbHlDZW50ZXJlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgaXNSaWdodDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBpc1RvcDogZmFsc2UsXG4gICAgICAgICAgICAgICAgaXNWZXJ0aWNhbGx5Q2VudGVyZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgaXNCb3R0b206IGZhbHNlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgNToge1xuICAgICAgICAgICAgICAgIGlzTGVmdDogZmFsc2UsXG4gICAgICAgICAgICAgICAgaXNIb3Jpem9udGFsbHlDZW50ZXJlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgaXNSaWdodDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBpc1RvcDogZmFsc2UsXG4gICAgICAgICAgICAgICAgaXNWZXJ0aWNhbGx5Q2VudGVyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGlzQm90dG9tOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgNjoge1xuICAgICAgICAgICAgICAgIGlzTGVmdDogZmFsc2UsXG4gICAgICAgICAgICAgICAgaXNIb3Jpem9udGFsbHlDZW50ZXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBpc1JpZ2h0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICBpc1RvcDogZmFsc2UsXG4gICAgICAgICAgICAgICAgaXNWZXJ0aWNhbGx5Q2VudGVyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGlzQm90dG9tOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgNzoge1xuICAgICAgICAgICAgICAgIGlzTGVmdDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBpc0hvcml6b250YWxseUNlbnRlcmVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBpc1JpZ2h0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICBpc1RvcDogZmFsc2UsXG4gICAgICAgICAgICAgICAgaXNWZXJ0aWNhbGx5Q2VudGVyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGlzQm90dG9tOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgODoge1xuICAgICAgICAgICAgICAgIGlzTGVmdDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBpc0hvcml6b250YWxseUNlbnRlcmVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBpc1JpZ2h0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICBpc1RvcDogZmFsc2UsXG4gICAgICAgICAgICAgICAgaXNWZXJ0aWNhbGx5Q2VudGVyZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgaXNCb3R0b206IGZhbHNlXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcblxufShPcGVuU2VhZHJhZ29uKSk7XG5cbi8qXG4gKiBPcGVuU2VhZHJhZ29uIC0gVmlld2VyXG4gKlxuICogQ29weXJpZ2h0IChDKSAyMDA5IENvZGVQbGV4IEZvdW5kYXRpb25cbiAqIENvcHlyaWdodCAoQykgMjAxMC0yMDEzIE9wZW5TZWFkcmFnb24gY29udHJpYnV0b3JzXG4gKlxuICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlXG4gKiBtZXQ6XG4gKlxuICogLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4gKiAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4gKlxuICogLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodFxuICogICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlXG4gKiAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uXG4gKlxuICogLSBOZWl0aGVyIHRoZSBuYW1lIG9mIENvZGVQbGV4IEZvdW5kYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHNcbiAqICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb21cbiAqICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbiAqXG4gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTXG4gKiBcIkFTIElTXCIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UXG4gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1JcbiAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVFxuICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsXG4gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURURcbiAqIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1JcbiAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0ZcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HXG4gKiBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVNcbiAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICovXG5cbihmdW5jdGlvbiggJCApe1xuXG4vLyBkaWN0aW9uYXJ5IGZyb20gaGFzaCB0byBwcml2YXRlIHByb3BlcnRpZXNcbnZhciBUSElTID0ge307XG52YXIgbmV4dEhhc2ggPSAxO1xuXG4vKipcbiAqXG4gKiBUaGUgbWFpbiBwb2ludCBvZiBlbnRyeSBpbnRvIGNyZWF0aW5nIGEgem9vbWFibGUgaW1hZ2Ugb24gdGhlIHBhZ2UuPGJyPlxuICogPGJyPlxuICogV2UgaGF2ZSBwcm92aWRlZCBhbiBpZGlvbWF0aWMgamF2YXNjcmlwdCBjb25zdHJ1Y3RvciB3aGljaCB0YWtlc1xuICogYSBzaW5nbGUgb2JqZWN0LCBidXQgc3RpbGwgc3VwcG9ydCB0aGUgbGVnYWN5IHBvc2l0aW9uYWwgYXJndW1lbnRzLjxicj5cbiAqIDxicj5cbiAqIFRoZSBvcHRpb25zIGJlbG93IGFyZSBnaXZlbiBpbiBvcmRlciB0aGF0IHRoZXkgYXBwZWFyZWQgaW4gdGhlIGNvbnN0cnVjdG9yXG4gKiBhcyBhcmd1bWVudHMgYW5kIHdlIHRyYW5zbGF0ZSBhIHBvc2l0aW9uYWwgY2FsbCBpbnRvIGFuIGlkaW9tYXRpYyBjYWxsLjxicj5cbiAqIDxicj5cbiAqIFRvIGNyZWF0ZSBhIHZpZXdlciwgeW91IGNhbiB1c2UgZWl0aGVyIG9mIHRoaXMgbWV0aG9kczo8YnI+XG4gKiA8dWw+XG4gKiA8bGk+PGNvZGU+dmFyIHZpZXdlciA9IG5ldyBPcGVuU2VhZHJhZ29uLlZpZXdlcihvcHRpb25zKTs8L2NvZGU+PC9saT5cbiAqIDxsaT48Y29kZT52YXIgdmlld2VyID0gT3BlblNlYWRyYWdvbihvcHRpb25zKTs8L2NvZGU+PC9saT5cbiAqIDwvdWw+XG4gKiBAY2xhc3MgVmlld2VyXG4gKiBAY2xhc3NkZXNjIFRoZSBtYWluIE9wZW5TZWFkcmFnb24gdmlld2VyIGNsYXNzLlxuICpcbiAqIEBtZW1iZXJvZiBPcGVuU2VhZHJhZ29uXG4gKiBAZXh0ZW5kcyBPcGVuU2VhZHJhZ29uLkV2ZW50U291cmNlXG4gKiBAZXh0ZW5kcyBPcGVuU2VhZHJhZ29uLkNvbnRyb2xEb2NrXG4gKiBAcGFyYW0ge09wZW5TZWFkcmFnb24uT3B0aW9uc30gb3B0aW9ucyAtIFZpZXdlciBvcHRpb25zLlxuICpcbiAqKi9cbiQuVmlld2VyID0gZnVuY3Rpb24oIG9wdGlvbnMgKSB7XG5cbiAgICB2YXIgYXJncyAgPSBhcmd1bWVudHMsXG4gICAgICAgIF90aGlzID0gdGhpcyxcbiAgICAgICAgaTtcblxuXG4gICAgLy9iYWNrd2FyZCBjb21wYXRpYmlsaXR5IGZvciBwb3NpdGlvbmFsIGFyZ3Mgd2hpbGUgcHJlZmVyaW5nIG1vcmVcbiAgICAvL2lkaW9tYXRpYyBqYXZhc2NyaXB0IG9wdGlvbnMgb2JqZWN0IGFzIHRoZSBvbmx5IGFyZ3VtZW50XG4gICAgaWYoICEkLmlzUGxhaW5PYmplY3QoIG9wdGlvbnMgKSApe1xuICAgICAgICBvcHRpb25zID0ge1xuICAgICAgICAgICAgaWQ6ICAgICAgICAgICAgICAgICBhcmdzWyAwIF0sXG4gICAgICAgICAgICB4bWxQYXRoOiAgICAgICAgICAgIGFyZ3MubGVuZ3RoID4gMSA/IGFyZ3NbIDEgXSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHByZWZpeFVybDogICAgICAgICAgYXJncy5sZW5ndGggPiAyID8gYXJnc1sgMiBdIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgY29udHJvbHM6ICAgICAgICAgICBhcmdzLmxlbmd0aCA+IDMgPyBhcmdzWyAzIF0gOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBvdmVybGF5czogICAgICAgICAgIGFyZ3MubGVuZ3RoID4gNCA/IGFyZ3NbIDQgXSA6IHVuZGVmaW5lZFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8vb3B0aW9ucy5jb25maWcgYW5kIHRoZSBnZW5lcmFsIGNvbmZpZyBhcmd1bWVudCBhcmUgZGVwcmVjYXRlZFxuICAgIC8vaW4gZmF2b3Igb2YgdGhlIG1vcmUgZGlyZWN0IHNwZWNpZmljYXRpb24gb2Ygb3B0aW9uYWwgc2V0dGluZ3NcbiAgICAvL2JlaW5nIHBhc3MgZGlyZWN0bHkgb24gdGhlIG9wdGlvbnMgb2JqZWN0XG4gICAgaWYgKCBvcHRpb25zLmNvbmZpZyApe1xuICAgICAgICAkLmV4dGVuZCggdHJ1ZSwgb3B0aW9ucywgb3B0aW9ucy5jb25maWcgKTtcbiAgICAgICAgZGVsZXRlIG9wdGlvbnMuY29uZmlnO1xuICAgIH1cblxuICAgIC8vUHVibGljIHByb3BlcnRpZXNcbiAgICAvL0FsbG93IHRoZSBvcHRpb25zIG9iamVjdCB0byBvdmVycmlkZSBnbG9iYWwgZGVmYXVsdHNcbiAgICAkLmV4dGVuZCggdHJ1ZSwgdGhpcywge1xuXG4gICAgICAgIC8vaW50ZXJuYWwgc3RhdGUgYW5kIGRvbSBpZGVudGlmaWVyc1xuICAgICAgICBpZDogICAgICAgICAgICAgb3B0aW9ucy5pZCxcbiAgICAgICAgaGFzaDogICAgICAgICAgIG9wdGlvbnMuaGFzaCB8fCBuZXh0SGFzaCsrLFxuXG4gICAgICAgIC8vZG9tIG5vZGVzXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgcGFyZW50IGVsZW1lbnQgb2YgdGhpcyBWaWV3ZXIgaW5zdGFuY2UsIHBhc3NlZCBpbiB3aGVuIHRoZSBWaWV3ZXIgd2FzIGNyZWF0ZWQuXG4gICAgICAgICAqIEBtZW1iZXIge0VsZW1lbnR9IGVsZW1lbnRcbiAgICAgICAgICogQG1lbWJlcm9mIE9wZW5TZWFkcmFnb24uVmlld2VyI1xuICAgICAgICAgKi9cbiAgICAgICAgZWxlbWVudDogICAgICAgIG51bGwsXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBICZsdDtkaXYmZ3Q7IGVsZW1lbnQgKHByb3ZpZGVkIGJ5IHtAbGluayBPcGVuU2VhZHJhZ29uLkNvbnRyb2xEb2NrfSksIHRoZSBiYXNlIGVsZW1lbnQgb2YgdGhpcyBWaWV3ZXIgaW5zdGFuY2UuPGJyPjxicj5cbiAgICAgICAgICogQ2hpbGQgZWxlbWVudCBvZiB7QGxpbmsgT3BlblNlYWRyYWdvbi5WaWV3ZXIjZWxlbWVudH0uXG4gICAgICAgICAqIEBtZW1iZXIge0VsZW1lbnR9IGNvbnRhaW5lclxuICAgICAgICAgKiBAbWVtYmVyb2YgT3BlblNlYWRyYWdvbi5WaWV3ZXIjXG4gICAgICAgICAqL1xuICAgICAgICBjb250YWluZXI6ICAgICAgbnVsbCxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgJmx0O2RpdiZndDsgZWxlbWVudCwgdGhlIGVsZW1lbnQgd2hlcmUgdXNlci1pbnB1dCBldmVudHMgYXJlIGhhbmRsZWQgZm9yIHBhbm5pbmcgYW5kIHpvb21pbmcuPGJyPjxicj5cbiAgICAgICAgICogQ2hpbGQgZWxlbWVudCBvZiB7QGxpbmsgT3BlblNlYWRyYWdvbi5WaWV3ZXIjY29udGFpbmVyfSxcbiAgICAgICAgICogcG9zaXRpb25lZCBvbiB0b3Agb2Yge0BsaW5rIE9wZW5TZWFkcmFnb24uVmlld2VyI2tleWJvYXJkQ29tbWFuZEFyZWF9Ljxicj48YnI+XG4gICAgICAgICAqIFRoZSBwYXJlbnQgb2Yge0BsaW5rIE9wZW5TZWFkcmFnb24uRHJhd2VyI2NhbnZhc30gaW5zdGFuY2VzLlxuICAgICAgICAgKiBAbWVtYmVyIHtFbGVtZW50fSBjYW52YXNcbiAgICAgICAgICogQG1lbWJlcm9mIE9wZW5TZWFkcmFnb24uVmlld2VyI1xuICAgICAgICAgKi9cbiAgICAgICAgY2FudmFzOiAgICAgICAgIG51bGwsXG5cbiAgICAgICAgLy8gT3ZlcmxheXMgbGlzdC4gQW4gb3ZlcmxheSBhbGxvd3MgdG8gYWRkIGh0bWwgb24gdG9wIG9mIHRoZSB2aWV3ZXIuXG4gICAgICAgIG92ZXJsYXlzOiAgICAgICAgICAgW10sXG4gICAgICAgIC8vIENvbnRhaW5lciBpbnNpZGUgdGhlIGNhbnZhcyB3aGVyZSBvdmVybGF5cyBhcmUgZHJhd24uXG4gICAgICAgIG92ZXJsYXlzQ29udGFpbmVyOiAgbnVsbCxcblxuICAgICAgICAvL3ByaXZhdGUgc3RhdGUgcHJvcGVydGllc1xuICAgICAgICBwcmV2aW91c0JvZHk6ICAgW10sXG5cbiAgICAgICAgLy9UaGlzIHdhcyBvcmlnaW5hbGx5IGluaXRpYWxpemVkIGluIHRoZSBjb25zdHJ1Y3RvciBhbmQgc28gY291bGQgbmV2ZXJcbiAgICAgICAgLy9oYXZlIGFueXRoaW5nIGluIGl0LiAgbm93IGl0IGNhbiBiZWNhdXNlIHdlIGFsbG93IGl0IHRvIGJlIHNwZWNpZmllZFxuICAgICAgICAvL2luIHRoZSBvcHRpb25zIGFuZCBpcyBvbmx5IGVtcHR5IGJ5IGRlZmF1bHQgaWYgbm90IHNwZWNpZmllZC4gQWxzb1xuICAgICAgICAvL3RoaXMgYXJyYXkgd2FzIHJldHVybmVkIGZyb20gZ2V0X2NvbnRyb2xzIHdoaWNoIEkgZmluZCBjb25mdXNpbmdcbiAgICAgICAgLy9zaW5jZSB0aGlzIG9iamVjdCBoYXMgYSBjb250cm9scyBwcm9wZXJ0eSB3aGljaCBpcyB0cmVhdGVkIGluIG90aGVyXG4gICAgICAgIC8vZnVuY3Rpb25zIGxpa2UgY2xlYXJDb250cm9scy4gIEknbSByZW1vdmluZyB0aGUgYWNjZXNzb3JzLlxuICAgICAgICBjdXN0b21Db250cm9sczogW10sXG5cbiAgICAgICAgLy9UaGVzZSBhcmUgb3JpZ2luYWxseSBub3QgcGFydCBvcHRpb25zIGJ1dCBkZWNsYXJlZCBhcyBtZW1iZXJzXG4gICAgICAgIC8vaW4gaW5pdGlhbGl6ZS4gIEl0J3Mgc3RpbGwgY29uc2lkZXJlZCBpZGlvbWF0aWMgdG8gcHV0IHRoZW0gaGVyZVxuICAgICAgICBzb3VyY2U6ICAgICAgICAgbnVsbCxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEhhbmRsZXMgcmVuZGVyaW5nIG9mIHRpbGVzIGluIHRoZSB2aWV3ZXIuIENyZWF0ZWQgZm9yIGVhY2ggVGlsZVNvdXJjZSBvcGVuZWQuXG4gICAgICAgICAqIEBtZW1iZXIge09wZW5TZWFkcmFnb24uRHJhd2VyfSBkcmF3ZXJcbiAgICAgICAgICogQG1lbWJlcm9mIE9wZW5TZWFkcmFnb24uVmlld2VyI1xuICAgICAgICAgKi9cbiAgICAgICAgZHJhd2VyOiAgICAgICAgICAgICBudWxsLFxuICAgICAgICB3b3JsZDogICAgICAgICAgICAgIG51bGwsXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBIYW5kbGVzIGNvb3JkaW5hdGUtcmVsYXRlZCBmdW5jdGlvbmFsaXR5IC0gem9vbSwgcGFuLCByb3RhdGlvbiwgZXRjLiBDcmVhdGVkIGZvciBlYWNoIFRpbGVTb3VyY2Ugb3BlbmVkLlxuICAgICAgICAgKiBAbWVtYmVyIHtPcGVuU2VhZHJhZ29uLlZpZXdwb3J0fSB2aWV3cG9ydFxuICAgICAgICAgKiBAbWVtYmVyb2YgT3BlblNlYWRyYWdvbi5WaWV3ZXIjXG4gICAgICAgICAqL1xuICAgICAgICB2aWV3cG9ydDogICAgICAgbnVsbCxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBtZW1iZXIge09wZW5TZWFkcmFnb24uTmF2aWdhdG9yfSBuYXZpZ2F0b3JcbiAgICAgICAgICogQG1lbWJlcm9mIE9wZW5TZWFkcmFnb24uVmlld2VyI1xuICAgICAgICAgKi9cbiAgICAgICAgbmF2aWdhdG9yOiAgICAgIG51bGwsXG5cbiAgICAgICAgLy9BIGNvbGxlY3Rpb24gdmlld3BvcnQgaXMgYSBzZXBhcmF0ZSB2aWV3cG9ydCB1c2VkIHRvIHByb3ZpZGVcbiAgICAgICAgLy9zaW11bHRhbmVvdXMgcmVuZGVyaW5nIG9mIHNldHMgb2YgdGlsZXNcbiAgICAgICAgY29sbGVjdGlvblZpZXdwb3J0OiAgICAgbnVsbCxcbiAgICAgICAgY29sbGVjdGlvbkRyYXdlcjogICAgICAgbnVsbCxcblxuICAgICAgICAvL1VJIGltYWdlIHJlc291cmNlc1xuICAgICAgICAvL1RPRE86IHJlbmFtZSBuYXZJbWFnZXMgdG8gdWlJbWFnZXNcbiAgICAgICAgbmF2SW1hZ2VzOiAgICAgIG51bGwsXG5cbiAgICAgICAgLy9pbnRlcmZhY2UgYnV0dG9uIGNvbnRyb2xzXG4gICAgICAgIGJ1dHRvbnM6ICAgICAgICBudWxsLFxuXG4gICAgICAgIC8vVE9ETzogdGhpcyBpcyBkZWZ1bmN0IHNvIHNhZmVseSByZW1vdmUgaXRcbiAgICAgICAgcHJvZmlsZXI6ICAgICAgIG51bGxcblxuICAgIH0sICQuREVGQVVMVF9TRVRUSU5HUywgb3B0aW9ucyApO1xuXG4gICAgaWYgKCB0eXBlb2YoIHRoaXMuaGFzaCkgPT09IFwidW5kZWZpbmVkXCIgKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkEgaGFzaCBtdXN0IGJlIGRlZmluZWQsIGVpdGhlciBieSBzcGVjaWZ5aW5nIG9wdGlvbnMuaWQgb3Igb3B0aW9ucy5oYXNoLlwiKTtcbiAgICB9XG4gICAgaWYgKCB0eXBlb2YoIFRISVNbIHRoaXMuaGFzaCBdICkgIT09IFwidW5kZWZpbmVkXCIgKSB7XG4gICAgICAgIC8vIFdlIGRvbid0IHdhbnQgdG8gdGhyb3cgYW4gZXJyb3IgaGVyZSwgYXMgdGhlIHVzZXIgbWlnaHQgaGF2ZSBkaXNjYXJkZWRcbiAgICAgICAgLy8gdGhlIHByZXZpb3VzIHZpZXdlciB3aXRoIHRoZSBzYW1lIGhhc2ggYW5kIG5vdyB3YW50IHRvIHJlY3JlYXRlIGl0LlxuICAgICAgICAkLmNvbnNvbGUud2FybihcIkhhc2ggXCIgKyB0aGlzLmhhc2ggKyBcIiBoYXMgYWxyZWFkeSBiZWVuIHVzZWQuXCIpO1xuICAgIH1cblxuICAgIC8vUHJpdmF0ZSBzdGF0ZSBwcm9wZXJ0aWVzXG4gICAgVEhJU1sgdGhpcy5oYXNoIF0gPSB7XG4gICAgICAgIFwiZnNCb3VuZHNEZWx0YVwiOiAgICAgbmV3ICQuUG9pbnQoIDEsIDEgKSxcbiAgICAgICAgXCJwcmV2Q29udGFpbmVyU2l6ZVwiOiBudWxsLFxuICAgICAgICBcImFuaW1hdGluZ1wiOiAgICAgICAgIGZhbHNlLFxuICAgICAgICBcImZvcmNlUmVkcmF3XCI6ICAgICAgIGZhbHNlLFxuICAgICAgICBcIm1vdXNlSW5zaWRlXCI6ICAgICAgIGZhbHNlLFxuICAgICAgICBcImdyb3VwXCI6ICAgICAgICAgICAgIG51bGwsXG4gICAgICAgIC8vIHdoZXRoZXIgd2Ugc2hvdWxkIGJlIGNvbnRpbnVvdXNseSB6b29taW5nXG4gICAgICAgIFwiem9vbWluZ1wiOiAgICAgICAgICAgZmFsc2UsXG4gICAgICAgIC8vIGhvdyBtdWNoIHdlIHNob3VsZCBiZSBjb250aW51b3VzbHkgem9vbWluZyBieVxuICAgICAgICBcInpvb21GYWN0b3JcIjogICAgICAgIG51bGwsXG4gICAgICAgIFwibGFzdFpvb21UaW1lXCI6ICAgICAgbnVsbCxcbiAgICAgICAgXCJmdWxsUGFnZVwiOiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgXCJvbmZ1bGxzY3JlZW5jaGFuZ2VcIjogbnVsbFxuICAgIH07XG5cbiAgICB0aGlzLl9zZXF1ZW5jZUluZGV4ID0gMDtcbiAgICB0aGlzLl9maXJzdE9wZW4gPSB0cnVlO1xuICAgIHRoaXMuX3VwZGF0ZVJlcXVlc3RJZCA9IG51bGw7XG4gICAgdGhpcy5fbG9hZFF1ZXVlID0gW107XG4gICAgdGhpcy5jdXJyZW50T3ZlcmxheXMgPSBbXTtcblxuICAgIHRoaXMuX2xhc3RTY3JvbGxUaW1lID0gJC5ub3coKTsgLy8gdmFyaWFibGUgdXNlZCB0byBoZWxwIG5vcm1hbGl6ZSB0aGUgc2Nyb2xsIGV2ZW50IHNwZWVkIG9mIGRpZmZlcmVudCBkZXZpY2VzXG5cbiAgICAvL0luaGVyaXQgc29tZSBiZWhhdmlvcnMgYW5kIHByb3BlcnRpZXNcbiAgICAkLkV2ZW50U291cmNlLmNhbGwoIHRoaXMgKTtcblxuICAgIHRoaXMuYWRkSGFuZGxlciggJ29wZW4tZmFpbGVkJywgZnVuY3Rpb24gKCBldmVudCApIHtcbiAgICAgICAgdmFyIG1zZyA9ICQuZ2V0U3RyaW5nKCBcIkVycm9ycy5PcGVuRmFpbGVkXCIsIGV2ZW50LmV2ZW50U291cmNlLCBldmVudC5tZXNzYWdlKTtcbiAgICAgICAgX3RoaXMuX3Nob3dNZXNzYWdlKCBtc2cgKTtcbiAgICB9KTtcblxuICAgICQuQ29udHJvbERvY2suY2FsbCggdGhpcywgb3B0aW9ucyApO1xuXG4gICAgLy9EZWFsIHdpdGggdGlsZSBzb3VyY2VzXG4gICAgaWYgKCB0aGlzLnhtbFBhdGggICl7XG4gICAgICAgIC8vRGVwcmVjYXRlZCBvcHRpb24uICBOb3cgaXQgaXMgcHJlZmVycmVkIHRvIHVzZSB0aGUgdGlsZVNvdXJjZXMgb3B0aW9uXG4gICAgICAgIHRoaXMudGlsZVNvdXJjZXMgPSBbIHRoaXMueG1sUGF0aCBdO1xuICAgIH1cblxuICAgIHRoaXMuZWxlbWVudCAgICAgICAgICAgICAgPSB0aGlzLmVsZW1lbnQgfHwgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIHRoaXMuaWQgKTtcbiAgICB0aGlzLmNhbnZhcyAgICAgICAgICAgICAgID0gJC5tYWtlTmV1dHJhbEVsZW1lbnQoIFwiZGl2XCIgKTtcblxuICAgIHRoaXMuY2FudmFzLmNsYXNzTmFtZSA9IFwib3BlbnNlYWRyYWdvbi1jYW52YXNcIjtcbiAgICAoZnVuY3Rpb24oIHN0eWxlICl7XG4gICAgICAgIHN0eWxlLndpZHRoICAgID0gXCIxMDAlXCI7XG4gICAgICAgIHN0eWxlLmhlaWdodCAgID0gXCIxMDAlXCI7XG4gICAgICAgIHN0eWxlLm92ZXJmbG93ID0gXCJoaWRkZW5cIjtcbiAgICAgICAgc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XG4gICAgICAgIHN0eWxlLnRvcCAgICAgID0gXCIwcHhcIjtcbiAgICAgICAgc3R5bGUubGVmdCAgICAgPSBcIjBweFwiO1xuICAgIH0odGhpcy5jYW52YXMuc3R5bGUpKTtcbiAgICAkLnNldEVsZW1lbnRUb3VjaEFjdGlvbk5vbmUoIHRoaXMuY2FudmFzICk7XG4gICAgaWYgKG9wdGlvbnMudGFiSW5kZXggIT09IFwiXCIpIHtcbiAgICAgICAgdGhpcy5jYW52YXMudGFiSW5kZXggPSAob3B0aW9ucy50YWJJbmRleCA9PT0gdW5kZWZpbmVkID8gMCA6IG9wdGlvbnMudGFiSW5kZXgpO1xuICAgIH1cblxuICAgIC8vdGhlIGNvbnRhaW5lciBpcyBjcmVhdGVkIHRocm91Z2ggYXBwbHlpbmcgdGhlIENvbnRyb2xEb2NrIGNvbnN0cnVjdG9yIGFib3ZlXG4gICAgdGhpcy5jb250YWluZXIuY2xhc3NOYW1lID0gXCJvcGVuc2VhZHJhZ29uLWNvbnRhaW5lclwiO1xuICAgIChmdW5jdGlvbiggc3R5bGUgKXtcbiAgICAgICAgc3R5bGUud2lkdGggICAgID0gXCIxMDAlXCI7XG4gICAgICAgIHN0eWxlLmhlaWdodCAgICA9IFwiMTAwJVwiO1xuICAgICAgICBzdHlsZS5wb3NpdGlvbiAgPSBcInJlbGF0aXZlXCI7XG4gICAgICAgIHN0eWxlLm92ZXJmbG93ICA9IFwiaGlkZGVuXCI7XG4gICAgICAgIHN0eWxlLmxlZnQgICAgICA9IFwiMHB4XCI7XG4gICAgICAgIHN0eWxlLnRvcCAgICAgICA9IFwiMHB4XCI7XG4gICAgICAgIHN0eWxlLnRleHRBbGlnbiA9IFwibGVmdFwiOyAgLy8gbmVlZGVkIHRvIHByb3RlY3QgYWdhaW5zdFxuICAgIH0oIHRoaXMuY29udGFpbmVyLnN0eWxlICkpO1xuXG4gICAgdGhpcy5jb250YWluZXIuaW5zZXJ0QmVmb3JlKCB0aGlzLmNhbnZhcywgdGhpcy5jb250YWluZXIuZmlyc3RDaGlsZCApO1xuICAgIHRoaXMuZWxlbWVudC5hcHBlbmRDaGlsZCggdGhpcy5jb250YWluZXIgKTtcblxuICAgIC8vVXNlZCBmb3IgdG9nZ2xpbmcgYmV0d2VlbiBmdWxsc2NyZWVuIGFuZCBkZWZhdWx0IGNvbnRhaW5lciBzaXplXG4gICAgLy9UT0RPOiB0aGVzZSBjYW4gYmUgY2xvc3VyZSBwcml2YXRlIGFuZCBzaGFyZWQgYWNyb3NzIFZpZXdlclxuICAgIC8vICAgICAgaW5zdGFuY2VzLlxuICAgIHRoaXMuYm9keVdpZHRoICAgICAgPSBkb2N1bWVudC5ib2R5LnN0eWxlLndpZHRoO1xuICAgIHRoaXMuYm9keUhlaWdodCAgICAgPSBkb2N1bWVudC5ib2R5LnN0eWxlLmhlaWdodDtcbiAgICB0aGlzLmJvZHlPdmVyZmxvdyAgID0gZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdztcbiAgICB0aGlzLmRvY092ZXJmbG93ICAgID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLm92ZXJmbG93O1xuXG4gICAgdGhpcy5pbm5lclRyYWNrZXIgPSBuZXcgJC5Nb3VzZVRyYWNrZXIoe1xuICAgICAgICBlbGVtZW50OiAgICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzLFxuICAgICAgICBzdGFydERpc2FibGVkOiAgICAgICAgICAgIHRoaXMubW91c2VOYXZFbmFibGVkID8gZmFsc2UgOiB0cnVlLFxuICAgICAgICBjbGlja1RpbWVUaHJlc2hvbGQ6ICAgICAgIHRoaXMuY2xpY2tUaW1lVGhyZXNob2xkLFxuICAgICAgICBjbGlja0Rpc3RUaHJlc2hvbGQ6ICAgICAgIHRoaXMuY2xpY2tEaXN0VGhyZXNob2xkLFxuICAgICAgICBkYmxDbGlja1RpbWVUaHJlc2hvbGQ6ICAgIHRoaXMuZGJsQ2xpY2tUaW1lVGhyZXNob2xkLFxuICAgICAgICBkYmxDbGlja0Rpc3RUaHJlc2hvbGQ6ICAgIHRoaXMuZGJsQ2xpY2tEaXN0VGhyZXNob2xkLFxuICAgICAgICBrZXlEb3duSGFuZGxlcjogICAgICAgICAgICQuZGVsZWdhdGUoIHRoaXMsIG9uQ2FudmFzS2V5RG93biApLFxuICAgICAgICBrZXlIYW5kbGVyOiAgICAgICAgICAgICAgICQuZGVsZWdhdGUoIHRoaXMsIG9uQ2FudmFzS2V5UHJlc3MgKSxcbiAgICAgICAgY2xpY2tIYW5kbGVyOiAgICAgICAgICAgICAkLmRlbGVnYXRlKCB0aGlzLCBvbkNhbnZhc0NsaWNrICksXG4gICAgICAgIGRibENsaWNrSGFuZGxlcjogICAgICAgICAgJC5kZWxlZ2F0ZSggdGhpcywgb25DYW52YXNEYmxDbGljayApLFxuICAgICAgICBkcmFnSGFuZGxlcjogICAgICAgICAgICAgICQuZGVsZWdhdGUoIHRoaXMsIG9uQ2FudmFzRHJhZyApLFxuICAgICAgICBkcmFnRW5kSGFuZGxlcjogICAgICAgICAgICQuZGVsZWdhdGUoIHRoaXMsIG9uQ2FudmFzRHJhZ0VuZCApLFxuICAgICAgICBlbnRlckhhbmRsZXI6ICAgICAgICAgICAgICQuZGVsZWdhdGUoIHRoaXMsIG9uQ2FudmFzRW50ZXIgKSxcbiAgICAgICAgZXhpdEhhbmRsZXI6ICAgICAgICAgICAgICAkLmRlbGVnYXRlKCB0aGlzLCBvbkNhbnZhc0V4aXQgKSxcbiAgICAgICAgcHJlc3NIYW5kbGVyOiAgICAgICAgICAgICAkLmRlbGVnYXRlKCB0aGlzLCBvbkNhbnZhc1ByZXNzICksXG4gICAgICAgIHJlbGVhc2VIYW5kbGVyOiAgICAgICAgICAgJC5kZWxlZ2F0ZSggdGhpcywgb25DYW52YXNSZWxlYXNlICksXG4gICAgICAgIG5vblByaW1hcnlQcmVzc0hhbmRsZXI6ICAgJC5kZWxlZ2F0ZSggdGhpcywgb25DYW52YXNOb25QcmltYXJ5UHJlc3MgKSxcbiAgICAgICAgbm9uUHJpbWFyeVJlbGVhc2VIYW5kbGVyOiAkLmRlbGVnYXRlKCB0aGlzLCBvbkNhbnZhc05vblByaW1hcnlSZWxlYXNlICksXG4gICAgICAgIHNjcm9sbEhhbmRsZXI6ICAgICAgICAgICAgJC5kZWxlZ2F0ZSggdGhpcywgb25DYW52YXNTY3JvbGwgKSxcbiAgICAgICAgcGluY2hIYW5kbGVyOiAgICAgICAgICAgICAkLmRlbGVnYXRlKCB0aGlzLCBvbkNhbnZhc1BpbmNoIClcbiAgICB9KTtcblxuICAgIHRoaXMub3V0ZXJUcmFja2VyID0gbmV3ICQuTW91c2VUcmFja2VyKHtcbiAgICAgICAgZWxlbWVudDogICAgICAgICAgICAgICB0aGlzLmNvbnRhaW5lcixcbiAgICAgICAgc3RhcnREaXNhYmxlZDogICAgICAgICB0aGlzLm1vdXNlTmF2RW5hYmxlZCA/IGZhbHNlIDogdHJ1ZSxcbiAgICAgICAgY2xpY2tUaW1lVGhyZXNob2xkOiAgICB0aGlzLmNsaWNrVGltZVRocmVzaG9sZCxcbiAgICAgICAgY2xpY2tEaXN0VGhyZXNob2xkOiAgICB0aGlzLmNsaWNrRGlzdFRocmVzaG9sZCxcbiAgICAgICAgZGJsQ2xpY2tUaW1lVGhyZXNob2xkOiB0aGlzLmRibENsaWNrVGltZVRocmVzaG9sZCxcbiAgICAgICAgZGJsQ2xpY2tEaXN0VGhyZXNob2xkOiB0aGlzLmRibENsaWNrRGlzdFRocmVzaG9sZCxcbiAgICAgICAgZW50ZXJIYW5kbGVyOiAgICAgICAgICAkLmRlbGVnYXRlKCB0aGlzLCBvbkNvbnRhaW5lckVudGVyICksXG4gICAgICAgIGV4aXRIYW5kbGVyOiAgICAgICAgICAgJC5kZWxlZ2F0ZSggdGhpcywgb25Db250YWluZXJFeGl0IClcbiAgICB9KTtcblxuICAgIGlmKCB0aGlzLnRvb2xiYXIgKXtcbiAgICAgICAgdGhpcy50b29sYmFyID0gbmV3ICQuQ29udHJvbERvY2soeyBlbGVtZW50OiB0aGlzLnRvb2xiYXIgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5iaW5kU3RhbmRhcmRDb250cm9scygpO1xuXG4gICAgVEhJU1sgdGhpcy5oYXNoIF0ucHJldkNvbnRhaW5lclNpemUgPSBfZ2V0U2FmZUVsZW1TaXplKCB0aGlzLmNvbnRhaW5lciApO1xuXG4gICAgLy8gQ3JlYXRlIHRoZSB3b3JsZFxuICAgIHRoaXMud29ybGQgPSBuZXcgJC5Xb3JsZCh7XG4gICAgICAgIHZpZXdlcjogdGhpc1xuICAgIH0pO1xuXG4gICAgdGhpcy53b3JsZC5hZGRIYW5kbGVyKCdhZGQtaXRlbScsIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgIC8vIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgd2UgbWFpbnRhaW4gdGhlIHNvdXJjZSBwcm9wZXJ0eVxuICAgICAgICBfdGhpcy5zb3VyY2UgPSBfdGhpcy53b3JsZC5nZXRJdGVtQXQoMCkuc291cmNlO1xuXG4gICAgICAgIFRISVNbIF90aGlzLmhhc2ggXS5mb3JjZVJlZHJhdyA9IHRydWU7XG5cbiAgICAgICAgaWYgKCFfdGhpcy5fdXBkYXRlUmVxdWVzdElkKSB7XG4gICAgICAgICAgICBfdGhpcy5fdXBkYXRlUmVxdWVzdElkID0gc2NoZWR1bGVVcGRhdGUoIF90aGlzLCB1cGRhdGVNdWx0aSApO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLndvcmxkLmFkZEhhbmRsZXIoJ3JlbW92ZS1pdGVtJywgZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgLy8gRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCB3ZSBtYWludGFpbiB0aGUgc291cmNlIHByb3BlcnR5XG4gICAgICAgIGlmIChfdGhpcy53b3JsZC5nZXRJdGVtQ291bnQoKSkge1xuICAgICAgICAgICAgX3RoaXMuc291cmNlID0gX3RoaXMud29ybGQuZ2V0SXRlbUF0KDApLnNvdXJjZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIF90aGlzLnNvdXJjZSA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBUSElTWyBfdGhpcy5oYXNoIF0uZm9yY2VSZWRyYXcgPSB0cnVlO1xuICAgIH0pO1xuXG4gICAgdGhpcy53b3JsZC5hZGRIYW5kbGVyKCdtZXRyaWNzLWNoYW5nZScsIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgIGlmIChfdGhpcy52aWV3cG9ydCkge1xuICAgICAgICAgICAgX3RoaXMudmlld3BvcnQuX3NldENvbnRlbnRCb3VuZHMoX3RoaXMud29ybGQuZ2V0SG9tZUJvdW5kcygpLCBfdGhpcy53b3JsZC5nZXRDb250ZW50RmFjdG9yKCkpO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLndvcmxkLmFkZEhhbmRsZXIoJ2l0ZW0taW5kZXgtY2hhbmdlJywgZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgLy8gRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCB3ZSBtYWludGFpbiB0aGUgc291cmNlIHByb3BlcnR5XG4gICAgICAgIF90aGlzLnNvdXJjZSA9IF90aGlzLndvcmxkLmdldEl0ZW1BdCgwKS5zb3VyY2U7XG4gICAgfSk7XG5cbiAgICAvLyBDcmVhdGUgdGhlIHZpZXdwb3J0XG4gICAgdGhpcy52aWV3cG9ydCA9IG5ldyAkLlZpZXdwb3J0KHtcbiAgICAgICAgY29udGFpbmVyU2l6ZTogICAgICBUSElTWyB0aGlzLmhhc2ggXS5wcmV2Q29udGFpbmVyU2l6ZSxcbiAgICAgICAgc3ByaW5nU3RpZmZuZXNzOiAgICB0aGlzLnNwcmluZ1N0aWZmbmVzcyxcbiAgICAgICAgYW5pbWF0aW9uVGltZTogICAgICB0aGlzLmFuaW1hdGlvblRpbWUsXG4gICAgICAgIG1pblpvb21JbWFnZVJhdGlvOiAgdGhpcy5taW5ab29tSW1hZ2VSYXRpbyxcbiAgICAgICAgbWF4Wm9vbVBpeGVsUmF0aW86ICB0aGlzLm1heFpvb21QaXhlbFJhdGlvLFxuICAgICAgICB2aXNpYmlsaXR5UmF0aW86ICAgIHRoaXMudmlzaWJpbGl0eVJhdGlvLFxuICAgICAgICB3cmFwSG9yaXpvbnRhbDogICAgIHRoaXMud3JhcEhvcml6b250YWwsXG4gICAgICAgIHdyYXBWZXJ0aWNhbDogICAgICAgdGhpcy53cmFwVmVydGljYWwsXG4gICAgICAgIGRlZmF1bHRab29tTGV2ZWw6ICAgdGhpcy5kZWZhdWx0Wm9vbUxldmVsLFxuICAgICAgICBtaW5ab29tTGV2ZWw6ICAgICAgIHRoaXMubWluWm9vbUxldmVsLFxuICAgICAgICBtYXhab29tTGV2ZWw6ICAgICAgIHRoaXMubWF4Wm9vbUxldmVsLFxuICAgICAgICB2aWV3ZXI6ICAgICAgICAgICAgIHRoaXMsXG4gICAgICAgIGRlZ3JlZXM6ICAgICAgICAgICAgdGhpcy5kZWdyZWVzLFxuICAgICAgICBuYXZpZ2F0b3JSb3RhdGU6ICAgIHRoaXMubmF2aWdhdG9yUm90YXRlLFxuICAgICAgICBob21lRmlsbHNWaWV3ZXI6ICAgIHRoaXMuaG9tZUZpbGxzVmlld2VyLFxuICAgICAgICBtYXJnaW5zOiAgICAgICAgICAgIHRoaXMudmlld3BvcnRNYXJnaW5zXG4gICAgfSk7XG5cbiAgICB0aGlzLnZpZXdwb3J0Ll9zZXRDb250ZW50Qm91bmRzKHRoaXMud29ybGQuZ2V0SG9tZUJvdW5kcygpLCB0aGlzLndvcmxkLmdldENvbnRlbnRGYWN0b3IoKSk7XG5cbiAgICAvLyBDcmVhdGUgdGhlIGltYWdlIGxvYWRlclxuICAgIHRoaXMuaW1hZ2VMb2FkZXIgPSBuZXcgJC5JbWFnZUxvYWRlcih7XG4gICAgICAgIGpvYkxpbWl0OiB0aGlzLmltYWdlTG9hZGVyTGltaXRcbiAgICB9KTtcblxuICAgIC8vIENyZWF0ZSB0aGUgdGlsZSBjYWNoZVxuICAgIHRoaXMudGlsZUNhY2hlID0gbmV3ICQuVGlsZUNhY2hlKHtcbiAgICAgICAgbWF4SW1hZ2VDYWNoZUNvdW50OiB0aGlzLm1heEltYWdlQ2FjaGVDb3VudFxuICAgIH0pO1xuXG4gICAgLy8gQ3JlYXRlIHRoZSBkcmF3ZXJcbiAgICB0aGlzLmRyYXdlciA9IG5ldyAkLkRyYXdlcih7XG4gICAgICAgIHZpZXdlcjogICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgdmlld3BvcnQ6ICAgICAgICAgICB0aGlzLnZpZXdwb3J0LFxuICAgICAgICBlbGVtZW50OiAgICAgICAgICAgIHRoaXMuY2FudmFzLFxuICAgICAgICBkZWJ1Z0dyaWRDb2xvcjogICAgIHRoaXMuZGVidWdHcmlkQ29sb3JcbiAgICB9KTtcblxuICAgIC8vIE92ZXJsYXkgY29udGFpbmVyXG4gICAgdGhpcy5vdmVybGF5c0NvbnRhaW5lciAgICA9ICQubWFrZU5ldXRyYWxFbGVtZW50KCBcImRpdlwiICk7XG4gICAgdGhpcy5jYW52YXMuYXBwZW5kQ2hpbGQoIHRoaXMub3ZlcmxheXNDb250YWluZXIgKTtcblxuICAgIC8vIE5vdyB0aGF0IHdlIGhhdmUgYSBkcmF3ZXIsIHNlZSBpZiBpdCBzdXBwb3J0cyByb3RhdGUuIElmIG5vdCB3ZSBuZWVkIHRvIHJlbW92ZSB0aGUgcm90YXRlIGJ1dHRvbnNcbiAgICBpZiAoIXRoaXMuZHJhd2VyLmNhblJvdGF0ZSgpKSB7XG4gICAgICAgIC8vIERpc2FibGUvcmVtb3ZlIHRoZSByb3RhdGUgbGVmdC9yaWdodCBidXR0b25zIHNpbmNlIHRoZXkgYXJlbid0IHN1cHBvcnRlZFxuICAgICAgICBpZiAodGhpcy5yb3RhdGVMZWZ0KSB7XG4gICAgICAgICAgICBpID0gdGhpcy5idXR0b25zLmJ1dHRvbnMuaW5kZXhPZih0aGlzLnJvdGF0ZUxlZnQpO1xuICAgICAgICAgICAgdGhpcy5idXR0b25zLmJ1dHRvbnMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgdGhpcy5idXR0b25zLmVsZW1lbnQucmVtb3ZlQ2hpbGQodGhpcy5yb3RhdGVMZWZ0LmVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnJvdGF0ZVJpZ2h0KSB7XG4gICAgICAgICAgICBpID0gdGhpcy5idXR0b25zLmJ1dHRvbnMuaW5kZXhPZih0aGlzLnJvdGF0ZVJpZ2h0KTtcbiAgICAgICAgICAgIHRoaXMuYnV0dG9ucy5idXR0b25zLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgIHRoaXMuYnV0dG9ucy5lbGVtZW50LnJlbW92ZUNoaWxkKHRoaXMucm90YXRlUmlnaHQuZWxlbWVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvL0luc3RhbnRpYXRlIGEgbmF2aWdhdG9yIGlmIGNvbmZpZ3VyZWRcbiAgICBpZiAoIHRoaXMuc2hvd05hdmlnYXRvcil7XG4gICAgICAgIHRoaXMubmF2aWdhdG9yID0gbmV3ICQuTmF2aWdhdG9yKHtcbiAgICAgICAgICAgIGlkOiAgICAgICAgICAgICAgICB0aGlzLm5hdmlnYXRvcklkLFxuICAgICAgICAgICAgcG9zaXRpb246ICAgICAgICAgIHRoaXMubmF2aWdhdG9yUG9zaXRpb24sXG4gICAgICAgICAgICBzaXplUmF0aW86ICAgICAgICAgdGhpcy5uYXZpZ2F0b3JTaXplUmF0aW8sXG4gICAgICAgICAgICBtYWludGFpblNpemVSYXRpbzogdGhpcy5uYXZpZ2F0b3JNYWludGFpblNpemVSYXRpbyxcbiAgICAgICAgICAgIHRvcDogICAgICAgICAgICAgICB0aGlzLm5hdmlnYXRvclRvcCxcbiAgICAgICAgICAgIGxlZnQ6ICAgICAgICAgICAgICB0aGlzLm5hdmlnYXRvckxlZnQsXG4gICAgICAgICAgICB3aWR0aDogICAgICAgICAgICAgdGhpcy5uYXZpZ2F0b3JXaWR0aCxcbiAgICAgICAgICAgIGhlaWdodDogICAgICAgICAgICB0aGlzLm5hdmlnYXRvckhlaWdodCxcbiAgICAgICAgICAgIGF1dG9SZXNpemU6ICAgICAgICB0aGlzLm5hdmlnYXRvckF1dG9SZXNpemUsXG4gICAgICAgICAgICBhdXRvRmFkZTogICAgICAgICAgdGhpcy5uYXZpZ2F0b3JBdXRvRmFkZSxcbiAgICAgICAgICAgIHByZWZpeFVybDogICAgICAgICB0aGlzLnByZWZpeFVybCxcbiAgICAgICAgICAgIHZpZXdlcjogICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgbmF2aWdhdG9yUm90YXRlOiAgIHRoaXMubmF2aWdhdG9yUm90YXRlLFxuICAgICAgICAgICAgY3Jvc3NPcmlnaW5Qb2xpY3k6IHRoaXMuY3Jvc3NPcmlnaW5Qb2xpY3lcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gU2VxdWVuY2UgbW9kZVxuICAgIGlmICh0aGlzLnNlcXVlbmNlTW9kZSkge1xuICAgICAgICB0aGlzLmJpbmRTZXF1ZW5jZUNvbnRyb2xzKCk7XG4gICAgfVxuXG4gICAgLy8gT3BlbiBpbml0aWFsIHRpbGVzb3VyY2VzXG4gICAgaWYgKHRoaXMudGlsZVNvdXJjZXMpIHtcbiAgICAgICAgdGhpcy5vcGVuKCB0aGlzLnRpbGVTb3VyY2VzICk7XG4gICAgfVxuXG4gICAgLy8gQWRkIGN1c3RvbSBjb250cm9sc1xuICAgIGZvciAoIGkgPSAwOyBpIDwgdGhpcy5jdXN0b21Db250cm9scy5sZW5ndGg7IGkrKyApIHtcbiAgICAgICAgdGhpcy5hZGRDb250cm9sKFxuICAgICAgICAgICAgdGhpcy5jdXN0b21Db250cm9sc1sgaSBdLmlkLFxuICAgICAgICAgICAge2FuY2hvcjogdGhpcy5jdXN0b21Db250cm9sc1sgaSBdLmFuY2hvcn1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBJbml0aWFsIGZhZGUgb3V0XG4gICAgJC5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoIGZ1bmN0aW9uKCl7XG4gICAgICAgIGJlZ2luQ29udHJvbHNBdXRvSGlkZSggX3RoaXMgKTtcbiAgICB9ICk7XG59O1xuXG4kLmV4dGVuZCggJC5WaWV3ZXIucHJvdG90eXBlLCAkLkV2ZW50U291cmNlLnByb3RvdHlwZSwgJC5Db250cm9sRG9jay5wcm90b3R5cGUsIC8qKiBAbGVuZHMgT3BlblNlYWRyYWdvbi5WaWV3ZXIucHJvdG90eXBlICove1xuXG5cbiAgICAvKipcbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGlzT3BlbjogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLndvcmxkLmdldEl0ZW1Db3VudCgpO1xuICAgIH0sXG5cbiAgICAvLyBkZXByZWNhdGVkXG4gICAgb3BlbkR6aTogZnVuY3Rpb24gKCBkemkgKSB7XG4gICAgICAgICQuY29uc29sZS5lcnJvciggXCJbVmlld2VyLm9wZW5EemldIHRoaXMgZnVuY3Rpb24gaXMgZGVwcmVjYXRlZDsgdXNlIFZpZXdlci5vcGVuKCkgaW5zdGVhZC5cIiApO1xuICAgICAgICByZXR1cm4gdGhpcy5vcGVuKCBkemkgKTtcbiAgICB9LFxuXG4gICAgLy8gZGVwcmVjYXRlZFxuICAgIG9wZW5UaWxlU291cmNlOiBmdW5jdGlvbiAoIHRpbGVTb3VyY2UgKSB7XG4gICAgICAgICQuY29uc29sZS5lcnJvciggXCJbVmlld2VyLm9wZW5UaWxlU291cmNlXSB0aGlzIGZ1bmN0aW9uIGlzIGRlcHJlY2F0ZWQ7IHVzZSBWaWV3ZXIub3BlbigpIGluc3RlYWQuXCIgKTtcbiAgICAgICAgcmV0dXJuIHRoaXMub3BlbiggdGlsZVNvdXJjZSApO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBPcGVuIHRpbGVkIGltYWdlcyBpbnRvIHRoZSB2aWV3ZXIsIGNsb3NpbmcgYW55IG90aGVycy5cbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fFN0cmluZ3xPYmplY3R8RnVuY3Rpb259IHRpbGVTb3VyY2VzIC0gVGhpcyBjYW4gYmUgYSBUaWxlZEltYWdlXG4gICAgICogc3BlY2lmaWVyLCBhIFRpbGVTb3VyY2Ugc3BlY2lmaWVyLCBvciBhbiBhcnJheSBvZiBlaXRoZXIuIEEgVGlsZWRJbWFnZSBzcGVjaWZpZXJcbiAgICAgKiBpcyB0aGUgc2FtZSBhcyB0aGUgb3B0aW9ucyBwYXJhbWV0ZXIgZm9yIHtAbGluayBPcGVuU2VhZHJhZ29uLlZpZXdlciNhZGRUaWxlZEltYWdlfSxcbiAgICAgKiBleGNlcHQgZm9yIHRoZSBpbmRleCBwcm9wZXJ0eTsgaW1hZ2VzIGFyZSBhZGRlZCBpbiBzZXF1ZW5jZS5cbiAgICAgKiBBIFRpbGVTb3VyY2Ugc3BlY2lmaWVyIGlzIGFueXRoaW5nIHlvdSBjb3VsZCBwYXNzIGFzIHRoZSB0aWxlU291cmNlIHByb3BlcnR5XG4gICAgICogb2YgdGhlIG9wdGlvbnMgcGFyYW1ldGVyIGZvciB7QGxpbmsgT3BlblNlYWRyYWdvbi5WaWV3ZXIjYWRkVGlsZWRJbWFnZX0uXG4gICAgICogQHJldHVybiB7T3BlblNlYWRyYWdvbi5WaWV3ZXJ9IENoYWluYWJsZS5cbiAgICAgKiBAZmlyZXMgT3BlblNlYWRyYWdvbi5WaWV3ZXIuZXZlbnQ6b3BlblxuICAgICAqIEBmaXJlcyBPcGVuU2VhZHJhZ29uLlZpZXdlci5ldmVudDpvcGVuLWZhaWxlZFxuICAgICAqL1xuICAgIG9wZW46IGZ1bmN0aW9uICh0aWxlU291cmNlcykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICAgIHRoaXMuY2xvc2UoKTtcblxuICAgICAgICBpZiAoIXRpbGVTb3VyY2VzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5zZXF1ZW5jZU1vZGUgJiYgJC5pc0FycmF5KHRpbGVTb3VyY2VzKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMucmVmZXJlbmNlU3RyaXApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlZmVyZW5jZVN0cmlwLmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlZmVyZW5jZVN0cmlwID0gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy50aWxlU291cmNlcyA9IHRpbGVTb3VyY2VzO1xuICAgICAgICAgICAgdGhpcy5fc2VxdWVuY2VJbmRleCA9IE1hdGgubWF4KDAsIE1hdGgubWluKHRoaXMudGlsZVNvdXJjZXMubGVuZ3RoIC0gMSwgdGhpcy5pbml0aWFsUGFnZSkpO1xuICAgICAgICAgICAgaWYgKHRoaXMudGlsZVNvdXJjZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcGVuKHRoaXMudGlsZVNvdXJjZXNbdGhpcy5fc2VxdWVuY2VJbmRleF0pO1xuXG4gICAgICAgICAgICAgICAgaWYgKCB0aGlzLnNob3dSZWZlcmVuY2VTdHJpcCApe1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZmVyZW5jZVN0cmlwID0gbmV3ICQuUmVmZXJlbmNlU3RyaXAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6ICAgICAgICAgIHRoaXMucmVmZXJlbmNlU3RyaXBFbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246ICAgIHRoaXMucmVmZXJlbmNlU3RyaXBQb3NpdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpemVSYXRpbzogICB0aGlzLnJlZmVyZW5jZVN0cmlwU2l6ZVJhdGlvLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsOiAgICAgIHRoaXMucmVmZXJlbmNlU3RyaXBTY3JvbGwsXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6ICAgICAgdGhpcy5yZWZlcmVuY2VTdHJpcEhlaWdodCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiAgICAgICB0aGlzLnJlZmVyZW5jZVN0cmlwV2lkdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aWxlU291cmNlczogdGhpcy50aWxlU291cmNlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeFVybDogICB0aGlzLnByZWZpeFVybCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdlcjogICAgICB0aGlzXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5fdXBkYXRlU2VxdWVuY2VCdXR0b25zKCB0aGlzLl9zZXF1ZW5jZUluZGV4ICk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoISQuaXNBcnJheSh0aWxlU291cmNlcykpIHtcbiAgICAgICAgICAgIHRpbGVTb3VyY2VzID0gW3RpbGVTb3VyY2VzXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGlsZVNvdXJjZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9vcGVuaW5nID0gdHJ1ZTtcblxuICAgICAgICB2YXIgZXhwZWN0ZWQgPSB0aWxlU291cmNlcy5sZW5ndGg7XG4gICAgICAgIHZhciBzdWNjZXNzZXMgPSAwO1xuICAgICAgICB2YXIgZmFpbHVyZXMgPSAwO1xuICAgICAgICB2YXIgZmFpbEV2ZW50O1xuXG4gICAgICAgIHZhciBjaGVja0NvbXBsZXRpb24gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlmIChzdWNjZXNzZXMgKyBmYWlsdXJlcyA9PT0gZXhwZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICBpZiAoc3VjY2Vzc2VzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChfdGhpcy5fZmlyc3RPcGVuIHx8ICFfdGhpcy5wcmVzZXJ2ZVZpZXdwb3J0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy52aWV3cG9ydC5nb0hvbWUoIHRydWUgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLnZpZXdwb3J0LnVwZGF0ZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuX2ZpcnN0T3BlbiA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgICAgIHZhciBzb3VyY2UgPSB0aWxlU291cmNlc1swXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNvdXJjZS50aWxlU291cmNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UgPSBzb3VyY2UudGlsZVNvdXJjZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIEdsb2JhbCBvdmVybGF5c1xuICAgICAgICAgICAgICAgICAgICBpZiggX3RoaXMub3ZlcmxheXMgJiYgIV90aGlzLnByZXNlcnZlT3ZlcmxheXMgKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoIHZhciBpID0gMDsgaSA8IF90aGlzLm92ZXJsYXlzLmxlbmd0aDsgaSsrICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLmN1cnJlbnRPdmVybGF5c1sgaSBdID0gZ2V0T3ZlcmxheU9iamVjdCggX3RoaXMsIF90aGlzLm92ZXJsYXlzWyBpIF0gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIF90aGlzLl9kcmF3T3ZlcmxheXMoKTtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuX29wZW5pbmcgPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgICAgICogUmFpc2VkIHdoZW4gdGhlIHZpZXdlciBoYXMgb3BlbmVkIGFuZCBsb2FkZWQgb25lIG9yIG1vcmUgVGlsZVNvdXJjZXMuXG4gICAgICAgICAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgICAgICAgICAqIEBldmVudCBvcGVuXG4gICAgICAgICAgICAgICAgICAgICAqIEBtZW1iZXJvZiBPcGVuU2VhZHJhZ29uLlZpZXdlclxuICAgICAgICAgICAgICAgICAgICAgKiBAdHlwZSB7b2JqZWN0fVxuICAgICAgICAgICAgICAgICAgICAgKiBAcHJvcGVydHkge09wZW5TZWFkcmFnb24uVmlld2VyfSBldmVudFNvdXJjZSAtIEEgcmVmZXJlbmNlIHRvIHRoZSBWaWV3ZXIgd2hpY2ggcmFpc2VkIHRoZSBldmVudC5cbiAgICAgICAgICAgICAgICAgICAgICogQHByb3BlcnR5IHtPcGVuU2VhZHJhZ29uLlRpbGVTb3VyY2V9IHNvdXJjZSAtIFRoZSB0aWxlIHNvdXJjZSB0aGF0IHdhcyBvcGVuZWQuXG4gICAgICAgICAgICAgICAgICAgICAqIEBwcm9wZXJ0eSB7P09iamVjdH0gdXNlckRhdGEgLSBBcmJpdHJhcnkgc3Vic2NyaWJlci1kZWZpbmVkIG9iamVjdC5cbiAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IHdoYXQgaWYgdGhlcmUgYXJlIG11bHRpcGxlIHNvdXJjZXM/XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLnJhaXNlRXZlbnQoICdvcGVuJywgeyBzb3VyY2U6IHNvdXJjZSB9ICk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuX29wZW5pbmcgPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgICAgICogUmFpc2VkIHdoZW4gYW4gZXJyb3Igb2NjdXJzIGxvYWRpbmcgYSBUaWxlU291cmNlLlxuICAgICAgICAgICAgICAgICAgICAgKlxuICAgICAgICAgICAgICAgICAgICAgKiBAZXZlbnQgb3Blbi1mYWlsZWRcbiAgICAgICAgICAgICAgICAgICAgICogQG1lbWJlcm9mIE9wZW5TZWFkcmFnb24uVmlld2VyXG4gICAgICAgICAgICAgICAgICAgICAqIEB0eXBlIHtvYmplY3R9XG4gICAgICAgICAgICAgICAgICAgICAqIEBwcm9wZXJ0eSB7T3BlblNlYWRyYWdvbi5WaWV3ZXJ9IGV2ZW50U291cmNlIC0gQSByZWZlcmVuY2UgdG8gdGhlIFZpZXdlciB3aGljaCByYWlzZWQgdGhlIGV2ZW50LlxuICAgICAgICAgICAgICAgICAgICAgKiBAcHJvcGVydHkge1N0cmluZ30gbWVzc2FnZSAtIEluZm9ybWF0aW9uIGFib3V0IHdoYXQgZmFpbGVkLlxuICAgICAgICAgICAgICAgICAgICAgKiBAcHJvcGVydHkge1N0cmluZ30gc291cmNlIC0gVGhlIHRpbGUgc291cmNlIHRoYXQgZmFpbGVkLlxuICAgICAgICAgICAgICAgICAgICAgKiBAcHJvcGVydHkgez9PYmplY3R9IHVzZXJEYXRhIC0gQXJiaXRyYXJ5IHN1YnNjcmliZXItZGVmaW5lZCBvYmplY3QuXG4gICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy5yYWlzZUV2ZW50KCAnb3Blbi1mYWlsZWQnLCBmYWlsRXZlbnQgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgdmFyIGRvT25lID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICAgICAgICAgICAgaWYgKCEkLmlzUGxhaW5PYmplY3Qob3B0aW9ucykgfHwgIW9wdGlvbnMudGlsZVNvdXJjZSkge1xuICAgICAgICAgICAgICAgIG9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgICAgIHRpbGVTb3VyY2U6IG9wdGlvbnNcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5pbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgJC5jb25zb2xlLmVycm9yKCdbVmlld2VyLm9wZW5dIHNldHRpbmcgaW5kZXhlcyBoZXJlIGlzIG5vdCBzdXBwb3J0ZWQ7IHVzZSBhZGRUaWxlZEltYWdlIGluc3RlYWQnKTtcbiAgICAgICAgICAgICAgICBkZWxldGUgb3B0aW9ucy5pbmRleDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuY29sbGVjdGlvbkltbWVkaWF0ZWx5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBvcHRpb25zLmNvbGxlY3Rpb25JbW1lZGlhdGVseSA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBvcmlnaW5hbFN1Y2Nlc3MgPSBvcHRpb25zLnN1Y2Nlc3M7XG4gICAgICAgICAgICBvcHRpb25zLnN1Y2Nlc3MgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgICAgIHN1Y2Nlc3NlcysrO1xuXG4gICAgICAgICAgICAgICAgLy8gVE9ETzogbm93IHRoYXQgb3B0aW9ucyBoYXMgb3RoZXIgdGhpbmdzIGJlc2lkZXMgdGlsZVNvdXJjZSwgdGhlIG92ZXJsYXlzXG4gICAgICAgICAgICAgICAgLy8gc2hvdWxkIHByb2JhYmx5IGJlIGF0IHRoZSBvcHRpb25zIGxldmVsLCBub3QgdGhlIHRpbGVTb3VyY2UgbGV2ZWwuXG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMudGlsZVNvdXJjZS5vdmVybGF5cykge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9wdGlvbnMudGlsZVNvdXJjZS5vdmVybGF5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuYWRkT3ZlcmxheShvcHRpb25zLnRpbGVTb3VyY2Uub3ZlcmxheXNbaV0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKG9yaWdpbmFsU3VjY2Vzcykge1xuICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbFN1Y2Nlc3MoZXZlbnQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNoZWNrQ29tcGxldGlvbigpO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgdmFyIG9yaWdpbmFsRXJyb3IgPSBvcHRpb25zLmVycm9yO1xuICAgICAgICAgICAgb3B0aW9ucy5lcnJvciA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgZmFpbHVyZXMrKztcblxuICAgICAgICAgICAgICAgIGlmICghZmFpbEV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGZhaWxFdmVudCA9IGV2ZW50O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChvcmlnaW5hbEVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsRXJyb3IoZXZlbnQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNoZWNrQ29tcGxldGlvbigpO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgX3RoaXMuYWRkVGlsZWRJbWFnZShvcHRpb25zKTtcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBUaWxlU291cmNlc1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRpbGVTb3VyY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBkb09uZSh0aWxlU291cmNlc1tpXSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG5cbiAgICAvKipcbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcmV0dXJuIHtPcGVuU2VhZHJhZ29uLlZpZXdlcn0gQ2hhaW5hYmxlLlxuICAgICAqIEBmaXJlcyBPcGVuU2VhZHJhZ29uLlZpZXdlci5ldmVudDpjbG9zZVxuICAgICAqL1xuICAgIGNsb3NlOiBmdW5jdGlvbiAoICkge1xuICAgICAgICBpZiAoICFUSElTWyB0aGlzLmhhc2ggXSApIHtcbiAgICAgICAgICAgIC8vdGhpcyB2aWV3ZXIgaGFzIGFscmVhZHkgYmVlbiBkZXN0cm95ZWQ6IHJldHVybmluZyBpbW1lZGlhdGVseVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9vcGVuaW5nID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKCB0aGlzLm5hdmlnYXRvciApIHtcbiAgICAgICAgICAgIHRoaXMubmF2aWdhdG9yLmNsb3NlKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiggISB0aGlzLnByZXNlcnZlT3ZlcmxheXMpIHtcbiAgICAgICAgICAgIHRoaXMuY2xlYXJPdmVybGF5cygpO1xuICAgICAgICAgICAgdGhpcy5vdmVybGF5c0NvbnRhaW5lci5pbm5lckhUTUwgPSBcIlwiO1xuICAgICAgICB9XG5cbiAgICAgICAgVEhJU1sgdGhpcy5oYXNoIF0uYW5pbWF0aW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMud29ybGQucmVtb3ZlQWxsKCk7XG4gICAgICAgIHRoaXMuaW1hZ2VMb2FkZXIuY2xlYXIoKTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogUmFpc2VkIHdoZW4gdGhlIHZpZXdlciBpcyBjbG9zZWQgKHNlZSB7QGxpbmsgT3BlblNlYWRyYWdvbi5WaWV3ZXIjY2xvc2V9KS5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV2ZW50IGNsb3NlXG4gICAgICAgICAqIEBtZW1iZXJvZiBPcGVuU2VhZHJhZ29uLlZpZXdlclxuICAgICAgICAgKiBAdHlwZSB7b2JqZWN0fVxuICAgICAgICAgKiBAcHJvcGVydHkge09wZW5TZWFkcmFnb24uVmlld2VyfSBldmVudFNvdXJjZSAtIEEgcmVmZXJlbmNlIHRvIHRoZSBWaWV3ZXIgd2hpY2ggcmFpc2VkIHRoZSBldmVudC5cbiAgICAgICAgICogQHByb3BlcnR5IHs/T2JqZWN0fSB1c2VyRGF0YSAtIEFyYml0cmFyeSBzdWJzY3JpYmVyLWRlZmluZWQgb2JqZWN0LlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5yYWlzZUV2ZW50KCAnY2xvc2UnICk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuXG4gICAgLyoqXG4gICAgICogRnVuY3Rpb24gdG8gZGVzdHJveSB0aGUgdmlld2VyIGFuZCBjbGVhbiB1cCBldmVyeXRoaW5nIGNyZWF0ZWQgYnkgT3BlblNlYWRyYWdvbi5cbiAgICAgKlxuICAgICAqIEV4YW1wbGU6XG4gICAgICogdmFyIHZpZXdlciA9IE9wZW5TZWFkcmFnb24oe1xuICAgICAqICAgWy4uLl1cbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIC8vd2hlbiB5b3UgYXJlIGRvbmUgd2l0aCB0aGUgdmlld2VyOlxuICAgICAqIHZpZXdlci5kZXN0cm95KCk7XG4gICAgICogdmlld2VyID0gbnVsbDsgLy9pbXBvcnRhbnRcbiAgICAgKlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqL1xuICAgIGRlc3Ryb3k6IGZ1bmN0aW9uKCApIHtcbiAgICAgICAgaWYgKCAhVEhJU1sgdGhpcy5oYXNoIF0gKSB7XG4gICAgICAgICAgICAvL3RoaXMgdmlld2VyIGhhcyBhbHJlYWR5IGJlZW4gZGVzdHJveWVkOiByZXR1cm5pbmcgaW1tZWRpYXRlbHlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2xvc2UoKTtcblxuICAgICAgICB0aGlzLmNsZWFyT3ZlcmxheXMoKTtcbiAgICAgICAgdGhpcy5vdmVybGF5c0NvbnRhaW5lci5pbm5lckhUTUwgPSBcIlwiO1xuXG4gICAgICAgIC8vVE9ETzogaW1wbGVtZW50IHRoaXMuLi5cbiAgICAgICAgLy90aGlzLnVuYmluZFNlcXVlbmNlQ29udHJvbHMoKVxuICAgICAgICAvL3RoaXMudW5iaW5kU3RhbmRhcmRDb250cm9scygpXG5cbiAgICAgICAgaWYgKHRoaXMucmVmZXJlbmNlU3RyaXApIHtcbiAgICAgICAgICAgIHRoaXMucmVmZXJlbmNlU3RyaXAuZGVzdHJveSgpO1xuICAgICAgICAgICAgdGhpcy5yZWZlcmVuY2VTdHJpcCA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIHRoaXMuX3VwZGF0ZVJlcXVlc3RJZCAhPT0gbnVsbCApIHtcbiAgICAgICAgICAgICQuY2FuY2VsQW5pbWF0aW9uRnJhbWUoIHRoaXMuX3VwZGF0ZVJlcXVlc3RJZCApO1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlUmVxdWVzdElkID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICggdGhpcy5kcmF3ZXIgKSB7XG4gICAgICAgICAgICB0aGlzLmRyYXdlci5kZXN0cm95KCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlbW92ZUFsbEhhbmRsZXJzKCk7XG5cbiAgICAgICAgLy8gR28gdGhyb3VnaCB0b3AgZWxlbWVudCAocGFzc2VkIHRvIHVzKSBhbmQgcmVtb3ZlIGFsbCBjaGlsZHJlblxuICAgICAgICAvLyBVc2UgcmVtb3ZlQ2hpbGQgdG8gbWFrZSBzdXJlIGl0IGhhbmRsZXMgU1ZHIG9yIGFueSBub24taHRtbFxuICAgICAgICAvLyBhbHNvIGl0IHBlcmZvcm1zIGJldHRlciAtIGh0dHA6Ly9qc3BlcmYuY29tL2lubmVyaHRtbC12cy1yZW1vdmVjaGlsZC8xNVxuICAgICAgICBpZiAodGhpcy5lbGVtZW50KXtcbiAgICAgICAgICAgIHdoaWxlICh0aGlzLmVsZW1lbnQuZmlyc3RDaGlsZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5yZW1vdmVDaGlsZCh0aGlzLmVsZW1lbnQuZmlyc3RDaGlsZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBkZXN0cm95IHRoZSBtb3VzZSB0cmFja2Vyc1xuICAgICAgICBpZiAodGhpcy5pbm5lclRyYWNrZXIpe1xuICAgICAgICAgICAgdGhpcy5pbm5lclRyYWNrZXIuZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm91dGVyVHJhY2tlcil7XG4gICAgICAgICAgICB0aGlzLm91dGVyVHJhY2tlci5kZXN0cm95KCk7XG4gICAgICAgIH1cblxuICAgICAgICBUSElTWyB0aGlzLmhhc2ggXSA9IG51bGw7XG4gICAgICAgIGRlbGV0ZSBUSElTWyB0aGlzLmhhc2ggXTtcblxuICAgICAgICAvLyBjbGVhciBhbGwgb3VyIHJlZmVyZW5jZXMgdG8gZG9tIG9iamVjdHNcbiAgICAgICAgdGhpcy5jYW52YXMgPSBudWxsO1xuICAgICAgICB0aGlzLmNvbnRhaW5lciA9IG51bGw7XG5cbiAgICAgICAgLy8gY2xlYXIgb3VyIHJlZmVyZW5jZSB0byB0aGUgbWFpbiBlbGVtZW50IC0gdGhleSB3aWxsIG5lZWQgdG8gcGFzcyBpdCBpbiBhZ2FpbiwgY3JlYXRpbmcgYSBuZXcgdmlld2VyXG4gICAgICAgIHRoaXMuZWxlbWVudCA9IG51bGw7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgaXNNb3VzZU5hdkVuYWJsZWQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5uZXJUcmFja2VyLmlzVHJhY2tpbmcoKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBlbmFibGVkIC0gdHJ1ZSB0byBlbmFibGUsIGZhbHNlIHRvIGRpc2FibGVcbiAgICAgKiBAcmV0dXJuIHtPcGVuU2VhZHJhZ29uLlZpZXdlcn0gQ2hhaW5hYmxlLlxuICAgICAqIEBmaXJlcyBPcGVuU2VhZHJhZ29uLlZpZXdlci5ldmVudDptb3VzZS1lbmFibGVkXG4gICAgICovXG4gICAgc2V0TW91c2VOYXZFbmFibGVkOiBmdW5jdGlvbiggZW5hYmxlZCApe1xuICAgICAgICB0aGlzLmlubmVyVHJhY2tlci5zZXRUcmFja2luZyggZW5hYmxlZCApO1xuICAgICAgICB0aGlzLm91dGVyVHJhY2tlci5zZXRUcmFja2luZyggZW5hYmxlZCApO1xuICAgICAgICAvKipcbiAgICAgICAgICogUmFpc2VkIHdoZW4gbW91c2UvdG91Y2ggbmF2aWdhdGlvbiBpcyBlbmFibGVkIG9yIGRpc2FibGVkIChzZWUge0BsaW5rIE9wZW5TZWFkcmFnb24uVmlld2VyI3NldE1vdXNlTmF2RW5hYmxlZH0pLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXZlbnQgbW91c2UtZW5hYmxlZFxuICAgICAgICAgKiBAbWVtYmVyb2YgT3BlblNlYWRyYWdvbi5WaWV3ZXJcbiAgICAgICAgICogQHR5cGUge29iamVjdH1cbiAgICAgICAgICogQHByb3BlcnR5IHtPcGVuU2VhZHJhZ29uLlZpZXdlcn0gZXZlbnRTb3VyY2UgLSBBIHJlZmVyZW5jZSB0byB0aGUgVmlld2VyIHdoaWNoIHJhaXNlZCB0aGUgZXZlbnQuXG4gICAgICAgICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gZW5hYmxlZFxuICAgICAgICAgKiBAcHJvcGVydHkgez9PYmplY3R9IHVzZXJEYXRhIC0gQXJiaXRyYXJ5IHN1YnNjcmliZXItZGVmaW5lZCBvYmplY3QuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnJhaXNlRXZlbnQoICdtb3VzZS1lbmFibGVkJywgeyBlbmFibGVkOiBlbmFibGVkIH0gKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuXG4gICAgLyoqXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBhcmVDb250cm9sc0VuYWJsZWQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGVuYWJsZWQgPSB0aGlzLmNvbnRyb2xzLmxlbmd0aCxcbiAgICAgICAgICAgIGk7XG4gICAgICAgIGZvciggaSA9IDA7IGkgPCB0aGlzLmNvbnRyb2xzLmxlbmd0aDsgaSsrICl7XG4gICAgICAgICAgICBlbmFibGVkID0gZW5hYmxlZCAmJiB0aGlzLmNvbnRyb2xzWyBpIF0uaXNWaXNpYmlsZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbmFibGVkO1xuICAgIH0sXG5cblxuICAgIC8qKlxuICAgICAqIFNob3dzIG9yIGhpZGVzIHRoZSBjb250cm9scyAoZS5nLiB0aGUgZGVmYXVsdCBuYXZpZ2F0aW9uIGJ1dHRvbnMpLlxuICAgICAqXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtCb29sZWFufSB0cnVlIHRvIHNob3csIGZhbHNlIHRvIGhpZGUuXG4gICAgICogQHJldHVybiB7T3BlblNlYWRyYWdvbi5WaWV3ZXJ9IENoYWluYWJsZS5cbiAgICAgKiBAZmlyZXMgT3BlblNlYWRyYWdvbi5WaWV3ZXIuZXZlbnQ6Y29udHJvbHMtZW5hYmxlZFxuICAgICAqL1xuICAgIHNldENvbnRyb2xzRW5hYmxlZDogZnVuY3Rpb24oIGVuYWJsZWQgKSB7XG4gICAgICAgIGlmKCBlbmFibGVkICl7XG4gICAgICAgICAgICBhYm9ydENvbnRyb2xzQXV0b0hpZGUoIHRoaXMgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGJlZ2luQ29udHJvbHNBdXRvSGlkZSggdGhpcyApO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSYWlzZWQgd2hlbiB0aGUgbmF2aWdhdGlvbiBjb250cm9scyBhcmUgc2hvd24gb3IgaGlkZGVuIChzZWUge0BsaW5rIE9wZW5TZWFkcmFnb24uVmlld2VyI3NldENvbnRyb2xzRW5hYmxlZH0pLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXZlbnQgY29udHJvbHMtZW5hYmxlZFxuICAgICAgICAgKiBAbWVtYmVyb2YgT3BlblNlYWRyYWdvbi5WaWV3ZXJcbiAgICAgICAgICogQHR5cGUge29iamVjdH1cbiAgICAgICAgICogQHByb3BlcnR5IHtPcGVuU2VhZHJhZ29uLlZpZXdlcn0gZXZlbnRTb3VyY2UgLSBBIHJlZmVyZW5jZSB0byB0aGUgVmlld2VyIHdoaWNoIHJhaXNlZCB0aGUgZXZlbnQuXG4gICAgICAgICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gZW5hYmxlZFxuICAgICAgICAgKiBAcHJvcGVydHkgez9PYmplY3R9IHVzZXJEYXRhIC0gQXJiaXRyYXJ5IHN1YnNjcmliZXItZGVmaW5lZCBvYmplY3QuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnJhaXNlRXZlbnQoICdjb250cm9scy1lbmFibGVkJywgeyBlbmFibGVkOiBlbmFibGVkIH0gKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgaXNGdWxsUGFnZTogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gVEhJU1sgdGhpcy5oYXNoIF0uZnVsbFBhZ2U7XG4gICAgfSxcblxuXG4gICAgLyoqXG4gICAgICogVG9nZ2xlIGZ1bGwgcGFnZSBtb2RlLlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gZnVsbFBhZ2VcbiAgICAgKiAgICAgIElmIHRydWUsIGVudGVyIGZ1bGwgcGFnZSBtb2RlLiAgSWYgZmFsc2UsIGV4aXQgZnVsbCBwYWdlIG1vZGUuXG4gICAgICogQHJldHVybiB7T3BlblNlYWRyYWdvbi5WaWV3ZXJ9IENoYWluYWJsZS5cbiAgICAgKiBAZmlyZXMgT3BlblNlYWRyYWdvbi5WaWV3ZXIuZXZlbnQ6cHJlLWZ1bGwtcGFnZVxuICAgICAqIEBmaXJlcyBPcGVuU2VhZHJhZ29uLlZpZXdlci5ldmVudDpmdWxsLXBhZ2VcbiAgICAgKi9cbiAgICBzZXRGdWxsUGFnZTogZnVuY3Rpb24oIGZ1bGxQYWdlICkge1xuXG4gICAgICAgIHZhciBib2R5ID0gZG9jdW1lbnQuYm9keSxcbiAgICAgICAgICAgIGJvZHlTdHlsZSA9IGJvZHkuc3R5bGUsXG4gICAgICAgICAgICBkb2NTdHlsZSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZSxcbiAgICAgICAgICAgIF90aGlzID0gdGhpcyxcbiAgICAgICAgICAgIGhhc2gsXG4gICAgICAgICAgICBub2RlcyxcbiAgICAgICAgICAgIGk7XG5cbiAgICAgICAgLy9kb250IGJvdGhlciBtb2RpZnlpbmcgdGhlIERPTSBpZiB3ZSBhcmUgYWxyZWFkeSBpbiBmdWxsIHBhZ2UgbW9kZS5cbiAgICAgICAgaWYgKCBmdWxsUGFnZSA9PSB0aGlzLmlzRnVsbFBhZ2UoKSApIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGZ1bGxQYWdlRXZlbnRBcmdzID0ge1xuICAgICAgICAgICAgZnVsbFBhZ2U6IGZ1bGxQYWdlLFxuICAgICAgICAgICAgcHJldmVudERlZmF1bHRBY3Rpb246IGZhbHNlXG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSYWlzZWQgd2hlbiB0aGUgdmlld2VyIGlzIGFib3V0IHRvIGNoYW5nZSB0by9mcm9tIGZ1bGwtcGFnZSBtb2RlIChzZWUge0BsaW5rIE9wZW5TZWFkcmFnb24uVmlld2VyI3NldEZ1bGxQYWdlfSkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBldmVudCBwcmUtZnVsbC1wYWdlXG4gICAgICAgICAqIEBtZW1iZXJvZiBPcGVuU2VhZHJhZ29uLlZpZXdlclxuICAgICAgICAgKiBAdHlwZSB7b2JqZWN0fVxuICAgICAgICAgKiBAcHJvcGVydHkge09wZW5TZWFkcmFnb24uVmlld2VyfSBldmVudFNvdXJjZSAtIEEgcmVmZXJlbmNlIHRvIHRoZSBWaWV3ZXIgd2hpY2ggcmFpc2VkIHRoZSBldmVudC5cbiAgICAgICAgICogQHByb3BlcnR5IHtCb29sZWFufSBmdWxsUGFnZSAtIFRydWUgaWYgZW50ZXJpbmcgZnVsbC1wYWdlIG1vZGUsIGZhbHNlIGlmIGV4aXRpbmcgZnVsbC1wYWdlIG1vZGUuXG4gICAgICAgICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gcHJldmVudERlZmF1bHRBY3Rpb24gLSBTZXQgdG8gdHJ1ZSB0byBwcmV2ZW50IGZ1bGwtcGFnZSBtb2RlIGNoYW5nZS4gRGVmYXVsdDogZmFsc2UuXG4gICAgICAgICAqIEBwcm9wZXJ0eSB7P09iamVjdH0gdXNlckRhdGEgLSBBcmJpdHJhcnkgc3Vic2NyaWJlci1kZWZpbmVkIG9iamVjdC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMucmFpc2VFdmVudCggJ3ByZS1mdWxsLXBhZ2UnLCBmdWxsUGFnZUV2ZW50QXJncyApO1xuICAgICAgICBpZiAoIGZ1bGxQYWdlRXZlbnRBcmdzLnByZXZlbnREZWZhdWx0QWN0aW9uICkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIGZ1bGxQYWdlICkge1xuXG4gICAgICAgICAgICB0aGlzLmVsZW1lbnRTaXplID0gJC5nZXRFbGVtZW50U2l6ZSggdGhpcy5lbGVtZW50ICk7XG4gICAgICAgICAgICB0aGlzLnBhZ2VTY3JvbGwgPSAkLmdldFBhZ2VTY3JvbGwoKTtcblxuICAgICAgICAgICAgdGhpcy5lbGVtZW50TWFyZ2luID0gdGhpcy5lbGVtZW50LnN0eWxlLm1hcmdpbjtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5zdHlsZS5tYXJnaW4gPSBcIjBcIjtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudFBhZGRpbmcgPSB0aGlzLmVsZW1lbnQuc3R5bGUucGFkZGluZztcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5zdHlsZS5wYWRkaW5nID0gXCIwXCI7XG5cbiAgICAgICAgICAgIHRoaXMuYm9keU1hcmdpbiA9IGJvZHlTdHlsZS5tYXJnaW47XG4gICAgICAgICAgICB0aGlzLmRvY01hcmdpbiA9IGRvY1N0eWxlLm1hcmdpbjtcbiAgICAgICAgICAgIGJvZHlTdHlsZS5tYXJnaW4gPSBcIjBcIjtcbiAgICAgICAgICAgIGRvY1N0eWxlLm1hcmdpbiA9IFwiMFwiO1xuXG4gICAgICAgICAgICB0aGlzLmJvZHlQYWRkaW5nID0gYm9keVN0eWxlLnBhZGRpbmc7XG4gICAgICAgICAgICB0aGlzLmRvY1BhZGRpbmcgPSBkb2NTdHlsZS5wYWRkaW5nO1xuICAgICAgICAgICAgYm9keVN0eWxlLnBhZGRpbmcgPSBcIjBcIjtcbiAgICAgICAgICAgIGRvY1N0eWxlLnBhZGRpbmcgPSBcIjBcIjtcblxuICAgICAgICAgICAgdGhpcy5ib2R5V2lkdGggPSBib2R5U3R5bGUud2lkdGg7XG4gICAgICAgICAgICB0aGlzLmRvY1dpZHRoID0gZG9jU3R5bGUud2lkdGg7XG4gICAgICAgICAgICBib2R5U3R5bGUud2lkdGggPSBcIjEwMCVcIjtcbiAgICAgICAgICAgIGRvY1N0eWxlLndpZHRoID0gXCIxMDAlXCI7XG5cbiAgICAgICAgICAgIHRoaXMuYm9keUhlaWdodCA9IGJvZHlTdHlsZS5oZWlnaHQ7XG4gICAgICAgICAgICB0aGlzLmRvY0hlaWdodCA9IGRvY1N0eWxlLmhlaWdodDtcbiAgICAgICAgICAgIGJvZHlTdHlsZS5oZWlnaHQgPSBcIjEwMCVcIjtcbiAgICAgICAgICAgIGRvY1N0eWxlLmhlaWdodCA9IFwiMTAwJVwiO1xuXG4gICAgICAgICAgICAvL3doZW4gZW50ZXJpbmcgZnVsbCBzY3JlZW4gb24gdGhlIGlwYWQgaXQgd2FzbnQgc3VmZmljaWVudCB0byBsZWF2ZVxuICAgICAgICAgICAgLy90aGUgYm9keSBpbnRhY3QgYXMgb25seSBvbmx5IHRoZSB0b3AgaGFsZiBvZiB0aGUgc2NyZWVuIHdvdWxkXG4gICAgICAgICAgICAvL3Jlc3BvbmQgdG8gdG91Y2ggZXZlbnRzIG9uIHRoZSBjYW52YXMsIHdoaWxlIHRoZSBib3R0b20gaGFsZiB0cmVhdGVkXG4gICAgICAgICAgICAvL3RoZW0gYXMgdG91Y2ggZXZlbnRzIG9uIHRoZSBkb2N1bWVudCBib2R5LiAgVGh1cyB3ZSByZW1vdmUgYW5kIHN0b3JlXG4gICAgICAgICAgICAvL3RoZSBib2RpZXMgZWxlbWVudHMgYW5kIHJlcGxhY2UgdGhlbSB3aGVuIHdlIGxlYXZlIGZ1bGwgc2NyZWVuLlxuICAgICAgICAgICAgdGhpcy5wcmV2aW91c0JvZHkgPSBbXTtcbiAgICAgICAgICAgIFRISVNbIHRoaXMuaGFzaCBdLnByZXZFbGVtZW50UGFyZW50ID0gdGhpcy5lbGVtZW50LnBhcmVudE5vZGU7XG4gICAgICAgICAgICBUSElTWyB0aGlzLmhhc2ggXS5wcmV2TmV4dFNpYmxpbmcgPSB0aGlzLmVsZW1lbnQubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICBUSElTWyB0aGlzLmhhc2ggXS5wcmV2RWxlbWVudFdpZHRoID0gdGhpcy5lbGVtZW50LnN0eWxlLndpZHRoO1xuICAgICAgICAgICAgVEhJU1sgdGhpcy5oYXNoIF0ucHJldkVsZW1lbnRIZWlnaHQgPSB0aGlzLmVsZW1lbnQuc3R5bGUuaGVpZ2h0O1xuICAgICAgICAgICAgbm9kZXMgPSBib2R5LmNoaWxkTm9kZXMubGVuZ3RoO1xuICAgICAgICAgICAgZm9yICggaSA9IDA7IGkgPCBub2RlczsgaSsrICkge1xuICAgICAgICAgICAgICAgIHRoaXMucHJldmlvdXNCb2R5LnB1c2goIGJvZHkuY2hpbGROb2Rlc1sgMCBdICk7XG4gICAgICAgICAgICAgICAgYm9keS5yZW1vdmVDaGlsZCggYm9keS5jaGlsZE5vZGVzWyAwIF0gKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy9JZiB3ZSd2ZSBnb3QgYSB0b29sYmFyLCB3ZSBuZWVkIHRvIGVuYWJsZSB0aGUgdXNlciB0byB1c2UgY3NzIHRvXG4gICAgICAgICAgICAvL3ByZXNlcnZlIGl0IGluIGZ1bGxwYWdlIG1vZGVcbiAgICAgICAgICAgIGlmICggdGhpcy50b29sYmFyICYmIHRoaXMudG9vbGJhci5lbGVtZW50ICkge1xuICAgICAgICAgICAgICAgIC8vc2F2ZSBhIHJlZmVyZW5jZSB0byB0aGUgcGFyZW50IHNvIHdlIGNhbiBwdXQgaXQgYmFja1xuICAgICAgICAgICAgICAgIC8vaW4gdGhlIGxvbmcgcnVuIHdlIG5lZWQgYSBiZXR0ZXIgc3RyYXRlZ3lcbiAgICAgICAgICAgICAgICB0aGlzLnRvb2xiYXIucGFyZW50Tm9kZSA9IHRoaXMudG9vbGJhci5lbGVtZW50LnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgdGhpcy50b29sYmFyLm5leHRTaWJsaW5nID0gdGhpcy50b29sYmFyLmVsZW1lbnQubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgYm9keS5hcHBlbmRDaGlsZCggdGhpcy50b29sYmFyLmVsZW1lbnQgKTtcblxuICAgICAgICAgICAgICAgIC8vTWFrZSBzdXJlIHRoZSB1c2VyIGhhcyBzb21lIGFiaWxpdHkgdG8gc3R5bGUgdGhlIHRvb2xiYXIgYmFzZWRcbiAgICAgICAgICAgICAgICAvL29uIHRoZSBtb2RlXG4gICAgICAgICAgICAgICAgJC5hZGRDbGFzcyggdGhpcy50b29sYmFyLmVsZW1lbnQsICdmdWxscGFnZScgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgJC5hZGRDbGFzcyggdGhpcy5lbGVtZW50LCAnZnVsbHBhZ2UnICk7XG4gICAgICAgICAgICBib2R5LmFwcGVuZENoaWxkKCB0aGlzLmVsZW1lbnQgKTtcblxuICAgICAgICAgICAgdGhpcy5lbGVtZW50LnN0eWxlLmhlaWdodCA9ICQuZ2V0V2luZG93U2l6ZSgpLnkgKyAncHgnO1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50LnN0eWxlLndpZHRoID0gJC5nZXRXaW5kb3dTaXplKCkueCArICdweCc7XG5cbiAgICAgICAgICAgIGlmICggdGhpcy50b29sYmFyICYmIHRoaXMudG9vbGJhci5lbGVtZW50ICkge1xuICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5zdHlsZS5oZWlnaHQgPSAoXG4gICAgICAgICAgICAgICAgICAgICQuZ2V0RWxlbWVudFNpemUoIHRoaXMuZWxlbWVudCApLnkgLSAkLmdldEVsZW1lbnRTaXplKCB0aGlzLnRvb2xiYXIuZWxlbWVudCApLnlcbiAgICAgICAgICAgICAgICApICsgJ3B4JztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgVEhJU1sgdGhpcy5oYXNoIF0uZnVsbFBhZ2UgPSB0cnVlO1xuXG4gICAgICAgICAgICAvLyBtb3VzZSB3aWxsIGJlIGluc2lkZSBjb250YWluZXIgbm93XG4gICAgICAgICAgICAkLmRlbGVnYXRlKCB0aGlzLCBvbkNvbnRhaW5lckVudGVyICkoIHt9ICk7XG5cbiAgICAgICAgfSBlbHNlIHtcblxuICAgICAgICAgICAgdGhpcy5lbGVtZW50LnN0eWxlLm1hcmdpbiA9IHRoaXMuZWxlbWVudE1hcmdpbjtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5zdHlsZS5wYWRkaW5nID0gdGhpcy5lbGVtZW50UGFkZGluZztcblxuICAgICAgICAgICAgYm9keVN0eWxlLm1hcmdpbiA9IHRoaXMuYm9keU1hcmdpbjtcbiAgICAgICAgICAgIGRvY1N0eWxlLm1hcmdpbiA9IHRoaXMuZG9jTWFyZ2luO1xuXG4gICAgICAgICAgICBib2R5U3R5bGUucGFkZGluZyA9IHRoaXMuYm9keVBhZGRpbmc7XG4gICAgICAgICAgICBkb2NTdHlsZS5wYWRkaW5nID0gdGhpcy5kb2NQYWRkaW5nO1xuXG4gICAgICAgICAgICBib2R5U3R5bGUud2lkdGggPSB0aGlzLmJvZHlXaWR0aDtcbiAgICAgICAgICAgIGRvY1N0eWxlLndpZHRoID0gdGhpcy5kb2NXaWR0aDtcblxuICAgICAgICAgICAgYm9keVN0eWxlLmhlaWdodCA9IHRoaXMuYm9keUhlaWdodDtcbiAgICAgICAgICAgIGRvY1N0eWxlLmhlaWdodCA9IHRoaXMuZG9jSGVpZ2h0O1xuXG4gICAgICAgICAgICBib2R5LnJlbW92ZUNoaWxkKCB0aGlzLmVsZW1lbnQgKTtcbiAgICAgICAgICAgIG5vZGVzID0gdGhpcy5wcmV2aW91c0JvZHkubGVuZ3RoO1xuICAgICAgICAgICAgZm9yICggaSA9IDA7IGkgPCBub2RlczsgaSsrICkge1xuICAgICAgICAgICAgICAgIGJvZHkuYXBwZW5kQ2hpbGQoIHRoaXMucHJldmlvdXNCb2R5LnNoaWZ0KCkgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgJC5yZW1vdmVDbGFzcyggdGhpcy5lbGVtZW50LCAnZnVsbHBhZ2UnICk7XG4gICAgICAgICAgICBUSElTWyB0aGlzLmhhc2ggXS5wcmV2RWxlbWVudFBhcmVudC5pbnNlcnRCZWZvcmUoXG4gICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50LFxuICAgICAgICAgICAgICAgIFRISVNbIHRoaXMuaGFzaCBdLnByZXZOZXh0U2libGluZ1xuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgLy9JZiB3ZSd2ZSBnb3QgYSB0b29sYmFyLCB3ZSBuZWVkIHRvIGVuYWJsZSB0aGUgdXNlciB0byB1c2UgY3NzIHRvXG4gICAgICAgICAgICAvL3Jlc2V0IGl0IHRvIGl0cyBvcmlnaW5hbCBzdGF0ZVxuICAgICAgICAgICAgaWYgKCB0aGlzLnRvb2xiYXIgJiYgdGhpcy50b29sYmFyLmVsZW1lbnQgKSB7XG4gICAgICAgICAgICAgICAgYm9keS5yZW1vdmVDaGlsZCggdGhpcy50b29sYmFyLmVsZW1lbnQgKTtcblxuICAgICAgICAgICAgICAgIC8vTWFrZSBzdXJlIHRoZSB1c2VyIGhhcyBzb21lIGFiaWxpdHkgdG8gc3R5bGUgdGhlIHRvb2xiYXIgYmFzZWRcbiAgICAgICAgICAgICAgICAvL29uIHRoZSBtb2RlXG4gICAgICAgICAgICAgICAgJC5yZW1vdmVDbGFzcyggdGhpcy50b29sYmFyLmVsZW1lbnQsICdmdWxscGFnZScgKTtcblxuICAgICAgICAgICAgICAgIHRoaXMudG9vbGJhci5wYXJlbnROb2RlLmluc2VydEJlZm9yZShcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b29sYmFyLmVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG9vbGJhci5uZXh0U2libGluZ1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMudG9vbGJhci5wYXJlbnROb2RlO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnRvb2xiYXIubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5zdHlsZS53aWR0aCA9IFRISVNbIHRoaXMuaGFzaCBdLnByZXZFbGVtZW50V2lkdGg7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gVEhJU1sgdGhpcy5oYXNoIF0ucHJldkVsZW1lbnRIZWlnaHQ7XG5cbiAgICAgICAgICAgIC8vIEFmdGVyIGV4aXRpbmcgZnVsbFBhZ2Ugb3IgZnVsbFNjcmVlbiwgaXQgY2FuIHRha2Ugc29tZSB0aW1lXG4gICAgICAgICAgICAvLyBiZWZvcmUgdGhlIGJyb3dzZXIgY2FuIGFjdHVhbGx5IHNldCB0aGUgc2Nyb2xsLlxuICAgICAgICAgICAgdmFyIHJlc3RvcmVTY3JvbGxDb3VudGVyID0gMDtcbiAgICAgICAgICAgIHZhciByZXN0b3JlU2Nyb2xsID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgJC5zZXRQYWdlU2Nyb2xsKCBfdGhpcy5wYWdlU2Nyb2xsICk7XG4gICAgICAgICAgICAgICAgdmFyIHBhZ2VTY3JvbGwgPSAkLmdldFBhZ2VTY3JvbGwoKTtcbiAgICAgICAgICAgICAgICByZXN0b3JlU2Nyb2xsQ291bnRlcisrO1xuICAgICAgICAgICAgICAgIGlmICggcmVzdG9yZVNjcm9sbENvdW50ZXIgPCAxMCAmJlxuICAgICAgICAgICAgICAgICAgICBwYWdlU2Nyb2xsLnggIT09IF90aGlzLnBhZ2VTY3JvbGwueCB8fFxuICAgICAgICAgICAgICAgICAgICBwYWdlU2Nyb2xsLnkgIT09IF90aGlzLnBhZ2VTY3JvbGwueSApIHtcbiAgICAgICAgICAgICAgICAgICAgJC5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoIHJlc3RvcmVTY3JvbGwgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgJC5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoIHJlc3RvcmVTY3JvbGwgKTtcblxuICAgICAgICAgICAgVEhJU1sgdGhpcy5oYXNoIF0uZnVsbFBhZ2UgPSBmYWxzZTtcblxuICAgICAgICAgICAgLy8gbW91c2Ugd2lsbCBsaWtlbHkgYmUgb3V0c2lkZSBub3dcbiAgICAgICAgICAgICQuZGVsZWdhdGUoIHRoaXMsIG9uQ29udGFpbmVyRXhpdCApKCB7IH0gKTtcblxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCB0aGlzLm5hdmlnYXRvciAmJiB0aGlzLnZpZXdwb3J0ICkge1xuICAgICAgICAgICAgdGhpcy5uYXZpZ2F0b3IudXBkYXRlKCB0aGlzLnZpZXdwb3J0ICk7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogUmFpc2VkIHdoZW4gdGhlIHZpZXdlciBoYXMgY2hhbmdlZCB0by9mcm9tIGZ1bGwtcGFnZSBtb2RlIChzZWUge0BsaW5rIE9wZW5TZWFkcmFnb24uVmlld2VyI3NldEZ1bGxQYWdlfSkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBldmVudCBmdWxsLXBhZ2VcbiAgICAgICAgICogQG1lbWJlcm9mIE9wZW5TZWFkcmFnb24uVmlld2VyXG4gICAgICAgICAqIEB0eXBlIHtvYmplY3R9XG4gICAgICAgICAqIEBwcm9wZXJ0eSB7T3BlblNlYWRyYWdvbi5WaWV3ZXJ9IGV2ZW50U291cmNlIC0gQSByZWZlcmVuY2UgdG8gdGhlIFZpZXdlciB3aGljaCByYWlzZWQgdGhlIGV2ZW50LlxuICAgICAgICAgKiBAcHJvcGVydHkge0Jvb2xlYW59IGZ1bGxQYWdlIC0gVHJ1ZSBpZiBjaGFuZ2VkIHRvIGZ1bGwtcGFnZSBtb2RlLCBmYWxzZSBpZiBleGl0ZWQgZnVsbC1wYWdlIG1vZGUuXG4gICAgICAgICAqIEBwcm9wZXJ0eSB7P09iamVjdH0gdXNlckRhdGEgLSBBcmJpdHJhcnkgc3Vic2NyaWJlci1kZWZpbmVkIG9iamVjdC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMucmFpc2VFdmVudCggJ2Z1bGwtcGFnZScsIHsgZnVsbFBhZ2U6IGZ1bGxQYWdlIH0gKTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogVG9nZ2xlIGZ1bGwgc2NyZWVuIG1vZGUgaWYgc3VwcG9ydGVkLiBUb2dnbGUgZnVsbCBwYWdlIG1vZGUgb3RoZXJ3aXNlLlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gZnVsbFNjcmVlblxuICAgICAqICAgICAgSWYgdHJ1ZSwgZW50ZXIgZnVsbCBzY3JlZW4gbW9kZS4gIElmIGZhbHNlLCBleGl0IGZ1bGwgc2NyZWVuIG1vZGUuXG4gICAgICogQHJldHVybiB7T3BlblNlYWRyYWdvbi5WaWV3ZXJ9IENoYWluYWJsZS5cbiAgICAgKiBAZmlyZXMgT3BlblNlYWRyYWdvbi5WaWV3ZXIuZXZlbnQ6cHJlLWZ1bGwtc2NyZWVuXG4gICAgICogQGZpcmVzIE9wZW5TZWFkcmFnb24uVmlld2VyLmV2ZW50OmZ1bGwtc2NyZWVuXG4gICAgICovXG4gICAgc2V0RnVsbFNjcmVlbjogZnVuY3Rpb24oIGZ1bGxTY3JlZW4gKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgICAgaWYgKCAhJC5zdXBwb3J0c0Z1bGxTY3JlZW4gKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zZXRGdWxsUGFnZSggZnVsbFNjcmVlbiApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCAkLmlzRnVsbFNjcmVlbigpID09PSBmdWxsU2NyZWVuICkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZnVsbFNjcmVlRXZlbnRBcmdzID0ge1xuICAgICAgICAgICAgZnVsbFNjcmVlbjogZnVsbFNjcmVlbixcbiAgICAgICAgICAgIHByZXZlbnREZWZhdWx0QWN0aW9uOiBmYWxzZVxuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogUmFpc2VkIHdoZW4gdGhlIHZpZXdlciBpcyBhYm91dCB0byBjaGFuZ2UgdG8vZnJvbSBmdWxsLXNjcmVlbiBtb2RlIChzZWUge0BsaW5rIE9wZW5TZWFkcmFnb24uVmlld2VyI3NldEZ1bGxTY3JlZW59KS5cbiAgICAgICAgICogTm90ZTogdGhlIHByZS1mdWxsLXNjcmVlbiBldmVudCBpcyBub3QgcmFpc2VkIHdoZW4gdGhlIHVzZXIgaXMgZXhpdGluZ1xuICAgICAgICAgKiBmdWxsLXNjcmVlbiBtb2RlIGJ5IHByZXNzaW5nIHRoZSBFc2Mga2V5LiBJbiB0aGF0IGNhc2UsIGNvbnNpZGVyIHVzaW5nXG4gICAgICAgICAqIHRoZSBmdWxsLXNjcmVlbiwgcHJlLWZ1bGwtcGFnZSBvciBmdWxsLXBhZ2UgZXZlbnRzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXZlbnQgcHJlLWZ1bGwtc2NyZWVuXG4gICAgICAgICAqIEBtZW1iZXJvZiBPcGVuU2VhZHJhZ29uLlZpZXdlclxuICAgICAgICAgKiBAdHlwZSB7b2JqZWN0fVxuICAgICAgICAgKiBAcHJvcGVydHkge09wZW5TZWFkcmFnb24uVmlld2VyfSBldmVudFNvdXJjZSAtIEEgcmVmZXJlbmNlIHRvIHRoZSBWaWV3ZXIgd2hpY2ggcmFpc2VkIHRoZSBldmVudC5cbiAgICAgICAgICogQHByb3BlcnR5IHtCb29sZWFufSBmdWxsU2NyZWVuIC0gVHJ1ZSBpZiBlbnRlcmluZyBmdWxsLXNjcmVlbiBtb2RlLCBmYWxzZSBpZiBleGl0aW5nIGZ1bGwtc2NyZWVuIG1vZGUuXG4gICAgICAgICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gcHJldmVudERlZmF1bHRBY3Rpb24gLSBTZXQgdG8gdHJ1ZSB0byBwcmV2ZW50IGZ1bGwtc2NyZWVuIG1vZGUgY2hhbmdlLiBEZWZhdWx0OiBmYWxzZS5cbiAgICAgICAgICogQHByb3BlcnR5IHs/T2JqZWN0fSB1c2VyRGF0YSAtIEFyYml0cmFyeSBzdWJzY3JpYmVyLWRlZmluZWQgb2JqZWN0LlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5yYWlzZUV2ZW50KCAncHJlLWZ1bGwtc2NyZWVuJywgZnVsbFNjcmVlRXZlbnRBcmdzICk7XG4gICAgICAgIGlmICggZnVsbFNjcmVlRXZlbnRBcmdzLnByZXZlbnREZWZhdWx0QWN0aW9uICkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIGZ1bGxTY3JlZW4gKSB7XG5cbiAgICAgICAgICAgIHRoaXMuc2V0RnVsbFBhZ2UoIHRydWUgKTtcbiAgICAgICAgICAgIC8vIElmIHRoZSBmdWxsIHBhZ2UgbW9kZSBpcyBub3QgYWN0dWFsbHkgZW50ZXJlZCwgd2UgbmVlZCB0byBwcmV2ZW50XG4gICAgICAgICAgICAvLyB0aGUgZnVsbCBzY3JlZW4gbW9kZS5cbiAgICAgICAgICAgIGlmICggIXRoaXMuaXNGdWxsUGFnZSgpICkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmZ1bGxQYWdlU3R5bGVXaWR0aCA9IHRoaXMuZWxlbWVudC5zdHlsZS53aWR0aDtcbiAgICAgICAgICAgIHRoaXMuZnVsbFBhZ2VTdHlsZUhlaWdodCA9IHRoaXMuZWxlbWVudC5zdHlsZS5oZWlnaHQ7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUud2lkdGggPSAnMTAwJSc7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gJzEwMCUnO1xuXG4gICAgICAgICAgICB2YXIgb25GdWxsU2NyZWVuQ2hhbmdlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgdmFyIGlzRnVsbFNjcmVlbiA9ICQuaXNGdWxsU2NyZWVuKCk7XG4gICAgICAgICAgICAgICAgaWYgKCAhaXNGdWxsU2NyZWVuICkge1xuICAgICAgICAgICAgICAgICAgICAkLnJlbW92ZUV2ZW50KCBkb2N1bWVudCwgJC5mdWxsU2NyZWVuRXZlbnROYW1lLCBvbkZ1bGxTY3JlZW5DaGFuZ2UgKTtcbiAgICAgICAgICAgICAgICAgICAgJC5yZW1vdmVFdmVudCggZG9jdW1lbnQsICQuZnVsbFNjcmVlbkVycm9yRXZlbnROYW1lLCBvbkZ1bGxTY3JlZW5DaGFuZ2UgKTtcblxuICAgICAgICAgICAgICAgICAgICBfdGhpcy5zZXRGdWxsUGFnZSggZmFsc2UgKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCBfdGhpcy5pc0Z1bGxQYWdlKCkgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5lbGVtZW50LnN0eWxlLndpZHRoID0gX3RoaXMuZnVsbFBhZ2VTdHlsZVdpZHRoO1xuICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuZWxlbWVudC5zdHlsZS5oZWlnaHQgPSBfdGhpcy5mdWxsUGFnZVN0eWxlSGVpZ2h0O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICggX3RoaXMubmF2aWdhdG9yICYmIF90aGlzLnZpZXdwb3J0ICkge1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy5uYXZpZ2F0b3IudXBkYXRlKCBfdGhpcy52aWV3cG9ydCApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgKiBSYWlzZWQgd2hlbiB0aGUgdmlld2VyIGhhcyBjaGFuZ2VkIHRvL2Zyb20gZnVsbC1zY3JlZW4gbW9kZSAoc2VlIHtAbGluayBPcGVuU2VhZHJhZ29uLlZpZXdlciNzZXRGdWxsU2NyZWVufSkuXG4gICAgICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAgICAgKiBAZXZlbnQgZnVsbC1zY3JlZW5cbiAgICAgICAgICAgICAgICAgKiBAbWVtYmVyb2YgT3BlblNlYWRyYWdvbi5WaWV3ZXJcbiAgICAgICAgICAgICAgICAgKiBAdHlwZSB7b2JqZWN0fVxuICAgICAgICAgICAgICAgICAqIEBwcm9wZXJ0eSB7T3BlblNlYWRyYWdvbi5WaWV3ZXJ9IGV2ZW50U291cmNlIC0gQSByZWZlcmVuY2UgdG8gdGhlIFZpZXdlciB3aGljaCByYWlzZWQgdGhlIGV2ZW50LlxuICAgICAgICAgICAgICAgICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gZnVsbFNjcmVlbiAtIFRydWUgaWYgY2hhbmdlZCB0byBmdWxsLXNjcmVlbiBtb2RlLCBmYWxzZSBpZiBleGl0ZWQgZnVsbC1zY3JlZW4gbW9kZS5cbiAgICAgICAgICAgICAgICAgKiBAcHJvcGVydHkgez9PYmplY3R9IHVzZXJEYXRhIC0gQXJiaXRyYXJ5IHN1YnNjcmliZXItZGVmaW5lZCBvYmplY3QuXG4gICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgX3RoaXMucmFpc2VFdmVudCggJ2Z1bGwtc2NyZWVuJywgeyBmdWxsU2NyZWVuOiBpc0Z1bGxTY3JlZW4gfSApO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICQuYWRkRXZlbnQoIGRvY3VtZW50LCAkLmZ1bGxTY3JlZW5FdmVudE5hbWUsIG9uRnVsbFNjcmVlbkNoYW5nZSApO1xuICAgICAgICAgICAgJC5hZGRFdmVudCggZG9jdW1lbnQsICQuZnVsbFNjcmVlbkVycm9yRXZlbnROYW1lLCBvbkZ1bGxTY3JlZW5DaGFuZ2UgKTtcblxuICAgICAgICAgICAgJC5yZXF1ZXN0RnVsbFNjcmVlbiggZG9jdW1lbnQuYm9keSApO1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAkLmV4aXRGdWxsU2NyZWVuKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgaXNWaXNpYmxlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRhaW5lci5zdHlsZS52aXNpYmlsaXR5ICE9IFwiaGlkZGVuXCI7XG4gICAgfSxcblxuXG4gICAgLyoqXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtCb29sZWFufSB2aXNpYmxlXG4gICAgICogQHJldHVybiB7T3BlblNlYWRyYWdvbi5WaWV3ZXJ9IENoYWluYWJsZS5cbiAgICAgKiBAZmlyZXMgT3BlblNlYWRyYWdvbi5WaWV3ZXIuZXZlbnQ6dmlzaWJsZVxuICAgICAqL1xuICAgIHNldFZpc2libGU6IGZ1bmN0aW9uKCB2aXNpYmxlICl7XG4gICAgICAgIHRoaXMuY29udGFpbmVyLnN0eWxlLnZpc2liaWxpdHkgPSB2aXNpYmxlID8gXCJcIiA6IFwiaGlkZGVuXCI7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSYWlzZWQgd2hlbiB0aGUgdmlld2VyIGlzIHNob3duIG9yIGhpZGRlbiAoc2VlIHtAbGluayBPcGVuU2VhZHJhZ29uLlZpZXdlciNzZXRWaXNpYmxlfSkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBldmVudCB2aXNpYmxlXG4gICAgICAgICAqIEBtZW1iZXJvZiBPcGVuU2VhZHJhZ29uLlZpZXdlclxuICAgICAgICAgKiBAdHlwZSB7b2JqZWN0fVxuICAgICAgICAgKiBAcHJvcGVydHkge09wZW5TZWFkcmFnb24uVmlld2VyfSBldmVudFNvdXJjZSAtIEEgcmVmZXJlbmNlIHRvIHRoZSBWaWV3ZXIgd2hpY2ggcmFpc2VkIHRoZSBldmVudC5cbiAgICAgICAgICogQHByb3BlcnR5IHtCb29sZWFufSB2aXNpYmxlXG4gICAgICAgICAqIEBwcm9wZXJ0eSB7P09iamVjdH0gdXNlckRhdGEgLSBBcmJpdHJhcnkgc3Vic2NyaWJlci1kZWZpbmVkIG9iamVjdC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMucmFpc2VFdmVudCggJ3Zpc2libGUnLCB7IHZpc2libGU6IHZpc2libGUgfSApO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQWRkIGEgdGlsZWQgaW1hZ2UgdG8gdGhlIHZpZXdlci5cbiAgICAgKiBvcHRpb25zLnRpbGVTb3VyY2UgY2FuIGJlIGFueXRoaW5nIHRoYXQge0BsaW5rIE9wZW5TZWFkcmFnb24uVmlld2VyI29wZW59XG4gICAgICogIHN1cHBvcnRzIGV4Y2VwdCBhcnJheXMgb2YgaW1hZ2VzLlxuICAgICAqIE5vdGUgdGhhdCB5b3UgY2FuIHNwZWNpZnkgb3B0aW9ucy53aWR0aCBvciBvcHRpb25zLmhlaWdodCwgYnV0IG5vdCBib3RoLlxuICAgICAqIFRoZSBvdGhlciBkaW1lbnNpb24gd2lsbCBiZSBjYWxjdWxhdGVkIGFjY29yZGluZyB0byB0aGUgaXRlbSdzIGFzcGVjdCByYXRpby5cbiAgICAgKiBJZiBjb2xsZWN0aW9uTW9kZSBpcyBvbiAoc2VlIHtAbGluayBPcGVuU2VhZHJhZ29uLk9wdGlvbnN9KSwgdGhlIG5ldyBpbWFnZSBpc1xuICAgICAqIGF1dG9tYXRpY2FsbHkgYXJyYW5nZWQgd2l0aCB0aGUgb3RoZXJzLlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gICAgICogQHBhcmFtIHtTdHJpbmd8T2JqZWN0fEZ1bmN0aW9ufSBvcHRpb25zLnRpbGVTb3VyY2UgLSBUaGUgVGlsZVNvdXJjZSBzcGVjaWZpZXIuXG4gICAgICogQSBTdHJpbmcgaW1wbGllcyBhIHVybCB1c2VkIHRvIGRldGVybWluZSB0aGUgdGlsZVNvdXJjZSBpbXBsZW1lbnRhdGlvblxuICAgICAqICAgICAgYmFzZWQgb24gdGhlIGZpbGUgZXh0ZW5zaW9uIG9mIHVybC4gSlNPTlAgaXMgaW1wbGllZCBieSAqLmpzLFxuICAgICAqICAgICAgb3RoZXJ3aXNlIHRoZSB1cmwgaXMgcmV0cmlldmVkIGFzIHRleHQgYW5kIHRoZSByZXN1bHRpbmcgdGV4dCBpc1xuICAgICAqICAgICAgaW50cm9zcGVjdGVkIHRvIGRldGVybWluZSBpZiBpdHMganNvbiwgeG1sLCBvciB0ZXh0IGFuZCBwYXJzZWQuXG4gICAgICogQW4gT2JqZWN0IGltcGxpZXMgYW4gaW5saW5lIGNvbmZpZ3VyYXRpb24gd2hpY2ggaGFzIGEgc2luZ2xlXG4gICAgICogICAgICBwcm9wZXJ0eSBzdWZmaWNpZW50IGZvciBiZWluZyBhYmxlIHRvIGRldGVybWluZSB0aWxlU291cmNlXG4gICAgICogICAgICBpbXBsZW1lbnRhdGlvbi4gSWYgdGhlIG9iamVjdCBoYXMgYSBwcm9wZXJ0eSB3aGljaCBpcyBhIGZ1bmN0aW9uXG4gICAgICogICAgICBuYW1lZCAnZ2V0VGlsZVVybCcsIGl0IGlzIHRyZWF0ZWQgYXMgYSBjdXN0b20gVGlsZVNvdXJjZS5cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuaW5kZXhdIFRoZSBpbmRleCBvZiB0aGUgaXRlbS4gQWRkZWQgb24gdG9wIG9mXG4gICAgICogYWxsIG90aGVyIGl0ZW1zIGlmIG5vdCBzcGVjaWZpZWQuXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5yZXBsYWNlPWZhbHNlXSBJZiB0cnVlLCB0aGUgaXRlbSBhdCBvcHRpb25zLmluZGV4IHdpbGwgYmVcbiAgICAgKiByZW1vdmVkIGFuZCB0aGUgbmV3IGl0ZW0gaXMgYWRkZWQgaW4gaXRzIHBsYWNlLiBvcHRpb25zLnRpbGVTb3VyY2Ugd2lsbCBiZVxuICAgICAqIGludGVycHJldGVkIGFuZCBmZXRjaGVkIGlmIG5lY2Vzc2FyeSBiZWZvcmUgdGhlIG9sZCBpdGVtIGlzIHJlbW92ZWQgdG8gYXZvaWQgbGVhdmluZ1xuICAgICAqIGEgZ2FwIGluIHRoZSB3b3JsZC5cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMueD0wXSBUaGUgWCBwb3NpdGlvbiBmb3IgdGhlIGltYWdlIGluIHZpZXdwb3J0IGNvb3JkaW5hdGVzLlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy55PTBdIFRoZSBZIHBvc2l0aW9uIGZvciB0aGUgaW1hZ2UgaW4gdmlld3BvcnQgY29vcmRpbmF0ZXMuXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLndpZHRoPTFdIFRoZSB3aWR0aCBmb3IgdGhlIGltYWdlIGluIHZpZXdwb3J0IGNvb3JkaW5hdGVzLlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5oZWlnaHRdIFRoZSBoZWlnaHQgZm9yIHRoZSBpbWFnZSBpbiB2aWV3cG9ydCBjb29yZGluYXRlcy5cbiAgICAgKiBAcGFyYW0ge09wZW5TZWFkcmFnb24uUmVjdH0gW29wdGlvbnMuZml0Qm91bmRzXSBUaGUgYm91bmRzIGluIHZpZXdwb3J0IGNvb3JkaW5hdGVzXG4gICAgICogdG8gZml0IHRoZSBpbWFnZSBpbnRvLiBJZiBzcGVjaWZpZWQsIHgsIHksIHdpZHRoIGFuZCBoZWlnaHQgZ2V0IGlnbm9yZWQuXG4gICAgICogQHBhcmFtIHtPcGVuU2VhZHJhZ29uLlBsYWNlbWVudH0gW29wdGlvbnMuZml0Qm91bmRzUGxhY2VtZW50PU9wZW5TZWFkcmFnb24uUGxhY2VtZW50LkNFTlRFUl1cbiAgICAgKiBIb3cgdG8gYW5jaG9yIHRoZSBpbWFnZSBpbiB0aGUgYm91bmRzIGlmIG9wdGlvbnMuZml0Qm91bmRzIGlzIHNldC5cbiAgICAgKiBAcGFyYW0ge09wZW5TZWFkcmFnb24uUmVjdH0gW29wdGlvbnMuY2xpcF0gLSBBbiBhcmVhLCBpbiBpbWFnZSBwaXhlbHMsIHRvIGNsaXAgdG9cbiAgICAgKiAocG9ydGlvbnMgb2YgdGhlIGltYWdlIG91dHNpZGUgb2YgdGhpcyBhcmVhIHdpbGwgbm90IGJlIHZpc2libGUpLiBPbmx5IHdvcmtzIG9uXG4gICAgICogYnJvd3NlcnMgdGhhdCBzdXBwb3J0IHRoZSBIVE1MNSBjYW52YXMuXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLm9wYWNpdHldIE9wYWNpdHkgdGhlIHRpbGVkIGltYWdlIHNob3VsZCBiZSBkcmF3biBhdCBieSBkZWZhdWx0LlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5jb21wb3NpdGVPcGVyYXRpb25dIEhvdyB0aGUgaW1hZ2UgaXMgY29tcG9zaXRlZCBvbnRvIG90aGVyIGltYWdlcy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5zdWNjZXNzXSBBIGZ1bmN0aW9uIHRoYXQgZ2V0cyBjYWxsZWQgd2hlbiB0aGUgaW1hZ2UgaXNcbiAgICAgKiBzdWNjZXNzZnVsbHkgYWRkZWQuIEl0J3MgcGFzc2VkIHRoZSBldmVudCBvYmplY3Qgd2hpY2ggY29udGFpbnMgYSBzaW5nbGUgcHJvcGVydHk6XG4gICAgICogXCJpdGVtXCIsIHRoZSByZXN1bHRpbmcgVGlsZWRJbWFnZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5lcnJvcl0gQSBmdW5jdGlvbiB0aGF0IGdldHMgY2FsbGVkIGlmIHRoZSBpbWFnZSBpc1xuICAgICAqIHVuYWJsZSB0byBiZSBhZGRlZC4gSXQncyBwYXNzZWQgdGhlIGVycm9yIGV2ZW50IG9iamVjdCwgd2hpY2ggY29udGFpbnMgXCJtZXNzYWdlXCJcbiAgICAgKiBhbmQgXCJzb3VyY2VcIiBwcm9wZXJ0aWVzLlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuY29sbGVjdGlvbkltbWVkaWF0ZWx5PWZhbHNlXSBJZiBjb2xsZWN0aW9uTW9kZSBpcyBvbixcbiAgICAgKiBzcGVjaWZpZXMgd2hldGhlciB0byBzbmFwIHRvIHRoZSBuZXcgYXJyYW5nZW1lbnQgaW1tZWRpYXRlbHkgb3IgdG8gYW5pbWF0ZSB0byBpdC5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ3xDYW52YXNHcmFkaWVudHxDYW52YXNQYXR0ZXJufEZ1bmN0aW9ufSBbb3B0aW9ucy5wbGFjZWhvbGRlckZpbGxTdHlsZV0gLSBTZWUge0BsaW5rIE9wZW5TZWFkcmFnb24uT3B0aW9uc30uXG4gICAgICogQGZpcmVzIE9wZW5TZWFkcmFnb24uV29ybGQuZXZlbnQ6YWRkLWl0ZW1cbiAgICAgKiBAZmlyZXMgT3BlblNlYWRyYWdvbi5WaWV3ZXIuZXZlbnQ6YWRkLWl0ZW0tZmFpbGVkXG4gICAgICovXG4gICAgYWRkVGlsZWRJbWFnZTogZnVuY3Rpb24oIG9wdGlvbnMgKSB7XG4gICAgICAgICQuY29uc29sZS5hc3NlcnQob3B0aW9ucywgXCJbVmlld2VyLmFkZFRpbGVkSW1hZ2VdIG9wdGlvbnMgaXMgcmVxdWlyZWRcIik7XG4gICAgICAgICQuY29uc29sZS5hc3NlcnQob3B0aW9ucy50aWxlU291cmNlLCBcIltWaWV3ZXIuYWRkVGlsZWRJbWFnZV0gb3B0aW9ucy50aWxlU291cmNlIGlzIHJlcXVpcmVkXCIpO1xuICAgICAgICAkLmNvbnNvbGUuYXNzZXJ0KCFvcHRpb25zLnJlcGxhY2UgfHwgKG9wdGlvbnMuaW5kZXggPiAtMSAmJiBvcHRpb25zLmluZGV4IDwgdGhpcy53b3JsZC5nZXRJdGVtQ291bnQoKSksXG4gICAgICAgICAgICBcIltWaWV3ZXIuYWRkVGlsZWRJbWFnZV0gaWYgb3B0aW9ucy5yZXBsYWNlIGlzIHVzZWQsIG9wdGlvbnMuaW5kZXggbXVzdCBiZSBhIHZhbGlkIGluZGV4IGluIFZpZXdlci53b3JsZFwiKTtcblxuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICAgIGlmIChvcHRpb25zLnJlcGxhY2UpIHtcbiAgICAgICAgICAgIG9wdGlvbnMucmVwbGFjZUl0ZW0gPSBfdGhpcy53b3JsZC5nZXRJdGVtQXQob3B0aW9ucy5pbmRleCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9oaWRlTWVzc2FnZSgpO1xuXG4gICAgICAgIGlmIChvcHRpb25zLnBsYWNlaG9sZGVyRmlsbFN0eWxlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG9wdGlvbnMucGxhY2Vob2xkZXJGaWxsU3R5bGUgPSB0aGlzLnBsYWNlaG9sZGVyRmlsbFN0eWxlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLm9wYWNpdHkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgb3B0aW9ucy5vcGFjaXR5ID0gdGhpcy5vcGFjaXR5O1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLmNvbXBvc2l0ZU9wZXJhdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBvcHRpb25zLmNvbXBvc2l0ZU9wZXJhdGlvbiA9IHRoaXMuY29tcG9zaXRlT3BlcmF0aW9uO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIG15UXVldWVJdGVtID0ge1xuICAgICAgICAgICAgb3B0aW9uczogb3B0aW9uc1xuICAgICAgICB9O1xuXG4gICAgICAgIGZ1bmN0aW9uIHJhaXNlQWRkSXRlbUZhaWxlZCggZXZlbnQgKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IF90aGlzLl9sb2FkUXVldWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoX3RoaXMuX2xvYWRRdWV1ZVtpXSA9PT0gbXlRdWV1ZUl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuX2xvYWRRdWV1ZS5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKF90aGlzLl9sb2FkUXVldWUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmVmcmVzaFdvcmxkKG15UXVldWVJdGVtKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogUmFpc2VkIHdoZW4gYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGFkZGluZyBhIGl0ZW0uXG4gICAgICAgICAgICAgKiBAZXZlbnQgYWRkLWl0ZW0tZmFpbGVkXG4gICAgICAgICAgICAgKiBAbWVtYmVyT2YgT3BlblNlYWRyYWdvbi5WaWV3ZXJcbiAgICAgICAgICAgICAqIEB0eXBlIHtvYmplY3R9XG4gICAgICAgICAgICAgKiBAcHJvcGVydHkge09wZW5TZWFkcmFnb24uVmlld2VyfSBldmVudFNvdXJjZSAtIEEgcmVmZXJlbmNlIHRvIHRoZSBWaWV3ZXIgd2hpY2ggcmFpc2VkIHRoZSBldmVudC5cbiAgICAgICAgICAgICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBtZXNzYWdlXG4gICAgICAgICAgICAgKiBAcHJvcGVydHkge1N0cmluZ30gc291cmNlXG4gICAgICAgICAgICAgKiBAcHJvcGVydHkge09iamVjdH0gb3B0aW9ucyBUaGUgb3B0aW9ucyBwYXNzZWQgdG8gdGhlIGFkZFRpbGVkSW1hZ2UgbWV0aG9kLlxuICAgICAgICAgICAgICogQHByb3BlcnR5IHs/T2JqZWN0fSB1c2VyRGF0YSAtIEFyYml0cmFyeSBzdWJzY3JpYmVyLWRlZmluZWQgb2JqZWN0LlxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBfdGhpcy5yYWlzZUV2ZW50KCAnYWRkLWl0ZW0tZmFpbGVkJywgZXZlbnQgKTtcblxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBvcHRpb25zLmVycm9yKGV2ZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIHJlZnJlc2hXb3JsZCh0aGVJdGVtKSB7XG4gICAgICAgICAgICBpZiAoX3RoaXMuY29sbGVjdGlvbk1vZGUpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy53b3JsZC5hcnJhbmdlKHtcbiAgICAgICAgICAgICAgICAgICAgaW1tZWRpYXRlbHk6IHRoZUl0ZW0ub3B0aW9ucy5jb2xsZWN0aW9uSW1tZWRpYXRlbHksXG4gICAgICAgICAgICAgICAgICAgIHJvd3M6IF90aGlzLmNvbGxlY3Rpb25Sb3dzLFxuICAgICAgICAgICAgICAgICAgICBjb2x1bW5zOiBfdGhpcy5jb2xsZWN0aW9uQ29sdW1ucyxcbiAgICAgICAgICAgICAgICAgICAgbGF5b3V0OiBfdGhpcy5jb2xsZWN0aW9uTGF5b3V0LFxuICAgICAgICAgICAgICAgICAgICB0aWxlU2l6ZTogX3RoaXMuY29sbGVjdGlvblRpbGVTaXplLFxuICAgICAgICAgICAgICAgICAgICB0aWxlTWFyZ2luOiBfdGhpcy5jb2xsZWN0aW9uVGlsZU1hcmdpblxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIF90aGlzLndvcmxkLnNldEF1dG9SZWZpZ3VyZVNpemVzKHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCQuaXNBcnJheShvcHRpb25zLnRpbGVTb3VyY2UpKSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJhaXNlQWRkSXRlbUZhaWxlZCh7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IFwiW1ZpZXdlci5hZGRUaWxlZEltYWdlXSBTZXF1ZW5jZXMgY2FuIG5vdCBiZSBhZGRlZDsgYWRkIHRoZW0gb25lIGF0IGEgdGltZSBpbnN0ZWFkLlwiLFxuICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IG9wdGlvbnMudGlsZVNvdXJjZSxcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9uczogb3B0aW9uc1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9sb2FkUXVldWUucHVzaChteVF1ZXVlSXRlbSk7XG5cbiAgICAgICAgZ2V0VGlsZVNvdXJjZUltcGxlbWVudGF0aW9uKCB0aGlzLCBvcHRpb25zLnRpbGVTb3VyY2UsIGZ1bmN0aW9uKCB0aWxlU291cmNlICkge1xuXG4gICAgICAgICAgICBteVF1ZXVlSXRlbS50aWxlU291cmNlID0gdGlsZVNvdXJjZTtcblxuICAgICAgICAgICAgLy8gYWRkIGV2ZXJ5Ym9keSBhdCB0aGUgZnJvbnQgb2YgdGhlIHF1ZXVlIHRoYXQncyByZWFkeSB0byBnb1xuICAgICAgICAgICAgdmFyIHF1ZXVlSXRlbSwgdGlsZWRJbWFnZSwgb3B0aW9uc0Nsb25lO1xuICAgICAgICAgICAgd2hpbGUgKF90aGlzLl9sb2FkUXVldWUubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgcXVldWVJdGVtID0gX3RoaXMuX2xvYWRRdWV1ZVswXTtcbiAgICAgICAgICAgICAgICBpZiAoIXF1ZXVlSXRlbS50aWxlU291cmNlKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIF90aGlzLl9sb2FkUXVldWUuc3BsaWNlKDAsIDEpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHF1ZXVlSXRlbS5vcHRpb25zLnJlcGxhY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG5ld0luZGV4ID0gX3RoaXMud29ybGQuZ2V0SW5kZXhPZkl0ZW0ocXVldWVJdGVtLm9wdGlvbnMucmVwbGFjZUl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAobmV3SW5kZXggIT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlSXRlbS5vcHRpb25zLmluZGV4ID0gbmV3SW5kZXg7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgX3RoaXMud29ybGQucmVtb3ZlSXRlbShxdWV1ZUl0ZW0ub3B0aW9ucy5yZXBsYWNlSXRlbSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGlsZWRJbWFnZSA9IG5ldyAkLlRpbGVkSW1hZ2Uoe1xuICAgICAgICAgICAgICAgICAgICB2aWV3ZXI6IF90aGlzLFxuICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IHF1ZXVlSXRlbS50aWxlU291cmNlLFxuICAgICAgICAgICAgICAgICAgICB2aWV3cG9ydDogX3RoaXMudmlld3BvcnQsXG4gICAgICAgICAgICAgICAgICAgIGRyYXdlcjogX3RoaXMuZHJhd2VyLFxuICAgICAgICAgICAgICAgICAgICB0aWxlQ2FjaGU6IF90aGlzLnRpbGVDYWNoZSxcbiAgICAgICAgICAgICAgICAgICAgaW1hZ2VMb2FkZXI6IF90aGlzLmltYWdlTG9hZGVyLFxuICAgICAgICAgICAgICAgICAgICB4OiBxdWV1ZUl0ZW0ub3B0aW9ucy54LFxuICAgICAgICAgICAgICAgICAgICB5OiBxdWV1ZUl0ZW0ub3B0aW9ucy55LFxuICAgICAgICAgICAgICAgICAgICB3aWR0aDogcXVldWVJdGVtLm9wdGlvbnMud2lkdGgsXG4gICAgICAgICAgICAgICAgICAgIGhlaWdodDogcXVldWVJdGVtLm9wdGlvbnMuaGVpZ2h0LFxuICAgICAgICAgICAgICAgICAgICBmaXRCb3VuZHM6IHF1ZXVlSXRlbS5vcHRpb25zLmZpdEJvdW5kcyxcbiAgICAgICAgICAgICAgICAgICAgZml0Qm91bmRzUGxhY2VtZW50OiBxdWV1ZUl0ZW0ub3B0aW9ucy5maXRCb3VuZHNQbGFjZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgIGNsaXA6IHF1ZXVlSXRlbS5vcHRpb25zLmNsaXAsXG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyRmlsbFN0eWxlOiBxdWV1ZUl0ZW0ub3B0aW9ucy5wbGFjZWhvbGRlckZpbGxTdHlsZSxcbiAgICAgICAgICAgICAgICAgICAgb3BhY2l0eTogcXVldWVJdGVtLm9wdGlvbnMub3BhY2l0eSxcbiAgICAgICAgICAgICAgICAgICAgY29tcG9zaXRlT3BlcmF0aW9uOiBxdWV1ZUl0ZW0ub3B0aW9ucy5jb21wb3NpdGVPcGVyYXRpb24sXG4gICAgICAgICAgICAgICAgICAgIHNwcmluZ1N0aWZmbmVzczogX3RoaXMuc3ByaW5nU3RpZmZuZXNzLFxuICAgICAgICAgICAgICAgICAgICBhbmltYXRpb25UaW1lOiBfdGhpcy5hbmltYXRpb25UaW1lLFxuICAgICAgICAgICAgICAgICAgICBtaW5ab29tSW1hZ2VSYXRpbzogX3RoaXMubWluWm9vbUltYWdlUmF0aW8sXG4gICAgICAgICAgICAgICAgICAgIHdyYXBIb3Jpem9udGFsOiBfdGhpcy53cmFwSG9yaXpvbnRhbCxcbiAgICAgICAgICAgICAgICAgICAgd3JhcFZlcnRpY2FsOiBfdGhpcy53cmFwVmVydGljYWwsXG4gICAgICAgICAgICAgICAgICAgIGltbWVkaWF0ZVJlbmRlcjogX3RoaXMuaW1tZWRpYXRlUmVuZGVyLFxuICAgICAgICAgICAgICAgICAgICBibGVuZFRpbWU6IF90aGlzLmJsZW5kVGltZSxcbiAgICAgICAgICAgICAgICAgICAgYWx3YXlzQmxlbmQ6IF90aGlzLmFsd2F5c0JsZW5kLFxuICAgICAgICAgICAgICAgICAgICBtaW5QaXhlbFJhdGlvOiBfdGhpcy5taW5QaXhlbFJhdGlvLFxuICAgICAgICAgICAgICAgICAgICBzbW9vdGhUaWxlRWRnZXNNaW5ab29tOiBfdGhpcy5zbW9vdGhUaWxlRWRnZXNNaW5ab29tLFxuICAgICAgICAgICAgICAgICAgICBpT1NEZXZpY2U6IF90aGlzLmlPU0RldmljZSxcbiAgICAgICAgICAgICAgICAgICAgY3Jvc3NPcmlnaW5Qb2xpY3k6IF90aGlzLmNyb3NzT3JpZ2luUG9saWN5LFxuICAgICAgICAgICAgICAgICAgICBkZWJ1Z01vZGU6IF90aGlzLmRlYnVnTW9kZVxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgaWYgKF90aGlzLmNvbGxlY3Rpb25Nb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLndvcmxkLnNldEF1dG9SZWZpZ3VyZVNpemVzKGZhbHNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgX3RoaXMud29ybGQuYWRkSXRlbSggdGlsZWRJbWFnZSwge1xuICAgICAgICAgICAgICAgICAgICBpbmRleDogcXVldWVJdGVtLm9wdGlvbnMuaW5kZXhcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGlmIChfdGhpcy5fbG9hZFF1ZXVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAvL3RoaXMgcmVzdG9yZXMgdGhlIGF1dG9SZWZpZ3VyZVNpemVzIGZsYWcgdG8gdHJ1ZS5cbiAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFdvcmxkKHF1ZXVlSXRlbSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKF90aGlzLndvcmxkLmdldEl0ZW1Db3VudCgpID09PSAxICYmICFfdGhpcy5wcmVzZXJ2ZVZpZXdwb3J0KSB7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLnZpZXdwb3J0LmdvSG9tZSh0cnVlKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoX3RoaXMubmF2aWdhdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnNDbG9uZSA9ICQuZXh0ZW5kKHt9LCBxdWV1ZUl0ZW0ub3B0aW9ucywge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZTogZmFsc2UsIC8vIG5hdmlnYXRvciBhbHJlYWR5IHJlbW92ZWQgdGhlIGxheWVyLCBub3RoaW5nIHRvIHJlcGxhY2VcbiAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsVGlsZWRJbWFnZTogdGlsZWRJbWFnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpbGVTb3VyY2U6IHF1ZXVlSXRlbS50aWxlU291cmNlXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIF90aGlzLm5hdmlnYXRvci5hZGRUaWxlZEltYWdlKG9wdGlvbnNDbG9uZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHF1ZXVlSXRlbS5vcHRpb25zLnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgcXVldWVJdGVtLm9wdGlvbnMuc3VjY2Vzcyh7XG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtOiB0aWxlZEltYWdlXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgZnVuY3Rpb24oIGV2ZW50ICkge1xuICAgICAgICAgICAgZXZlbnQub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICAgICAgICByYWlzZUFkZEl0ZW1GYWlsZWQoZXZlbnQpO1xuICAgICAgICB9ICk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEFkZCBhIHNpbXBsZSBpbWFnZSB0byB0aGUgdmlld2VyLlxuICAgICAqIFRoZSBvcHRpb25zIGFyZSB0aGUgc2FtZSBhcyB0aGUgb25lcyBpbiB7QGxpbmsgT3BlblNlYWRyYWdvbi5WaWV3ZXIjYWRkVGlsZWRJbWFnZX1cbiAgICAgKiBleGNlcHQgZm9yIG9wdGlvbnMudGlsZVNvdXJjZSB3aGljaCBpcyByZXBsYWNlZCBieSBvcHRpb25zLnVybC5cbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIFNlZSB7QGxpbmsgT3BlblNlYWRyYWdvbi5WaWV3ZXIjYWRkVGlsZWRJbWFnZX1cbiAgICAgKiBmb3IgYWxsIHRoZSBvcHRpb25zXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG9wdGlvbnMudXJsIC0gVGhlIFVSTCBvZiB0aGUgaW1hZ2UgdG8gYWRkLlxuICAgICAqIEBmaXJlcyBPcGVuU2VhZHJhZ29uLldvcmxkLmV2ZW50OmFkZC1pdGVtXG4gICAgICogQGZpcmVzIE9wZW5TZWFkcmFnb24uVmlld2VyLmV2ZW50OmFkZC1pdGVtLWZhaWxlZFxuICAgICAqL1xuICAgIGFkZFNpbXBsZUltYWdlOiBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgICAgICQuY29uc29sZS5hc3NlcnQob3B0aW9ucywgXCJbVmlld2VyLmFkZFNpbXBsZUltYWdlXSBvcHRpb25zIGlzIHJlcXVpcmVkXCIpO1xuICAgICAgICAkLmNvbnNvbGUuYXNzZXJ0KG9wdGlvbnMudXJsLCBcIltWaWV3ZXIuYWRkU2ltcGxlSW1hZ2VdIG9wdGlvbnMudXJsIGlzIHJlcXVpcmVkXCIpO1xuXG4gICAgICAgIHZhciBvcHRzID0gJC5leHRlbmQoe30sIG9wdGlvbnMsIHtcbiAgICAgICAgICAgIHRpbGVTb3VyY2U6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnaW1hZ2UnLFxuICAgICAgICAgICAgICAgIHVybDogIG9wdGlvbnMudXJsXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBkZWxldGUgb3B0cy51cmw7XG4gICAgICAgIHRoaXMuYWRkVGlsZWRJbWFnZShvcHRzKTtcbiAgICB9LFxuXG4gICAgLy8gZGVwcmVjYXRlZFxuICAgIGFkZExheWVyOiBmdW5jdGlvbiggb3B0aW9ucyApIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgICAkLmNvbnNvbGUuZXJyb3IoIFwiW1ZpZXdlci5hZGRMYXllcl0gdGhpcyBmdW5jdGlvbiBpcyBkZXByZWNhdGVkOyB1c2UgVmlld2VyLmFkZFRpbGVkSW1hZ2UoKSBpbnN0ZWFkLlwiICk7XG5cbiAgICAgICAgdmFyIG9wdGlvbnNDbG9uZSA9ICQuZXh0ZW5kKHt9LCBvcHRpb25zLCB7XG4gICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgICAgIF90aGlzLnJhaXNlRXZlbnQoXCJhZGQtbGF5ZXJcIiwge1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiBvcHRpb25zLFxuICAgICAgICAgICAgICAgICAgICBkcmF3ZXI6IGV2ZW50Lml0ZW1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvcjogZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5yYWlzZUV2ZW50KFwiYWRkLWxheWVyLWZhaWxlZFwiLCBldmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuYWRkVGlsZWRJbWFnZShvcHRpb25zQ2xvbmUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLy8gZGVwcmVjYXRlZFxuICAgIGdldExheWVyQXRMZXZlbDogZnVuY3Rpb24oIGxldmVsICkge1xuICAgICAgICAkLmNvbnNvbGUuZXJyb3IoIFwiW1ZpZXdlci5nZXRMYXllckF0TGV2ZWxdIHRoaXMgZnVuY3Rpb24gaXMgZGVwcmVjYXRlZDsgdXNlIFdvcmxkLmdldEl0ZW1BdCgpIGluc3RlYWQuXCIgKTtcbiAgICAgICAgcmV0dXJuIHRoaXMud29ybGQuZ2V0SXRlbUF0KGxldmVsKTtcbiAgICB9LFxuXG4gICAgLy8gZGVwcmVjYXRlZFxuICAgIGdldExldmVsT2ZMYXllcjogZnVuY3Rpb24oIGRyYXdlciApIHtcbiAgICAgICAgJC5jb25zb2xlLmVycm9yKCBcIltWaWV3ZXIuZ2V0TGV2ZWxPZkxheWVyXSB0aGlzIGZ1bmN0aW9uIGlzIGRlcHJlY2F0ZWQ7IHVzZSBXb3JsZC5nZXRJbmRleE9mSXRlbSgpIGluc3RlYWQuXCIgKTtcbiAgICAgICAgcmV0dXJuIHRoaXMud29ybGQuZ2V0SW5kZXhPZkl0ZW0oZHJhd2VyKTtcbiAgICB9LFxuXG4gICAgLy8gZGVwcmVjYXRlZFxuICAgIGdldExheWVyc0NvdW50OiBmdW5jdGlvbigpIHtcbiAgICAgICAgJC5jb25zb2xlLmVycm9yKCBcIltWaWV3ZXIuZ2V0TGF5ZXJzQ291bnRdIHRoaXMgZnVuY3Rpb24gaXMgZGVwcmVjYXRlZDsgdXNlIFdvcmxkLmdldEl0ZW1Db3VudCgpIGluc3RlYWQuXCIgKTtcbiAgICAgICAgcmV0dXJuIHRoaXMud29ybGQuZ2V0SXRlbUNvdW50KCk7XG4gICAgfSxcblxuICAgIC8vIGRlcHJlY2F0ZWRcbiAgICBzZXRMYXllckxldmVsOiBmdW5jdGlvbiggZHJhd2VyLCBsZXZlbCApIHtcbiAgICAgICAgJC5jb25zb2xlLmVycm9yKCBcIltWaWV3ZXIuc2V0TGF5ZXJMZXZlbF0gdGhpcyBmdW5jdGlvbiBpcyBkZXByZWNhdGVkOyB1c2UgV29ybGQuc2V0SXRlbUluZGV4KCkgaW5zdGVhZC5cIiApO1xuICAgICAgICByZXR1cm4gdGhpcy53b3JsZC5zZXRJdGVtSW5kZXgoZHJhd2VyLCBsZXZlbCk7XG4gICAgfSxcblxuICAgIC8vIGRlcHJlY2F0ZWRcbiAgICByZW1vdmVMYXllcjogZnVuY3Rpb24oIGRyYXdlciApIHtcbiAgICAgICAgJC5jb25zb2xlLmVycm9yKCBcIltWaWV3ZXIucmVtb3ZlTGF5ZXJdIHRoaXMgZnVuY3Rpb24gaXMgZGVwcmVjYXRlZDsgdXNlIFdvcmxkLnJlbW92ZUl0ZW0oKSBpbnN0ZWFkLlwiICk7XG4gICAgICAgIHJldHVybiB0aGlzLndvcmxkLnJlbW92ZUl0ZW0oZHJhd2VyKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogRm9yY2UgdGhlIHZpZXdlciB0byByZWRyYXcgaXRzIGNvbnRlbnRzLlxuICAgICAqIEByZXR1cm5zIHtPcGVuU2VhZHJhZ29uLlZpZXdlcn0gQ2hhaW5hYmxlLlxuICAgICAqL1xuICAgIGZvcmNlUmVkcmF3OiBmdW5jdGlvbigpIHtcbiAgICAgICAgVEhJU1sgdGhpcy5oYXNoIF0uZm9yY2VSZWRyYXcgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHJldHVybiB7T3BlblNlYWRyYWdvbi5WaWV3ZXJ9IENoYWluYWJsZS5cbiAgICAgKi9cbiAgICBiaW5kU2VxdWVuY2VDb250cm9sczogZnVuY3Rpb24oKXtcblxuICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAgICAgICAvLyBJbWFnZSBTZXF1ZW5jZSBDb250cm9sc1xuICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAgICAgICB2YXIgb25Gb2N1c0hhbmRsZXIgICAgICAgICAgPSAkLmRlbGVnYXRlKCB0aGlzLCBvbkZvY3VzICksXG4gICAgICAgICAgICBvbkJsdXJIYW5kbGVyICAgICAgICAgICA9ICQuZGVsZWdhdGUoIHRoaXMsIG9uQmx1ciApLFxuICAgICAgICAgICAgb25OZXh0SGFuZGxlciAgICAgICAgICAgPSAkLmRlbGVnYXRlKCB0aGlzLCBvbk5leHQgKSxcbiAgICAgICAgICAgIG9uUHJldmlvdXNIYW5kbGVyICAgICAgID0gJC5kZWxlZ2F0ZSggdGhpcywgb25QcmV2aW91cyApLFxuICAgICAgICAgICAgbmF2SW1hZ2VzICAgICAgICAgICAgICAgPSB0aGlzLm5hdkltYWdlcyxcbiAgICAgICAgICAgIHVzZUdyb3VwICAgICAgICAgICAgICAgID0gdHJ1ZSA7XG5cbiAgICAgICAgaWYoIHRoaXMuc2hvd1NlcXVlbmNlQ29udHJvbCApe1xuXG4gICAgICAgICAgICBpZiggdGhpcy5wcmV2aW91c0J1dHRvbiB8fCB0aGlzLm5leHRCdXR0b24gKXtcbiAgICAgICAgICAgICAgICAvL2lmIHdlIGFyZSBiaW5kaW5nIHRvIGN1c3RvbSBidXR0b25zIHRoZW4gbGF5b3V0IGFuZFxuICAgICAgICAgICAgICAgIC8vZ3JvdXBpbmcgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBwYWdlIGF1dGhvclxuICAgICAgICAgICAgICAgIHVzZUdyb3VwID0gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMucHJldmlvdXNCdXR0b24gPSBuZXcgJC5CdXR0b24oe1xuICAgICAgICAgICAgICAgIGVsZW1lbnQ6ICAgIHRoaXMucHJldmlvdXNCdXR0b24gPyAkLmdldEVsZW1lbnQoIHRoaXMucHJldmlvdXNCdXR0b24gKSA6IG51bGwsXG4gICAgICAgICAgICAgICAgY2xpY2tUaW1lVGhyZXNob2xkOiB0aGlzLmNsaWNrVGltZVRocmVzaG9sZCxcbiAgICAgICAgICAgICAgICBjbGlja0Rpc3RUaHJlc2hvbGQ6IHRoaXMuY2xpY2tEaXN0VGhyZXNob2xkLFxuICAgICAgICAgICAgICAgIHRvb2x0aXA6ICAgICQuZ2V0U3RyaW5nKCBcIlRvb2x0aXBzLlByZXZpb3VzUGFnZVwiICksXG4gICAgICAgICAgICAgICAgc3JjUmVzdDogICAgcmVzb2x2ZVVybCggdGhpcy5wcmVmaXhVcmwsIG5hdkltYWdlcy5wcmV2aW91cy5SRVNUICksXG4gICAgICAgICAgICAgICAgc3JjR3JvdXA6ICAgcmVzb2x2ZVVybCggdGhpcy5wcmVmaXhVcmwsIG5hdkltYWdlcy5wcmV2aW91cy5HUk9VUCApLFxuICAgICAgICAgICAgICAgIHNyY0hvdmVyOiAgIHJlc29sdmVVcmwoIHRoaXMucHJlZml4VXJsLCBuYXZJbWFnZXMucHJldmlvdXMuSE9WRVIgKSxcbiAgICAgICAgICAgICAgICBzcmNEb3duOiAgICByZXNvbHZlVXJsKCB0aGlzLnByZWZpeFVybCwgbmF2SW1hZ2VzLnByZXZpb3VzLkRPV04gKSxcbiAgICAgICAgICAgICAgICBvblJlbGVhc2U6ICBvblByZXZpb3VzSGFuZGxlcixcbiAgICAgICAgICAgICAgICBvbkZvY3VzOiAgICBvbkZvY3VzSGFuZGxlcixcbiAgICAgICAgICAgICAgICBvbkJsdXI6ICAgICBvbkJsdXJIYW5kbGVyXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGhpcy5uZXh0QnV0dG9uID0gbmV3ICQuQnV0dG9uKHtcbiAgICAgICAgICAgICAgICBlbGVtZW50OiAgICB0aGlzLm5leHRCdXR0b24gPyAkLmdldEVsZW1lbnQoIHRoaXMubmV4dEJ1dHRvbiApIDogbnVsbCxcbiAgICAgICAgICAgICAgICBjbGlja1RpbWVUaHJlc2hvbGQ6IHRoaXMuY2xpY2tUaW1lVGhyZXNob2xkLFxuICAgICAgICAgICAgICAgIGNsaWNrRGlzdFRocmVzaG9sZDogdGhpcy5jbGlja0Rpc3RUaHJlc2hvbGQsXG4gICAgICAgICAgICAgICAgdG9vbHRpcDogICAgJC5nZXRTdHJpbmcoIFwiVG9vbHRpcHMuTmV4dFBhZ2VcIiApLFxuICAgICAgICAgICAgICAgIHNyY1Jlc3Q6ICAgIHJlc29sdmVVcmwoIHRoaXMucHJlZml4VXJsLCBuYXZJbWFnZXMubmV4dC5SRVNUICksXG4gICAgICAgICAgICAgICAgc3JjR3JvdXA6ICAgcmVzb2x2ZVVybCggdGhpcy5wcmVmaXhVcmwsIG5hdkltYWdlcy5uZXh0LkdST1VQICksXG4gICAgICAgICAgICAgICAgc3JjSG92ZXI6ICAgcmVzb2x2ZVVybCggdGhpcy5wcmVmaXhVcmwsIG5hdkltYWdlcy5uZXh0LkhPVkVSICksXG4gICAgICAgICAgICAgICAgc3JjRG93bjogICAgcmVzb2x2ZVVybCggdGhpcy5wcmVmaXhVcmwsIG5hdkltYWdlcy5uZXh0LkRPV04gKSxcbiAgICAgICAgICAgICAgICBvblJlbGVhc2U6ICBvbk5leHRIYW5kbGVyLFxuICAgICAgICAgICAgICAgIG9uRm9jdXM6ICAgIG9uRm9jdXNIYW5kbGVyLFxuICAgICAgICAgICAgICAgIG9uQmx1cjogICAgIG9uQmx1ckhhbmRsZXJcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiggIXRoaXMubmF2UHJldk5leHRXcmFwICl7XG4gICAgICAgICAgICAgICAgdGhpcy5wcmV2aW91c0J1dHRvbi5kaXNhYmxlKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghdGhpcy50aWxlU291cmNlcyB8fCAhdGhpcy50aWxlU291cmNlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm5leHRCdXR0b24uZGlzYWJsZSgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiggdXNlR3JvdXAgKXtcbiAgICAgICAgICAgICAgICB0aGlzLnBhZ2luZyA9IG5ldyAkLkJ1dHRvbkdyb3VwKHtcbiAgICAgICAgICAgICAgICAgICAgYnV0dG9uczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcmV2aW91c0J1dHRvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmV4dEJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBjbGlja1RpbWVUaHJlc2hvbGQ6IHRoaXMuY2xpY2tUaW1lVGhyZXNob2xkLFxuICAgICAgICAgICAgICAgICAgICBjbGlja0Rpc3RUaHJlc2hvbGQ6IHRoaXMuY2xpY2tEaXN0VGhyZXNob2xkXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnBhZ2luZ0NvbnRyb2wgPSB0aGlzLnBhZ2luZy5lbGVtZW50O1xuXG4gICAgICAgICAgICAgICAgaWYoIHRoaXMudG9vbGJhciApe1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvb2xiYXIuYWRkQ29udHJvbChcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFnaW5nQ29udHJvbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHthbmNob3I6ICQuQ29udHJvbEFuY2hvci5CT1RUT01fUklHSFR9XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkQ29udHJvbChcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFnaW5nQ29udHJvbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHthbmNob3I6IHRoaXMuc2VxdWVuY2VDb250cm9sQW5jaG9yIHx8ICQuQ29udHJvbEFuY2hvci5UT1BfTEVGVH1cbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuXG4gICAgLyoqXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHJldHVybiB7T3BlblNlYWRyYWdvbi5WaWV3ZXJ9IENoYWluYWJsZS5cbiAgICAgKi9cbiAgICBiaW5kU3RhbmRhcmRDb250cm9sczogZnVuY3Rpb24oKXtcbiAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgICAgICAgLy8gTmF2aWdhdGlvbiBDb250cm9sc1xuICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAgICAgICB2YXIgYmVnaW5ab29taW5nSW5IYW5kbGVyICAgPSAkLmRlbGVnYXRlKCB0aGlzLCBiZWdpblpvb21pbmdJbiApLFxuICAgICAgICAgICAgZW5kWm9vbWluZ0hhbmRsZXIgICAgICAgPSAkLmRlbGVnYXRlKCB0aGlzLCBlbmRab29taW5nICksXG4gICAgICAgICAgICBkb1NpbmdsZVpvb21JbkhhbmRsZXIgICA9ICQuZGVsZWdhdGUoIHRoaXMsIGRvU2luZ2xlWm9vbUluICksXG4gICAgICAgICAgICBiZWdpblpvb21pbmdPdXRIYW5kbGVyICA9ICQuZGVsZWdhdGUoIHRoaXMsIGJlZ2luWm9vbWluZ091dCApLFxuICAgICAgICAgICAgZG9TaW5nbGVab29tT3V0SGFuZGxlciAgPSAkLmRlbGVnYXRlKCB0aGlzLCBkb1NpbmdsZVpvb21PdXQgKSxcbiAgICAgICAgICAgIG9uSG9tZUhhbmRsZXIgICAgICAgICAgID0gJC5kZWxlZ2F0ZSggdGhpcywgb25Ib21lICksXG4gICAgICAgICAgICBvbkZ1bGxTY3JlZW5IYW5kbGVyICAgICA9ICQuZGVsZWdhdGUoIHRoaXMsIG9uRnVsbFNjcmVlbiApLFxuICAgICAgICAgICAgb25Sb3RhdGVMZWZ0SGFuZGxlciAgICAgPSAkLmRlbGVnYXRlKCB0aGlzLCBvblJvdGF0ZUxlZnQgKSxcbiAgICAgICAgICAgIG9uUm90YXRlUmlnaHRIYW5kbGVyICAgID0gJC5kZWxlZ2F0ZSggdGhpcywgb25Sb3RhdGVSaWdodCApLFxuICAgICAgICAgICAgb25Gb2N1c0hhbmRsZXIgICAgICAgICAgPSAkLmRlbGVnYXRlKCB0aGlzLCBvbkZvY3VzICksXG4gICAgICAgICAgICBvbkJsdXJIYW5kbGVyICAgICAgICAgICA9ICQuZGVsZWdhdGUoIHRoaXMsIG9uQmx1ciApLFxuICAgICAgICAgICAgbmF2SW1hZ2VzICAgICAgICAgICAgICAgPSB0aGlzLm5hdkltYWdlcyxcbiAgICAgICAgICAgIGJ1dHRvbnMgICAgICAgICAgICAgICAgID0gW10sXG4gICAgICAgICAgICB1c2VHcm91cCAgICAgICAgICAgICAgICA9IHRydWUgO1xuXG5cbiAgICAgICAgaWYgKCB0aGlzLnNob3dOYXZpZ2F0aW9uQ29udHJvbCApIHtcblxuICAgICAgICAgICAgaWYoIHRoaXMuem9vbUluQnV0dG9uIHx8IHRoaXMuem9vbU91dEJ1dHRvbiB8fFxuICAgICAgICAgICAgICAgIHRoaXMuaG9tZUJ1dHRvbiB8fCB0aGlzLmZ1bGxQYWdlQnV0dG9uIHx8XG4gICAgICAgICAgICAgICAgdGhpcy5yb3RhdGVMZWZ0QnV0dG9uIHx8IHRoaXMucm90YXRlUmlnaHRCdXR0b24gKSB7XG4gICAgICAgICAgICAgICAgLy9pZiB3ZSBhcmUgYmluZGluZyB0byBjdXN0b20gYnV0dG9ucyB0aGVuIGxheW91dCBhbmRcbiAgICAgICAgICAgICAgICAvL2dyb3VwaW5nIGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgcGFnZSBhdXRob3JcbiAgICAgICAgICAgICAgICB1c2VHcm91cCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIHRoaXMuc2hvd1pvb21Db250cm9sICkge1xuICAgICAgICAgICAgICAgIGJ1dHRvbnMucHVzaCggdGhpcy56b29tSW5CdXR0b24gPSBuZXcgJC5CdXR0b24oe1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50OiAgICB0aGlzLnpvb21JbkJ1dHRvbiA/ICQuZ2V0RWxlbWVudCggdGhpcy56b29tSW5CdXR0b24gKSA6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGNsaWNrVGltZVRocmVzaG9sZDogdGhpcy5jbGlja1RpbWVUaHJlc2hvbGQsXG4gICAgICAgICAgICAgICAgICAgIGNsaWNrRGlzdFRocmVzaG9sZDogdGhpcy5jbGlja0Rpc3RUaHJlc2hvbGQsXG4gICAgICAgICAgICAgICAgICAgIHRvb2x0aXA6ICAgICQuZ2V0U3RyaW5nKCBcIlRvb2x0aXBzLlpvb21JblwiICksXG4gICAgICAgICAgICAgICAgICAgIHNyY1Jlc3Q6ICAgIHJlc29sdmVVcmwoIHRoaXMucHJlZml4VXJsLCBuYXZJbWFnZXMuem9vbUluLlJFU1QgKSxcbiAgICAgICAgICAgICAgICAgICAgc3JjR3JvdXA6ICAgcmVzb2x2ZVVybCggdGhpcy5wcmVmaXhVcmwsIG5hdkltYWdlcy56b29tSW4uR1JPVVAgKSxcbiAgICAgICAgICAgICAgICAgICAgc3JjSG92ZXI6ICAgcmVzb2x2ZVVybCggdGhpcy5wcmVmaXhVcmwsIG5hdkltYWdlcy56b29tSW4uSE9WRVIgKSxcbiAgICAgICAgICAgICAgICAgICAgc3JjRG93bjogICAgcmVzb2x2ZVVybCggdGhpcy5wcmVmaXhVcmwsIG5hdkltYWdlcy56b29tSW4uRE9XTiApLFxuICAgICAgICAgICAgICAgICAgICBvblByZXNzOiAgICBiZWdpblpvb21pbmdJbkhhbmRsZXIsXG4gICAgICAgICAgICAgICAgICAgIG9uUmVsZWFzZTogIGVuZFpvb21pbmdIYW5kbGVyLFxuICAgICAgICAgICAgICAgICAgICBvbkNsaWNrOiAgICBkb1NpbmdsZVpvb21JbkhhbmRsZXIsXG4gICAgICAgICAgICAgICAgICAgIG9uRW50ZXI6ICAgIGJlZ2luWm9vbWluZ0luSGFuZGxlcixcbiAgICAgICAgICAgICAgICAgICAgb25FeGl0OiAgICAgZW5kWm9vbWluZ0hhbmRsZXIsXG4gICAgICAgICAgICAgICAgICAgIG9uRm9jdXM6ICAgIG9uRm9jdXNIYW5kbGVyLFxuICAgICAgICAgICAgICAgICAgICBvbkJsdXI6ICAgICBvbkJsdXJIYW5kbGVyXG4gICAgICAgICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgICAgICAgYnV0dG9ucy5wdXNoKCB0aGlzLnpvb21PdXRCdXR0b24gPSBuZXcgJC5CdXR0b24oe1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50OiAgICB0aGlzLnpvb21PdXRCdXR0b24gPyAkLmdldEVsZW1lbnQoIHRoaXMuem9vbU91dEJ1dHRvbiApIDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgY2xpY2tUaW1lVGhyZXNob2xkOiB0aGlzLmNsaWNrVGltZVRocmVzaG9sZCxcbiAgICAgICAgICAgICAgICAgICAgY2xpY2tEaXN0VGhyZXNob2xkOiB0aGlzLmNsaWNrRGlzdFRocmVzaG9sZCxcbiAgICAgICAgICAgICAgICAgICAgdG9vbHRpcDogICAgJC5nZXRTdHJpbmcoIFwiVG9vbHRpcHMuWm9vbU91dFwiICksXG4gICAgICAgICAgICAgICAgICAgIHNyY1Jlc3Q6ICAgIHJlc29sdmVVcmwoIHRoaXMucHJlZml4VXJsLCBuYXZJbWFnZXMuem9vbU91dC5SRVNUICksXG4gICAgICAgICAgICAgICAgICAgIHNyY0dyb3VwOiAgIHJlc29sdmVVcmwoIHRoaXMucHJlZml4VXJsLCBuYXZJbWFnZXMuem9vbU91dC5HUk9VUCApLFxuICAgICAgICAgICAgICAgICAgICBzcmNIb3ZlcjogICByZXNvbHZlVXJsKCB0aGlzLnByZWZpeFVybCwgbmF2SW1hZ2VzLnpvb21PdXQuSE9WRVIgKSxcbiAgICAgICAgICAgICAgICAgICAgc3JjRG93bjogICAgcmVzb2x2ZVVybCggdGhpcy5wcmVmaXhVcmwsIG5hdkltYWdlcy56b29tT3V0LkRPV04gKSxcbiAgICAgICAgICAgICAgICAgICAgb25QcmVzczogICAgYmVnaW5ab29taW5nT3V0SGFuZGxlcixcbiAgICAgICAgICAgICAgICAgICAgb25SZWxlYXNlOiAgZW5kWm9vbWluZ0hhbmRsZXIsXG4gICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s6ICAgIGRvU2luZ2xlWm9vbU91dEhhbmRsZXIsXG4gICAgICAgICAgICAgICAgICAgIG9uRW50ZXI6ICAgIGJlZ2luWm9vbWluZ091dEhhbmRsZXIsXG4gICAgICAgICAgICAgICAgICAgIG9uRXhpdDogICAgIGVuZFpvb21pbmdIYW5kbGVyLFxuICAgICAgICAgICAgICAgICAgICBvbkZvY3VzOiAgICBvbkZvY3VzSGFuZGxlcixcbiAgICAgICAgICAgICAgICAgICAgb25CbHVyOiAgICAgb25CbHVySGFuZGxlclxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCB0aGlzLnNob3dIb21lQ29udHJvbCApIHtcbiAgICAgICAgICAgICAgICBidXR0b25zLnB1c2goIHRoaXMuaG9tZUJ1dHRvbiA9IG5ldyAkLkJ1dHRvbih7XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ6ICAgIHRoaXMuaG9tZUJ1dHRvbiA/ICQuZ2V0RWxlbWVudCggdGhpcy5ob21lQnV0dG9uICkgOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBjbGlja1RpbWVUaHJlc2hvbGQ6IHRoaXMuY2xpY2tUaW1lVGhyZXNob2xkLFxuICAgICAgICAgICAgICAgICAgICBjbGlja0Rpc3RUaHJlc2hvbGQ6IHRoaXMuY2xpY2tEaXN0VGhyZXNob2xkLFxuICAgICAgICAgICAgICAgICAgICB0b29sdGlwOiAgICAkLmdldFN0cmluZyggXCJUb29sdGlwcy5Ib21lXCIgKSxcbiAgICAgICAgICAgICAgICAgICAgc3JjUmVzdDogICAgcmVzb2x2ZVVybCggdGhpcy5wcmVmaXhVcmwsIG5hdkltYWdlcy5ob21lLlJFU1QgKSxcbiAgICAgICAgICAgICAgICAgICAgc3JjR3JvdXA6ICAgcmVzb2x2ZVVybCggdGhpcy5wcmVmaXhVcmwsIG5hdkltYWdlcy5ob21lLkdST1VQICksXG4gICAgICAgICAgICAgICAgICAgIHNyY0hvdmVyOiAgIHJlc29sdmVVcmwoIHRoaXMucHJlZml4VXJsLCBuYXZJbWFnZXMuaG9tZS5IT1ZFUiApLFxuICAgICAgICAgICAgICAgICAgICBzcmNEb3duOiAgICByZXNvbHZlVXJsKCB0aGlzLnByZWZpeFVybCwgbmF2SW1hZ2VzLmhvbWUuRE9XTiApLFxuICAgICAgICAgICAgICAgICAgICBvblJlbGVhc2U6ICBvbkhvbWVIYW5kbGVyLFxuICAgICAgICAgICAgICAgICAgICBvbkZvY3VzOiAgICBvbkZvY3VzSGFuZGxlcixcbiAgICAgICAgICAgICAgICAgICAgb25CbHVyOiAgICAgb25CbHVySGFuZGxlclxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCB0aGlzLnNob3dGdWxsUGFnZUNvbnRyb2wgKSB7XG4gICAgICAgICAgICAgICAgYnV0dG9ucy5wdXNoKCB0aGlzLmZ1bGxQYWdlQnV0dG9uID0gbmV3ICQuQnV0dG9uKHtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudDogICAgdGhpcy5mdWxsUGFnZUJ1dHRvbiA/ICQuZ2V0RWxlbWVudCggdGhpcy5mdWxsUGFnZUJ1dHRvbiApIDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgY2xpY2tUaW1lVGhyZXNob2xkOiB0aGlzLmNsaWNrVGltZVRocmVzaG9sZCxcbiAgICAgICAgICAgICAgICAgICAgY2xpY2tEaXN0VGhyZXNob2xkOiB0aGlzLmNsaWNrRGlzdFRocmVzaG9sZCxcbiAgICAgICAgICAgICAgICAgICAgdG9vbHRpcDogICAgJC5nZXRTdHJpbmcoIFwiVG9vbHRpcHMuRnVsbFBhZ2VcIiApLFxuICAgICAgICAgICAgICAgICAgICBzcmNSZXN0OiAgICByZXNvbHZlVXJsKCB0aGlzLnByZWZpeFVybCwgbmF2SW1hZ2VzLmZ1bGxwYWdlLlJFU1QgKSxcbiAgICAgICAgICAgICAgICAgICAgc3JjR3JvdXA6ICAgcmVzb2x2ZVVybCggdGhpcy5wcmVmaXhVcmwsIG5hdkltYWdlcy5mdWxscGFnZS5HUk9VUCApLFxuICAgICAgICAgICAgICAgICAgICBzcmNIb3ZlcjogICByZXNvbHZlVXJsKCB0aGlzLnByZWZpeFVybCwgbmF2SW1hZ2VzLmZ1bGxwYWdlLkhPVkVSICksXG4gICAgICAgICAgICAgICAgICAgIHNyY0Rvd246ICAgIHJlc29sdmVVcmwoIHRoaXMucHJlZml4VXJsLCBuYXZJbWFnZXMuZnVsbHBhZ2UuRE9XTiApLFxuICAgICAgICAgICAgICAgICAgICBvblJlbGVhc2U6ICBvbkZ1bGxTY3JlZW5IYW5kbGVyLFxuICAgICAgICAgICAgICAgICAgICBvbkZvY3VzOiAgICBvbkZvY3VzSGFuZGxlcixcbiAgICAgICAgICAgICAgICAgICAgb25CbHVyOiAgICAgb25CbHVySGFuZGxlclxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCB0aGlzLnNob3dSb3RhdGlvbkNvbnRyb2wgKSB7XG4gICAgICAgICAgICAgICAgYnV0dG9ucy5wdXNoKCB0aGlzLnJvdGF0ZUxlZnRCdXR0b24gPSBuZXcgJC5CdXR0b24oe1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50OiAgICB0aGlzLnJvdGF0ZUxlZnRCdXR0b24gPyAkLmdldEVsZW1lbnQoIHRoaXMucm90YXRlTGVmdEJ1dHRvbiApIDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgY2xpY2tUaW1lVGhyZXNob2xkOiB0aGlzLmNsaWNrVGltZVRocmVzaG9sZCxcbiAgICAgICAgICAgICAgICAgICAgY2xpY2tEaXN0VGhyZXNob2xkOiB0aGlzLmNsaWNrRGlzdFRocmVzaG9sZCxcbiAgICAgICAgICAgICAgICAgICAgdG9vbHRpcDogICAgJC5nZXRTdHJpbmcoIFwiVG9vbHRpcHMuUm90YXRlTGVmdFwiICksXG4gICAgICAgICAgICAgICAgICAgIHNyY1Jlc3Q6ICAgIHJlc29sdmVVcmwoIHRoaXMucHJlZml4VXJsLCBuYXZJbWFnZXMucm90YXRlbGVmdC5SRVNUICksXG4gICAgICAgICAgICAgICAgICAgIHNyY0dyb3VwOiAgIHJlc29sdmVVcmwoIHRoaXMucHJlZml4VXJsLCBuYXZJbWFnZXMucm90YXRlbGVmdC5HUk9VUCApLFxuICAgICAgICAgICAgICAgICAgICBzcmNIb3ZlcjogICByZXNvbHZlVXJsKCB0aGlzLnByZWZpeFVybCwgbmF2SW1hZ2VzLnJvdGF0ZWxlZnQuSE9WRVIgKSxcbiAgICAgICAgICAgICAgICAgICAgc3JjRG93bjogICAgcmVzb2x2ZVVybCggdGhpcy5wcmVmaXhVcmwsIG5hdkltYWdlcy5yb3RhdGVsZWZ0LkRPV04gKSxcbiAgICAgICAgICAgICAgICAgICAgb25SZWxlYXNlOiAgb25Sb3RhdGVMZWZ0SGFuZGxlcixcbiAgICAgICAgICAgICAgICAgICAgb25Gb2N1czogICAgb25Gb2N1c0hhbmRsZXIsXG4gICAgICAgICAgICAgICAgICAgIG9uQmx1cjogICAgIG9uQmx1ckhhbmRsZXJcbiAgICAgICAgICAgICAgICB9KSk7XG5cbiAgICAgICAgICAgICAgICBidXR0b25zLnB1c2goIHRoaXMucm90YXRlUmlnaHRCdXR0b24gPSBuZXcgJC5CdXR0b24oe1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50OiAgICB0aGlzLnJvdGF0ZVJpZ2h0QnV0dG9uID8gJC5nZXRFbGVtZW50KCB0aGlzLnJvdGF0ZVJpZ2h0QnV0dG9uICkgOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBjbGlja1RpbWVUaHJlc2hvbGQ6IHRoaXMuY2xpY2tUaW1lVGhyZXNob2xkLFxuICAgICAgICAgICAgICAgICAgICBjbGlja0Rpc3RUaHJlc2hvbGQ6IHRoaXMuY2xpY2tEaXN0VGhyZXNob2xkLFxuICAgICAgICAgICAgICAgICAgICB0b29sdGlwOiAgICAkLmdldFN0cmluZyggXCJUb29sdGlwcy5Sb3RhdGVSaWdodFwiICksXG4gICAgICAgICAgICAgICAgICAgIHNyY1Jlc3Q6ICAgIHJlc29sdmVVcmwoIHRoaXMucHJlZml4VXJsLCBuYXZJbWFnZXMucm90YXRlcmlnaHQuUkVTVCApLFxuICAgICAgICAgICAgICAgICAgICBzcmNHcm91cDogICByZXNvbHZlVXJsKCB0aGlzLnByZWZpeFVybCwgbmF2SW1hZ2VzLnJvdGF0ZXJpZ2h0LkdST1VQICksXG4gICAgICAgICAgICAgICAgICAgIHNyY0hvdmVyOiAgIHJlc29sdmVVcmwoIHRoaXMucHJlZml4VXJsLCBuYXZJbWFnZXMucm90YXRlcmlnaHQuSE9WRVIgKSxcbiAgICAgICAgICAgICAgICAgICAgc3JjRG93bjogICAgcmVzb2x2ZVVybCggdGhpcy5wcmVmaXhVcmwsIG5hdkltYWdlcy5yb3RhdGVyaWdodC5ET1dOICksXG4gICAgICAgICAgICAgICAgICAgIG9uUmVsZWFzZTogIG9uUm90YXRlUmlnaHRIYW5kbGVyLFxuICAgICAgICAgICAgICAgICAgICBvbkZvY3VzOiAgICBvbkZvY3VzSGFuZGxlcixcbiAgICAgICAgICAgICAgICAgICAgb25CbHVyOiAgICAgb25CbHVySGFuZGxlclxuICAgICAgICAgICAgICAgIH0pKTtcblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIHVzZUdyb3VwICkge1xuICAgICAgICAgICAgICAgIHRoaXMuYnV0dG9ucyA9IG5ldyAkLkJ1dHRvbkdyb3VwKHtcbiAgICAgICAgICAgICAgICAgICAgYnV0dG9uczogICAgICAgICAgICBidXR0b25zLFxuICAgICAgICAgICAgICAgICAgICBjbGlja1RpbWVUaHJlc2hvbGQ6IHRoaXMuY2xpY2tUaW1lVGhyZXNob2xkLFxuICAgICAgICAgICAgICAgICAgICBjbGlja0Rpc3RUaHJlc2hvbGQ6IHRoaXMuY2xpY2tEaXN0VGhyZXNob2xkXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLm5hdkNvbnRyb2wgID0gdGhpcy5idXR0b25zLmVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRIYW5kbGVyKCAnb3BlbicsICQuZGVsZWdhdGUoIHRoaXMsIGxpZ2h0VXAgKSApO1xuXG4gICAgICAgICAgICAgICAgaWYoIHRoaXMudG9vbGJhciApe1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvb2xiYXIuYWRkQ29udHJvbChcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmF2Q29udHJvbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHthbmNob3I6ICQuQ29udHJvbEFuY2hvci5UT1BfTEVGVH1cbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZENvbnRyb2woXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5hdkNvbnRyb2wsXG4gICAgICAgICAgICAgICAgICAgICAgICB7YW5jaG9yOiB0aGlzLm5hdmlnYXRpb25Db250cm9sQW5jaG9yIHx8ICQuQ29udHJvbEFuY2hvci5UT1BfTEVGVH1cbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgYWN0aXZlIHBhZ2Ugb2YgYSBzZXF1ZW5jZVxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBjdXJyZW50UGFnZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZXF1ZW5jZUluZGV4O1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcmV0dXJuIHtPcGVuU2VhZHJhZ29uLlZpZXdlcn0gQ2hhaW5hYmxlLlxuICAgICAqIEBmaXJlcyBPcGVuU2VhZHJhZ29uLlZpZXdlci5ldmVudDpwYWdlXG4gICAgICovXG4gICAgZ29Ub1BhZ2U6IGZ1bmN0aW9uKCBwYWdlICl7XG4gICAgICAgIGlmKCB0aGlzLnRpbGVTb3VyY2VzICYmIHBhZ2UgPj0gMCAmJiBwYWdlIDwgdGhpcy50aWxlU291cmNlcy5sZW5ndGggKXtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogUmFpc2VkIHdoZW4gdGhlIHBhZ2UgaXMgY2hhbmdlZCBvbiBhIHZpZXdlciBjb25maWd1cmVkIHdpdGggbXVsdGlwbGUgaW1hZ2Ugc291cmNlcyAoc2VlIHtAbGluayBPcGVuU2VhZHJhZ29uLlZpZXdlciNnb1RvUGFnZX0pLlxuICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAqIEBldmVudCBwYWdlXG4gICAgICAgICAgICAgKiBAbWVtYmVyb2YgT3BlblNlYWRyYWdvbi5WaWV3ZXJcbiAgICAgICAgICAgICAqIEB0eXBlIHtPYmplY3R9XG4gICAgICAgICAgICAgKiBAcHJvcGVydHkge09wZW5TZWFkcmFnb24uVmlld2VyfSBldmVudFNvdXJjZSAtIEEgcmVmZXJlbmNlIHRvIHRoZSBWaWV3ZXIgd2hpY2ggcmFpc2VkIHRoZSBldmVudC5cbiAgICAgICAgICAgICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBwYWdlIC0gVGhlIHBhZ2UgaW5kZXguXG4gICAgICAgICAgICAgKiBAcHJvcGVydHkgez9PYmplY3R9IHVzZXJEYXRhIC0gQXJiaXRyYXJ5IHN1YnNjcmliZXItZGVmaW5lZCBvYmplY3QuXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIHRoaXMucmFpc2VFdmVudCggJ3BhZ2UnLCB7IHBhZ2U6IHBhZ2UgfSApO1xuXG4gICAgICAgICAgICB0aGlzLl9zZXF1ZW5jZUluZGV4ID0gcGFnZTtcblxuICAgICAgICAgICAgdGhpcy5fdXBkYXRlU2VxdWVuY2VCdXR0b25zKCBwYWdlICk7XG5cbiAgICAgICAgICAgIHRoaXMub3BlbiggdGhpcy50aWxlU291cmNlc1sgcGFnZSBdICk7XG5cbiAgICAgICAgICAgIGlmKCB0aGlzLnJlZmVyZW5jZVN0cmlwICl7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWZlcmVuY2VTdHJpcC5zZXRGb2N1cyggcGFnZSApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgLyoqXG4gICAgICogQWRkcyBhbiBodG1sIGVsZW1lbnQgYXMgYW4gb3ZlcmxheSB0byB0aGUgY3VycmVudCB2aWV3cG9ydC4gIFVzZWZ1bCBmb3JcbiAgICAgKiBoaWdobGlnaHRpbmcgd29yZHMgb3IgYXJlYXMgb2YgaW50ZXJlc3Qgb24gYW4gaW1hZ2Ugb3Igb3RoZXIgem9vbWFibGVcbiAgICAgKiBpbnRlcmZhY2UuIFRoZSBvdmVybGF5cyBhZGRlZCB2aWEgdGhpcyBtZXRob2QgYXJlIHJlbW92ZWQgd2hlbiB0aGUgdmlld3BvcnRcbiAgICAgKiBpcyBjbG9zZWQgd2hpY2ggaW5jbHVkZSB3aGVuIGNoYW5naW5nIHBhZ2UuXG4gICAgICogQG1ldGhvZFxuICAgICAqIEBwYXJhbSB7RWxlbWVudHxTdHJpbmd8T2JqZWN0fSBlbGVtZW50IC0gQSByZWZlcmVuY2UgdG8gYW4gZWxlbWVudCBvciBhbiBpZCBmb3JcbiAgICAgKiAgICAgIHRoZSBlbGVtZW50IHdoaWNoIHdpbGwgYmUgb3ZlcmxheWVkLiBPciBhbiBPYmplY3Qgc3BlY2lmeWluZyB0aGUgY29uZmlndXJhdGlvbiBmb3IgdGhlIG92ZXJsYXkuXG4gICAgICogICAgICBJZiB1c2luZyBhbiBvYmplY3QsIHNlZSB7QGxpbmsgT3BlblNlYWRyYWdvbi5PdmVybGF5fSBmb3IgYSBsaXN0IG9mXG4gICAgICogICAgICBhbGwgYXZhaWxhYmxlIG9wdGlvbnMuXG4gICAgICogQHBhcmFtIHtPcGVuU2VhZHJhZ29uLlBvaW50fE9wZW5TZWFkcmFnb24uUmVjdH0gbG9jYXRpb24gLSBUaGUgcG9pbnQgb3JcbiAgICAgKiAgICAgIHJlY3RhbmdsZSB3aGljaCB3aWxsIGJlIG92ZXJsYXllZC4gVGhpcyBpcyBhIHZpZXdwb3J0IHJlbGF0aXZlIGxvY2F0aW9uLlxuICAgICAqIEBwYXJhbSB7T3BlblNlYWRyYWdvbi5QbGFjZW1lbnR9IHBsYWNlbWVudCAtIFRoZSBwb3NpdGlvbiBvZiB0aGVcbiAgICAgKiAgICAgIHZpZXdwb3J0IHdoaWNoIHRoZSBsb2NhdGlvbiBjb29yZGluYXRlcyB3aWxsIGJlIHRyZWF0ZWQgYXMgcmVsYXRpdmVcbiAgICAgKiAgICAgIHRvLlxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IG9uRHJhdyAtIElmIHN1cHBsaWVkIHRoZSBjYWxsYmFjayBpcyBjYWxsZWQgd2hlbiB0aGUgb3ZlcmxheVxuICAgICAqICAgICAgbmVlZHMgdG8gYmUgZHJhd24uIEl0IGl0IHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgY2FsbGJhY2sgdG8gZG8gYW55IGRyYXdpbmcvcG9zaXRpb25pbmcuXG4gICAgICogICAgICBJdCBpcyBwYXNzZWQgcG9zaXRpb24sIHNpemUgYW5kIGVsZW1lbnQuXG4gICAgICogQHJldHVybiB7T3BlblNlYWRyYWdvbi5WaWV3ZXJ9IENoYWluYWJsZS5cbiAgICAgKiBAZmlyZXMgT3BlblNlYWRyYWdvbi5WaWV3ZXIuZXZlbnQ6YWRkLW92ZXJsYXlcbiAgICAgKi9cbiAgICBhZGRPdmVybGF5OiBmdW5jdGlvbiggZWxlbWVudCwgbG9jYXRpb24sIHBsYWNlbWVudCwgb25EcmF3ICkge1xuICAgICAgICB2YXIgb3B0aW9ucztcbiAgICAgICAgaWYoICQuaXNQbGFpbk9iamVjdCggZWxlbWVudCApICl7XG4gICAgICAgICAgICBvcHRpb25zID0gZWxlbWVudDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudDogZWxlbWVudCxcbiAgICAgICAgICAgICAgICBsb2NhdGlvbjogbG9jYXRpb24sXG4gICAgICAgICAgICAgICAgcGxhY2VtZW50OiBwbGFjZW1lbnQsXG4gICAgICAgICAgICAgICAgb25EcmF3OiBvbkRyYXdcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBlbGVtZW50ID0gJC5nZXRFbGVtZW50KCBvcHRpb25zLmVsZW1lbnQgKTtcblxuICAgICAgICBpZiAoIGdldE92ZXJsYXlJbmRleCggdGhpcy5jdXJyZW50T3ZlcmxheXMsIGVsZW1lbnQgKSA+PSAwICkge1xuICAgICAgICAgICAgLy8gdGhleSdyZSB0cnlpbmcgdG8gYWRkIGEgZHVwbGljYXRlIG92ZXJsYXlcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIG92ZXJsYXkgPSBnZXRPdmVybGF5T2JqZWN0KCB0aGlzLCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy5jdXJyZW50T3ZlcmxheXMucHVzaChvdmVybGF5KTtcbiAgICAgICAgb3ZlcmxheS5kcmF3SFRNTCggdGhpcy5vdmVybGF5c0NvbnRhaW5lciwgdGhpcy52aWV3cG9ydCApO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSYWlzZWQgd2hlbiBhbiBvdmVybGF5IGlzIGFkZGVkIHRvIHRoZSB2aWV3ZXIgKHNlZSB7QGxpbmsgT3BlblNlYWRyYWdvbi5WaWV3ZXIjYWRkT3ZlcmxheX0pLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXZlbnQgYWRkLW92ZXJsYXlcbiAgICAgICAgICogQG1lbWJlcm9mIE9wZW5TZWFkcmFnb24uVmlld2VyXG4gICAgICAgICAqIEB0eXBlIHtvYmplY3R9XG4gICAgICAgICAqIEBwcm9wZXJ0eSB7T3BlblNlYWRyYWdvbi5WaWV3ZXJ9IGV2ZW50U291cmNlIC0gQSByZWZlcmVuY2UgdG8gdGhlIFZpZXdlciB3aGljaCByYWlzZWQgdGhlIGV2ZW50LlxuICAgICAgICAgKiBAcHJvcGVydHkge0VsZW1lbnR9IGVsZW1lbnQgLSBUaGUgb3ZlcmxheSBlbGVtZW50LlxuICAgICAgICAgKiBAcHJvcGVydHkge09wZW5TZWFkcmFnb24uUG9pbnR8T3BlblNlYWRyYWdvbi5SZWN0fSBsb2NhdGlvblxuICAgICAgICAgKiBAcHJvcGVydHkge09wZW5TZWFkcmFnb24uUGxhY2VtZW50fSBwbGFjZW1lbnRcbiAgICAgICAgICogQHByb3BlcnR5IHs/T2JqZWN0fSB1c2VyRGF0YSAtIEFyYml0cmFyeSBzdWJzY3JpYmVyLWRlZmluZWQgb2JqZWN0LlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5yYWlzZUV2ZW50KCAnYWRkLW92ZXJsYXknLCB7XG4gICAgICAgICAgICBlbGVtZW50OiBlbGVtZW50LFxuICAgICAgICAgICAgbG9jYXRpb246IG9wdGlvbnMubG9jYXRpb24sXG4gICAgICAgICAgICBwbGFjZW1lbnQ6IG9wdGlvbnMucGxhY2VtZW50XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlcyB0aGUgb3ZlcmxheSByZXByZXNlbnRlZCBieSB0aGUgcmVmZXJlbmNlIHRvIHRoZSBlbGVtZW50IG9yXG4gICAgICogZWxlbWVudCBpZCBtb3ZpbmcgaXQgdG8gdGhlIG5ldyBsb2NhdGlvbiwgcmVsYXRpdmUgdG8gdGhlIG5ldyBwbGFjZW1lbnQuXG4gICAgICogQG1ldGhvZFxuICAgICAqIEBwYXJhbSB7RWxlbWVudHxTdHJpbmd9IGVsZW1lbnQgLSBBIHJlZmVyZW5jZSB0byBhbiBlbGVtZW50IG9yIGFuIGlkIGZvclxuICAgICAqICAgICAgdGhlIGVsZW1lbnQgd2hpY2ggaXMgb3ZlcmxheWVkLlxuICAgICAqIEBwYXJhbSB7T3BlblNlYWRyYWdvbi5Qb2ludHxPcGVuU2VhZHJhZ29uLlJlY3R9IGxvY2F0aW9uIC0gVGhlIHBvaW50IG9yXG4gICAgICogICAgICByZWN0YW5nbGUgd2hpY2ggd2lsbCBiZSBvdmVybGF5ZWQuIFRoaXMgaXMgYSB2aWV3cG9ydCByZWxhdGl2ZSBsb2NhdGlvbi5cbiAgICAgKiBAcGFyYW0ge09wZW5TZWFkcmFnb24uUGxhY2VtZW50fSBwbGFjZW1lbnQgLSBUaGUgcG9zaXRpb24gb2YgdGhlXG4gICAgICogICAgICB2aWV3cG9ydCB3aGljaCB0aGUgbG9jYXRpb24gY29vcmRpbmF0ZXMgd2lsbCBiZSB0cmVhdGVkIGFzIHJlbGF0aXZlXG4gICAgICogICAgICB0by5cbiAgICAgKiBAcmV0dXJuIHtPcGVuU2VhZHJhZ29uLlZpZXdlcn0gQ2hhaW5hYmxlLlxuICAgICAqIEBmaXJlcyBPcGVuU2VhZHJhZ29uLlZpZXdlci5ldmVudDp1cGRhdGUtb3ZlcmxheVxuICAgICAqL1xuICAgIHVwZGF0ZU92ZXJsYXk6IGZ1bmN0aW9uKCBlbGVtZW50LCBsb2NhdGlvbiwgcGxhY2VtZW50ICkge1xuICAgICAgICB2YXIgaTtcblxuICAgICAgICBlbGVtZW50ID0gJC5nZXRFbGVtZW50KCBlbGVtZW50ICk7XG4gICAgICAgIGkgPSBnZXRPdmVybGF5SW5kZXgoIHRoaXMuY3VycmVudE92ZXJsYXlzLCBlbGVtZW50ICk7XG5cbiAgICAgICAgaWYgKCBpID49IDAgKSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRPdmVybGF5c1sgaSBdLnVwZGF0ZSggbG9jYXRpb24sIHBsYWNlbWVudCApO1xuICAgICAgICAgICAgVEhJU1sgdGhpcy5oYXNoIF0uZm9yY2VSZWRyYXcgPSB0cnVlO1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBSYWlzZWQgd2hlbiBhbiBvdmVybGF5J3MgbG9jYXRpb24gb3IgcGxhY2VtZW50IGNoYW5nZXNcbiAgICAgICAgICAgICAqIChzZWUge0BsaW5rIE9wZW5TZWFkcmFnb24uVmlld2VyI3VwZGF0ZU92ZXJsYXl9KS5cbiAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgKiBAZXZlbnQgdXBkYXRlLW92ZXJsYXlcbiAgICAgICAgICAgICAqIEBtZW1iZXJvZiBPcGVuU2VhZHJhZ29uLlZpZXdlclxuICAgICAgICAgICAgICogQHR5cGUge29iamVjdH1cbiAgICAgICAgICAgICAqIEBwcm9wZXJ0eSB7T3BlblNlYWRyYWdvbi5WaWV3ZXJ9IGV2ZW50U291cmNlIC0gQSByZWZlcmVuY2UgdG8gdGhlXG4gICAgICAgICAgICAgKiBWaWV3ZXIgd2hpY2ggcmFpc2VkIHRoZSBldmVudC5cbiAgICAgICAgICAgICAqIEBwcm9wZXJ0eSB7RWxlbWVudH0gZWxlbWVudFxuICAgICAgICAgICAgICogQHByb3BlcnR5IHtPcGVuU2VhZHJhZ29uLlBvaW50fE9wZW5TZWFkcmFnb24uUmVjdH0gbG9jYXRpb25cbiAgICAgICAgICAgICAqIEBwcm9wZXJ0eSB7T3BlblNlYWRyYWdvbi5QbGFjZW1lbnR9IHBsYWNlbWVudFxuICAgICAgICAgICAgICogQHByb3BlcnR5IHs/T2JqZWN0fSB1c2VyRGF0YSAtIEFyYml0cmFyeSBzdWJzY3JpYmVyLWRlZmluZWQgb2JqZWN0LlxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICB0aGlzLnJhaXNlRXZlbnQoICd1cGRhdGUtb3ZlcmxheScsIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50OiBlbGVtZW50LFxuICAgICAgICAgICAgICAgIGxvY2F0aW9uOiBsb2NhdGlvbixcbiAgICAgICAgICAgICAgICBwbGFjZW1lbnQ6IHBsYWNlbWVudFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYW4gb3ZlcmxheSBpZGVudGlmaWVkIGJ5IHRoZSByZWZlcmVuY2UgZWxlbWVudCBvciBlbGVtZW50IGlkXG4gICAgICogYW5kIHNjaGVkdWxlcyBhbiB1cGRhdGUuXG4gICAgICogQG1ldGhvZFxuICAgICAqIEBwYXJhbSB7RWxlbWVudHxTdHJpbmd9IGVsZW1lbnQgLSBBIHJlZmVyZW5jZSB0byB0aGUgZWxlbWVudCBvciBhblxuICAgICAqICAgICAgZWxlbWVudCBpZCB3aGljaCByZXByZXNlbnQgdGhlIG92ZWxheSBjb250ZW50IHRvIGJlIHJlbW92ZWQuXG4gICAgICogQHJldHVybiB7T3BlblNlYWRyYWdvbi5WaWV3ZXJ9IENoYWluYWJsZS5cbiAgICAgKiBAZmlyZXMgT3BlblNlYWRyYWdvbi5WaWV3ZXIuZXZlbnQ6cmVtb3ZlLW92ZXJsYXlcbiAgICAgKi9cbiAgICByZW1vdmVPdmVybGF5OiBmdW5jdGlvbiggZWxlbWVudCApIHtcbiAgICAgICAgdmFyIGk7XG5cbiAgICAgICAgZWxlbWVudCA9ICQuZ2V0RWxlbWVudCggZWxlbWVudCApO1xuICAgICAgICBpID0gZ2V0T3ZlcmxheUluZGV4KCB0aGlzLmN1cnJlbnRPdmVybGF5cywgZWxlbWVudCApO1xuXG4gICAgICAgIGlmICggaSA+PSAwICkge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50T3ZlcmxheXNbIGkgXS5kZXN0cm95KCk7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRPdmVybGF5cy5zcGxpY2UoIGksIDEgKTtcbiAgICAgICAgICAgIFRISVNbIHRoaXMuaGFzaCBdLmZvcmNlUmVkcmF3ID0gdHJ1ZTtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogUmFpc2VkIHdoZW4gYW4gb3ZlcmxheSBpcyByZW1vdmVkIGZyb20gdGhlIHZpZXdlclxuICAgICAgICAgICAgICogKHNlZSB7QGxpbmsgT3BlblNlYWRyYWdvbi5WaWV3ZXIjcmVtb3ZlT3ZlcmxheX0pLlxuICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAqIEBldmVudCByZW1vdmUtb3ZlcmxheVxuICAgICAgICAgICAgICogQG1lbWJlcm9mIE9wZW5TZWFkcmFnb24uVmlld2VyXG4gICAgICAgICAgICAgKiBAdHlwZSB7b2JqZWN0fVxuICAgICAgICAgICAgICogQHByb3BlcnR5IHtPcGVuU2VhZHJhZ29uLlZpZXdlcn0gZXZlbnRTb3VyY2UgLSBBIHJlZmVyZW5jZSB0byB0aGVcbiAgICAgICAgICAgICAqIFZpZXdlciB3aGljaCByYWlzZWQgdGhlIGV2ZW50LlxuICAgICAgICAgICAgICogQHByb3BlcnR5IHtFbGVtZW50fSBlbGVtZW50IC0gVGhlIG92ZXJsYXkgZWxlbWVudC5cbiAgICAgICAgICAgICAqIEBwcm9wZXJ0eSB7P09iamVjdH0gdXNlckRhdGEgLSBBcmJpdHJhcnkgc3Vic2NyaWJlci1kZWZpbmVkIG9iamVjdC5cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgdGhpcy5yYWlzZUV2ZW50KCAncmVtb3ZlLW92ZXJsYXknLCB7XG4gICAgICAgICAgICAgICAgZWxlbWVudDogZWxlbWVudFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYWxsIGN1cnJlbnRseSBjb25maWd1cmVkIE92ZXJsYXlzIGZyb20gdGhpcyBWaWV3ZXIgYW5kIHNjaGVkdWxlc1xuICAgICAqIGFuIHVwZGF0ZS5cbiAgICAgKiBAbWV0aG9kXG4gICAgICogQHJldHVybiB7T3BlblNlYWRyYWdvbi5WaWV3ZXJ9IENoYWluYWJsZS5cbiAgICAgKiBAZmlyZXMgT3BlblNlYWRyYWdvbi5WaWV3ZXIuZXZlbnQ6Y2xlYXItb3ZlcmxheVxuICAgICAqL1xuICAgIGNsZWFyT3ZlcmxheXM6IGZ1bmN0aW9uKCkge1xuICAgICAgICB3aGlsZSAoIHRoaXMuY3VycmVudE92ZXJsYXlzLmxlbmd0aCA+IDAgKSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRPdmVybGF5cy5wb3AoKS5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICAgICAgVEhJU1sgdGhpcy5oYXNoIF0uZm9yY2VSZWRyYXcgPSB0cnVlO1xuICAgICAgICAvKipcbiAgICAgICAgICogUmFpc2VkIHdoZW4gYWxsIG92ZXJsYXlzIGFyZSByZW1vdmVkIGZyb20gdGhlIHZpZXdlciAoc2VlIHtAbGluayBPcGVuU2VhZHJhZ29uLkRyYXdlciNjbGVhck92ZXJsYXlzfSkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBldmVudCBjbGVhci1vdmVybGF5XG4gICAgICAgICAqIEBtZW1iZXJvZiBPcGVuU2VhZHJhZ29uLlZpZXdlclxuICAgICAgICAgKiBAdHlwZSB7b2JqZWN0fVxuICAgICAgICAgKiBAcHJvcGVydHkge09wZW5TZWFkcmFnb24uVmlld2VyfSBldmVudFNvdXJjZSAtIEEgcmVmZXJlbmNlIHRvIHRoZSBWaWV3ZXIgd2hpY2ggcmFpc2VkIHRoZSBldmVudC5cbiAgICAgICAgICogQHByb3BlcnR5IHs/T2JqZWN0fSB1c2VyRGF0YSAtIEFyYml0cmFyeSBzdWJzY3JpYmVyLWRlZmluZWQgb2JqZWN0LlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5yYWlzZUV2ZW50KCAnY2xlYXItb3ZlcmxheScsIHt9ICk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAgLyoqXG4gICAgICogRmluZHMgYW4gb3ZlcmxheSBpZGVudGlmaWVkIGJ5IHRoZSByZWZlcmVuY2UgZWxlbWVudCBvciBlbGVtZW50IGlkXG4gICAgICogYW5kIHJldHVybnMgaXQgYXMgYW4gb2JqZWN0LCByZXR1cm4gbnVsbCBpZiBub3QgZm91bmQuXG4gICAgICogQG1ldGhvZFxuICAgICAqIEBwYXJhbSB7RWxlbWVudHxTdHJpbmd9IGVsZW1lbnQgLSBBIHJlZmVyZW5jZSB0byB0aGUgZWxlbWVudCBvciBhblxuICAgICAqICAgICAgZWxlbWVudCBpZCB3aGljaCByZXByZXNlbnRzIHRoZSBvdmVybGF5IGNvbnRlbnQuXG4gICAgICogQHJldHVybiB7T3BlblNlYWRyYWdvbi5PdmVybGF5fSB0aGUgbWF0Y2hpbmcgb3ZlcmxheSBvciBudWxsIGlmIG5vbmUgZm91bmQuXG4gICAgICovXG4gICAgZ2V0T3ZlcmxheUJ5SWQ6IGZ1bmN0aW9uKCBlbGVtZW50ICkge1xuICAgICAgICB2YXIgaTtcblxuICAgICAgICBlbGVtZW50ID0gJC5nZXRFbGVtZW50KCBlbGVtZW50ICk7XG4gICAgICAgIGkgPSBnZXRPdmVybGF5SW5kZXgoIHRoaXMuY3VycmVudE92ZXJsYXlzLCBlbGVtZW50ICk7XG5cbiAgICAgICAgaWYgKGk+PTApIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRPdmVybGF5c1tpXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgdGhlIHNlcXVlbmNlIGJ1dHRvbnMuXG4gICAgICogQGZ1bmN0aW9uIE9wZW5TZWFkcmFnb24uVmlld2VyLnByb3RvdHlwZS5fdXBkYXRlU2VxdWVuY2VCdXR0b25zXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gU2VxdWVuY2UgVmFsdWVcbiAgICAgKi9cbiAgICBfdXBkYXRlU2VxdWVuY2VCdXR0b25zOiBmdW5jdGlvbiggcGFnZSApIHtcblxuICAgICAgICAgICAgaWYgKCB0aGlzLm5leHRCdXR0b24gKSB7XG4gICAgICAgICAgICAgICAgaWYoIXRoaXMudGlsZVNvdXJjZXMgfHwgdGhpcy50aWxlU291cmNlcy5sZW5ndGggLSAxID09PSBwYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vRGlzYWJsZSBuZXh0IGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBpZiAoICF0aGlzLm5hdlByZXZOZXh0V3JhcCApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmV4dEJ1dHRvbi5kaXNhYmxlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5leHRCdXR0b24uZW5hYmxlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCB0aGlzLnByZXZpb3VzQnV0dG9uICkge1xuICAgICAgICAgICAgICAgIGlmICggcGFnZSA+IDAgKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vRW5hYmxlIHByZXZpb3VzIGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByZXZpb3VzQnV0dG9uLmVuYWJsZSgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICggIXRoaXMubmF2UHJldk5leHRXcmFwICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcmV2aW91c0J1dHRvbi5kaXNhYmxlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgLyoqXG4gICAgICogRGlzcGxheSBhIG1lc3NhZ2UgaW4gdGhlIHZpZXdwb3J0XG4gICAgICogQGZ1bmN0aW9uIE9wZW5TZWFkcmFnb24uVmlld2VyLnByb3RvdHlwZS5fc2hvd01lc3NhZ2VcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0ZXh0IG1lc3NhZ2VcbiAgICAgKi9cbiAgICBfc2hvd01lc3NhZ2U6IGZ1bmN0aW9uICggbWVzc2FnZSApIHtcbiAgICAgICAgdGhpcy5faGlkZU1lc3NhZ2UoKTtcblxuICAgICAgICB2YXIgZGl2ID0gJC5tYWtlTmV1dHJhbEVsZW1lbnQoIFwiZGl2XCIgKTtcbiAgICAgICAgZGl2LmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSggbWVzc2FnZSApICk7XG5cbiAgICAgICAgdGhpcy5tZXNzYWdlRGl2ID0gJC5tYWtlQ2VudGVyZWROb2RlKCBkaXYgKTtcblxuICAgICAgICAkLmFkZENsYXNzKHRoaXMubWVzc2FnZURpdiwgXCJvcGVuc2VhZHJhZ29uLW1lc3NhZ2VcIik7XG5cbiAgICAgICAgdGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQoIHRoaXMubWVzc2FnZURpdiApO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBIaWRlIGFueSBjdXJyZW50bHkgZGlzcGxheWVkIHZpZXdwb3J0IG1lc3NhZ2VcbiAgICAgKiBAZnVuY3Rpb24gT3BlblNlYWRyYWdvbi5WaWV3ZXIucHJvdG90eXBlLl9oaWRlTWVzc2FnZVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX2hpZGVNZXNzYWdlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBkaXYgPSB0aGlzLm1lc3NhZ2VEaXY7XG4gICAgICAgIGlmIChkaXYpIHtcbiAgICAgICAgICAgIGRpdi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGRpdik7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5tZXNzYWdlRGl2O1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhpcyB2aWV3ZXIncyBnZXN0dXJlIHNldHRpbmdzIGZvciB0aGUgZ2l2ZW4gcG9pbnRlciBkZXZpY2UgdHlwZS5cbiAgICAgKiBAbWV0aG9kXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgLSBUaGUgcG9pbnRlciBkZXZpY2UgdHlwZSB0byBnZXQgdGhlIGdlc3R1cmUgc2V0dGluZ3MgZm9yIChcIm1vdXNlXCIsIFwidG91Y2hcIiwgXCJwZW5cIiwgZXRjLikuXG4gICAgICogQHJldHVybiB7T3BlblNlYWRyYWdvbi5HZXN0dXJlU2V0dGluZ3N9XG4gICAgICovXG4gICAgZ2VzdHVyZVNldHRpbmdzQnlEZXZpY2VUeXBlOiBmdW5jdGlvbiAoIHR5cGUgKSB7XG4gICAgICAgIHN3aXRjaCAoIHR5cGUgKSB7XG4gICAgICAgICAgICBjYXNlICdtb3VzZSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2VzdHVyZVNldHRpbmdzTW91c2U7XG4gICAgICAgICAgICBjYXNlICd0b3VjaCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2VzdHVyZVNldHRpbmdzVG91Y2g7XG4gICAgICAgICAgICBjYXNlICdwZW4nOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdlc3R1cmVTZXR0aW5nc1BlbjtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2VzdHVyZVNldHRpbmdzVW5rbm93bjtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyBwcml2YXRlXG4gICAgX2RyYXdPdmVybGF5czogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBpLFxuICAgICAgICAgICAgbGVuZ3RoID0gdGhpcy5jdXJyZW50T3ZlcmxheXMubGVuZ3RoO1xuICAgICAgICBmb3IgKCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrICkge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50T3ZlcmxheXNbIGkgXS5kcmF3SFRNTCggdGhpcy5vdmVybGF5c0NvbnRhaW5lciwgdGhpcy52aWV3cG9ydCApO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENhbmNlbCB0aGUgXCJpbiBmbGlnaHRcIiBpbWFnZXMuXG4gICAgICovXG4gICAgX2NhbmNlbFBlbmRpbmdJbWFnZXM6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLl9sb2FkUXVldWUgPSBbXTtcbiAgICB9XG59KTtcblxuXG4vKipcbiAqIF9nZXRTYWZlRWxlbVNpemUgaXMgbGlrZSBnZXRFbGVtZW50U2l6ZSgpLCBidXQgcmVmdXNlcyB0byByZXR1cm4gMCBmb3IgeCBvciB5LFxuICogd2hpY2ggd2FzIGNhdXNpbmcgc29tZSBjYWxsaW5nIG9wZXJhdGlvbnMgdG8gcmV0dXJuIE5hTi5cbiAqIEByZXR1cm5zIHtQb2ludH1cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIF9nZXRTYWZlRWxlbVNpemUgKG9FbGVtZW50KSB7XG4gICAgb0VsZW1lbnQgPSAkLmdldEVsZW1lbnQoIG9FbGVtZW50ICk7XG5cbiAgICByZXR1cm4gbmV3ICQuUG9pbnQoXG4gICAgICAgIChvRWxlbWVudC5jbGllbnRXaWR0aCA9PT0gMCA/IDEgOiBvRWxlbWVudC5jbGllbnRXaWR0aCksXG4gICAgICAgIChvRWxlbWVudC5jbGllbnRIZWlnaHQgPT09IDAgPyAxIDogb0VsZW1lbnQuY2xpZW50SGVpZ2h0KVxuICAgICk7XG59XG5cbi8qKlxuICogQGZ1bmN0aW9uXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBnZXRUaWxlU291cmNlSW1wbGVtZW50YXRpb24oIHZpZXdlciwgdGlsZVNvdXJjZSwgc3VjY2Vzc0NhbGxiYWNrLFxuICAgIGZhaWxDYWxsYmFjayApIHtcbiAgICB2YXIgX3RoaXMgPSB2aWV3ZXI7XG5cbiAgICAvL2FsbG93IHBsYWluIHhtbCBzdHJpbmdzIG9yIGpzb24gc3RyaW5ncyB0byBiZSBwYXJzZWQgaGVyZVxuICAgIGlmICggJC50eXBlKCB0aWxlU291cmNlICkgPT0gJ3N0cmluZycgKSB7XG4gICAgICAgIGlmICggdGlsZVNvdXJjZS5tYXRjaCggL1xccyo8LiovICkgKSB7XG4gICAgICAgICAgICB0aWxlU291cmNlID0gJC5wYXJzZVhtbCggdGlsZVNvdXJjZSApO1xuICAgICAgICB9IGVsc2UgaWYgKCB0aWxlU291cmNlLm1hdGNoKCAvXFxzKltcXHtcXFtdLiovICkgKSB7XG4gICAgICAgICAgICB0aWxlU291cmNlID0gJC5wYXJzZUpTT04odGlsZVNvdXJjZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiB3YWl0VW50aWxSZWFkeSh0aWxlU291cmNlLCBvcmlnaW5hbFRpbGVTb3VyY2UpIHtcbiAgICAgICAgaWYgKHRpbGVTb3VyY2UucmVhZHkpIHtcbiAgICAgICAgICAgIHN1Y2Nlc3NDYWxsYmFjayh0aWxlU291cmNlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRpbGVTb3VyY2UuYWRkSGFuZGxlcigncmVhZHknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgc3VjY2Vzc0NhbGxiYWNrKHRpbGVTb3VyY2UpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aWxlU291cmNlLmFkZEhhbmRsZXIoJ29wZW4tZmFpbGVkJywgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgZmFpbENhbGxiYWNrKHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogZXZlbnQubWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgc291cmNlOiBvcmlnaW5hbFRpbGVTb3VyY2VcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2V0VGltZW91dCggZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICggJC50eXBlKCB0aWxlU291cmNlICkgPT0gJ3N0cmluZycgKSB7XG4gICAgICAgICAgICAvL0lmIGl0cyBzdGlsbCBhIHN0cmluZyBpdCBtZWFucyBpdCBtdXN0IGJlIGEgdXJsIGF0IHRoaXMgcG9pbnRcbiAgICAgICAgICAgIHRpbGVTb3VyY2UgPSBuZXcgJC5UaWxlU291cmNlKHtcbiAgICAgICAgICAgICAgICB1cmw6IHRpbGVTb3VyY2UsXG4gICAgICAgICAgICAgICAgY3Jvc3NPcmlnaW5Qb2xpY3k6IHZpZXdlci5jcm9zc09yaWdpblBvbGljeSxcbiAgICAgICAgICAgICAgICBhamF4V2l0aENyZWRlbnRpYWxzOiB2aWV3ZXIuYWpheFdpdGhDcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgICB1c2VDYW52YXM6IHZpZXdlci51c2VDYW52YXMsXG4gICAgICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24oIGV2ZW50ICkge1xuICAgICAgICAgICAgICAgICAgICBzdWNjZXNzQ2FsbGJhY2soIGV2ZW50LnRpbGVTb3VyY2UgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRpbGVTb3VyY2UuYWRkSGFuZGxlciggJ29wZW4tZmFpbGVkJywgZnVuY3Rpb24oIGV2ZW50ICkge1xuICAgICAgICAgICAgICAgIGZhaWxDYWxsYmFjayggZXZlbnQgKTtcbiAgICAgICAgICAgIH0gKTtcblxuICAgICAgICB9IGVsc2UgaWYgKCQuaXNQbGFpbk9iamVjdCh0aWxlU291cmNlKSB8fCB0aWxlU291cmNlLm5vZGVUeXBlKSB7XG4gICAgICAgICAgICBpZiAoIXRpbGVTb3VyY2UuY3Jvc3NPcmlnaW5Qb2xpY3kgJiYgdmlld2VyLmNyb3NzT3JpZ2luUG9saWN5KSB7XG4gICAgICAgICAgICAgICAgdGlsZVNvdXJjZS5jcm9zc09yaWdpblBvbGljeSA9IHZpZXdlci5jcm9zc09yaWdpblBvbGljeTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aWxlU291cmNlLmFqYXhXaXRoQ3JlZGVudGlhbHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRpbGVTb3VyY2UuYWpheFdpdGhDcmVkZW50aWFscyA9IHZpZXdlci5hamF4V2l0aENyZWRlbnRpYWxzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRpbGVTb3VyY2UudXNlQ2FudmFzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aWxlU291cmNlLnVzZUNhbnZhcyA9IHZpZXdlci51c2VDYW52YXM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICggJC5pc0Z1bmN0aW9uKCB0aWxlU291cmNlLmdldFRpbGVVcmwgKSApIHtcbiAgICAgICAgICAgICAgICAvL0N1c3RvbSB0aWxlIHNvdXJjZVxuICAgICAgICAgICAgICAgIHZhciBjdXN0b21UaWxlU291cmNlID0gbmV3ICQuVGlsZVNvdXJjZSggdGlsZVNvdXJjZSApO1xuICAgICAgICAgICAgICAgIGN1c3RvbVRpbGVTb3VyY2UuZ2V0VGlsZVVybCA9IHRpbGVTb3VyY2UuZ2V0VGlsZVVybDtcbiAgICAgICAgICAgICAgICBzdWNjZXNzQ2FsbGJhY2soIGN1c3RvbVRpbGVTb3VyY2UgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy9pbmxpbmUgY29uZmlndXJhdGlvblxuICAgICAgICAgICAgICAgIHZhciAkVGlsZVNvdXJjZSA9ICQuVGlsZVNvdXJjZS5kZXRlcm1pbmVUeXBlKCBfdGhpcywgdGlsZVNvdXJjZSApO1xuICAgICAgICAgICAgICAgIGlmICggISRUaWxlU291cmNlICkge1xuICAgICAgICAgICAgICAgICAgICBmYWlsQ2FsbGJhY2soIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IFwiVW5hYmxlIHRvIGxvYWQgVGlsZVNvdXJjZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiB0aWxlU291cmNlXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBvcHRpb25zID0gJFRpbGVTb3VyY2UucHJvdG90eXBlLmNvbmZpZ3VyZS5hcHBseSggX3RoaXMsIFsgdGlsZVNvdXJjZSBdICk7XG4gICAgICAgICAgICAgICAgd2FpdFVudGlsUmVhZHkobmV3ICRUaWxlU291cmNlKG9wdGlvbnMpLCB0aWxlU291cmNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vY2FuIGFzc3VtZSBpdCdzIGFscmVhZHkgYSB0aWxlIHNvdXJjZSBpbXBsZW1lbnRhdGlvblxuICAgICAgICAgICAgd2FpdFVudGlsUmVhZHkodGlsZVNvdXJjZSwgdGlsZVNvdXJjZSk7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0T3ZlcmxheU9iamVjdCggdmlld2VyLCBvdmVybGF5ICkge1xuICAgIGlmICggb3ZlcmxheSBpbnN0YW5jZW9mICQuT3ZlcmxheSApIHtcbiAgICAgICAgcmV0dXJuIG92ZXJsYXk7XG4gICAgfVxuXG4gICAgdmFyIGVsZW1lbnQgPSBudWxsO1xuICAgIGlmICggb3ZlcmxheS5lbGVtZW50ICkge1xuICAgICAgICBlbGVtZW50ID0gJC5nZXRFbGVtZW50KCBvdmVybGF5LmVsZW1lbnQgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgaWQgPSBvdmVybGF5LmlkID9cbiAgICAgICAgICAgIG92ZXJsYXkuaWQgOlxuICAgICAgICAgICAgXCJvcGVuc2VhZHJhZ29uLW92ZXJsYXktXCIgKyBNYXRoLmZsb29yKCBNYXRoLnJhbmRvbSgpICogMTAwMDAwMDAgKTtcblxuICAgICAgICBlbGVtZW50ID0gJC5nZXRFbGVtZW50KCBvdmVybGF5LmlkICk7XG4gICAgICAgIGlmICggIWVsZW1lbnQgKSB7XG4gICAgICAgICAgICBlbGVtZW50ICAgICAgICAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImFcIiApO1xuICAgICAgICAgICAgZWxlbWVudC5ocmVmICAgID0gXCIjL292ZXJsYXkvXCIgKyBpZDtcbiAgICAgICAgfVxuICAgICAgICBlbGVtZW50LmlkID0gaWQ7XG4gICAgICAgICQuYWRkQ2xhc3MoIGVsZW1lbnQsIG92ZXJsYXkuY2xhc3NOYW1lID9cbiAgICAgICAgICAgIG92ZXJsYXkuY2xhc3NOYW1lIDpcbiAgICAgICAgICAgIFwib3BlbnNlYWRyYWdvbi1vdmVybGF5XCJcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICB2YXIgbG9jYXRpb24gPSBvdmVybGF5LmxvY2F0aW9uO1xuICAgIHZhciB3aWR0aCA9IG92ZXJsYXkud2lkdGg7XG4gICAgdmFyIGhlaWdodCA9IG92ZXJsYXkuaGVpZ2h0O1xuICAgIGlmICghbG9jYXRpb24pIHtcbiAgICAgICAgdmFyIHggPSBvdmVybGF5Lng7XG4gICAgICAgIHZhciB5ID0gb3ZlcmxheS55O1xuICAgICAgICBpZiAob3ZlcmxheS5weCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB2YXIgcmVjdCA9IHZpZXdlci52aWV3cG9ydC5pbWFnZVRvVmlld3BvcnRSZWN0YW5nbGUobmV3ICQuUmVjdChcbiAgICAgICAgICAgICAgICBvdmVybGF5LnB4LFxuICAgICAgICAgICAgICAgIG92ZXJsYXkucHksXG4gICAgICAgICAgICAgICAgd2lkdGggfHwgMCxcbiAgICAgICAgICAgICAgICBoZWlnaHQgfHwgMCkpO1xuICAgICAgICAgICAgeCA9IHJlY3QueDtcbiAgICAgICAgICAgIHkgPSByZWN0Lnk7XG4gICAgICAgICAgICB3aWR0aCA9IHdpZHRoICE9PSB1bmRlZmluZWQgPyByZWN0LndpZHRoIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgaGVpZ2h0ID0gaGVpZ2h0ICE9PSB1bmRlZmluZWQgPyByZWN0LmhlaWdodCA6IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBsb2NhdGlvbiA9IG5ldyAkLlBvaW50KHgsIHkpO1xuICAgIH1cblxuICAgIHZhciBwbGFjZW1lbnQgPSBvdmVybGF5LnBsYWNlbWVudDtcbiAgICBpZiAocGxhY2VtZW50ICYmICQudHlwZShwbGFjZW1lbnQpID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHBsYWNlbWVudCA9ICQuUGxhY2VtZW50W292ZXJsYXkucGxhY2VtZW50LnRvVXBwZXJDYXNlKCldO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgJC5PdmVybGF5KHtcbiAgICAgICAgZWxlbWVudDogZWxlbWVudCxcbiAgICAgICAgbG9jYXRpb246IGxvY2F0aW9uLFxuICAgICAgICBwbGFjZW1lbnQ6IHBsYWNlbWVudCxcbiAgICAgICAgb25EcmF3OiBvdmVybGF5Lm9uRHJhdyxcbiAgICAgICAgY2hlY2tSZXNpemU6IG92ZXJsYXkuY2hlY2tSZXNpemUsXG4gICAgICAgIHdpZHRoOiB3aWR0aCxcbiAgICAgICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgICAgIHJvdGF0aW9uTW9kZTogb3ZlcmxheS5yb3RhdGlvbk1vZGVcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQGlubmVyXG4gKiBEZXRlcm1pbmVzIHRoZSBpbmRleCBvZiB0aGUgZ2l2ZW4gb3ZlcmxheSBpbiB0aGUgZ2l2ZW4gb3ZlcmxheXMgYXJyYXkuXG4gKi9cbmZ1bmN0aW9uIGdldE92ZXJsYXlJbmRleCggb3ZlcmxheXMsIGVsZW1lbnQgKSB7XG4gICAgdmFyIGk7XG4gICAgZm9yICggaSA9IG92ZXJsYXlzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tICkge1xuICAgICAgICBpZiAoIG92ZXJsYXlzWyBpIF0uZWxlbWVudCA9PT0gZWxlbWVudCApIHtcbiAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIC0xO1xufVxuXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBTY2hlZHVsZXJzIHByb3ZpZGUgdGhlIGdlbmVyYWwgZW5naW5lIGZvciBhbmltYXRpb25cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbmZ1bmN0aW9uIHNjaGVkdWxlVXBkYXRlKCB2aWV3ZXIsIHVwZGF0ZUZ1bmMgKXtcbiAgICByZXR1cm4gJC5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoIGZ1bmN0aW9uKCl7XG4gICAgICAgIHVwZGF0ZUZ1bmMoIHZpZXdlciApO1xuICAgIH0gKTtcbn1cblxuXG4vL3Byb3ZpZGVzIGEgc2VxdWVuY2UgaW4gdGhlIGZhZGUgYW5pbWF0aW9uXG5mdW5jdGlvbiBzY2hlZHVsZUNvbnRyb2xzRmFkZSggdmlld2VyICkge1xuICAgICQucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCBmdW5jdGlvbigpe1xuICAgICAgICB1cGRhdGVDb250cm9sc0ZhZGUoIHZpZXdlciApO1xuICAgIH0pO1xufVxuXG5cbi8vaW5pdGlhdGVzIGFuIGFuaW1hdGlvbiB0byBoaWRlIHRoZSBjb250cm9sc1xuZnVuY3Rpb24gYmVnaW5Db250cm9sc0F1dG9IaWRlKCB2aWV3ZXIgKSB7XG4gICAgaWYgKCAhdmlld2VyLmF1dG9IaWRlQ29udHJvbHMgKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmlld2VyLmNvbnRyb2xzU2hvdWxkRmFkZSA9IHRydWU7XG4gICAgdmlld2VyLmNvbnRyb2xzRmFkZUJlZ2luVGltZSA9XG4gICAgICAgICQubm93KCkgK1xuICAgICAgICB2aWV3ZXIuY29udHJvbHNGYWRlRGVsYXk7XG5cbiAgICB3aW5kb3cuc2V0VGltZW91dCggZnVuY3Rpb24oKXtcbiAgICAgICAgc2NoZWR1bGVDb250cm9sc0ZhZGUoIHZpZXdlciApO1xuICAgIH0sIHZpZXdlci5jb250cm9sc0ZhZGVEZWxheSApO1xufVxuXG5cbi8vZGV0ZXJtaW5lcyBpZiBmYWRlIGFuaW1hdGlvbiBpcyBkb25lIG9yIGNvbnRpbnVlcyB0aGUgYW5pbWF0aW9uXG5mdW5jdGlvbiB1cGRhdGVDb250cm9sc0ZhZGUoIHZpZXdlciApIHtcbiAgICB2YXIgY3VycmVudFRpbWUsXG4gICAgICAgIGRlbHRhVGltZSxcbiAgICAgICAgb3BhY2l0eSxcbiAgICAgICAgaTtcbiAgICBpZiAoIHZpZXdlci5jb250cm9sc1Nob3VsZEZhZGUgKSB7XG4gICAgICAgIGN1cnJlbnRUaW1lID0gJC5ub3coKTtcbiAgICAgICAgZGVsdGFUaW1lID0gY3VycmVudFRpbWUgLSB2aWV3ZXIuY29udHJvbHNGYWRlQmVnaW5UaW1lO1xuICAgICAgICBvcGFjaXR5ID0gMS4wIC0gZGVsdGFUaW1lIC8gdmlld2VyLmNvbnRyb2xzRmFkZUxlbmd0aDtcblxuICAgICAgICBvcGFjaXR5ID0gTWF0aC5taW4oIDEuMCwgb3BhY2l0eSApO1xuICAgICAgICBvcGFjaXR5ID0gTWF0aC5tYXgoIDAuMCwgb3BhY2l0eSApO1xuXG4gICAgICAgIGZvciAoIGkgPSB2aWV3ZXIuY29udHJvbHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGlmICh2aWV3ZXIuY29udHJvbHNbIGkgXS5hdXRvRmFkZSkge1xuICAgICAgICAgICAgICAgIHZpZXdlci5jb250cm9sc1sgaSBdLnNldE9wYWNpdHkoIG9wYWNpdHkgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICggb3BhY2l0eSA+IDAgKSB7XG4gICAgICAgICAgICAvLyBmYWRlIGFnYWluXG4gICAgICAgICAgICBzY2hlZHVsZUNvbnRyb2xzRmFkZSggdmlld2VyICk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cblxuLy9zdG9wIHRoZSBmYWRlIGFuaW1hdGlvbiBvbiB0aGUgY29udHJvbHMgYW5kIHNob3cgdGhlbVxuZnVuY3Rpb24gYWJvcnRDb250cm9sc0F1dG9IaWRlKCB2aWV3ZXIgKSB7XG4gICAgdmFyIGk7XG4gICAgdmlld2VyLmNvbnRyb2xzU2hvdWxkRmFkZSA9IGZhbHNlO1xuICAgIGZvciAoIGkgPSB2aWV3ZXIuY29udHJvbHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0gKSB7XG4gICAgICAgIHZpZXdlci5jb250cm9sc1sgaSBdLnNldE9wYWNpdHkoIDEuMCApO1xuICAgIH1cbn1cblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIERlZmF1bHQgdmlldyBldmVudCBoYW5kbGVycy5cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbmZ1bmN0aW9uIG9uRm9jdXMoKXtcbiAgICBhYm9ydENvbnRyb2xzQXV0b0hpZGUoIHRoaXMgKTtcbn1cblxuZnVuY3Rpb24gb25CbHVyKCl7XG4gICAgYmVnaW5Db250cm9sc0F1dG9IaWRlKCB0aGlzICk7XG5cbn1cblxuZnVuY3Rpb24gb25DYW52YXNLZXlEb3duKCBldmVudCApIHtcbiAgICBpZiAoICFldmVudC5wcmV2ZW50RGVmYXVsdEFjdGlvbiAmJiAhZXZlbnQuY3RybCAmJiAhZXZlbnQuYWx0ICYmICFldmVudC5tZXRhICkge1xuICAgICAgICBzd2l0Y2goIGV2ZW50LmtleUNvZGUgKXtcbiAgICAgICAgICAgIGNhc2UgMzg6Ly91cCBhcnJvd1xuICAgICAgICAgICAgICAgIGlmICggZXZlbnQuc2hpZnQgKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudmlld3BvcnQuem9vbUJ5KDEuMSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52aWV3cG9ydC5wYW5CeSh0aGlzLnZpZXdwb3J0LmRlbHRhUG9pbnRzRnJvbVBpeGVscyhuZXcgJC5Qb2ludCgwLCAtNDApKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMudmlld3BvcnQuYXBwbHlDb25zdHJhaW50cygpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGNhc2UgNDA6Ly9kb3duIGFycm93XG4gICAgICAgICAgICAgICAgaWYgKCBldmVudC5zaGlmdCApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52aWV3cG9ydC56b29tQnkoMC45KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnZpZXdwb3J0LnBhbkJ5KHRoaXMudmlld3BvcnQuZGVsdGFQb2ludHNGcm9tUGl4ZWxzKG5ldyAkLlBvaW50KDAsIDQwKSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLnZpZXdwb3J0LmFwcGx5Q29uc3RyYWludHMoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBjYXNlIDM3Oi8vbGVmdCBhcnJvd1xuICAgICAgICAgICAgICAgIHRoaXMudmlld3BvcnQucGFuQnkodGhpcy52aWV3cG9ydC5kZWx0YVBvaW50c0Zyb21QaXhlbHMobmV3ICQuUG9pbnQoLTQwLCAwKSkpO1xuICAgICAgICAgICAgICAgIHRoaXMudmlld3BvcnQuYXBwbHlDb25zdHJhaW50cygpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGNhc2UgMzk6Ly9yaWdodCBhcnJvd1xuICAgICAgICAgICAgICAgIHRoaXMudmlld3BvcnQucGFuQnkodGhpcy52aWV3cG9ydC5kZWx0YVBvaW50c0Zyb21QaXhlbHMobmV3ICQuUG9pbnQoNDAsIDApKSk7XG4gICAgICAgICAgICAgICAgdGhpcy52aWV3cG9ydC5hcHBseUNvbnN0cmFpbnRzKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCAnbmF2aWdhdG9yIGtleWNvZGUgJXMnLCBldmVudC5rZXlDb2RlICk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIG9uQ2FudmFzS2V5UHJlc3MoIGV2ZW50ICkge1xuICAgIGlmICggIWV2ZW50LnByZXZlbnREZWZhdWx0QWN0aW9uICYmICFldmVudC5jdHJsICYmICFldmVudC5hbHQgJiYgIWV2ZW50Lm1ldGEgKSB7XG4gICAgICAgIHN3aXRjaCggZXZlbnQua2V5Q29kZSApe1xuICAgICAgICAgICAgY2FzZSA0MzovLz18K1xuICAgICAgICAgICAgY2FzZSA2MTovLz18K1xuICAgICAgICAgICAgICAgIHRoaXMudmlld3BvcnQuem9vbUJ5KDEuMSk7XG4gICAgICAgICAgICAgICAgdGhpcy52aWV3cG9ydC5hcHBseUNvbnN0cmFpbnRzKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgY2FzZSA0NTovLy18X1xuICAgICAgICAgICAgICAgIHRoaXMudmlld3BvcnQuem9vbUJ5KDAuOSk7XG4gICAgICAgICAgICAgICAgdGhpcy52aWV3cG9ydC5hcHBseUNvbnN0cmFpbnRzKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgY2FzZSA0ODovLzB8KVxuICAgICAgICAgICAgICAgIHRoaXMudmlld3BvcnQuZ29Ib21lKCk7XG4gICAgICAgICAgICAgICAgdGhpcy52aWV3cG9ydC5hcHBseUNvbnN0cmFpbnRzKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgY2FzZSAxMTk6Ly93XG4gICAgICAgICAgICBjYXNlIDg3Oi8vV1xuICAgICAgICAgICAgICAgIGlmICggZXZlbnQuc2hpZnQgKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudmlld3BvcnQuem9vbUJ5KDEuMSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52aWV3cG9ydC5wYW5CeSh0aGlzLnZpZXdwb3J0LmRlbHRhUG9pbnRzRnJvbVBpeGVscyhuZXcgJC5Qb2ludCgwLCAtNDApKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMudmlld3BvcnQuYXBwbHlDb25zdHJhaW50cygpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGNhc2UgMTE1Oi8vc1xuICAgICAgICAgICAgY2FzZSA4MzovL1NcbiAgICAgICAgICAgICAgICBpZiAoIGV2ZW50LnNoaWZ0ICkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnZpZXdwb3J0Lnpvb21CeSgwLjkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudmlld3BvcnQucGFuQnkodGhpcy52aWV3cG9ydC5kZWx0YVBvaW50c0Zyb21QaXhlbHMobmV3ICQuUG9pbnQoMCwgNDApKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMudmlld3BvcnQuYXBwbHlDb25zdHJhaW50cygpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGNhc2UgOTc6Ly9hXG4gICAgICAgICAgICAgICAgdGhpcy52aWV3cG9ydC5wYW5CeSh0aGlzLnZpZXdwb3J0LmRlbHRhUG9pbnRzRnJvbVBpeGVscyhuZXcgJC5Qb2ludCgtNDAsIDApKSk7XG4gICAgICAgICAgICAgICAgdGhpcy52aWV3cG9ydC5hcHBseUNvbnN0cmFpbnRzKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgY2FzZSAxMDA6Ly9kXG4gICAgICAgICAgICAgICAgdGhpcy52aWV3cG9ydC5wYW5CeSh0aGlzLnZpZXdwb3J0LmRlbHRhUG9pbnRzRnJvbVBpeGVscyhuZXcgJC5Qb2ludCg0MCwgMCkpKTtcbiAgICAgICAgICAgICAgICB0aGlzLnZpZXdwb3J0LmFwcGx5Q29uc3RyYWludHMoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coICduYXZpZ2F0b3Iga2V5Y29kZSAlcycsIGV2ZW50LmtleUNvZGUgKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gb25DYW52YXNDbGljayggZXZlbnQgKSB7XG4gICAgdmFyIGdlc3R1cmVTZXR0aW5ncztcblxuICAgIHZhciBoYXZlS2V5Ym9hcmRGb2N1cyA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT0gdGhpcy5jYW52YXM7XG5cbiAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGtleWJvYXJkIGZvY3VzLCByZXF1ZXN0IGl0LlxuICAgIGlmICggIWhhdmVLZXlib2FyZEZvY3VzICkge1xuICAgICAgICB0aGlzLmNhbnZhcy5mb2N1cygpO1xuICAgIH1cblxuICAgIGlmICggIWV2ZW50LnByZXZlbnREZWZhdWx0QWN0aW9uICYmIHRoaXMudmlld3BvcnQgJiYgZXZlbnQucXVpY2sgKSB7XG4gICAgICAgIGdlc3R1cmVTZXR0aW5ncyA9IHRoaXMuZ2VzdHVyZVNldHRpbmdzQnlEZXZpY2VUeXBlKCBldmVudC5wb2ludGVyVHlwZSApO1xuICAgICAgICBpZiAoIGdlc3R1cmVTZXR0aW5ncy5jbGlja1RvWm9vbSApIHtcbiAgICAgICAgICAgIHRoaXMudmlld3BvcnQuem9vbUJ5KFxuICAgICAgICAgICAgICAgIGV2ZW50LnNoaWZ0ID8gMS4wIC8gdGhpcy56b29tUGVyQ2xpY2sgOiB0aGlzLnpvb21QZXJDbGljayxcbiAgICAgICAgICAgICAgICB0aGlzLnZpZXdwb3J0LnBvaW50RnJvbVBpeGVsKCBldmVudC5wb3NpdGlvbiwgdHJ1ZSApXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy52aWV3cG9ydC5hcHBseUNvbnN0cmFpbnRzKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUmFpc2VkIHdoZW4gYSBtb3VzZSBwcmVzcy9yZWxlYXNlIG9yIHRvdWNoL3JlbW92ZSBvY2N1cnMgb24gdGhlIHtAbGluayBPcGVuU2VhZHJhZ29uLlZpZXdlciNjYW52YXN9IGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBAZXZlbnQgY2FudmFzLWNsaWNrXG4gICAgICogQG1lbWJlcm9mIE9wZW5TZWFkcmFnb24uVmlld2VyXG4gICAgICogQHR5cGUge29iamVjdH1cbiAgICAgKiBAcHJvcGVydHkge09wZW5TZWFkcmFnb24uVmlld2VyfSBldmVudFNvdXJjZSAtIEEgcmVmZXJlbmNlIHRvIHRoZSBWaWV3ZXIgd2hpY2ggcmFpc2VkIHRoaXMgZXZlbnQuXG4gICAgICogQHByb3BlcnR5IHtPcGVuU2VhZHJhZ29uLk1vdXNlVHJhY2tlcn0gdHJhY2tlciAtIEEgcmVmZXJlbmNlIHRvIHRoZSBNb3VzZVRyYWNrZXIgd2hpY2ggb3JpZ2luYXRlZCB0aGlzIGV2ZW50LlxuICAgICAqIEBwcm9wZXJ0eSB7T3BlblNlYWRyYWdvbi5Qb2ludH0gcG9zaXRpb24gLSBUaGUgcG9zaXRpb24gb2YgdGhlIGV2ZW50IHJlbGF0aXZlIHRvIHRoZSB0cmFja2VkIGVsZW1lbnQuXG4gICAgICogQHByb3BlcnR5IHtCb29sZWFufSBxdWljayAtIFRydWUgb25seSBpZiB0aGUgY2xpY2tEaXN0VGhyZXNob2xkIGFuZCBjbGlja1RpbWVUaHJlc2hvbGQgYXJlIGJvdGggcGFzc2VkLiBVc2VmdWwgZm9yIGRpZmZlcmVudGlhdGluZyBiZXR3ZWVuIGNsaWNrcyBhbmQgZHJhZ3MuXG4gICAgICogQHByb3BlcnR5IHtCb29sZWFufSBzaGlmdCAtIFRydWUgaWYgdGhlIHNoaWZ0IGtleSB3YXMgcHJlc3NlZCBkdXJpbmcgdGhpcyBldmVudC5cbiAgICAgKiBAcHJvcGVydHkge09iamVjdH0gb3JpZ2luYWxFdmVudCAtIFRoZSBvcmlnaW5hbCBET00gZXZlbnQuXG4gICAgICogQHByb3BlcnR5IHs/T2JqZWN0fSB1c2VyRGF0YSAtIEFyYml0cmFyeSBzdWJzY3JpYmVyLWRlZmluZWQgb2JqZWN0LlxuICAgICAqL1xuICAgIHRoaXMucmFpc2VFdmVudCggJ2NhbnZhcy1jbGljaycsIHtcbiAgICAgICAgdHJhY2tlcjogZXZlbnQuZXZlbnRTb3VyY2UsXG4gICAgICAgIHBvc2l0aW9uOiBldmVudC5wb3NpdGlvbixcbiAgICAgICAgcXVpY2s6IGV2ZW50LnF1aWNrLFxuICAgICAgICBzaGlmdDogZXZlbnQuc2hpZnQsXG4gICAgICAgIG9yaWdpbmFsRXZlbnQ6IGV2ZW50Lm9yaWdpbmFsRXZlbnRcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gb25DYW52YXNEYmxDbGljayggZXZlbnQgKSB7XG4gICAgdmFyIGdlc3R1cmVTZXR0aW5ncztcblxuICAgIGlmICggIWV2ZW50LnByZXZlbnREZWZhdWx0QWN0aW9uICYmIHRoaXMudmlld3BvcnQgKSB7XG4gICAgICAgIGdlc3R1cmVTZXR0aW5ncyA9IHRoaXMuZ2VzdHVyZVNldHRpbmdzQnlEZXZpY2VUeXBlKCBldmVudC5wb2ludGVyVHlwZSApO1xuICAgICAgICBpZiAoIGdlc3R1cmVTZXR0aW5ncy5kYmxDbGlja1RvWm9vbSApIHtcbiAgICAgICAgICAgIHRoaXMudmlld3BvcnQuem9vbUJ5KFxuICAgICAgICAgICAgICAgIGV2ZW50LnNoaWZ0ID8gMS4wIC8gdGhpcy56b29tUGVyQ2xpY2sgOiB0aGlzLnpvb21QZXJDbGljayxcbiAgICAgICAgICAgICAgICB0aGlzLnZpZXdwb3J0LnBvaW50RnJvbVBpeGVsKCBldmVudC5wb3NpdGlvbiwgdHJ1ZSApXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy52aWV3cG9ydC5hcHBseUNvbnN0cmFpbnRzKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUmFpc2VkIHdoZW4gYSBkb3VibGUgbW91c2UgcHJlc3MvcmVsZWFzZSBvciB0b3VjaC9yZW1vdmUgb2NjdXJzIG9uIHRoZSB7QGxpbmsgT3BlblNlYWRyYWdvbi5WaWV3ZXIjY2FudmFzfSBlbGVtZW50LlxuICAgICAqXG4gICAgICogQGV2ZW50IGNhbnZhcy1kb3VibGUtY2xpY2tcbiAgICAgKiBAbWVtYmVyb2YgT3BlblNlYWRyYWdvbi5WaWV3ZXJcbiAgICAgKiBAdHlwZSB7b2JqZWN0fVxuICAgICAqIEBwcm9wZXJ0eSB7T3BlblNlYWRyYWdvbi5WaWV3ZXJ9IGV2ZW50U291cmNlIC0gQSByZWZlcmVuY2UgdG8gdGhlIFZpZXdlciB3aGljaCByYWlzZWQgdGhpcyBldmVudC5cbiAgICAgKiBAcHJvcGVydHkge09wZW5TZWFkcmFnb24uTW91c2VUcmFja2VyfSB0cmFja2VyIC0gQSByZWZlcmVuY2UgdG8gdGhlIE1vdXNlVHJhY2tlciB3aGljaCBvcmlnaW5hdGVkIHRoaXMgZXZlbnQuXG4gICAgICogQHByb3BlcnR5IHtPcGVuU2VhZHJhZ29uLlBvaW50fSBwb3NpdGlvbiAtIFRoZSBwb3NpdGlvbiBvZiB0aGUgZXZlbnQgcmVsYXRpdmUgdG8gdGhlIHRyYWNrZWQgZWxlbWVudC5cbiAgICAgKiBAcHJvcGVydHkge0Jvb2xlYW59IHNoaWZ0IC0gVHJ1ZSBpZiB0aGUgc2hpZnQga2V5IHdhcyBwcmVzc2VkIGR1cmluZyB0aGlzIGV2ZW50LlxuICAgICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBvcmlnaW5hbEV2ZW50IC0gVGhlIG9yaWdpbmFsIERPTSBldmVudC5cbiAgICAgKiBAcHJvcGVydHkgez9PYmplY3R9IHVzZXJEYXRhIC0gQXJiaXRyYXJ5IHN1YnNjcmliZXItZGVmaW5lZCBvYmplY3QuXG4gICAgICovXG4gICAgdGhpcy5yYWlzZUV2ZW50KCAnY2FudmFzLWRvdWJsZS1jbGljaycsIHtcbiAgICAgICAgdHJhY2tlcjogZXZlbnQuZXZlbnRTb3VyY2UsXG4gICAgICAgIHBvc2l0aW9uOiBldmVudC5wb3NpdGlvbixcbiAgICAgICAgc2hpZnQ6IGV2ZW50LnNoaWZ0LFxuICAgICAgICBvcmlnaW5hbEV2ZW50OiBldmVudC5vcmlnaW5hbEV2ZW50XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIG9uQ2FudmFzRHJhZyggZXZlbnQgKSB7XG4gICAgdmFyIGdlc3R1cmVTZXR0aW5ncztcblxuICAgIGlmICggIWV2ZW50LnByZXZlbnREZWZhdWx0QWN0aW9uICYmIHRoaXMudmlld3BvcnQgKSB7XG4gICAgICAgIGdlc3R1cmVTZXR0aW5ncyA9IHRoaXMuZ2VzdHVyZVNldHRpbmdzQnlEZXZpY2VUeXBlKCBldmVudC5wb2ludGVyVHlwZSApO1xuICAgICAgICBpZiggIXRoaXMucGFuSG9yaXpvbnRhbCApe1xuICAgICAgICAgICAgZXZlbnQuZGVsdGEueCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgaWYoICF0aGlzLnBhblZlcnRpY2FsICl7XG4gICAgICAgICAgICBldmVudC5kZWx0YS55ID0gMDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZpZXdwb3J0LnBhbkJ5KCB0aGlzLnZpZXdwb3J0LmRlbHRhUG9pbnRzRnJvbVBpeGVscyggZXZlbnQuZGVsdGEubmVnYXRlKCkgKSwgZ2VzdHVyZVNldHRpbmdzLmZsaWNrRW5hYmxlZCApO1xuICAgICAgICBpZiggdGhpcy5jb25zdHJhaW5EdXJpbmdQYW4gKXtcbiAgICAgICAgICAgIHRoaXMudmlld3BvcnQuYXBwbHlDb25zdHJhaW50cygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJhaXNlZCB3aGVuIGEgbW91c2Ugb3IgdG91Y2ggZHJhZyBvcGVyYXRpb24gb2NjdXJzIG9uIHRoZSB7QGxpbmsgT3BlblNlYWRyYWdvbi5WaWV3ZXIjY2FudmFzfSBlbGVtZW50LlxuICAgICAqXG4gICAgICogQGV2ZW50IGNhbnZhcy1kcmFnXG4gICAgICogQG1lbWJlcm9mIE9wZW5TZWFkcmFnb24uVmlld2VyXG4gICAgICogQHR5cGUge29iamVjdH1cbiAgICAgKiBAcHJvcGVydHkge09wZW5TZWFkcmFnb24uVmlld2VyfSBldmVudFNvdXJjZSAtIEEgcmVmZXJlbmNlIHRvIHRoZSBWaWV3ZXIgd2hpY2ggcmFpc2VkIHRoaXMgZXZlbnQuXG4gICAgICogQHByb3BlcnR5IHtPcGVuU2VhZHJhZ29uLk1vdXNlVHJhY2tlcn0gdHJhY2tlciAtIEEgcmVmZXJlbmNlIHRvIHRoZSBNb3VzZVRyYWNrZXIgd2hpY2ggb3JpZ2luYXRlZCB0aGlzIGV2ZW50LlxuICAgICAqIEBwcm9wZXJ0eSB7T3BlblNlYWRyYWdvbi5Qb2ludH0gcG9zaXRpb24gLSBUaGUgcG9zaXRpb24gb2YgdGhlIGV2ZW50IHJlbGF0aXZlIHRvIHRoZSB0cmFja2VkIGVsZW1lbnQuXG4gICAgICogQHByb3BlcnR5IHtPcGVuU2VhZHJhZ29uLlBvaW50fSBkZWx0YSAtIFRoZSB4LHkgY29tcG9uZW50cyBvZiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHN0YXJ0IGRyYWcgYW5kIGVuZCBkcmFnLlxuICAgICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBzcGVlZCAtIEN1cnJlbnQgY29tcHV0ZWQgc3BlZWQsIGluIHBpeGVscyBwZXIgc2Vjb25kLlxuICAgICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBkaXJlY3Rpb24gLSBDdXJyZW50IGNvbXB1dGVkIGRpcmVjdGlvbiwgZXhwcmVzc2VkIGFzIGFuIGFuZ2xlIGNvdW50ZXJjbG9ja3dpc2UgcmVsYXRpdmUgdG8gdGhlIHBvc2l0aXZlIFggYXhpcyAoLXBpIHRvIHBpLCBpbiByYWRpYW5zKS4gT25seSB2YWxpZCBpZiBzcGVlZCA+IDAuXG4gICAgICogQHByb3BlcnR5IHtCb29sZWFufSBzaGlmdCAtIFRydWUgaWYgdGhlIHNoaWZ0IGtleSB3YXMgcHJlc3NlZCBkdXJpbmcgdGhpcyBldmVudC5cbiAgICAgKiBAcHJvcGVydHkge09iamVjdH0gb3JpZ2luYWxFdmVudCAtIFRoZSBvcmlnaW5hbCBET00gZXZlbnQuXG4gICAgICogQHByb3BlcnR5IHs/T2JqZWN0fSB1c2VyRGF0YSAtIEFyYml0cmFyeSBzdWJzY3JpYmVyLWRlZmluZWQgb2JqZWN0LlxuICAgICAqL1xuICAgIHRoaXMucmFpc2VFdmVudCggJ2NhbnZhcy1kcmFnJywge1xuICAgICAgICB0cmFja2VyOiBldmVudC5ldmVudFNvdXJjZSxcbiAgICAgICAgcG9zaXRpb246IGV2ZW50LnBvc2l0aW9uLFxuICAgICAgICBkZWx0YTogZXZlbnQuZGVsdGEsXG4gICAgICAgIHNwZWVkOiBldmVudC5zcGVlZCxcbiAgICAgICAgZGlyZWN0aW9uOiBldmVudC5kaXJlY3Rpb24sXG4gICAgICAgIHNoaWZ0OiBldmVudC5zaGlmdCxcbiAgICAgICAgb3JpZ2luYWxFdmVudDogZXZlbnQub3JpZ2luYWxFdmVudFxuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBvbkNhbnZhc0RyYWdFbmQoIGV2ZW50ICkge1xuICAgIGlmICghZXZlbnQucHJldmVudERlZmF1bHRBY3Rpb24gJiYgdGhpcy52aWV3cG9ydCkge1xuICAgICAgICB2YXIgZ2VzdHVyZVNldHRpbmdzID0gdGhpcy5nZXN0dXJlU2V0dGluZ3NCeURldmljZVR5cGUoZXZlbnQucG9pbnRlclR5cGUpO1xuICAgICAgICBpZiAoZ2VzdHVyZVNldHRpbmdzLmZsaWNrRW5hYmxlZCAmJlxuICAgICAgICAgICAgZXZlbnQuc3BlZWQgPj0gZ2VzdHVyZVNldHRpbmdzLmZsaWNrTWluU3BlZWQpIHtcbiAgICAgICAgICAgIHZhciBhbXBsaXR1ZGVYID0gMDtcbiAgICAgICAgICAgIGlmICh0aGlzLnBhbkhvcml6b250YWwpIHtcbiAgICAgICAgICAgICAgICBhbXBsaXR1ZGVYID0gZ2VzdHVyZVNldHRpbmdzLmZsaWNrTW9tZW50dW0gKiBldmVudC5zcGVlZCAqXG4gICAgICAgICAgICAgICAgICAgIE1hdGguY29zKGV2ZW50LmRpcmVjdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgYW1wbGl0dWRlWSA9IDA7XG4gICAgICAgICAgICBpZiAodGhpcy5wYW5WZXJ0aWNhbCkge1xuICAgICAgICAgICAgICAgIGFtcGxpdHVkZVkgPSBnZXN0dXJlU2V0dGluZ3MuZmxpY2tNb21lbnR1bSAqIGV2ZW50LnNwZWVkICpcbiAgICAgICAgICAgICAgICAgICAgTWF0aC5zaW4oZXZlbnQuZGlyZWN0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBjZW50ZXIgPSB0aGlzLnZpZXdwb3J0LnBpeGVsRnJvbVBvaW50KFxuICAgICAgICAgICAgICAgIHRoaXMudmlld3BvcnQuZ2V0Q2VudGVyKHRydWUpKTtcbiAgICAgICAgICAgIHZhciB0YXJnZXQgPSB0aGlzLnZpZXdwb3J0LnBvaW50RnJvbVBpeGVsKFxuICAgICAgICAgICAgICAgIG5ldyAkLlBvaW50KGNlbnRlci54IC0gYW1wbGl0dWRlWCwgY2VudGVyLnkgLSBhbXBsaXR1ZGVZKSk7XG4gICAgICAgICAgICB0aGlzLnZpZXdwb3J0LnBhblRvKHRhcmdldCwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudmlld3BvcnQuYXBwbHlDb25zdHJhaW50cygpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSYWlzZWQgd2hlbiBhIG1vdXNlIG9yIHRvdWNoIGRyYWcgb3BlcmF0aW9uIGVuZHMgb24gdGhlIHtAbGluayBPcGVuU2VhZHJhZ29uLlZpZXdlciNjYW52YXN9IGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBAZXZlbnQgY2FudmFzLWRyYWctZW5kXG4gICAgICogQG1lbWJlcm9mIE9wZW5TZWFkcmFnb24uVmlld2VyXG4gICAgICogQHR5cGUge29iamVjdH1cbiAgICAgKiBAcHJvcGVydHkge09wZW5TZWFkcmFnb24uVmlld2VyfSBldmVudFNvdXJjZSAtIEEgcmVmZXJlbmNlIHRvIHRoZSBWaWV3ZXIgd2hpY2ggcmFpc2VkIHRoaXMgZXZlbnQuXG4gICAgICogQHByb3BlcnR5IHtPcGVuU2VhZHJhZ29uLk1vdXNlVHJhY2tlcn0gdHJhY2tlciAtIEEgcmVmZXJlbmNlIHRvIHRoZSBNb3VzZVRyYWNrZXIgd2hpY2ggb3JpZ2luYXRlZCB0aGlzIGV2ZW50LlxuICAgICAqIEBwcm9wZXJ0eSB7T3BlblNlYWRyYWdvbi5Qb2ludH0gcG9zaXRpb24gLSBUaGUgcG9zaXRpb24gb2YgdGhlIGV2ZW50IHJlbGF0aXZlIHRvIHRoZSB0cmFja2VkIGVsZW1lbnQuXG4gICAgICogQHByb3BlcnR5IHtOdW1iZXJ9IHNwZWVkIC0gU3BlZWQgYXQgdGhlIGVuZCBvZiBhIGRyYWcgZ2VzdHVyZSwgaW4gcGl4ZWxzIHBlciBzZWNvbmQuXG4gICAgICogQHByb3BlcnR5IHtOdW1iZXJ9IGRpcmVjdGlvbiAtIERpcmVjdGlvbiBhdCB0aGUgZW5kIG9mIGEgZHJhZyBnZXN0dXJlLCBleHByZXNzZWQgYXMgYW4gYW5nbGUgY291bnRlcmNsb2Nrd2lzZSByZWxhdGl2ZSB0byB0aGUgcG9zaXRpdmUgWCBheGlzICgtcGkgdG8gcGksIGluIHJhZGlhbnMpLiBPbmx5IHZhbGlkIGlmIHNwZWVkID4gMC5cbiAgICAgKiBAcHJvcGVydHkge0Jvb2xlYW59IHNoaWZ0IC0gVHJ1ZSBpZiB0aGUgc2hpZnQga2V5IHdhcyBwcmVzc2VkIGR1cmluZyB0aGlzIGV2ZW50LlxuICAgICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBvcmlnaW5hbEV2ZW50IC0gVGhlIG9yaWdpbmFsIERPTSBldmVudC5cbiAgICAgKiBAcHJvcGVydHkgez9PYmplY3R9IHVzZXJEYXRhIC0gQXJiaXRyYXJ5IHN1YnNjcmliZXItZGVmaW5lZCBvYmplY3QuXG4gICAgICovXG4gICAgdGhpcy5yYWlzZUV2ZW50KCdjYW52YXMtZHJhZy1lbmQnLCB7XG4gICAgICAgIHRyYWNrZXI6IGV2ZW50LmV2ZW50U291cmNlLFxuICAgICAgICBwb3NpdGlvbjogZXZlbnQucG9zaXRpb24sXG4gICAgICAgIHNwZWVkOiBldmVudC5zcGVlZCxcbiAgICAgICAgZGlyZWN0aW9uOiBldmVudC5kaXJlY3Rpb24sXG4gICAgICAgIHNoaWZ0OiBldmVudC5zaGlmdCxcbiAgICAgICAgb3JpZ2luYWxFdmVudDogZXZlbnQub3JpZ2luYWxFdmVudFxuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBvbkNhbnZhc0VudGVyKCBldmVudCApIHtcbiAgICAvKipcbiAgICAgKiBSYWlzZWQgd2hlbiBhIHBvaW50ZXIgZW50ZXJzIHRoZSB7QGxpbmsgT3BlblNlYWRyYWdvbi5WaWV3ZXIjY2FudmFzfSBlbGVtZW50LlxuICAgICAqXG4gICAgICogQGV2ZW50IGNhbnZhcy1lbnRlclxuICAgICAqIEBtZW1iZXJvZiBPcGVuU2VhZHJhZ29uLlZpZXdlclxuICAgICAqIEB0eXBlIHtvYmplY3R9XG4gICAgICogQHByb3BlcnR5IHtPcGVuU2VhZHJhZ29uLlZpZXdlcn0gZXZlbnRTb3VyY2UgLSBBIHJlZmVyZW5jZSB0byB0aGUgVmlld2VyIHdoaWNoIHJhaXNlZCB0aGlzIGV2ZW50LlxuICAgICAqIEBwcm9wZXJ0eSB7T3BlblNlYWRyYWdvbi5Nb3VzZVRyYWNrZXJ9IHRyYWNrZXIgLSBBIHJlZmVyZW5jZSB0byB0aGUgTW91c2VUcmFja2VyIHdoaWNoIG9yaWdpbmF0ZWQgdGhpcyBldmVudC5cbiAgICAgKiBAcHJvcGVydHkge1N0cmluZ30gcG9pbnRlclR5cGUgLSBcIm1vdXNlXCIsIFwidG91Y2hcIiwgXCJwZW5cIiwgZXRjLlxuICAgICAqIEBwcm9wZXJ0eSB7T3BlblNlYWRyYWdvbi5Qb2ludH0gcG9zaXRpb24gLSBUaGUgcG9zaXRpb24gb2YgdGhlIGV2ZW50IHJlbGF0aXZlIHRvIHRoZSB0cmFja2VkIGVsZW1lbnQuXG4gICAgICogQHByb3BlcnR5IHtOdW1iZXJ9IGJ1dHRvbnMgLSBDdXJyZW50IGJ1dHRvbnMgcHJlc3NlZC4gQSBjb21iaW5hdGlvbiBvZiBiaXQgZmxhZ3MgMDogbm9uZSwgMTogcHJpbWFyeSAob3IgdG91Y2ggY29udGFjdCksIDI6IHNlY29uZGFyeSwgNDogYXV4IChvZnRlbiBtaWRkbGUpLCA4OiBYMSAob2Z0ZW4gYmFjayksIDE2OiBYMiAob2Z0ZW4gZm9yd2FyZCksIDMyOiBwZW4gZXJhc2VyLlxuICAgICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBwb2ludGVycyAtIE51bWJlciBvZiBwb2ludGVycyAoYWxsIHR5cGVzKSBhY3RpdmUgaW4gdGhlIHRyYWNrZWQgZWxlbWVudC5cbiAgICAgKiBAcHJvcGVydHkge0Jvb2xlYW59IGluc2lkZUVsZW1lbnRQcmVzc2VkIC0gVHJ1ZSBpZiB0aGUgbGVmdCBtb3VzZSBidXR0b24gaXMgY3VycmVudGx5IGJlaW5nIHByZXNzZWQgYW5kIHdhcyBpbml0aWF0ZWQgaW5zaWRlIHRoZSB0cmFja2VkIGVsZW1lbnQsIG90aGVyd2lzZSBmYWxzZS5cbiAgICAgKiBAcHJvcGVydHkge0Jvb2xlYW59IGJ1dHRvbkRvd25BbnkgLSBXYXMgdGhlIGJ1dHRvbiBkb3duIGFueXdoZXJlIGluIHRoZSBzY3JlZW4gZHVyaW5nIHRoZSBldmVudC4gPHNwYW4gc3R5bGU9XCJjb2xvcjpyZWQ7XCI+RGVwcmVjYXRlZC4gVXNlIGJ1dHRvbnMgaW5zdGVhZC48L3NwYW4+XG4gICAgICogQHByb3BlcnR5IHtPYmplY3R9IG9yaWdpbmFsRXZlbnQgLSBUaGUgb3JpZ2luYWwgRE9NIGV2ZW50LlxuICAgICAqIEBwcm9wZXJ0eSB7P09iamVjdH0gdXNlckRhdGEgLSBBcmJpdHJhcnkgc3Vic2NyaWJlci1kZWZpbmVkIG9iamVjdC5cbiAgICAgKi9cbiAgICB0aGlzLnJhaXNlRXZlbnQoICdjYW52YXMtZW50ZXInLCB7XG4gICAgICAgIHRyYWNrZXI6IGV2ZW50LmV2ZW50U291cmNlLFxuICAgICAgICBwb2ludGVyVHlwZTogZXZlbnQucG9pbnRlclR5cGUsXG4gICAgICAgIHBvc2l0aW9uOiBldmVudC5wb3NpdGlvbixcbiAgICAgICAgYnV0dG9uczogZXZlbnQuYnV0dG9ucyxcbiAgICAgICAgcG9pbnRlcnM6IGV2ZW50LnBvaW50ZXJzLFxuICAgICAgICBpbnNpZGVFbGVtZW50UHJlc3NlZDogZXZlbnQuaW5zaWRlRWxlbWVudFByZXNzZWQsXG4gICAgICAgIGJ1dHRvbkRvd25Bbnk6IGV2ZW50LmJ1dHRvbkRvd25BbnksXG4gICAgICAgIG9yaWdpbmFsRXZlbnQ6IGV2ZW50Lm9yaWdpbmFsRXZlbnRcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gb25DYW52YXNFeGl0KCBldmVudCApIHtcbiAgICAvKipcbiAgICAgKiBSYWlzZWQgd2hlbiBhIHBvaW50ZXIgbGVhdmVzIHRoZSB7QGxpbmsgT3BlblNlYWRyYWdvbi5WaWV3ZXIjY2FudmFzfSBlbGVtZW50LlxuICAgICAqXG4gICAgICogQGV2ZW50IGNhbnZhcy1leGl0XG4gICAgICogQG1lbWJlcm9mIE9wZW5TZWFkcmFnb24uVmlld2VyXG4gICAgICogQHR5cGUge29iamVjdH1cbiAgICAgKiBAcHJvcGVydHkge09wZW5TZWFkcmFnb24uVmlld2VyfSBldmVudFNvdXJjZSAtIEEgcmVmZXJlbmNlIHRvIHRoZSBWaWV3ZXIgd2hpY2ggcmFpc2VkIHRoaXMgZXZlbnQuXG4gICAgICogQHByb3BlcnR5IHtPcGVuU2VhZHJhZ29uLk1vdXNlVHJhY2tlcn0gdHJhY2tlciAtIEEgcmVmZXJlbmNlIHRvIHRoZSBNb3VzZVRyYWNrZXIgd2hpY2ggb3JpZ2luYXRlZCB0aGlzIGV2ZW50LlxuICAgICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBwb2ludGVyVHlwZSAtIFwibW91c2VcIiwgXCJ0b3VjaFwiLCBcInBlblwiLCBldGMuXG4gICAgICogQHByb3BlcnR5IHtPcGVuU2VhZHJhZ29uLlBvaW50fSBwb3NpdGlvbiAtIFRoZSBwb3NpdGlvbiBvZiB0aGUgZXZlbnQgcmVsYXRpdmUgdG8gdGhlIHRyYWNrZWQgZWxlbWVudC5cbiAgICAgKiBAcHJvcGVydHkge051bWJlcn0gYnV0dG9ucyAtIEN1cnJlbnQgYnV0dG9ucyBwcmVzc2VkLiBBIGNvbWJpbmF0aW9uIG9mIGJpdCBmbGFncyAwOiBub25lLCAxOiBwcmltYXJ5IChvciB0b3VjaCBjb250YWN0KSwgMjogc2Vjb25kYXJ5LCA0OiBhdXggKG9mdGVuIG1pZGRsZSksIDg6IFgxIChvZnRlbiBiYWNrKSwgMTY6IFgyIChvZnRlbiBmb3J3YXJkKSwgMzI6IHBlbiBlcmFzZXIuXG4gICAgICogQHByb3BlcnR5IHtOdW1iZXJ9IHBvaW50ZXJzIC0gTnVtYmVyIG9mIHBvaW50ZXJzIChhbGwgdHlwZXMpIGFjdGl2ZSBpbiB0aGUgdHJhY2tlZCBlbGVtZW50LlxuICAgICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gaW5zaWRlRWxlbWVudFByZXNzZWQgLSBUcnVlIGlmIHRoZSBsZWZ0IG1vdXNlIGJ1dHRvbiBpcyBjdXJyZW50bHkgYmVpbmcgcHJlc3NlZCBhbmQgd2FzIGluaXRpYXRlZCBpbnNpZGUgdGhlIHRyYWNrZWQgZWxlbWVudCwgb3RoZXJ3aXNlIGZhbHNlLlxuICAgICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gYnV0dG9uRG93bkFueSAtIFdhcyB0aGUgYnV0dG9uIGRvd24gYW55d2hlcmUgaW4gdGhlIHNjcmVlbiBkdXJpbmcgdGhlIGV2ZW50LiA8c3BhbiBzdHlsZT1cImNvbG9yOnJlZDtcIj5EZXByZWNhdGVkLiBVc2UgYnV0dG9ucyBpbnN0ZWFkLjwvc3Bhbj5cbiAgICAgKiBAcHJvcGVydHkge09iamVjdH0gb3JpZ2luYWxFdmVudCAtIFRoZSBvcmlnaW5hbCBET00gZXZlbnQuXG4gICAgICogQHByb3BlcnR5IHs/T2JqZWN0fSB1c2VyRGF0YSAtIEFyYml0cmFyeSBzdWJzY3JpYmVyLWRlZmluZWQgb2JqZWN0LlxuICAgICAqL1xuICAgIHRoaXMucmFpc2VFdmVudCggJ2NhbnZhcy1leGl0Jywge1xuICAgICAgICB0cmFja2VyOiBldmVudC5ldmVudFNvdXJjZSxcbiAgICAgICAgcG9pbnRlclR5cGU6IGV2ZW50LnBvaW50ZXJUeXBlLFxuICAgICAgICBwb3NpdGlvbjogZXZlbnQucG9zaXRpb24sXG4gICAgICAgIGJ1dHRvbnM6IGV2ZW50LmJ1dHRvbnMsXG4gICAgICAgIHBvaW50ZXJzOiBldmVudC5wb2ludGVycyxcbiAgICAgICAgaW5zaWRlRWxlbWVudFByZXNzZWQ6IGV2ZW50Lmluc2lkZUVsZW1lbnRQcmVzc2VkLFxuICAgICAgICBidXR0b25Eb3duQW55OiBldmVudC5idXR0b25Eb3duQW55LFxuICAgICAgICBvcmlnaW5hbEV2ZW50OiBldmVudC5vcmlnaW5hbEV2ZW50XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIG9uQ2FudmFzUHJlc3MoIGV2ZW50ICkge1xuICAgIC8qKlxuICAgICAqIFJhaXNlZCB3aGVuIHRoZSBwcmltYXJ5IG1vdXNlIGJ1dHRvbiBpcyBwcmVzc2VkIG9yIHRvdWNoIHN0YXJ0cyBvbiB0aGUge0BsaW5rIE9wZW5TZWFkcmFnb24uVmlld2VyI2NhbnZhc30gZWxlbWVudC5cbiAgICAgKlxuICAgICAqIEBldmVudCBjYW52YXMtcHJlc3NcbiAgICAgKiBAbWVtYmVyb2YgT3BlblNlYWRyYWdvbi5WaWV3ZXJcbiAgICAgKiBAdHlwZSB7b2JqZWN0fVxuICAgICAqIEBwcm9wZXJ0eSB7T3BlblNlYWRyYWdvbi5WaWV3ZXJ9IGV2ZW50U291cmNlIC0gQSByZWZlcmVuY2UgdG8gdGhlIFZpZXdlciB3aGljaCByYWlzZWQgdGhpcyBldmVudC5cbiAgICAgKiBAcHJvcGVydHkge09wZW5TZWFkcmFnb24uTW91c2VUcmFja2VyfSB0cmFja2VyIC0gQSByZWZlcmVuY2UgdG8gdGhlIE1vdXNlVHJhY2tlciB3aGljaCBvcmlnaW5hdGVkIHRoaXMgZXZlbnQuXG4gICAgICogQHByb3BlcnR5IHtTdHJpbmd9IHBvaW50ZXJUeXBlIC0gXCJtb3VzZVwiLCBcInRvdWNoXCIsIFwicGVuXCIsIGV0Yy5cbiAgICAgKiBAcHJvcGVydHkge09wZW5TZWFkcmFnb24uUG9pbnR9IHBvc2l0aW9uIC0gVGhlIHBvc2l0aW9uIG9mIHRoZSBldmVudCByZWxhdGl2ZSB0byB0aGUgdHJhY2tlZCBlbGVtZW50LlxuICAgICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gaW5zaWRlRWxlbWVudFByZXNzZWQgLSBUcnVlIGlmIHRoZSBsZWZ0IG1vdXNlIGJ1dHRvbiBpcyBjdXJyZW50bHkgYmVpbmcgcHJlc3NlZCBhbmQgd2FzIGluaXRpYXRlZCBpbnNpZGUgdGhlIHRyYWNrZWQgZWxlbWVudCwgb3RoZXJ3aXNlIGZhbHNlLlxuICAgICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gaW5zaWRlRWxlbWVudFJlbGVhc2VkIC0gVHJ1ZSBpZiB0aGUgY3Vyc29yIHN0aWxsIGluc2lkZSB0aGUgdHJhY2tlZCBlbGVtZW50IHdoZW4gdGhlIGJ1dHRvbiB3YXMgcmVsZWFzZWQuXG4gICAgICogQHByb3BlcnR5IHtPYmplY3R9IG9yaWdpbmFsRXZlbnQgLSBUaGUgb3JpZ2luYWwgRE9NIGV2ZW50LlxuICAgICAqIEBwcm9wZXJ0eSB7P09iamVjdH0gdXNlckRhdGEgLSBBcmJpdHJhcnkgc3Vic2NyaWJlci1kZWZpbmVkIG9iamVjdC5cbiAgICAgKi9cbiAgICB0aGlzLnJhaXNlRXZlbnQoICdjYW52YXMtcHJlc3MnLCB7XG4gICAgICAgIHRyYWNrZXI6IGV2ZW50LmV2ZW50U291cmNlLFxuICAgICAgICBwb2ludGVyVHlwZTogZXZlbnQucG9pbnRlclR5cGUsXG4gICAgICAgIHBvc2l0aW9uOiBldmVudC5wb3NpdGlvbixcbiAgICAgICAgaW5zaWRlRWxlbWVudFByZXNzZWQ6IGV2ZW50Lmluc2lkZUVsZW1lbnRQcmVzc2VkLFxuICAgICAgICBpbnNpZGVFbGVtZW50UmVsZWFzZWQ6IGV2ZW50Lmluc2lkZUVsZW1lbnRSZWxlYXNlZCxcbiAgICAgICAgb3JpZ2luYWxFdmVudDogZXZlbnQub3JpZ2luYWxFdmVudFxuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBvbkNhbnZhc1JlbGVhc2UoIGV2ZW50ICkge1xuICAgIC8qKlxuICAgICAqIFJhaXNlZCB3aGVuIHRoZSBwcmltYXJ5IG1vdXNlIGJ1dHRvbiBpcyByZWxlYXNlZCBvciB0b3VjaCBlbmRzIG9uIHRoZSB7QGxpbmsgT3BlblNlYWRyYWdvbi5WaWV3ZXIjY2FudmFzfSBlbGVtZW50LlxuICAgICAqXG4gICAgICogQGV2ZW50IGNhbnZhcy1yZWxlYXNlXG4gICAgICogQG1lbWJlcm9mIE9wZW5TZWFkcmFnb24uVmlld2VyXG4gICAgICogQHR5cGUge29iamVjdH1cbiAgICAgKiBAcHJvcGVydHkge09wZW5TZWFkcmFnb24uVmlld2VyfSBldmVudFNvdXJjZSAtIEEgcmVmZXJlbmNlIHRvIHRoZSBWaWV3ZXIgd2hpY2ggcmFpc2VkIHRoaXMgZXZlbnQuXG4gICAgICogQHByb3BlcnR5IHtPcGVuU2VhZHJhZ29uLk1vdXNlVHJhY2tlcn0gdHJhY2tlciAtIEEgcmVmZXJlbmNlIHRvIHRoZSBNb3VzZVRyYWNrZXIgd2hpY2ggb3JpZ2luYXRlZCB0aGlzIGV2ZW50LlxuICAgICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBwb2ludGVyVHlwZSAtIFwibW91c2VcIiwgXCJ0b3VjaFwiLCBcInBlblwiLCBldGMuXG4gICAgICogQHByb3BlcnR5IHtPcGVuU2VhZHJhZ29uLlBvaW50fSBwb3NpdGlvbiAtIFRoZSBwb3NpdGlvbiBvZiB0aGUgZXZlbnQgcmVsYXRpdmUgdG8gdGhlIHRyYWNrZWQgZWxlbWVudC5cbiAgICAgKiBAcHJvcGVydHkge0Jvb2xlYW59IGluc2lkZUVsZW1lbnRQcmVzc2VkIC0gVHJ1ZSBpZiB0aGUgbGVmdCBtb3VzZSBidXR0b24gaXMgY3VycmVudGx5IGJlaW5nIHByZXNzZWQgYW5kIHdhcyBpbml0aWF0ZWQgaW5zaWRlIHRoZSB0cmFja2VkIGVsZW1lbnQsIG90aGVyd2lzZSBmYWxzZS5cbiAgICAgKiBAcHJvcGVydHkge0Jvb2xlYW59IGluc2lkZUVsZW1lbnRSZWxlYXNlZCAtIFRydWUgaWYgdGhlIGN1cnNvciBzdGlsbCBpbnNpZGUgdGhlIHRyYWNrZWQgZWxlbWVudCB3aGVuIHRoZSBidXR0b24gd2FzIHJlbGVhc2VkLlxuICAgICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBvcmlnaW5hbEV2ZW50IC0gVGhlIG9yaWdpbmFsIERPTSBldmVudC5cbiAgICAgKiBAcHJvcGVydHkgez9PYmplY3R9IHVzZXJEYXRhIC0gQXJiaXRyYXJ5IHN1YnNjcmliZXItZGVmaW5lZCBvYmplY3QuXG4gICAgICovXG4gICAgdGhpcy5yYWlzZUV2ZW50KCAnY2FudmFzLXJlbGVhc2UnLCB7XG4gICAgICAgIHRyYWNrZXI6IGV2ZW50LmV2ZW50U291cmNlLFxuICAgICAgICBwb2ludGVyVHlwZTogZXZlbnQucG9pbnRlclR5cGUsXG4gICAgICAgIHBvc2l0aW9uOiBldmVudC5wb3NpdGlvbixcbiAgICAgICAgaW5zaWRlRWxlbWVudFByZXNzZWQ6IGV2ZW50Lmluc2lkZUVsZW1lbnRQcmVzc2VkLFxuICAgICAgICBpbnNpZGVFbGVtZW50UmVsZWFzZWQ6IGV2ZW50Lmluc2lkZUVsZW1lbnRSZWxlYXNlZCxcbiAgICAgICAgb3JpZ2luYWxFdmVudDogZXZlbnQub3JpZ2luYWxFdmVudFxuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBvbkNhbnZhc05vblByaW1hcnlQcmVzcyggZXZlbnQgKSB7XG4gICAgLyoqXG4gICAgICogUmFpc2VkIHdoZW4gYW55IG5vbi1wcmltYXJ5IHBvaW50ZXIgYnV0dG9uIGlzIHByZXNzZWQgb24gdGhlIHtAbGluayBPcGVuU2VhZHJhZ29uLlZpZXdlciNjYW52YXN9IGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBAZXZlbnQgY2FudmFzLW5vbnByaW1hcnktcHJlc3NcbiAgICAgKiBAbWVtYmVyb2YgT3BlblNlYWRyYWdvbi5WaWV3ZXJcbiAgICAgKiBAdHlwZSB7b2JqZWN0fVxuICAgICAqIEBwcm9wZXJ0eSB7T3BlblNlYWRyYWdvbi5WaWV3ZXJ9IGV2ZW50U291cmNlIC0gQSByZWZlcmVuY2UgdG8gdGhlIFZpZXdlciB3aGljaCByYWlzZWQgdGhpcyBldmVudC5cbiAgICAgKiBAcHJvcGVydHkge09wZW5TZWFkcmFnb24uTW91c2VUcmFja2VyfSB0cmFja2VyIC0gQSByZWZlcmVuY2UgdG8gdGhlIE1vdXNlVHJhY2tlciB3aGljaCBvcmlnaW5hdGVkIHRoaXMgZXZlbnQuXG4gICAgICogQHByb3BlcnR5IHtPcGVuU2VhZHJhZ29uLlBvaW50fSBwb3NpdGlvbiAtIFRoZSBwb3NpdGlvbiBvZiB0aGUgZXZlbnQgcmVsYXRpdmUgdG8gdGhlIHRyYWNrZWQgZWxlbWVudC5cbiAgICAgKiBAcHJvcGVydHkge1N0cmluZ30gcG9pbnRlclR5cGUgLSBcIm1vdXNlXCIsIFwidG91Y2hcIiwgXCJwZW5cIiwgZXRjLlxuICAgICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBidXR0b24gLSBCdXR0b24gd2hpY2ggY2F1c2VkIHRoZSBldmVudC5cbiAgICAgKiAgICAgIC0xOiBub25lLCAwOiBwcmltYXJ5L2xlZnQsIDE6IGF1eC9taWRkbGUsIDI6IHNlY29uZGFyeS9yaWdodCwgMzogWDEvYmFjaywgNDogWDIvZm9yd2FyZCwgNTogcGVuIGVyYXNlci5cbiAgICAgKiBAcHJvcGVydHkge051bWJlcn0gYnV0dG9ucyAtIEN1cnJlbnQgYnV0dG9ucyBwcmVzc2VkLlxuICAgICAqICAgICAgQ29tYmluYXRpb24gb2YgYml0IGZsYWdzIDA6IG5vbmUsIDE6IHByaW1hcnkgKG9yIHRvdWNoIGNvbnRhY3QpLCAyOiBzZWNvbmRhcnksIDQ6IGF1eCAob2Z0ZW4gbWlkZGxlKSwgODogWDEgKG9mdGVuIGJhY2spLCAxNjogWDIgKG9mdGVuIGZvcndhcmQpLCAzMjogcGVuIGVyYXNlci5cbiAgICAgKiBAcHJvcGVydHkge09iamVjdH0gb3JpZ2luYWxFdmVudCAtIFRoZSBvcmlnaW5hbCBET00gZXZlbnQuXG4gICAgICogQHByb3BlcnR5IHs/T2JqZWN0fSB1c2VyRGF0YSAtIEFyYml0cmFyeSBzdWJzY3JpYmVyLWRlZmluZWQgb2JqZWN0LlxuICAgICAqL1xuICAgIHRoaXMucmFpc2VFdmVudCggJ2NhbnZhcy1ub25wcmltYXJ5LXByZXNzJywge1xuICAgICAgICB0cmFja2VyOiBldmVudC5ldmVudFNvdXJjZSxcbiAgICAgICAgcG9zaXRpb246IGV2ZW50LnBvc2l0aW9uLFxuICAgICAgICBwb2ludGVyVHlwZTogZXZlbnQucG9pbnRlclR5cGUsXG4gICAgICAgIGJ1dHRvbjogZXZlbnQuYnV0dG9uLFxuICAgICAgICBidXR0b25zOiBldmVudC5idXR0b25zLFxuICAgICAgICBvcmlnaW5hbEV2ZW50OiBldmVudC5vcmlnaW5hbEV2ZW50XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIG9uQ2FudmFzTm9uUHJpbWFyeVJlbGVhc2UoIGV2ZW50ICkge1xuICAgIC8qKlxuICAgICAqIFJhaXNlZCB3aGVuIGFueSBub24tcHJpbWFyeSBwb2ludGVyIGJ1dHRvbiBpcyByZWxlYXNlZCBvbiB0aGUge0BsaW5rIE9wZW5TZWFkcmFnb24uVmlld2VyI2NhbnZhc30gZWxlbWVudC5cbiAgICAgKlxuICAgICAqIEBldmVudCBjYW52YXMtbm9ucHJpbWFyeS1yZWxlYXNlXG4gICAgICogQG1lbWJlcm9mIE9wZW5TZWFkcmFnb24uVmlld2VyXG4gICAgICogQHR5cGUge29iamVjdH1cbiAgICAgKiBAcHJvcGVydHkge09wZW5TZWFkcmFnb24uVmlld2VyfSBldmVudFNvdXJjZSAtIEEgcmVmZXJlbmNlIHRvIHRoZSBWaWV3ZXIgd2hpY2ggcmFpc2VkIHRoaXMgZXZlbnQuXG4gICAgICogQHByb3BlcnR5IHtPcGVuU2VhZHJhZ29uLk1vdXNlVHJhY2tlcn0gdHJhY2tlciAtIEEgcmVmZXJlbmNlIHRvIHRoZSBNb3VzZVRyYWNrZXIgd2hpY2ggb3JpZ2luYXRlZCB0aGlzIGV2ZW50LlxuICAgICAqIEBwcm9wZXJ0eSB7T3BlblNlYWRyYWdvbi5Qb2ludH0gcG9zaXRpb24gLSBUaGUgcG9zaXRpb24gb2YgdGhlIGV2ZW50IHJlbGF0aXZlIHRvIHRoZSB0cmFja2VkIGVsZW1lbnQuXG4gICAgICogQHByb3BlcnR5IHtTdHJpbmd9IHBvaW50ZXJUeXBlIC0gXCJtb3VzZVwiLCBcInRvdWNoXCIsIFwicGVuXCIsIGV0Yy5cbiAgICAgKiBAcHJvcGVydHkge051bWJlcn0gYnV0dG9uIC0gQnV0dG9uIHdoaWNoIGNhdXNlZCB0aGUgZXZlbnQuXG4gICAgICogICAgICAtMTogbm9uZSwgMDogcHJpbWFyeS9sZWZ0LCAxOiBhdXgvbWlkZGxlLCAyOiBzZWNvbmRhcnkvcmlnaHQsIDM6IFgxL2JhY2ssIDQ6IFgyL2ZvcndhcmQsIDU6IHBlbiBlcmFzZXIuXG4gICAgICogQHByb3BlcnR5IHtOdW1iZXJ9IGJ1dHRvbnMgLSBDdXJyZW50IGJ1dHRvbnMgcHJlc3NlZC5cbiAgICAgKiAgICAgIENvbWJpbmF0aW9uIG9mIGJpdCBmbGFncyAwOiBub25lLCAxOiBwcmltYXJ5IChvciB0b3VjaCBjb250YWN0KSwgMjogc2Vjb25kYXJ5LCA0OiBhdXggKG9mdGVuIG1pZGRsZSksIDg6IFgxIChvZnRlbiBiYWNrKSwgMTY6IFgyIChvZnRlbiBmb3J3YXJkKSwgMzI6IHBlbiBlcmFzZXIuXG4gICAgICogQHByb3BlcnR5IHtPYmplY3R9IG9yaWdpbmFsRXZlbnQgLSBUaGUgb3JpZ2luYWwgRE9NIGV2ZW50LlxuICAgICAqIEBwcm9wZXJ0eSB7P09iamVjdH0gdXNlckRhdGEgLSBBcmJpdHJhcnkgc3Vic2NyaWJlci1kZWZpbmVkIG9iamVjdC5cbiAgICAgKi9cbiAgICB0aGlzLnJhaXNlRXZlbnQoICdjYW52YXMtbm9ucHJpbWFyeS1yZWxlYXNlJywge1xuICAgICAgICB0cmFja2VyOiBldmVudC5ldmVudFNvdXJjZSxcbiAgICAgICAgcG9zaXRpb246IGV2ZW50LnBvc2l0aW9uLFxuICAgICAgICBwb2ludGVyVHlwZTogZXZlbnQucG9pbnRlclR5cGUsXG4gICAgICAgIGJ1dHRvbjogZXZlbnQuYnV0dG9uLFxuICAgICAgICBidXR0b25zOiBldmVudC5idXR0b25zLFxuICAgICAgICBvcmlnaW5hbEV2ZW50OiBldmVudC5vcmlnaW5hbEV2ZW50XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIG9uQ2FudmFzUGluY2goIGV2ZW50ICkge1xuICAgIHZhciBnZXN0dXJlU2V0dGluZ3MsXG4gICAgICAgIGNlbnRlclB0LFxuICAgICAgICBsYXN0Q2VudGVyUHQsXG4gICAgICAgIHBhbkJ5UHQ7XG5cbiAgICBpZiAoICFldmVudC5wcmV2ZW50RGVmYXVsdEFjdGlvbiAmJiB0aGlzLnZpZXdwb3J0ICkge1xuICAgICAgICBnZXN0dXJlU2V0dGluZ3MgPSB0aGlzLmdlc3R1cmVTZXR0aW5nc0J5RGV2aWNlVHlwZSggZXZlbnQucG9pbnRlclR5cGUgKTtcbiAgICAgICAgaWYgKCBnZXN0dXJlU2V0dGluZ3MucGluY2hUb1pvb20gKSB7XG4gICAgICAgICAgICBjZW50ZXJQdCA9IHRoaXMudmlld3BvcnQucG9pbnRGcm9tUGl4ZWwoIGV2ZW50LmNlbnRlciwgdHJ1ZSApO1xuICAgICAgICAgICAgbGFzdENlbnRlclB0ID0gdGhpcy52aWV3cG9ydC5wb2ludEZyb21QaXhlbCggZXZlbnQubGFzdENlbnRlciwgdHJ1ZSApO1xuICAgICAgICAgICAgcGFuQnlQdCA9IGxhc3RDZW50ZXJQdC5taW51cyggY2VudGVyUHQgKTtcbiAgICAgICAgICAgIGlmKCAhdGhpcy5wYW5Ib3Jpem9udGFsICkge1xuICAgICAgICAgICAgICAgIHBhbkJ5UHQueCA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiggIXRoaXMucGFuVmVydGljYWwgKSB7XG4gICAgICAgICAgICAgICAgcGFuQnlQdC55ID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMudmlld3BvcnQuem9vbUJ5KCBldmVudC5kaXN0YW5jZSAvIGV2ZW50Lmxhc3REaXN0YW5jZSwgY2VudGVyUHQsIHRydWUgKTtcbiAgICAgICAgICAgIHRoaXMudmlld3BvcnQucGFuQnkoIHBhbkJ5UHQsIHRydWUgKTtcbiAgICAgICAgICAgIHRoaXMudmlld3BvcnQuYXBwbHlDb25zdHJhaW50cygpO1xuICAgICAgICB9XG4gICAgICAgIGlmICggZ2VzdHVyZVNldHRpbmdzLnBpbmNoUm90YXRlICkge1xuICAgICAgICAgICAgLy8gUGluY2ggcm90YXRlXG4gICAgICAgICAgICB2YXIgYW5nbGUxID0gTWF0aC5hdGFuMihldmVudC5nZXN0dXJlUG9pbnRzWzBdLmN1cnJlbnRQb3MueSAtIGV2ZW50Lmdlc3R1cmVQb2ludHNbMV0uY3VycmVudFBvcy55LFxuICAgICAgICAgICAgICAgIGV2ZW50Lmdlc3R1cmVQb2ludHNbMF0uY3VycmVudFBvcy54IC0gZXZlbnQuZ2VzdHVyZVBvaW50c1sxXS5jdXJyZW50UG9zLngpO1xuICAgICAgICAgICAgdmFyIGFuZ2xlMiA9IE1hdGguYXRhbjIoZXZlbnQuZ2VzdHVyZVBvaW50c1swXS5sYXN0UG9zLnkgLSBldmVudC5nZXN0dXJlUG9pbnRzWzFdLmxhc3RQb3MueSxcbiAgICAgICAgICAgICAgICBldmVudC5nZXN0dXJlUG9pbnRzWzBdLmxhc3RQb3MueCAtIGV2ZW50Lmdlc3R1cmVQb2ludHNbMV0ubGFzdFBvcy54KTtcbiAgICAgICAgICAgIHRoaXMudmlld3BvcnQuc2V0Um90YXRpb24odGhpcy52aWV3cG9ydC5nZXRSb3RhdGlvbigpICsgKChhbmdsZTEgLSBhbmdsZTIpICogKDE4MCAvIE1hdGguUEkpKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUmFpc2VkIHdoZW4gYSBwaW5jaCBldmVudCBvY2N1cnMgb24gdGhlIHtAbGluayBPcGVuU2VhZHJhZ29uLlZpZXdlciNjYW52YXN9IGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBAZXZlbnQgY2FudmFzLXBpbmNoXG4gICAgICogQG1lbWJlcm9mIE9wZW5TZWFkcmFnb24uVmlld2VyXG4gICAgICogQHR5cGUge29iamVjdH1cbiAgICAgKiBAcHJvcGVydHkge09wZW5TZWFkcmFnb24uVmlld2VyfSBldmVudFNvdXJjZSAtIEEgcmVmZXJlbmNlIHRvIHRoZSBWaWV3ZXIgd2hpY2ggcmFpc2VkIHRoaXMgZXZlbnQuXG4gICAgICogQHByb3BlcnR5IHtPcGVuU2VhZHJhZ29uLk1vdXNlVHJhY2tlcn0gdHJhY2tlciAtIEEgcmVmZXJlbmNlIHRvIHRoZSBNb3VzZVRyYWNrZXIgd2hpY2ggb3JpZ2luYXRlZCB0aGlzIGV2ZW50LlxuICAgICAqIEBwcm9wZXJ0eSB7QXJyYXkuPE9wZW5TZWFkcmFnb24uTW91c2VUcmFja2VyLkdlc3R1cmVQb2ludD59IGdlc3R1cmVQb2ludHMgLSBHZXN0dXJlIHBvaW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIGdlc3R1cmUuIFZlbG9jaXR5IGRhdGEgY2FuIGJlIGZvdW5kIGhlcmUuXG4gICAgICogQHByb3BlcnR5IHtPcGVuU2VhZHJhZ29uLlBvaW50fSBsYXN0Q2VudGVyIC0gVGhlIHByZXZpb3VzIGNlbnRlciBwb2ludCBvZiB0aGUgdHdvIHBpbmNoIGNvbnRhY3QgcG9pbnRzIHJlbGF0aXZlIHRvIHRoZSB0cmFja2VkIGVsZW1lbnQuXG4gICAgICogQHByb3BlcnR5IHtPcGVuU2VhZHJhZ29uLlBvaW50fSBjZW50ZXIgLSBUaGUgY2VudGVyIHBvaW50IG9mIHRoZSB0d28gcGluY2ggY29udGFjdCBwb2ludHMgcmVsYXRpdmUgdG8gdGhlIHRyYWNrZWQgZWxlbWVudC5cbiAgICAgKiBAcHJvcGVydHkge051bWJlcn0gbGFzdERpc3RhbmNlIC0gVGhlIHByZXZpb3VzIGRpc3RhbmNlIGJldHdlZW4gdGhlIHR3byBwaW5jaCBjb250YWN0IHBvaW50cyBpbiBDU1MgcGl4ZWxzLlxuICAgICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBkaXN0YW5jZSAtIFRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSB0d28gcGluY2ggY29udGFjdCBwb2ludHMgaW4gQ1NTIHBpeGVscy5cbiAgICAgKiBAcHJvcGVydHkge0Jvb2xlYW59IHNoaWZ0IC0gVHJ1ZSBpZiB0aGUgc2hpZnQga2V5IHdhcyBwcmVzc2VkIGR1cmluZyB0aGlzIGV2ZW50LlxuICAgICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBvcmlnaW5hbEV2ZW50IC0gVGhlIG9yaWdpbmFsIERPTSBldmVudC5cbiAgICAgKiBAcHJvcGVydHkgez9PYmplY3R9IHVzZXJEYXRhIC0gQXJiaXRyYXJ5IHN1YnNjcmliZXItZGVmaW5lZCBvYmplY3QuXG4gICAgICovXG4gICAgdGhpcy5yYWlzZUV2ZW50KCdjYW52YXMtcGluY2gnLCB7XG4gICAgICAgIHRyYWNrZXI6IGV2ZW50LmV2ZW50U291cmNlLFxuICAgICAgICBnZXN0dXJlUG9pbnRzOiBldmVudC5nZXN0dXJlUG9pbnRzLFxuICAgICAgICBsYXN0Q2VudGVyOiBldmVudC5sYXN0Q2VudGVyLFxuICAgICAgICBjZW50ZXI6IGV2ZW50LmNlbnRlcixcbiAgICAgICAgbGFzdERpc3RhbmNlOiBldmVudC5sYXN0RGlzdGFuY2UsXG4gICAgICAgIGRpc3RhbmNlOiBldmVudC5kaXN0YW5jZSxcbiAgICAgICAgc2hpZnQ6IGV2ZW50LnNoaWZ0LFxuICAgICAgICBvcmlnaW5hbEV2ZW50OiBldmVudC5vcmlnaW5hbEV2ZW50XG4gICAgfSk7XG4gICAgLy9jYW5jZWxzIGV2ZW50XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBvbkNhbnZhc1Njcm9sbCggZXZlbnQgKSB7XG4gICAgdmFyIGdlc3R1cmVTZXR0aW5ncyxcbiAgICAgICAgZmFjdG9yLFxuICAgICAgICB0aGlzU2Nyb2xsVGltZSxcbiAgICAgICAgZGVsdGFTY3JvbGxUaW1lO1xuXG4gICAgLyogQ2VydGFpbiBzY3JvbGwgZGV2aWNlcyBmaXJlIHRoZSBzY3JvbGwgZXZlbnQgd2F5IHRvbyBmYXN0IHNvIHdlIGFyZSBpbmplY3RpbmcgYSBzaW1wbGUgYWRqdXN0bWVudCB0byBrZWVwIHRoaW5nc1xuICAgICAqIHBhcnRpYWxseSBub3JtYWxpemVkLiBJZiB3ZSBoYXZlIGFscmVhZHkgZmlyZWQgYW4gZXZlbnQgd2l0aGluIHRoZSBsYXN0ICdtaW5TY3JvbGxEZWx0YScgbWlsbGlzZWNvbmRzIHdlIHNraXBcbiAgICAgKiB0aGlzIG9uZSBhbmQgd2FpdCBmb3IgdGhlIG5leHQgZXZlbnQuICovXG4gICAgdGhpc1Njcm9sbFRpbWUgPSAkLm5vdygpO1xuICAgIGRlbHRhU2Nyb2xsVGltZSA9IHRoaXNTY3JvbGxUaW1lIC0gdGhpcy5fbGFzdFNjcm9sbFRpbWU7XG4gICAgaWYgKGRlbHRhU2Nyb2xsVGltZSA+IHRoaXMubWluU2Nyb2xsRGVsdGFUaW1lKSB7XG4gICAgICAgIHRoaXMuX2xhc3RTY3JvbGxUaW1lID0gdGhpc1Njcm9sbFRpbWU7XG5cbiAgICAgICAgaWYgKCAhZXZlbnQucHJldmVudERlZmF1bHRBY3Rpb24gJiYgdGhpcy52aWV3cG9ydCApIHtcbiAgICAgICAgICAgIGdlc3R1cmVTZXR0aW5ncyA9IHRoaXMuZ2VzdHVyZVNldHRpbmdzQnlEZXZpY2VUeXBlKCBldmVudC5wb2ludGVyVHlwZSApO1xuICAgICAgICAgICAgaWYgKCBnZXN0dXJlU2V0dGluZ3Muc2Nyb2xsVG9ab29tICkge1xuICAgICAgICAgICAgICAgIGZhY3RvciA9IE1hdGgucG93KCB0aGlzLnpvb21QZXJTY3JvbGwsIGV2ZW50LnNjcm9sbCApO1xuICAgICAgICAgICAgICAgIHRoaXMudmlld3BvcnQuem9vbUJ5KFxuICAgICAgICAgICAgICAgICAgICBmYWN0b3IsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudmlld3BvcnQucG9pbnRGcm9tUGl4ZWwoIGV2ZW50LnBvc2l0aW9uLCB0cnVlIClcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHRoaXMudmlld3BvcnQuYXBwbHlDb25zdHJhaW50cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSYWlzZWQgd2hlbiBhIHNjcm9sbCBldmVudCBvY2N1cnMgb24gdGhlIHtAbGluayBPcGVuU2VhZHJhZ29uLlZpZXdlciNjYW52YXN9IGVsZW1lbnQgKG1vdXNlIHdoZWVsKS5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV2ZW50IGNhbnZhcy1zY3JvbGxcbiAgICAgICAgICogQG1lbWJlcm9mIE9wZW5TZWFkcmFnb24uVmlld2VyXG4gICAgICAgICAqIEB0eXBlIHtvYmplY3R9XG4gICAgICAgICAqIEBwcm9wZXJ0eSB7T3BlblNlYWRyYWdvbi5WaWV3ZXJ9IGV2ZW50U291cmNlIC0gQSByZWZlcmVuY2UgdG8gdGhlIFZpZXdlciB3aGljaCByYWlzZWQgdGhpcyBldmVudC5cbiAgICAgICAgICogQHByb3BlcnR5IHtPcGVuU2VhZHJhZ29uLk1vdXNlVHJhY2tlcn0gdHJhY2tlciAtIEEgcmVmZXJlbmNlIHRvIHRoZSBNb3VzZVRyYWNrZXIgd2hpY2ggb3JpZ2luYXRlZCB0aGlzIGV2ZW50LlxuICAgICAgICAgKiBAcHJvcGVydHkge09wZW5TZWFkcmFnb24uUG9pbnR9IHBvc2l0aW9uIC0gVGhlIHBvc2l0aW9uIG9mIHRoZSBldmVudCByZWxhdGl2ZSB0byB0aGUgdHJhY2tlZCBlbGVtZW50LlxuICAgICAgICAgKiBAcHJvcGVydHkge051bWJlcn0gc2Nyb2xsIC0gVGhlIHNjcm9sbCBkZWx0YSBmb3IgdGhlIGV2ZW50LlxuICAgICAgICAgKiBAcHJvcGVydHkge0Jvb2xlYW59IHNoaWZ0IC0gVHJ1ZSBpZiB0aGUgc2hpZnQga2V5IHdhcyBwcmVzc2VkIGR1cmluZyB0aGlzIGV2ZW50LlxuICAgICAgICAgKiBAcHJvcGVydHkge09iamVjdH0gb3JpZ2luYWxFdmVudCAtIFRoZSBvcmlnaW5hbCBET00gZXZlbnQuXG4gICAgICAgICAqIEBwcm9wZXJ0eSB7P09iamVjdH0gdXNlckRhdGEgLSBBcmJpdHJhcnkgc3Vic2NyaWJlci1kZWZpbmVkIG9iamVjdC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMucmFpc2VFdmVudCggJ2NhbnZhcy1zY3JvbGwnLCB7XG4gICAgICAgICAgICB0cmFja2VyOiBldmVudC5ldmVudFNvdXJjZSxcbiAgICAgICAgICAgIHBvc2l0aW9uOiBldmVudC5wb3NpdGlvbixcbiAgICAgICAgICAgIHNjcm9sbDogZXZlbnQuc2Nyb2xsLFxuICAgICAgICAgICAgc2hpZnQ6IGV2ZW50LnNoaWZ0LFxuICAgICAgICAgICAgb3JpZ2luYWxFdmVudDogZXZlbnQub3JpZ2luYWxFdmVudFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGdlc3R1cmVTZXR0aW5ncyAmJiBnZXN0dXJlU2V0dGluZ3Muc2Nyb2xsVG9ab29tKSB7XG4gICAgICAgICAgICAvL2NhbmNlbHMgZXZlbnRcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgZ2VzdHVyZVNldHRpbmdzID0gdGhpcy5nZXN0dXJlU2V0dGluZ3NCeURldmljZVR5cGUoIGV2ZW50LnBvaW50ZXJUeXBlICk7XG4gICAgICAgIGlmIChnZXN0dXJlU2V0dGluZ3MgJiYgZ2VzdHVyZVNldHRpbmdzLnNjcm9sbFRvWm9vbSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAgIC8vIFdlIGFyZSBzd2FsbG93aW5nIHRoaXMgZXZlbnRcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gb25Db250YWluZXJFbnRlciggZXZlbnQgKSB7XG4gICAgVEhJU1sgdGhpcy5oYXNoIF0ubW91c2VJbnNpZGUgPSB0cnVlO1xuICAgIGFib3J0Q29udHJvbHNBdXRvSGlkZSggdGhpcyApO1xuICAgIC8qKlxuICAgICAqIFJhaXNlZCB3aGVuIHRoZSBjdXJzb3IgZW50ZXJzIHRoZSB7QGxpbmsgT3BlblNlYWRyYWdvbi5WaWV3ZXIjY29udGFpbmVyfSBlbGVtZW50LlxuICAgICAqXG4gICAgICogQGV2ZW50IGNvbnRhaW5lci1lbnRlclxuICAgICAqIEBtZW1iZXJvZiBPcGVuU2VhZHJhZ29uLlZpZXdlclxuICAgICAqIEB0eXBlIHtvYmplY3R9XG4gICAgICogQHByb3BlcnR5IHtPcGVuU2VhZHJhZ29uLlZpZXdlcn0gZXZlbnRTb3VyY2UgLSBBIHJlZmVyZW5jZSB0byB0aGUgVmlld2VyIHdoaWNoIHJhaXNlZCB0aGlzIGV2ZW50LlxuICAgICAqIEBwcm9wZXJ0eSB7T3BlblNlYWRyYWdvbi5Nb3VzZVRyYWNrZXJ9IHRyYWNrZXIgLSBBIHJlZmVyZW5jZSB0byB0aGUgTW91c2VUcmFja2VyIHdoaWNoIG9yaWdpbmF0ZWQgdGhpcyBldmVudC5cbiAgICAgKiBAcHJvcGVydHkge09wZW5TZWFkcmFnb24uUG9pbnR9IHBvc2l0aW9uIC0gVGhlIHBvc2l0aW9uIG9mIHRoZSBldmVudCByZWxhdGl2ZSB0byB0aGUgdHJhY2tlZCBlbGVtZW50LlxuICAgICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBidXR0b25zIC0gQ3VycmVudCBidXR0b25zIHByZXNzZWQuIEEgY29tYmluYXRpb24gb2YgYml0IGZsYWdzIDA6IG5vbmUsIDE6IHByaW1hcnkgKG9yIHRvdWNoIGNvbnRhY3QpLCAyOiBzZWNvbmRhcnksIDQ6IGF1eCAob2Z0ZW4gbWlkZGxlKSwgODogWDEgKG9mdGVuIGJhY2spLCAxNjogWDIgKG9mdGVuIGZvcndhcmQpLCAzMjogcGVuIGVyYXNlci5cbiAgICAgKiBAcHJvcGVydHkge051bWJlcn0gcG9pbnRlcnMgLSBOdW1iZXIgb2YgcG9pbnRlcnMgKGFsbCB0eXBlcykgYWN0aXZlIGluIHRoZSB0cmFja2VkIGVsZW1lbnQuXG4gICAgICogQHByb3BlcnR5IHtCb29sZWFufSBpbnNpZGVFbGVtZW50UHJlc3NlZCAtIFRydWUgaWYgdGhlIGxlZnQgbW91c2UgYnV0dG9uIGlzIGN1cnJlbnRseSBiZWluZyBwcmVzc2VkIGFuZCB3YXMgaW5pdGlhdGVkIGluc2lkZSB0aGUgdHJhY2tlZCBlbGVtZW50LCBvdGhlcndpc2UgZmFsc2UuXG4gICAgICogQHByb3BlcnR5IHtCb29sZWFufSBidXR0b25Eb3duQW55IC0gV2FzIHRoZSBidXR0b24gZG93biBhbnl3aGVyZSBpbiB0aGUgc2NyZWVuIGR1cmluZyB0aGUgZXZlbnQuIDxzcGFuIHN0eWxlPVwiY29sb3I6cmVkO1wiPkRlcHJlY2F0ZWQuIFVzZSBidXR0b25zIGluc3RlYWQuPC9zcGFuPlxuICAgICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBvcmlnaW5hbEV2ZW50IC0gVGhlIG9yaWdpbmFsIERPTSBldmVudC5cbiAgICAgKiBAcHJvcGVydHkgez9PYmplY3R9IHVzZXJEYXRhIC0gQXJiaXRyYXJ5IHN1YnNjcmliZXItZGVmaW5lZCBvYmplY3QuXG4gICAgICovXG4gICAgdGhpcy5yYWlzZUV2ZW50KCAnY29udGFpbmVyLWVudGVyJywge1xuICAgICAgICB0cmFja2VyOiBldmVudC5ldmVudFNvdXJjZSxcbiAgICAgICAgcG9zaXRpb246IGV2ZW50LnBvc2l0aW9uLFxuICAgICAgICBidXR0b25zOiBldmVudC5idXR0b25zLFxuICAgICAgICBwb2ludGVyczogZXZlbnQucG9pbnRlcnMsXG4gICAgICAgIGluc2lkZUVsZW1lbnRQcmVzc2VkOiBldmVudC5pbnNpZGVFbGVtZW50UHJlc3NlZCxcbiAgICAgICAgYnV0dG9uRG93bkFueTogZXZlbnQuYnV0dG9uRG93bkFueSxcbiAgICAgICAgb3JpZ2luYWxFdmVudDogZXZlbnQub3JpZ2luYWxFdmVudFxuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBvbkNvbnRhaW5lckV4aXQoIGV2ZW50ICkge1xuICAgIGlmICggZXZlbnQucG9pbnRlcnMgPCAxICkge1xuICAgICAgICBUSElTWyB0aGlzLmhhc2ggXS5tb3VzZUluc2lkZSA9IGZhbHNlO1xuICAgICAgICBpZiAoICFUSElTWyB0aGlzLmhhc2ggXS5hbmltYXRpbmcgKSB7XG4gICAgICAgICAgICBiZWdpbkNvbnRyb2xzQXV0b0hpZGUoIHRoaXMgKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSYWlzZWQgd2hlbiB0aGUgY3Vyc29yIGxlYXZlcyB0aGUge0BsaW5rIE9wZW5TZWFkcmFnb24uVmlld2VyI2NvbnRhaW5lcn0gZWxlbWVudC5cbiAgICAgKlxuICAgICAqIEBldmVudCBjb250YWluZXItZXhpdFxuICAgICAqIEBtZW1iZXJvZiBPcGVuU2VhZHJhZ29uLlZpZXdlclxuICAgICAqIEB0eXBlIHtvYmplY3R9XG4gICAgICogQHByb3BlcnR5IHtPcGVuU2VhZHJhZ29uLlZpZXdlcn0gZXZlbnRTb3VyY2UgLSBBIHJlZmVyZW5jZSB0byB0aGUgVmlld2VyIHdoaWNoIHJhaXNlZCB0aGlzIGV2ZW50LlxuICAgICAqIEBwcm9wZXJ0eSB7T3BlblNlYWRyYWdvbi5Nb3VzZVRyYWNrZXJ9IHRyYWNrZXIgLSBBIHJlZmVyZW5jZSB0byB0aGUgTW91c2VUcmFja2VyIHdoaWNoIG9yaWdpbmF0ZWQgdGhpcyBldmVudC5cbiAgICAgKiBAcHJvcGVydHkge09wZW5TZWFkcmFnb24uUG9pbnR9IHBvc2l0aW9uIC0gVGhlIHBvc2l0aW9uIG9mIHRoZSBldmVudCByZWxhdGl2ZSB0byB0aGUgdHJhY2tlZCBlbGVtZW50LlxuICAgICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBidXR0b25zIC0gQ3VycmVudCBidXR0b25zIHByZXNzZWQuIEEgY29tYmluYXRpb24gb2YgYml0IGZsYWdzIDA6IG5vbmUsIDE6IHByaW1hcnkgKG9yIHRvdWNoIGNvbnRhY3QpLCAyOiBzZWNvbmRhcnksIDQ6IGF1eCAob2Z0ZW4gbWlkZGxlKSwgODogWDEgKG9mdGVuIGJhY2spLCAxNjogWDIgKG9mdGVuIGZvcndhcmQpLCAzMjogcGVuIGVyYXNlci5cbiAgICAgKiBAcHJvcGVydHkge051bWJlcn0gcG9pbnRlcnMgLSBOdW1iZXIgb2YgcG9pbnRlcnMgKGFsbCB0eXBlcykgYWN0aXZlIGluIHRoZSB0cmFja2VkIGVsZW1lbnQuXG4gICAgICogQHByb3BlcnR5IHtCb29sZWFufSBpbnNpZGVFbGVtZW50UHJlc3NlZCAtIFRydWUgaWYgdGhlIGxlZnQgbW91c2UgYnV0dG9uIGlzIGN1cnJlbnRseSBiZWluZyBwcmVzc2VkIGFuZCB3YXMgaW5pdGlhdGVkIGluc2lkZSB0aGUgdHJhY2tlZCBlbGVtZW50LCBvdGhlcndpc2UgZmFsc2UuXG4gICAgICogQHByb3BlcnR5IHtCb29sZWFufSBidXR0b25Eb3duQW55IC0gV2FzIHRoZSBidXR0b24gZG93biBhbnl3aGVyZSBpbiB0aGUgc2NyZWVuIGR1cmluZyB0aGUgZXZlbnQuIDxzcGFuIHN0eWxlPVwiY29sb3I6cmVkO1wiPkRlcHJlY2F0ZWQuIFVzZSBidXR0b25zIGluc3RlYWQuPC9zcGFuPlxuICAgICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBvcmlnaW5hbEV2ZW50IC0gVGhlIG9yaWdpbmFsIERPTSBldmVudC5cbiAgICAgKiBAcHJvcGVydHkgez9PYmplY3R9IHVzZXJEYXRhIC0gQXJiaXRyYXJ5IHN1YnNjcmliZXItZGVmaW5lZCBvYmplY3QuXG4gICAgICovXG4gICAgdGhpcy5yYWlzZUV2ZW50KCAnY29udGFpbmVyLWV4aXQnLCB7XG4gICAgICAgIHRyYWNrZXI6IGV2ZW50LmV2ZW50U291cmNlLFxuICAgICAgICBwb3NpdGlvbjogZXZlbnQucG9zaXRpb24sXG4gICAgICAgIGJ1dHRvbnM6IGV2ZW50LmJ1dHRvbnMsXG4gICAgICAgIHBvaW50ZXJzOiBldmVudC5wb2ludGVycyxcbiAgICAgICAgaW5zaWRlRWxlbWVudFByZXNzZWQ6IGV2ZW50Lmluc2lkZUVsZW1lbnRQcmVzc2VkLFxuICAgICAgICBidXR0b25Eb3duQW55OiBldmVudC5idXR0b25Eb3duQW55LFxuICAgICAgICBvcmlnaW5hbEV2ZW50OiBldmVudC5vcmlnaW5hbEV2ZW50XG4gICAgfSk7XG59XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gUGFnZSB1cGRhdGUgcm91dGluZXMgKCBha2EgVmlld3MgLSBmb3IgZnV0dXJlIHJlZmVyZW5jZSApXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbmZ1bmN0aW9uIHVwZGF0ZU11bHRpKCB2aWV3ZXIgKSB7XG4gICAgdXBkYXRlT25jZSggdmlld2VyICk7XG5cbiAgICAvLyBSZXF1ZXN0IHRoZSBuZXh0IGZyYW1lLCB1bmxlc3Mgd2UndmUgYmVlbiBjbG9zZWRcbiAgICBpZiAoIHZpZXdlci5pc09wZW4oKSApIHtcbiAgICAgICAgdmlld2VyLl91cGRhdGVSZXF1ZXN0SWQgPSBzY2hlZHVsZVVwZGF0ZSggdmlld2VyLCB1cGRhdGVNdWx0aSApO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHZpZXdlci5fdXBkYXRlUmVxdWVzdElkID0gZmFsc2U7XG4gICAgfVxufVxuXG5mdW5jdGlvbiB1cGRhdGVPbmNlKCB2aWV3ZXIgKSB7XG5cbiAgICAvL3ZpZXdlci5wcm9maWxlci5iZWdpblVwZGF0ZSgpO1xuXG4gICAgaWYgKHZpZXdlci5fb3BlbmluZykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHZpZXdlci5hdXRvUmVzaXplKSB7XG4gICAgICAgIHZhciBjb250YWluZXJTaXplID0gX2dldFNhZmVFbGVtU2l6ZSh2aWV3ZXIuY29udGFpbmVyKTtcbiAgICAgICAgdmFyIHByZXZDb250YWluZXJTaXplID0gVEhJU1t2aWV3ZXIuaGFzaF0ucHJldkNvbnRhaW5lclNpemU7XG4gICAgICAgIGlmICghY29udGFpbmVyU2l6ZS5lcXVhbHMocHJldkNvbnRhaW5lclNpemUpKSB7XG4gICAgICAgICAgICB2YXIgdmlld3BvcnQgPSB2aWV3ZXIudmlld3BvcnQ7XG4gICAgICAgICAgICBpZiAodmlld2VyLnByZXNlcnZlSW1hZ2VTaXplT25SZXNpemUpIHtcbiAgICAgICAgICAgICAgICB2YXIgcmVzaXplUmF0aW8gPSBwcmV2Q29udGFpbmVyU2l6ZS54IC8gY29udGFpbmVyU2l6ZS54O1xuICAgICAgICAgICAgICAgIHZhciB6b29tID0gdmlld3BvcnQuZ2V0Wm9vbSgpICogcmVzaXplUmF0aW87XG4gICAgICAgICAgICAgICAgdmFyIGNlbnRlciA9IHZpZXdwb3J0LmdldENlbnRlcigpO1xuICAgICAgICAgICAgICAgIHZpZXdwb3J0LnJlc2l6ZShjb250YWluZXJTaXplLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgdmlld3BvcnQuem9vbVRvKHpvb20sIG51bGwsIHRydWUpO1xuICAgICAgICAgICAgICAgIHZpZXdwb3J0LnBhblRvKGNlbnRlciwgdHJ1ZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIG1haW50YWluIGltYWdlIHBvc2l0aW9uXG4gICAgICAgICAgICAgICAgdmFyIG9sZEJvdW5kcyA9IHZpZXdwb3J0LmdldEJvdW5kcygpO1xuICAgICAgICAgICAgICAgIHZpZXdwb3J0LnJlc2l6ZShjb250YWluZXJTaXplLCB0cnVlKTtcbiAgICAgICAgICAgICAgICB2aWV3cG9ydC5maXRCb3VuZHNXaXRoQ29uc3RyYWludHMob2xkQm91bmRzLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFRISVNbdmlld2VyLmhhc2hdLnByZXZDb250YWluZXJTaXplID0gY29udGFpbmVyU2l6ZTtcbiAgICAgICAgICAgIFRISVNbdmlld2VyLmhhc2hdLmZvcmNlUmVkcmF3ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciB2aWV3cG9ydENoYW5nZSA9IHZpZXdlci52aWV3cG9ydC51cGRhdGUoKTtcbiAgICB2YXIgYW5pbWF0ZWQgPSB2aWV3ZXIud29ybGQudXBkYXRlKCkgfHwgdmlld3BvcnRDaGFuZ2U7XG5cbiAgICBpZiAodmlld3BvcnRDaGFuZ2UpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJhaXNlZCB3aGVuIGFueSBzcHJpbmcgYW5pbWF0aW9uIHVwZGF0ZSBvY2N1cnMgKHpvb20sIHBhbiwgZXRjLiksXG4gICAgICAgICAqIGJlZm9yZSB0aGUgdmlld2VyIGhhcyBkcmF3biB0aGUgbmV3IGxvY2F0aW9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXZlbnQgdmlld3BvcnQtY2hhbmdlXG4gICAgICAgICAqIEBtZW1iZXJvZiBPcGVuU2VhZHJhZ29uLlZpZXdlclxuICAgICAgICAgKiBAdHlwZSB7b2JqZWN0fVxuICAgICAgICAgKiBAcHJvcGVydHkge09wZW5TZWFkcmFnb24uVmlld2VyfSBldmVudFNvdXJjZSAtIEEgcmVmZXJlbmNlIHRvIHRoZSBWaWV3ZXIgd2hpY2ggcmFpc2VkIHRoaXMgZXZlbnQuXG4gICAgICAgICAqIEBwcm9wZXJ0eSB7P09iamVjdH0gdXNlckRhdGEgLSBBcmJpdHJhcnkgc3Vic2NyaWJlci1kZWZpbmVkIG9iamVjdC5cbiAgICAgICAgICovXG4gICAgICAgIHZpZXdlci5yYWlzZUV2ZW50KCd2aWV3cG9ydC1jaGFuZ2UnKTtcbiAgICB9XG5cbiAgICBpZiggdmlld2VyLnJlZmVyZW5jZVN0cmlwICl7XG4gICAgICAgIGFuaW1hdGVkID0gdmlld2VyLnJlZmVyZW5jZVN0cmlwLnVwZGF0ZSggdmlld2VyLnZpZXdwb3J0ICkgfHwgYW5pbWF0ZWQ7XG4gICAgfVxuXG4gICAgaWYgKCAhVEhJU1sgdmlld2VyLmhhc2ggXS5hbmltYXRpbmcgJiYgYW5pbWF0ZWQgKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSYWlzZWQgd2hlbiBhbnkgc3ByaW5nIGFuaW1hdGlvbiBzdGFydHMgKHpvb20sIHBhbiwgZXRjLikuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBldmVudCBhbmltYXRpb24tc3RhcnRcbiAgICAgICAgICogQG1lbWJlcm9mIE9wZW5TZWFkcmFnb24uVmlld2VyXG4gICAgICAgICAqIEB0eXBlIHtvYmplY3R9XG4gICAgICAgICAqIEBwcm9wZXJ0eSB7T3BlblNlYWRyYWdvbi5WaWV3ZXJ9IGV2ZW50U291cmNlIC0gQSByZWZlcmVuY2UgdG8gdGhlIFZpZXdlciB3aGljaCByYWlzZWQgdGhpcyBldmVudC5cbiAgICAgICAgICogQHByb3BlcnR5IHs/T2JqZWN0fSB1c2VyRGF0YSAtIEFyYml0cmFyeSBzdWJzY3JpYmVyLWRlZmluZWQgb2JqZWN0LlxuICAgICAgICAgKi9cbiAgICAgICAgdmlld2VyLnJhaXNlRXZlbnQoIFwiYW5pbWF0aW9uLXN0YXJ0XCIgKTtcbiAgICAgICAgYWJvcnRDb250cm9sc0F1dG9IaWRlKCB2aWV3ZXIgKTtcbiAgICB9XG5cbiAgICBpZiAoIGFuaW1hdGVkIHx8IFRISVNbIHZpZXdlci5oYXNoIF0uZm9yY2VSZWRyYXcgfHwgdmlld2VyLndvcmxkLm5lZWRzRHJhdygpICkge1xuICAgICAgICBkcmF3V29ybGQoIHZpZXdlciApO1xuICAgICAgICB2aWV3ZXIuX2RyYXdPdmVybGF5cygpO1xuICAgICAgICBpZiggdmlld2VyLm5hdmlnYXRvciApe1xuICAgICAgICAgICAgdmlld2VyLm5hdmlnYXRvci51cGRhdGUoIHZpZXdlci52aWV3cG9ydCApO1xuICAgICAgICB9XG5cbiAgICAgICAgVEhJU1sgdmlld2VyLmhhc2ggXS5mb3JjZVJlZHJhdyA9IGZhbHNlO1xuXG4gICAgICAgIGlmIChhbmltYXRlZCkge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBSYWlzZWQgd2hlbiBhbnkgc3ByaW5nIGFuaW1hdGlvbiB1cGRhdGUgb2NjdXJzICh6b29tLCBwYW4sIGV0Yy4pLFxuICAgICAgICAgICAgICogYWZ0ZXIgdGhlIHZpZXdlciBoYXMgZHJhd24gdGhlIG5ldyBsb2NhdGlvbi5cbiAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgKiBAZXZlbnQgYW5pbWF0aW9uXG4gICAgICAgICAgICAgKiBAbWVtYmVyb2YgT3BlblNlYWRyYWdvbi5WaWV3ZXJcbiAgICAgICAgICAgICAqIEB0eXBlIHtvYmplY3R9XG4gICAgICAgICAgICAgKiBAcHJvcGVydHkge09wZW5TZWFkcmFnb24uVmlld2VyfSBldmVudFNvdXJjZSAtIEEgcmVmZXJlbmNlIHRvIHRoZSBWaWV3ZXIgd2hpY2ggcmFpc2VkIHRoaXMgZXZlbnQuXG4gICAgICAgICAgICAgKiBAcHJvcGVydHkgez9PYmplY3R9IHVzZXJEYXRhIC0gQXJiaXRyYXJ5IHN1YnNjcmliZXItZGVmaW5lZCBvYmplY3QuXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIHZpZXdlci5yYWlzZUV2ZW50KCBcImFuaW1hdGlvblwiICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIFRISVNbIHZpZXdlci5oYXNoIF0uYW5pbWF0aW5nICYmICFhbmltYXRlZCApIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJhaXNlZCB3aGVuIGFueSBzcHJpbmcgYW5pbWF0aW9uIGVuZHMgKHpvb20sIHBhbiwgZXRjLikuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBldmVudCBhbmltYXRpb24tZmluaXNoXG4gICAgICAgICAqIEBtZW1iZXJvZiBPcGVuU2VhZHJhZ29uLlZpZXdlclxuICAgICAgICAgKiBAdHlwZSB7b2JqZWN0fVxuICAgICAgICAgKiBAcHJvcGVydHkge09wZW5TZWFkcmFnb24uVmlld2VyfSBldmVudFNvdXJjZSAtIEEgcmVmZXJlbmNlIHRvIHRoZSBWaWV3ZXIgd2hpY2ggcmFpc2VkIHRoaXMgZXZlbnQuXG4gICAgICAgICAqIEBwcm9wZXJ0eSB7P09iamVjdH0gdXNlckRhdGEgLSBBcmJpdHJhcnkgc3Vic2NyaWJlci1kZWZpbmVkIG9iamVjdC5cbiAgICAgICAgICovXG4gICAgICAgIHZpZXdlci5yYWlzZUV2ZW50KCBcImFuaW1hdGlvbi1maW5pc2hcIiApO1xuXG4gICAgICAgIGlmICggIVRISVNbIHZpZXdlci5oYXNoIF0ubW91c2VJbnNpZGUgKSB7XG4gICAgICAgICAgICBiZWdpbkNvbnRyb2xzQXV0b0hpZGUoIHZpZXdlciApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgVEhJU1sgdmlld2VyLmhhc2ggXS5hbmltYXRpbmcgPSBhbmltYXRlZDtcblxuICAgIC8vdmlld2VyLnByb2ZpbGVyLmVuZFVwZGF0ZSgpO1xufVxuXG5mdW5jdGlvbiBkcmF3V29ybGQoIHZpZXdlciApIHtcbiAgICB2aWV3ZXIuaW1hZ2VMb2FkZXIuY2xlYXIoKTtcbiAgICB2aWV3ZXIuZHJhd2VyLmNsZWFyKCk7XG4gICAgdmlld2VyLndvcmxkLmRyYXcoKTtcblxuICAgIC8qKlxuICAgICAqIDxlbT4tIE5lZWRzIGRvY3VtZW50YXRpb24gLTwvZW0+XG4gICAgICpcbiAgICAgKiBAZXZlbnQgdXBkYXRlLXZpZXdwb3J0XG4gICAgICogQG1lbWJlcm9mIE9wZW5TZWFkcmFnb24uVmlld2VyXG4gICAgICogQHR5cGUge29iamVjdH1cbiAgICAgKiBAcHJvcGVydHkge09wZW5TZWFkcmFnb24uVmlld2VyfSBldmVudFNvdXJjZSAtIEEgcmVmZXJlbmNlIHRvIHRoZSBWaWV3ZXIgd2hpY2ggcmFpc2VkIHRoZSBldmVudC5cbiAgICAgKiBAcHJvcGVydHkgez9PYmplY3R9IHVzZXJEYXRhIC0gQXJiaXRyYXJ5IHN1YnNjcmliZXItZGVmaW5lZCBvYmplY3QuXG4gICAgICovXG4gICAgdmlld2VyLnJhaXNlRXZlbnQoICd1cGRhdGUtdmlld3BvcnQnLCB7fSApO1xufVxuXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBOYXZpZ2F0aW9uIENvbnRyb2xzXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5mdW5jdGlvbiByZXNvbHZlVXJsKCBwcmVmaXgsIHVybCApIHtcbiAgICByZXR1cm4gcHJlZml4ID8gcHJlZml4ICsgdXJsIDogdXJsO1xufVxuXG5cblxuZnVuY3Rpb24gYmVnaW5ab29taW5nSW4oKSB7XG4gICAgVEhJU1sgdGhpcy5oYXNoIF0ubGFzdFpvb21UaW1lID0gJC5ub3coKTtcbiAgICBUSElTWyB0aGlzLmhhc2ggXS56b29tRmFjdG9yID0gdGhpcy56b29tUGVyU2Vjb25kO1xuICAgIFRISVNbIHRoaXMuaGFzaCBdLnpvb21pbmcgPSB0cnVlO1xuICAgIHNjaGVkdWxlWm9vbSggdGhpcyApO1xufVxuXG5cbmZ1bmN0aW9uIGJlZ2luWm9vbWluZ091dCgpIHtcbiAgICBUSElTWyB0aGlzLmhhc2ggXS5sYXN0Wm9vbVRpbWUgPSAkLm5vdygpO1xuICAgIFRISVNbIHRoaXMuaGFzaCBdLnpvb21GYWN0b3IgPSAxLjAgLyB0aGlzLnpvb21QZXJTZWNvbmQ7XG4gICAgVEhJU1sgdGhpcy5oYXNoIF0uem9vbWluZyA9IHRydWU7XG4gICAgc2NoZWR1bGVab29tKCB0aGlzICk7XG59XG5cblxuZnVuY3Rpb24gZW5kWm9vbWluZygpIHtcbiAgICBUSElTWyB0aGlzLmhhc2ggXS56b29taW5nID0gZmFsc2U7XG59XG5cblxuZnVuY3Rpb24gc2NoZWR1bGVab29tKCB2aWV3ZXIgKSB7XG4gICAgJC5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoICQuZGVsZWdhdGUoIHZpZXdlciwgZG9ab29tICkgKTtcbn1cblxuXG5mdW5jdGlvbiBkb1pvb20oKSB7XG4gICAgdmFyIGN1cnJlbnRUaW1lLFxuICAgICAgICBkZWx0YVRpbWUsXG4gICAgICAgIGFkanVzdGVkRmFjdG9yO1xuXG4gICAgaWYgKCBUSElTWyB0aGlzLmhhc2ggXS56b29taW5nICYmIHRoaXMudmlld3BvcnQpIHtcbiAgICAgICAgY3VycmVudFRpbWUgICAgID0gJC5ub3coKTtcbiAgICAgICAgZGVsdGFUaW1lICAgICAgID0gY3VycmVudFRpbWUgLSBUSElTWyB0aGlzLmhhc2ggXS5sYXN0Wm9vbVRpbWU7XG4gICAgICAgIGFkanVzdGVkRmFjdG9yICA9IE1hdGgucG93KCBUSElTWyB0aGlzLmhhc2ggXS56b29tRmFjdG9yLCBkZWx0YVRpbWUgLyAxMDAwICk7XG5cbiAgICAgICAgdGhpcy52aWV3cG9ydC56b29tQnkoIGFkanVzdGVkRmFjdG9yICk7XG4gICAgICAgIHRoaXMudmlld3BvcnQuYXBwbHlDb25zdHJhaW50cygpO1xuICAgICAgICBUSElTWyB0aGlzLmhhc2ggXS5sYXN0Wm9vbVRpbWUgPSBjdXJyZW50VGltZTtcbiAgICAgICAgc2NoZWR1bGVab29tKCB0aGlzICk7XG4gICAgfVxufVxuXG5cbmZ1bmN0aW9uIGRvU2luZ2xlWm9vbUluKCkge1xuICAgIGlmICggdGhpcy52aWV3cG9ydCApIHtcbiAgICAgICAgVEhJU1sgdGhpcy5oYXNoIF0uem9vbWluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnZpZXdwb3J0Lnpvb21CeShcbiAgICAgICAgICAgIHRoaXMuem9vbVBlckNsaWNrIC8gMS4wXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMudmlld3BvcnQuYXBwbHlDb25zdHJhaW50cygpO1xuICAgIH1cbn1cblxuXG5mdW5jdGlvbiBkb1NpbmdsZVpvb21PdXQoKSB7XG4gICAgaWYgKCB0aGlzLnZpZXdwb3J0ICkge1xuICAgICAgICBUSElTWyB0aGlzLmhhc2ggXS56b29taW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMudmlld3BvcnQuem9vbUJ5KFxuICAgICAgICAgICAgMS4wIC8gdGhpcy56b29tUGVyQ2xpY2tcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy52aWV3cG9ydC5hcHBseUNvbnN0cmFpbnRzKCk7XG4gICAgfVxufVxuXG5cbmZ1bmN0aW9uIGxpZ2h0VXAoKSB7XG4gICAgdGhpcy5idXR0b25zLmVtdWxhdGVFbnRlcigpO1xuICAgIHRoaXMuYnV0dG9ucy5lbXVsYXRlRXhpdCgpO1xufVxuXG5cbmZ1bmN0aW9uIG9uSG9tZSgpIHtcbiAgICBpZiAoIHRoaXMudmlld3BvcnQgKSB7XG4gICAgICAgIHRoaXMudmlld3BvcnQuZ29Ib21lKCk7XG4gICAgfVxufVxuXG5cbmZ1bmN0aW9uIG9uRnVsbFNjcmVlbigpIHtcbiAgICBpZiAoIHRoaXMuaXNGdWxsUGFnZSgpICYmICEkLmlzRnVsbFNjcmVlbigpICkge1xuICAgICAgICAvLyBJcyBmdWxsUGFnZSBidXQgbm90IGZ1bGxTY3JlZW5cbiAgICAgICAgdGhpcy5zZXRGdWxsUGFnZSggZmFsc2UgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNldEZ1bGxTY3JlZW4oICF0aGlzLmlzRnVsbFBhZ2UoKSApO1xuICAgIH1cbiAgICAvLyBjb3JyZWN0IGZvciBubyBtb3VzZW91dCBldmVudCBvbiBjaGFuZ2VcbiAgICBpZiAoIHRoaXMuYnV0dG9ucyApIHtcbiAgICAgICAgdGhpcy5idXR0b25zLmVtdWxhdGVFeGl0KCk7XG4gICAgfVxuICAgIHRoaXMuZnVsbFBhZ2VCdXR0b24uZWxlbWVudC5mb2N1cygpO1xuICAgIGlmICggdGhpcy52aWV3cG9ydCApIHtcbiAgICAgICAgdGhpcy52aWV3cG9ydC5hcHBseUNvbnN0cmFpbnRzKCk7XG4gICAgfVxufVxuXG4vKipcbiAqIE5vdGU6IFRoZSBjdXJyZW50IHJvdGF0aW9uIGZlYXR1cmUgaXMgbGltaXRlZCB0byA5MCBkZWdyZWUgdHVybnMuXG4gKi9cbmZ1bmN0aW9uIG9uUm90YXRlTGVmdCgpIHtcbiAgICBpZiAoIHRoaXMudmlld3BvcnQgKSB7XG4gICAgICAgIHZhciBjdXJyUm90YXRpb24gPSB0aGlzLnZpZXdwb3J0LmdldFJvdGF0aW9uKCk7XG4gICAgICAgIGlmIChjdXJyUm90YXRpb24gPT09IDApIHtcbiAgICAgICAgICAgIGN1cnJSb3RhdGlvbiA9IDI3MDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGN1cnJSb3RhdGlvbiAtPSA5MDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZpZXdwb3J0LnNldFJvdGF0aW9uKGN1cnJSb3RhdGlvbik7XG4gICAgfVxufVxuXG4vKipcbiAqIE5vdGU6IFRoZSBjdXJyZW50IHJvdGF0aW9uIGZlYXR1cmUgaXMgbGltaXRlZCB0byA5MCBkZWdyZWUgdHVybnMuXG4gKi9cbmZ1bmN0aW9uIG9uUm90YXRlUmlnaHQoKSB7XG4gICAgaWYgKCB0aGlzLnZpZXdwb3J0ICkge1xuICAgICAgICB2YXIgY3VyclJvdGF0aW9uID0gdGhpcy52aWV3cG9ydC5nZXRSb3RhdGlvbigpO1xuICAgICAgICBpZiAoY3VyclJvdGF0aW9uID09PSAyNzApIHtcbiAgICAgICAgICAgIGN1cnJSb3RhdGlvbiA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjdXJyUm90YXRpb24gKz0gOTA7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy52aWV3cG9ydC5zZXRSb3RhdGlvbihjdXJyUm90YXRpb24pO1xuICAgIH1cbn1cblxuXG5mdW5jdGlvbiBvblByZXZpb3VzKCl7XG4gICAgdmFyIHByZXZpb3VzID0gdGhpcy5fc2VxdWVuY2VJbmRleCAtIDE7XG4gICAgaWYodGhpcy5uYXZQcmV2TmV4dFdyYXAgJiYgcHJldmlvdXMgPCAwKXtcbiAgICAgICAgcHJldmlvdXMgKz0gdGhpcy50aWxlU291cmNlcy5sZW5ndGg7XG4gICAgfVxuICAgIHRoaXMuZ29Ub1BhZ2UoIHByZXZpb3VzICk7XG59XG5cblxuZnVuY3Rpb24gb25OZXh0KCl7XG4gICAgdmFyIG5leHQgPSB0aGlzLl9zZXF1ZW5jZUluZGV4ICsgMTtcbiAgICBpZih0aGlzLm5hdlByZXZOZXh0V3JhcCAmJiBuZXh0ID49IHRoaXMudGlsZVNvdXJjZXMubGVuZ3RoKXtcbiAgICAgICAgbmV4dCA9IDA7XG4gICAgfVxuICAgIHRoaXMuZ29Ub1BhZ2UoIG5leHQgKTtcbn1cblxuXG59KCBPcGVuU2VhZHJhZ29uICkpO1xuXG4vKlxuICogT3BlblNlYWRyYWdvbiAtIE5hdmlnYXRvclxuICpcbiAqIENvcHlyaWdodCAoQykgMjAwOSBDb2RlUGxleCBGb3VuZGF0aW9uXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMyBPcGVuU2VhZHJhZ29uIGNvbnRyaWJ1dG9yc1xuICpcbiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZVxuICogbWV0OlxuICpcbiAqIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuICogICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuICpcbiAqIC0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHRcbiAqICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZVxuICogICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuICpcbiAqIC0gTmVpdGhlciB0aGUgbmFtZSBvZiBDb2RlUGxleCBGb3VuZGF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzXG4gKiAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tXG4gKiAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4gKlxuICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SU1xuICogXCJBUyBJU1wiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVFxuICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SXG4gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFRcbiAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLFxuICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEXG4gKiBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SXG4gKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElOR1xuICogTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTXG4gKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiAqL1xuXG4oZnVuY3Rpb24oICQgKXtcblxuLyoqXG4gKiBAY2xhc3MgTmF2aWdhdG9yXG4gKiBAY2xhc3NkZXNjIFRoZSBOYXZpZ2F0b3IgcHJvdmlkZXMgYSBzbWFsbCB2aWV3IG9mIHRoZSBjdXJyZW50IGltYWdlIGFzIGZpeGVkXG4gKiB3aGlsZSByZXByZXNlbnRpbmcgdGhlIHZpZXdwb3J0IGFzIGEgbW92aW5nIGJveCBzZXJ2aW5nIGFzIGEgZnJhbWVcbiAqIG9mIHJlZmVyZW5jZSBpbiB0aGUgbGFyZ2VyIHZpZXdwb3J0IGFzIHRvIHdoaWNoIHBvcnRpb24gb2YgdGhlIGltYWdlXG4gKiBpcyBjdXJyZW50bHkgYmVpbmcgZXhhbWluZWQuICBUaGUgbmF2aWdhdG9yJ3Mgdmlld3BvcnQgY2FuIGJlIGludGVyYWN0ZWRcbiAqIHdpdGggdXNpbmcgdGhlIGtleWJvYXJkIG9yIHRoZSBtb3VzZS5cbiAqXG4gKiBAbWVtYmVyb2YgT3BlblNlYWRyYWdvblxuICogQGV4dGVuZHMgT3BlblNlYWRyYWdvbi5WaWV3ZXJcbiAqIEBleHRlbmRzIE9wZW5TZWFkcmFnb24uRXZlbnRTb3VyY2VcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gKi9cbiQuTmF2aWdhdG9yID0gZnVuY3Rpb24oIG9wdGlvbnMgKXtcblxuICAgIHZhciB2aWV3ZXIgICAgICA9IG9wdGlvbnMudmlld2VyLFxuICAgICAgICBfdGhpcyA9IHRoaXMsXG4gICAgICAgIHZpZXdlclNpemUsXG4gICAgICAgIG5hdmlnYXRvclNpemU7XG5cbiAgICAvL1dlIG1heSBuZWVkIHRvIGNyZWF0ZSBhIG5ldyBlbGVtZW50IGFuZCBpZCBpZiB0aGV5IGRpZCBub3RcbiAgICAvL3Byb3ZpZGUgdGhlIGlkIGZvciB0aGUgZXhpc3RpbmcgZWxlbWVudFxuICAgIGlmKCAhb3B0aW9ucy5pZCApe1xuICAgICAgICBvcHRpb25zLmlkICAgICAgICAgICAgICA9ICduYXZpZ2F0b3ItJyArICQubm93KCk7XG4gICAgICAgIHRoaXMuZWxlbWVudCAgICAgICAgICAgID0gJC5tYWtlTmV1dHJhbEVsZW1lbnQoIFwiZGl2XCIgKTtcbiAgICAgICAgb3B0aW9ucy5jb250cm9sT3B0aW9ucyAgPSB7XG4gICAgICAgICAgICBhbmNob3I6ICAgICAgICAgICAkLkNvbnRyb2xBbmNob3IuVE9QX1JJR0hULFxuICAgICAgICAgICAgYXR0YWNoVG9WaWV3ZXI6ICAgdHJ1ZSxcbiAgICAgICAgICAgIGF1dG9GYWRlOiAgICAgICAgIG9wdGlvbnMuYXV0b0ZhZGVcbiAgICAgICAgfTtcblxuICAgICAgICBpZiggb3B0aW9ucy5wb3NpdGlvbiApe1xuICAgICAgICAgICAgaWYoICdCT1RUT01fUklHSFQnID09IG9wdGlvbnMucG9zaXRpb24gKXtcbiAgICAgICAgICAgICAgIG9wdGlvbnMuY29udHJvbE9wdGlvbnMuYW5jaG9yID0gJC5Db250cm9sQW5jaG9yLkJPVFRPTV9SSUdIVDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiggJ0JPVFRPTV9MRUZUJyA9PSBvcHRpb25zLnBvc2l0aW9uICl7XG4gICAgICAgICAgICAgICBvcHRpb25zLmNvbnRyb2xPcHRpb25zLmFuY2hvciA9ICQuQ29udHJvbEFuY2hvci5CT1RUT01fTEVGVDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiggJ1RPUF9SSUdIVCcgPT0gb3B0aW9ucy5wb3NpdGlvbiApe1xuICAgICAgICAgICAgICAgb3B0aW9ucy5jb250cm9sT3B0aW9ucy5hbmNob3IgPSAkLkNvbnRyb2xBbmNob3IuVE9QX1JJR0hUO1xuICAgICAgICAgICAgfSBlbHNlIGlmKCAnVE9QX0xFRlQnID09IG9wdGlvbnMucG9zaXRpb24gKXtcbiAgICAgICAgICAgICAgIG9wdGlvbnMuY29udHJvbE9wdGlvbnMuYW5jaG9yID0gJC5Db250cm9sQW5jaG9yLlRPUF9MRUZUO1xuICAgICAgICAgICAgfSBlbHNlIGlmKCAnQUJTT0xVVEUnID09IG9wdGlvbnMucG9zaXRpb24gKXtcbiAgICAgICAgICAgICAgIG9wdGlvbnMuY29udHJvbE9wdGlvbnMuYW5jaG9yID0gJC5Db250cm9sQW5jaG9yLkFCU09MVVRFO1xuICAgICAgICAgICAgICAgb3B0aW9ucy5jb250cm9sT3B0aW9ucy50b3AgPSBvcHRpb25zLnRvcDtcbiAgICAgICAgICAgICAgIG9wdGlvbnMuY29udHJvbE9wdGlvbnMubGVmdCA9IG9wdGlvbnMubGVmdDtcbiAgICAgICAgICAgICAgIG9wdGlvbnMuY29udHJvbE9wdGlvbnMuaGVpZ2h0ID0gb3B0aW9ucy5oZWlnaHQ7XG4gICAgICAgICAgICAgICBvcHRpb25zLmNvbnRyb2xPcHRpb25zLndpZHRoID0gb3B0aW9ucy53aWR0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5lbGVtZW50ICAgICAgICAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggb3B0aW9ucy5pZCApO1xuICAgICAgICBvcHRpb25zLmNvbnRyb2xPcHRpb25zICA9IHtcbiAgICAgICAgICAgIGFuY2hvcjogICAgICAgICAgICQuQ29udHJvbEFuY2hvci5OT05FLFxuICAgICAgICAgICAgYXR0YWNoVG9WaWV3ZXI6ICAgZmFsc2UsXG4gICAgICAgICAgICBhdXRvRmFkZTogICAgICAgICBmYWxzZVxuICAgICAgICB9O1xuICAgIH1cbiAgICB0aGlzLmVsZW1lbnQuaWQgICAgICAgICA9IG9wdGlvbnMuaWQ7XG4gICAgdGhpcy5lbGVtZW50LmNsYXNzTmFtZSAgKz0gJyBuYXZpZ2F0b3InO1xuXG4gICAgb3B0aW9ucyA9ICQuZXh0ZW5kKCB0cnVlLCB7XG4gICAgICAgIHNpemVSYXRpbzogICAgICQuREVGQVVMVF9TRVRUSU5HUy5uYXZpZ2F0b3JTaXplUmF0aW9cbiAgICB9LCBvcHRpb25zLCB7XG4gICAgICAgIGVsZW1lbnQ6ICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudCxcbiAgICAgICAgdGFiSW5kZXg6ICAgICAgICAgICAgICAgLTEsIC8vIE5vIGtleWJvYXJkIG5hdmlnYXRpb24sIG9taXQgZnJvbSB0YWIgb3JkZXJcbiAgICAgICAgLy9UaGVzZSBuZWVkIHRvIGJlIG92ZXJyaWRkZW4gdG8gcHJldmVudCByZWN1cnNpb24gc2luY2VcbiAgICAgICAgLy90aGUgbmF2aWdhdG9yIGlzIGEgdmlld2VyIGFuZCBhIHZpZXdlciBoYXMgYSBuYXZpZ2F0b3JcbiAgICAgICAgc2hvd05hdmlnYXRvcjogICAgICAgICAgZmFsc2UsXG4gICAgICAgIG1vdXNlTmF2RW5hYmxlZDogICAgICAgIGZhbHNlLFxuICAgICAgICBzaG93TmF2aWdhdGlvbkNvbnRyb2w6ICBmYWxzZSxcbiAgICAgICAgc2hvd1NlcXVlbmNlQ29udHJvbDogICAgZmFsc2UsXG4gICAgICAgIGltbWVkaWF0ZVJlbmRlcjogICAgICAgIHRydWUsXG4gICAgICAgIGJsZW5kVGltZTogICAgICAgICAgICAgIDAsXG4gICAgICAgIGFuaW1hdGlvblRpbWU6ICAgICAgICAgIDAsXG4gICAgICAgIGF1dG9SZXNpemU6ICAgICAgICAgICAgIG9wdGlvbnMuYXV0b1Jlc2l6ZSxcbiAgICAgICAgLy8gcHJldmVudCByZXNpemluZyB0aGUgbmF2aWdhdG9yIGZyb20gYWRkaW5nIHVud2FudGVkIHNwYWNlIGFyb3VuZCB0aGUgaW1hZ2VcbiAgICAgICAgbWluWm9vbUltYWdlUmF0aW86ICAgICAgMS4wXG4gICAgfSk7XG5cbiAgICBvcHRpb25zLm1pblBpeGVsUmF0aW8gPSB0aGlzLm1pblBpeGVsUmF0aW8gPSB2aWV3ZXIubWluUGl4ZWxSYXRpbztcblxuICAgICQuc2V0RWxlbWVudFRvdWNoQWN0aW9uTm9uZSggdGhpcy5lbGVtZW50ICk7XG5cbiAgICB0aGlzLmJvcmRlcldpZHRoID0gMjtcbiAgICAvL0F0IHNvbWUgYnJvd3NlciBtYWduaWZpY2F0aW9uIGxldmVscyB0aGUgZGlzcGxheSByZWdpb25zIGxpbmVzIHVwIGNvcnJlY3RseSwgYnV0IGF0IHNvbWUgdGhlcmUgYXBwZWFycyB0b1xuICAgIC8vYmUgYSBvbmUgcGl4ZWwgZ2FwLlxuICAgIHRoaXMuZnVkZ2UgPSBuZXcgJC5Qb2ludCgxLCAxKTtcbiAgICB0aGlzLnRvdGFsQm9yZGVyV2lkdGhzID0gbmV3ICQuUG9pbnQodGhpcy5ib3JkZXJXaWR0aCoyLCB0aGlzLmJvcmRlcldpZHRoKjIpLm1pbnVzKHRoaXMuZnVkZ2UpO1xuXG5cbiAgICBpZiAoIG9wdGlvbnMuY29udHJvbE9wdGlvbnMuYW5jaG9yICE9ICQuQ29udHJvbEFuY2hvci5OT05FICkge1xuICAgICAgICAoZnVuY3Rpb24oIHN0eWxlLCBib3JkZXJXaWR0aCApe1xuICAgICAgICAgICAgc3R5bGUubWFyZ2luICAgICAgICA9ICcwcHgnO1xuICAgICAgICAgICAgc3R5bGUuYm9yZGVyICAgICAgICA9IGJvcmRlcldpZHRoICsgJ3B4IHNvbGlkICM1NTUnO1xuICAgICAgICAgICAgc3R5bGUucGFkZGluZyAgICAgICA9ICcwcHgnO1xuICAgICAgICAgICAgc3R5bGUuYmFja2dyb3VuZCAgICA9ICcjMDAwJztcbiAgICAgICAgICAgIHN0eWxlLm9wYWNpdHkgICAgICAgPSAwLjg7XG4gICAgICAgICAgICBzdHlsZS5vdmVyZmxvdyAgICAgID0gJ2hpZGRlbic7XG4gICAgICAgIH0oIHRoaXMuZWxlbWVudC5zdHlsZSwgdGhpcy5ib3JkZXJXaWR0aCkpO1xuICAgIH1cblxuICAgIHRoaXMuZGlzcGxheVJlZ2lvbiAgICAgICAgICAgPSAkLm1ha2VOZXV0cmFsRWxlbWVudCggXCJkaXZcIiApO1xuICAgIHRoaXMuZGlzcGxheVJlZ2lvbi5pZCAgICAgICAgPSB0aGlzLmVsZW1lbnQuaWQgKyAnLWRpc3BsYXlyZWdpb24nO1xuICAgIHRoaXMuZGlzcGxheVJlZ2lvbi5jbGFzc05hbWUgPSAnZGlzcGxheXJlZ2lvbic7XG5cbiAgICAoZnVuY3Rpb24oIHN0eWxlLCBib3JkZXJXaWR0aCApe1xuICAgICAgICBzdHlsZS5wb3NpdGlvbiAgICAgID0gJ3JlbGF0aXZlJztcbiAgICAgICAgc3R5bGUudG9wICAgICAgICAgICA9ICcwcHgnO1xuICAgICAgICBzdHlsZS5sZWZ0ICAgICAgICAgID0gJzBweCc7XG4gICAgICAgIHN0eWxlLmZvbnRTaXplICAgICAgPSAnMHB4JztcbiAgICAgICAgc3R5bGUub3ZlcmZsb3cgICAgICA9ICdoaWRkZW4nO1xuICAgICAgICBzdHlsZS5ib3JkZXIgICAgICAgID0gYm9yZGVyV2lkdGggKyAncHggc29saWQgIzkwMCc7XG4gICAgICAgIHN0eWxlLm1hcmdpbiAgICAgICAgPSAnMHB4JztcbiAgICAgICAgc3R5bGUucGFkZGluZyAgICAgICA9ICcwcHgnO1xuICAgICAgICAvL1RPRE86IElFIGRvZXNudCBsaWtlIHRoaXMgcHJvcGVydHkgYmVpbmcgc2V0XG4gICAgICAgIC8vdHJ5eyBzdHlsZS5vdXRsaW5lICA9ICcycHggYXV0byAjOTA5JzsgfWNhdGNoKGUpey8qaWdub3JlKi99XG5cbiAgICAgICAgc3R5bGUuYmFja2dyb3VuZCAgICA9ICd0cmFuc3BhcmVudCc7XG5cbiAgICAgICAgLy8gV2UgdXNlIHNxdWFyZSBicmFja2V0IG5vdGF0aW9uIG9uIHRoZSBzdGF0ZW1lbnQgYmVsb3csIGJlY2F1c2UgZmxvYXQgaXMgYSBrZXl3b3JkLlxuICAgICAgICAvLyBUaGlzIGlzIGltcG9ydGFudCBmb3IgdGhlIEdvb2dsZSBDbG9zdXJlIGNvbXBpbGVyLCBpZiBub3RoaW5nIGVsc2UuXG4gICAgICAgIC8qanNoaW50IHN1Yjp0cnVlICovXG4gICAgICAgIHN0eWxlWydmbG9hdCddICAgICAgPSAnbGVmdCc7IC8vV2Via2l0XG5cbiAgICAgICAgc3R5bGUuY3NzRmxvYXQgICAgICA9ICdsZWZ0JzsgLy9GaXJlZm94XG4gICAgICAgIHN0eWxlLnN0eWxlRmxvYXQgICAgPSAnbGVmdCc7IC8vSUVcbiAgICAgICAgc3R5bGUuekluZGV4ICAgICAgICA9IDk5OTk5OTk5OTtcbiAgICAgICAgc3R5bGUuY3Vyc29yICAgICAgICA9ICdkZWZhdWx0JztcbiAgICB9KCB0aGlzLmRpc3BsYXlSZWdpb24uc3R5bGUsIHRoaXMuYm9yZGVyV2lkdGggKSk7XG5cbiAgICB0aGlzLmRpc3BsYXlSZWdpb25Db250YWluZXIgPSAkLm1ha2VOZXV0cmFsRWxlbWVudChcImRpdlwiKTtcbiAgICB0aGlzLmRpc3BsYXlSZWdpb25Db250YWluZXIuaWQgPSB0aGlzLmVsZW1lbnQuaWQgKyAnLWRpc3BsYXlyZWdpb25jb250YWluZXInO1xuICAgIHRoaXMuZGlzcGxheVJlZ2lvbkNvbnRhaW5lci5jbGFzc05hbWUgPSBcImRpc3BsYXlyZWdpb25jb250YWluZXJcIjtcbiAgICB0aGlzLmRpc3BsYXlSZWdpb25Db250YWluZXIuc3R5bGUud2lkdGggPSBcIjEwMCVcIjtcbiAgICB0aGlzLmRpc3BsYXlSZWdpb25Db250YWluZXIuc3R5bGUuaGVpZ2h0ID0gXCIxMDAlXCI7XG5cbiAgICB2aWV3ZXIuYWRkQ29udHJvbChcbiAgICAgICAgdGhpcy5lbGVtZW50LFxuICAgICAgICBvcHRpb25zLmNvbnRyb2xPcHRpb25zXG4gICAgKTtcblxuICAgIHRoaXMuX3Jlc2l6ZVdpdGhWaWV3ZXIgPSBvcHRpb25zLmNvbnRyb2xPcHRpb25zLmFuY2hvciAhPSAkLkNvbnRyb2xBbmNob3IuQUJTT0xVVEUgJiZcbiAgICAgICAgb3B0aW9ucy5jb250cm9sT3B0aW9ucy5hbmNob3IgIT0gJC5Db250cm9sQW5jaG9yLk5PTkU7XG5cbiAgICBpZiAoIHRoaXMuX3Jlc2l6ZVdpdGhWaWV3ZXIgKSB7XG4gICAgICAgIGlmICggb3B0aW9ucy53aWR0aCAmJiBvcHRpb25zLmhlaWdodCApIHtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5zdHlsZS5oZWlnaHQgPSB0eXBlb2YgKCBvcHRpb25zLmhlaWdodCApICA9PSBcIm51bWJlclwiID8gKCBvcHRpb25zLmhlaWdodCArICdweCcgKSA6IG9wdGlvbnMuaGVpZ2h0O1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50LnN0eWxlLndpZHRoICA9IHR5cGVvZiAoIG9wdGlvbnMud2lkdGggKSAgPT0gXCJudW1iZXJcIiA/ICggb3B0aW9ucy53aWR0aCArICdweCcgKSA6IG9wdGlvbnMud2lkdGg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2aWV3ZXJTaXplID0gJC5nZXRFbGVtZW50U2l6ZSggdmlld2VyLmVsZW1lbnQgKTtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5zdHlsZS5oZWlnaHQgPSBNYXRoLnJvdW5kKCB2aWV3ZXJTaXplLnkgKiBvcHRpb25zLnNpemVSYXRpbyApICsgJ3B4JztcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5zdHlsZS53aWR0aCAgPSBNYXRoLnJvdW5kKCB2aWV3ZXJTaXplLnggKiBvcHRpb25zLnNpemVSYXRpbyApICsgJ3B4JztcbiAgICAgICAgICAgIHRoaXMub2xkVmlld2VyU2l6ZSA9IHZpZXdlclNpemU7XG4gICAgICAgIH1cbiAgICAgICAgbmF2aWdhdG9yU2l6ZSA9ICQuZ2V0RWxlbWVudFNpemUoIHRoaXMuZWxlbWVudCApO1xuICAgICAgICB0aGlzLmVsZW1lbnRBcmVhID0gbmF2aWdhdG9yU2l6ZS54ICogbmF2aWdhdG9yU2l6ZS55O1xuICAgIH1cblxuICAgIHRoaXMub2xkQ29udGFpbmVyU2l6ZSA9IG5ldyAkLlBvaW50KCAwLCAwICk7XG5cbiAgICAkLlZpZXdlci5hcHBseSggdGhpcywgWyBvcHRpb25zIF0gKTtcblxuICAgIHRoaXMuZGlzcGxheVJlZ2lvbkNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLmRpc3BsYXlSZWdpb24pO1xuICAgIHRoaXMuZWxlbWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnZGl2JylbMF0uYXBwZW5kQ2hpbGQodGhpcy5kaXNwbGF5UmVnaW9uQ29udGFpbmVyKTtcblxuICAgIGZ1bmN0aW9uIHJvdGF0ZShkZWdyZWVzKSB7XG4gICAgICAgIF9zZXRUcmFuc2Zvcm1Sb3RhdGUoX3RoaXMuZGlzcGxheVJlZ2lvbkNvbnRhaW5lciwgZGVncmVlcyk7XG4gICAgICAgIF9zZXRUcmFuc2Zvcm1Sb3RhdGUoX3RoaXMuZGlzcGxheVJlZ2lvbiwgLWRlZ3JlZXMpO1xuICAgICAgICBfdGhpcy52aWV3cG9ydC5zZXRSb3RhdGlvbihkZWdyZWVzKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMubmF2aWdhdG9yUm90YXRlKSB7XG4gICAgICAgIHZhciBkZWdyZWVzID0gb3B0aW9ucy52aWV3ZXIudmlld3BvcnQgP1xuICAgICAgICAgICAgb3B0aW9ucy52aWV3ZXIudmlld3BvcnQuZ2V0Um90YXRpb24oKSA6XG4gICAgICAgICAgICBvcHRpb25zLnZpZXdlci5kZWdyZWVzIHx8IDA7XG4gICAgICAgIHJvdGF0ZShkZWdyZWVzKTtcbiAgICAgICAgb3B0aW9ucy52aWV3ZXIuYWRkSGFuZGxlcihcInJvdGF0ZVwiLCBmdW5jdGlvbiAoYXJncykge1xuICAgICAgICAgICAgcm90YXRlKGFyZ3MuZGVncmVlcyk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFJlbW92ZSB0aGUgYmFzZSBjbGFzcycgKFZpZXdlcidzKSBpbm5lclRyYWNrZXIgYW5kIHJlcGxhY2UgaXQgd2l0aCBvdXIgb3duXG4gICAgdGhpcy5pbm5lclRyYWNrZXIuZGVzdHJveSgpO1xuICAgIHRoaXMuaW5uZXJUcmFja2VyID0gbmV3ICQuTW91c2VUcmFja2VyKHtcbiAgICAgICAgZWxlbWVudDogICAgICAgICB0aGlzLmVsZW1lbnQsXG4gICAgICAgIGRyYWdIYW5kbGVyOiAgICAgJC5kZWxlZ2F0ZSggdGhpcywgb25DYW52YXNEcmFnICksXG4gICAgICAgIGNsaWNrSGFuZGxlcjogICAgJC5kZWxlZ2F0ZSggdGhpcywgb25DYW52YXNDbGljayApLFxuICAgICAgICByZWxlYXNlSGFuZGxlcjogICQuZGVsZWdhdGUoIHRoaXMsIG9uQ2FudmFzUmVsZWFzZSApLFxuICAgICAgICBzY3JvbGxIYW5kbGVyOiAgICQuZGVsZWdhdGUoIHRoaXMsIG9uQ2FudmFzU2Nyb2xsIClcbiAgICB9KTtcblxuICAgIHRoaXMuYWRkSGFuZGxlcihcInJlc2V0LXNpemVcIiwgZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmIChfdGhpcy52aWV3cG9ydCkge1xuICAgICAgICAgICAgX3RoaXMudmlld3BvcnQuZ29Ib21lKHRydWUpO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICB2aWV3ZXIud29ybGQuYWRkSGFuZGxlcihcIml0ZW0taW5kZXgtY2hhbmdlXCIsIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgIHZhciBpdGVtID0gX3RoaXMud29ybGQuZ2V0SXRlbUF0KGV2ZW50LnByZXZpb3VzSW5kZXgpO1xuICAgICAgICBfdGhpcy53b3JsZC5zZXRJdGVtSW5kZXgoaXRlbSwgZXZlbnQubmV3SW5kZXgpO1xuICAgIH0pO1xuXG4gICAgdmlld2VyLndvcmxkLmFkZEhhbmRsZXIoXCJyZW1vdmUtaXRlbVwiLCBmdW5jdGlvbihldmVudCkge1xuICAgICAgICB2YXIgdGhlaXJJdGVtID0gZXZlbnQuaXRlbTtcbiAgICAgICAgdmFyIG15SXRlbSA9IF90aGlzLl9nZXRNYXRjaGluZ0l0ZW0odGhlaXJJdGVtKTtcbiAgICAgICAgaWYgKG15SXRlbSkge1xuICAgICAgICAgICAgX3RoaXMud29ybGQucmVtb3ZlSXRlbShteUl0ZW0pO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLnVwZGF0ZSh2aWV3ZXIudmlld3BvcnQpO1xufTtcblxuJC5leHRlbmQoICQuTmF2aWdhdG9yLnByb3RvdHlwZSwgJC5FdmVudFNvdXJjZS5wcm90b3R5cGUsICQuVmlld2VyLnByb3RvdHlwZSwgLyoqIEBsZW5kcyBPcGVuU2VhZHJhZ29uLk5hdmlnYXRvci5wcm90b3R5cGUgKi97XG5cbiAgICAvKipcbiAgICAgKiBVc2VkIHRvIG5vdGlmeSB0aGUgbmF2aWdhdG9yIHdoZW4gaXRzIHNpemUgaGFzIGNoYW5nZWQuXG4gICAgICogRXNwZWNpYWxseSB1c2VmdWwgd2hlbiB7QGxpbmsgT3BlblNlYWRyYWdvbi5PcHRpb25zfS5uYXZpZ2F0b3JBdXRvUmVzaXplIGlzIHNldCB0byBmYWxzZSBhbmQgdGhlIG5hdmlnYXRvciBpcyByZXNpemFibGUuXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICovXG4gICAgdXBkYXRlU2l6ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIHRoaXMudmlld3BvcnQgKSB7XG4gICAgICAgICAgICB2YXIgY29udGFpbmVyU2l6ZSA9IG5ldyAkLlBvaW50KFxuICAgICAgICAgICAgICAgICAgICAodGhpcy5jb250YWluZXIuY2xpZW50V2lkdGggPT09IDAgPyAxIDogdGhpcy5jb250YWluZXIuY2xpZW50V2lkdGgpLFxuICAgICAgICAgICAgICAgICAgICAodGhpcy5jb250YWluZXIuY2xpZW50SGVpZ2h0ID09PSAwID8gMSA6IHRoaXMuY29udGFpbmVyLmNsaWVudEhlaWdodClcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBpZiAoICFjb250YWluZXJTaXplLmVxdWFscyggdGhpcy5vbGRDb250YWluZXJTaXplICkgKSB7XG4gICAgICAgICAgICAgICAgdGhpcy52aWV3cG9ydC5yZXNpemUoIGNvbnRhaW5lclNpemUsIHRydWUgKTtcbiAgICAgICAgICAgICAgICB0aGlzLnZpZXdwb3J0LmdvSG9tZSh0cnVlKTtcbiAgICAgICAgICAgICAgICB0aGlzLm9sZENvbnRhaW5lclNpemUgPSBjb250YWluZXJTaXplO1xuICAgICAgICAgICAgICAgIHRoaXMuZHJhd2VyLmNsZWFyKCk7XG4gICAgICAgICAgICAgICAgdGhpcy53b3JsZC5kcmF3KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogVXNlZCB0byB1cGRhdGUgdGhlIG5hdmlnYXRvciBtaW5pbWFwJ3Mgdmlld3BvcnQgcmVjdGFuZ2xlIHdoZW4gYSBjaGFuZ2UgaW4gdGhlIHZpZXdlcidzIHZpZXdwb3J0IG9jY3Vycy5cbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge09wZW5TZWFkcmFnb24uVmlld3BvcnR9IFRoZSB2aWV3cG9ydCB0aGlzIG5hdmlnYXRvciBpcyB0cmFja2luZy5cbiAgICAgKi9cbiAgICB1cGRhdGU6IGZ1bmN0aW9uKCB2aWV3cG9ydCApIHtcblxuICAgICAgICB2YXIgdmlld2VyU2l6ZSxcbiAgICAgICAgICAgIG5ld1dpZHRoLFxuICAgICAgICAgICAgbmV3SGVpZ2h0LFxuICAgICAgICAgICAgYm91bmRzLFxuICAgICAgICAgICAgdG9wbGVmdCxcbiAgICAgICAgICAgIGJvdHRvbXJpZ2h0O1xuXG4gICAgICAgIHZpZXdlclNpemUgPSAkLmdldEVsZW1lbnRTaXplKCB0aGlzLnZpZXdlci5lbGVtZW50ICk7XG4gICAgICAgIGlmICggdGhpcy5fcmVzaXplV2l0aFZpZXdlciAmJiB2aWV3ZXJTaXplLnggJiYgdmlld2VyU2l6ZS55ICYmICF2aWV3ZXJTaXplLmVxdWFscyggdGhpcy5vbGRWaWV3ZXJTaXplICkgKSB7XG4gICAgICAgICAgICB0aGlzLm9sZFZpZXdlclNpemUgPSB2aWV3ZXJTaXplO1xuXG4gICAgICAgICAgICBpZiAoIHRoaXMubWFpbnRhaW5TaXplUmF0aW8gfHwgIXRoaXMuZWxlbWVudEFyZWEpIHtcbiAgICAgICAgICAgICAgICBuZXdXaWR0aCAgPSB2aWV3ZXJTaXplLnggKiB0aGlzLnNpemVSYXRpbztcbiAgICAgICAgICAgICAgICBuZXdIZWlnaHQgPSB2aWV3ZXJTaXplLnkgKiB0aGlzLnNpemVSYXRpbztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbmV3V2lkdGggPSBNYXRoLnNxcnQodGhpcy5lbGVtZW50QXJlYSAqICh2aWV3ZXJTaXplLnggLyB2aWV3ZXJTaXplLnkpKTtcbiAgICAgICAgICAgICAgICBuZXdIZWlnaHQgPSB0aGlzLmVsZW1lbnRBcmVhIC8gbmV3V2lkdGg7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5zdHlsZS53aWR0aCAgPSBNYXRoLnJvdW5kKCBuZXdXaWR0aCApICsgJ3B4JztcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5zdHlsZS5oZWlnaHQgPSBNYXRoLnJvdW5kKCBuZXdIZWlnaHQgKSArICdweCc7XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5lbGVtZW50QXJlYSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudEFyZWEgPSBuZXdXaWR0aCAqIG5ld0hlaWdodDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy51cGRhdGVTaXplKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmlld3BvcnQgJiYgdGhpcy52aWV3cG9ydCkge1xuICAgICAgICAgICAgYm91bmRzICAgICAgPSB2aWV3cG9ydC5nZXRCb3VuZHNOb1JvdGF0ZSh0cnVlKTtcbiAgICAgICAgICAgIHRvcGxlZnQgICAgID0gdGhpcy52aWV3cG9ydC5waXhlbEZyb21Qb2ludE5vUm90YXRlKGJvdW5kcy5nZXRUb3BMZWZ0KCksIGZhbHNlKTtcbiAgICAgICAgICAgIGJvdHRvbXJpZ2h0ID0gdGhpcy52aWV3cG9ydC5waXhlbEZyb21Qb2ludE5vUm90YXRlKGJvdW5kcy5nZXRCb3R0b21SaWdodCgpLCBmYWxzZSlcbiAgICAgICAgICAgICAgICAubWludXMoIHRoaXMudG90YWxCb3JkZXJXaWR0aHMgKTtcblxuICAgICAgICAgICAgLy91cGRhdGUgc3R5bGUgZm9yIG5hdmlnYXRvci1ib3hcbiAgICAgICAgICAgIHZhciBzdHlsZSA9IHRoaXMuZGlzcGxheVJlZ2lvbi5zdHlsZTtcbiAgICAgICAgICAgIHN0eWxlLmRpc3BsYXkgPSB0aGlzLndvcmxkLmdldEl0ZW1Db3VudCgpID8gJ2Jsb2NrJyA6ICdub25lJztcblxuICAgICAgICAgICAgc3R5bGUudG9wICAgID0gTWF0aC5yb3VuZCggdG9wbGVmdC55ICkgKyAncHgnO1xuICAgICAgICAgICAgc3R5bGUubGVmdCAgID0gTWF0aC5yb3VuZCggdG9wbGVmdC54ICkgKyAncHgnO1xuXG4gICAgICAgICAgICB2YXIgd2lkdGggPSBNYXRoLmFicyggdG9wbGVmdC54IC0gYm90dG9tcmlnaHQueCApO1xuICAgICAgICAgICAgdmFyIGhlaWdodCA9IE1hdGguYWJzKCB0b3BsZWZ0LnkgLSBib3R0b21yaWdodC55ICk7XG4gICAgICAgICAgICAvLyBtYWtlIHN1cmUgd2lkdGggYW5kIGhlaWdodCBhcmUgbm9uLW5lZ2F0aXZlIHNvIElFIGRvZXNuJ3QgdGhyb3dcbiAgICAgICAgICAgIHN0eWxlLndpZHRoICA9IE1hdGgucm91bmQoIE1hdGgubWF4KCB3aWR0aCwgMCApICkgKyAncHgnO1xuICAgICAgICAgICAgc3R5bGUuaGVpZ2h0ID0gTWF0aC5yb3VuZCggTWF0aC5tYXgoIGhlaWdodCwgMCApICkgKyAncHgnO1xuICAgICAgICB9XG5cbiAgICB9LFxuXG4gICAgLy8gb3ZlcnJpZGVzIFZpZXdlci5hZGRUaWxlZEltYWdlXG4gICAgYWRkVGlsZWRJbWFnZTogZnVuY3Rpb24ob3B0aW9ucykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICAgIHZhciBvcmlnaW5hbCA9IG9wdGlvbnMub3JpZ2luYWxUaWxlZEltYWdlO1xuICAgICAgICBkZWxldGUgb3B0aW9ucy5vcmlnaW5hbDtcblxuICAgICAgICB2YXIgb3B0aW9uc0Nsb25lID0gJC5leHRlbmQoe30sIG9wdGlvbnMsIHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgdmFyIG15SXRlbSA9IGV2ZW50Lml0ZW07XG4gICAgICAgICAgICAgICAgbXlJdGVtLl9vcmlnaW5hbEZvck5hdmlnYXRvciA9IG9yaWdpbmFsO1xuICAgICAgICAgICAgICAgIF90aGlzLl9tYXRjaEJvdW5kcyhteUl0ZW0sIG9yaWdpbmFsLCB0cnVlKTtcblxuICAgICAgICAgICAgICAgIG9yaWdpbmFsLmFkZEhhbmRsZXIoJ2JvdW5kcy1jaGFuZ2UnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuX21hdGNoQm91bmRzKG15SXRlbSwgb3JpZ2luYWwpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gJC5WaWV3ZXIucHJvdG90eXBlLmFkZFRpbGVkSW1hZ2UuYXBwbHkodGhpcywgW29wdGlvbnNDbG9uZV0pO1xuICAgIH0sXG5cbiAgICAvLyBwcml2YXRlXG4gICAgX2dldE1hdGNoaW5nSXRlbTogZnVuY3Rpb24odGhlaXJJdGVtKSB7XG4gICAgICAgIHZhciBjb3VudCA9IHRoaXMud29ybGQuZ2V0SXRlbUNvdW50KCk7XG4gICAgICAgIHZhciBpdGVtO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcbiAgICAgICAgICAgIGl0ZW0gPSB0aGlzLndvcmxkLmdldEl0ZW1BdChpKTtcbiAgICAgICAgICAgIGlmIChpdGVtLl9vcmlnaW5hbEZvck5hdmlnYXRvciA9PT0gdGhlaXJJdGVtKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9LFxuXG4gICAgLy8gcHJpdmF0ZVxuICAgIF9tYXRjaEJvdW5kczogZnVuY3Rpb24obXlJdGVtLCB0aGVpckl0ZW0sIGltbWVkaWF0ZWx5KSB7XG4gICAgICAgIHZhciBib3VuZHMgPSB0aGVpckl0ZW0uZ2V0Qm91bmRzKCk7XG4gICAgICAgIG15SXRlbS5zZXRQb3NpdGlvbihib3VuZHMuZ2V0VG9wTGVmdCgpLCBpbW1lZGlhdGVseSk7XG4gICAgICAgIG15SXRlbS5zZXRXaWR0aChib3VuZHMud2lkdGgsIGltbWVkaWF0ZWx5KTtcbiAgICB9XG59KTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQGlubmVyXG4gKiBAZnVuY3Rpb25cbiAqL1xuZnVuY3Rpb24gb25DYW52YXNDbGljayggZXZlbnQgKSB7XG4gICAgaWYgKCBldmVudC5xdWljayAmJiB0aGlzLnZpZXdlci52aWV3cG9ydCApIHtcbiAgICAgICAgdGhpcy52aWV3ZXIudmlld3BvcnQucGFuVG8odGhpcy52aWV3cG9ydC5wb2ludEZyb21QaXhlbChldmVudC5wb3NpdGlvbikpO1xuICAgICAgICB0aGlzLnZpZXdlci52aWV3cG9ydC5hcHBseUNvbnN0cmFpbnRzKCk7XG4gICAgfVxufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAaW5uZXJcbiAqIEBmdW5jdGlvblxuICovXG5mdW5jdGlvbiBvbkNhbnZhc0RyYWcoIGV2ZW50ICkge1xuICAgIGlmICggdGhpcy52aWV3ZXIudmlld3BvcnQgKSB7XG4gICAgICAgIGlmKCAhdGhpcy5wYW5Ib3Jpem9udGFsICl7XG4gICAgICAgICAgICBldmVudC5kZWx0YS54ID0gMDtcbiAgICAgICAgfVxuICAgICAgICBpZiggIXRoaXMucGFuVmVydGljYWwgKXtcbiAgICAgICAgICAgIGV2ZW50LmRlbHRhLnkgPSAwO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudmlld2VyLnZpZXdwb3J0LnBhbkJ5KFxuICAgICAgICAgICAgdGhpcy52aWV3cG9ydC5kZWx0YVBvaW50c0Zyb21QaXhlbHMoXG4gICAgICAgICAgICAgICAgZXZlbnQuZGVsdGFcbiAgICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICB9XG59XG5cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQGlubmVyXG4gKiBAZnVuY3Rpb25cbiAqL1xuZnVuY3Rpb24gb25DYW52YXNSZWxlYXNlKCBldmVudCApIHtcbiAgICBpZiAoIGV2ZW50Lmluc2lkZUVsZW1lbnRQcmVzc2VkICYmIHRoaXMudmlld2VyLnZpZXdwb3J0ICkge1xuICAgICAgICB0aGlzLnZpZXdlci52aWV3cG9ydC5hcHBseUNvbnN0cmFpbnRzKCk7XG4gICAgfVxufVxuXG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEBpbm5lclxuICogQGZ1bmN0aW9uXG4gKi9cbmZ1bmN0aW9uIG9uQ2FudmFzU2Nyb2xsKCBldmVudCApIHtcbiAgICAvKipcbiAgICAgKiBSYWlzZWQgd2hlbiBhIHNjcm9sbCBldmVudCBvY2N1cnMgb24gdGhlIHtAbGluayBPcGVuU2VhZHJhZ29uLlZpZXdlciNuYXZpZ2F0b3J9IGVsZW1lbnQgKG1vdXNlIHdoZWVsLCB0b3VjaCBwaW5jaCwgZXRjLikuXG4gICAgICpcbiAgICAgKiBAZXZlbnQgbmF2aWdhdG9yLXNjcm9sbFxuICAgICAqIEBtZW1iZXJvZiBPcGVuU2VhZHJhZ29uLlZpZXdlclxuICAgICAqIEB0eXBlIHtvYmplY3R9XG4gICAgICogQHByb3BlcnR5IHtPcGVuU2VhZHJhZ29uLlZpZXdlcn0gZXZlbnRTb3VyY2UgLSBBIHJlZmVyZW5jZSB0byB0aGUgVmlld2VyIHdoaWNoIHJhaXNlZCB0aGlzIGV2ZW50LlxuICAgICAqIEBwcm9wZXJ0eSB7T3BlblNlYWRyYWdvbi5Nb3VzZVRyYWNrZXJ9IHRyYWNrZXIgLSBBIHJlZmVyZW5jZSB0byB0aGUgTW91c2VUcmFja2VyIHdoaWNoIG9yaWdpbmF0ZWQgdGhpcyBldmVudC5cbiAgICAgKiBAcHJvcGVydHkge09wZW5TZWFkcmFnb24uUG9pbnR9IHBvc2l0aW9uIC0gVGhlIHBvc2l0aW9uIG9mIHRoZSBldmVudCByZWxhdGl2ZSB0byB0aGUgdHJhY2tlZCBlbGVtZW50LlxuICAgICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBzY3JvbGwgLSBUaGUgc2Nyb2xsIGRlbHRhIGZvciB0aGUgZXZlbnQuXG4gICAgICogQHByb3BlcnR5IHtCb29sZWFufSBzaGlmdCAtIFRydWUgaWYgdGhlIHNoaWZ0IGtleSB3YXMgcHJlc3NlZCBkdXJpbmcgdGhpcyBldmVudC5cbiAgICAgKiBAcHJvcGVydHkge09iamVjdH0gb3JpZ2luYWxFdmVudCAtIFRoZSBvcmlnaW5hbCBET00gZXZlbnQuXG4gICAgICogQHByb3BlcnR5IHs/T2JqZWN0fSB1c2VyRGF0YSAtIEFyYml0cmFyeSBzdWJzY3JpYmVyLWRlZmluZWQgb2JqZWN0LlxuICAgICAqL1xuICAgIHRoaXMudmlld2VyLnJhaXNlRXZlbnQoICduYXZpZ2F0b3Itc2Nyb2xsJywge1xuICAgICAgICB0cmFja2VyOiBldmVudC5ldmVudFNvdXJjZSxcbiAgICAgICAgcG9zaXRpb246IGV2ZW50LnBvc2l0aW9uLFxuICAgICAgICBzY3JvbGw6IGV2ZW50LnNjcm9sbCxcbiAgICAgICAgc2hpZnQ6IGV2ZW50LnNoaWZ0LFxuICAgICAgICBvcmlnaW5hbEV2ZW50OiBldmVudC5vcmlnaW5hbEV2ZW50XG4gICAgfSk7XG5cbiAgICAvL2RvbnQgc2Nyb2xsIHRoZSBwYWdlIHVwIGFuZCBkb3duIGlmIHRoZSB1c2VyIGlzIHNjcm9sbGluZ1xuICAgIC8vaW4gdGhlIG5hdmlnYXRvclxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gICAgKiBAZnVuY3Rpb25cbiAgICAqIEBwcml2YXRlXG4gICAgKiBAcGFyYW0ge09iamVjdH0gZWxlbWVudFxuICAgICogQHBhcmFtIHtOdW1iZXJ9IGRlZ3JlZXNcbiAgICAqL1xuZnVuY3Rpb24gX3NldFRyYW5zZm9ybVJvdGF0ZSAoZWxlbWVudCwgZGVncmVlcykge1xuICAgIGVsZW1lbnQuc3R5bGUud2Via2l0VHJhbnNmb3JtID0gXCJyb3RhdGUoXCIgKyBkZWdyZWVzICsgXCJkZWcpXCI7XG4gICAgZWxlbWVudC5zdHlsZS5tb3pUcmFuc2Zvcm0gPSBcInJvdGF0ZShcIiArIGRlZ3JlZXMgKyBcImRlZylcIjtcbiAgICBlbGVtZW50LnN0eWxlLm1zVHJhbnNmb3JtID0gXCJyb3RhdGUoXCIgKyBkZWdyZWVzICsgXCJkZWcpXCI7XG4gICAgZWxlbWVudC5zdHlsZS5vVHJhbnNmb3JtID0gXCJyb3RhdGUoXCIgKyBkZWdyZWVzICsgXCJkZWcpXCI7XG4gICAgZWxlbWVudC5zdHlsZS50cmFuc2Zvcm0gPSBcInJvdGF0ZShcIiArIGRlZ3JlZXMgKyBcImRlZylcIjtcbn1cblxufSggT3BlblNlYWRyYWdvbiApKTtcblxuLypcbiAqIE9wZW5TZWFkcmFnb24gLSBnZXRTdHJpbmcvc2V0U3RyaW5nXG4gKlxuICogQ29weXJpZ2h0IChDKSAyMDA5IENvZGVQbGV4IEZvdW5kYXRpb25cbiAqIENvcHlyaWdodCAoQykgMjAxMC0yMDEzIE9wZW5TZWFkcmFnb24gY29udHJpYnV0b3JzXG4gKlxuICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlXG4gKiBtZXQ6XG4gKlxuICogLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4gKiAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4gKlxuICogLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodFxuICogICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlXG4gKiAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uXG4gKlxuICogLSBOZWl0aGVyIHRoZSBuYW1lIG9mIENvZGVQbGV4IEZvdW5kYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHNcbiAqICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb21cbiAqICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbiAqXG4gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTXG4gKiBcIkFTIElTXCIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UXG4gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1JcbiAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVFxuICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsXG4gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURURcbiAqIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1JcbiAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0ZcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HXG4gKiBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVNcbiAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICovXG5cbihmdW5jdGlvbiggJCApe1xuXG4vL1RPRE86IEkgZ3Vlc3MgdGhpcyBpcyB3aGVyZSB0aGUgaTE4biBuZWVkcyB0byBiZSByZWltcGxlbWVudGVkLiAgSSdsbCBsb29rXG4vLyAgICAgIGludG8gZXhpc3RpbmcgcGF0dGVybnMgZm9yIGkxOG4gaW4gamF2YXNjcmlwdCBidXQgaSB0aGluayB0aGF0IG1pbWlja2luZ1xuLy8gICAgICBweXRob25zIGdldHRleHQgbWlnaHQgYmUgYSByZWFzb25hYmxlIGFwcHJvYWNoLlxudmFyIEkxOE4gPSB7XG4gICAgRXJyb3JzOiB7XG4gICAgICAgIER6YzogICAgICAgICAgICBcIlNvcnJ5LCB3ZSBkb24ndCBzdXBwb3J0IERlZXAgWm9vbSBDb2xsZWN0aW9ucyFcIixcbiAgICAgICAgRHppOiAgICAgICAgICAgIFwiSG1tLCB0aGlzIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGEgdmFsaWQgRGVlcCBab29tIEltYWdlLlwiLFxuICAgICAgICBYbWw6ICAgICAgICAgICAgXCJIbW0sIHRoaXMgZG9lc24ndCBhcHBlYXIgdG8gYmUgYSB2YWxpZCBEZWVwIFpvb20gSW1hZ2UuXCIsXG4gICAgICAgIEltYWdlRm9ybWF0OiAgICBcIlNvcnJ5LCB3ZSBkb24ndCBzdXBwb3J0IHswfS1iYXNlZCBEZWVwIFpvb20gSW1hZ2VzLlwiLFxuICAgICAgICBTZWN1cml0eTogICAgICAgXCJJdCBsb29rcyBsaWtlIGEgc2VjdXJpdHkgcmVzdHJpY3Rpb24gc3RvcHBlZCB1cyBmcm9tIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwibG9hZGluZyB0aGlzIERlZXAgWm9vbSBJbWFnZS5cIixcbiAgICAgICAgU3RhdHVzOiAgICAgICAgIFwiVGhpcyBzcGFjZSB1bmludGVudGlvbmFsbHkgbGVmdCBibGFuayAoezB9IHsxfSkuXCIsXG4gICAgICAgIE9wZW5GYWlsZWQ6ICAgICBcIlVuYWJsZSB0byBvcGVuIHswfTogezF9XCJcbiAgICB9LFxuXG4gICAgVG9vbHRpcHM6IHtcbiAgICAgICAgRnVsbFBhZ2U6ICAgICAgIFwiVG9nZ2xlIGZ1bGwgcGFnZVwiLFxuICAgICAgICBIb21lOiAgICAgICAgICAgXCJHbyBob21lXCIsXG4gICAgICAgIFpvb21JbjogICAgICAgICBcIlpvb20gaW5cIixcbiAgICAgICAgWm9vbU91dDogICAgICAgIFwiWm9vbSBvdXRcIixcbiAgICAgICAgTmV4dFBhZ2U6ICAgICAgIFwiTmV4dCBwYWdlXCIsXG4gICAgICAgIFByZXZpb3VzUGFnZTogICBcIlByZXZpb3VzIHBhZ2VcIixcbiAgICAgICAgUm90YXRlTGVmdDogICAgIFwiUm90YXRlIGxlZnRcIixcbiAgICAgICAgUm90YXRlUmlnaHQ6ICAgIFwiUm90YXRlIHJpZ2h0XCJcbiAgICB9XG59O1xuXG4kLmV4dGVuZCggJCwgLyoqIEBsZW5kcyBPcGVuU2VhZHJhZ29uICove1xuXG4gICAgLyoqXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5XG4gICAgICovXG4gICAgZ2V0U3RyaW5nOiBmdW5jdGlvbiggcHJvcCApIHtcblxuICAgICAgICB2YXIgcHJvcHMgICA9IHByb3Auc3BsaXQoJy4nKSxcbiAgICAgICAgICAgIHN0cmluZyAgPSBudWxsLFxuICAgICAgICAgICAgYXJncyAgICA9IGFyZ3VtZW50cyxcbiAgICAgICAgICAgIGNvbnRhaW5lciA9IEkxOE4sXG4gICAgICAgICAgICBpO1xuXG4gICAgICAgIGZvciAoIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoLTE7IGkrKyApIHtcbiAgICAgICAgICAgIC8vIGluIGNhc2Ugbm90IGEgc3VicHJvcGVydHlcbiAgICAgICAgICAgIGNvbnRhaW5lciA9IGNvbnRhaW5lclsgcHJvcHNbIGkgXSBdIHx8IHt9O1xuICAgICAgICB9XG4gICAgICAgIHN0cmluZyA9IGNvbnRhaW5lclsgcHJvcHNbIGkgXSBdO1xuXG4gICAgICAgIGlmICggdHlwZW9mKCBzdHJpbmcgKSAhPSBcInN0cmluZ1wiICkge1xuICAgICAgICAgICAgJC5jb25zb2xlLmRlYnVnKCBcIlVudHJhbnNsYXRlZCBzb3VyY2Ugc3RyaW5nOlwiLCBwcm9wICk7XG4gICAgICAgICAgICBzdHJpbmcgPSBcIlwiOyAvLyBGSVhNRTogdGhpcyBicmVha3MgZ2V0dGV4dCgpLXN0eWxlIGNvbnZlbnRpb24sIHdoaWNoIHdvdWxkIHJldHVybiBzb3VyY2VcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgvXFx7XFxkK1xcfS9nLCBmdW5jdGlvbihjYXB0dXJlKSB7XG4gICAgICAgICAgICB2YXIgaSA9IHBhcnNlSW50KCBjYXB0dXJlLm1hdGNoKCAvXFxkKy8gKSwgMTAgKSArIDE7XG4gICAgICAgICAgICByZXR1cm4gaSA8IGFyZ3MubGVuZ3RoID9cbiAgICAgICAgICAgICAgICBhcmdzWyBpIF0gOlxuICAgICAgICAgICAgICAgIFwiXCI7XG4gICAgICAgIH0pO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gcHJvcGVydHlcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlXG4gICAgICovXG4gICAgc2V0U3RyaW5nOiBmdW5jdGlvbiggcHJvcCwgdmFsdWUgKSB7XG5cbiAgICAgICAgdmFyIHByb3BzICAgICA9IHByb3Auc3BsaXQoJy4nKSxcbiAgICAgICAgICAgIGNvbnRhaW5lciA9IEkxOE4sXG4gICAgICAgICAgICBpO1xuXG4gICAgICAgIGZvciAoIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoIC0gMTsgaSsrICkge1xuICAgICAgICAgICAgaWYgKCAhY29udGFpbmVyWyBwcm9wc1sgaSBdIF0gKSB7XG4gICAgICAgICAgICAgICAgY29udGFpbmVyWyBwcm9wc1sgaSBdIF0gPSB7fTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnRhaW5lciA9IGNvbnRhaW5lclsgcHJvcHNbIGkgXSBdO1xuICAgICAgICB9XG5cbiAgICAgICAgY29udGFpbmVyWyBwcm9wc1sgaSBdIF0gPSB2YWx1ZTtcbiAgICB9XG5cbn0pO1xuXG59KCBPcGVuU2VhZHJhZ29uICkpO1xuXG4vKlxuICogT3BlblNlYWRyYWdvbiAtIFBvaW50XG4gKlxuICogQ29weXJpZ2h0IChDKSAyMDA5IENvZGVQbGV4IEZvdW5kYXRpb25cbiAqIENvcHlyaWdodCAoQykgMjAxMC0yMDEzIE9wZW5TZWFkcmFnb24gY29udHJpYnV0b3JzXG4gKlxuICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlXG4gKiBtZXQ6XG4gKlxuICogLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4gKiAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4gKlxuICogLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodFxuICogICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlXG4gKiAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uXG4gKlxuICogLSBOZWl0aGVyIHRoZSBuYW1lIG9mIENvZGVQbGV4IEZvdW5kYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHNcbiAqICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb21cbiAqICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbiAqXG4gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTXG4gKiBcIkFTIElTXCIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UXG4gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1JcbiAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVFxuICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsXG4gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURURcbiAqIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1JcbiAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0ZcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HXG4gKiBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVNcbiAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICovXG5cbihmdW5jdGlvbiggJCApe1xuXG4vKipcbiAqIEBjbGFzcyBQb2ludFxuICogQGNsYXNzZGVzYyBBIFBvaW50IGlzIHJlYWxseSB1c2VkIGFzIGEgMi1kaW1lbnNpb25hbCB2ZWN0b3IsIGVxdWFsbHkgdXNlZnVsIGZvclxuICogcmVwcmVzZW50aW5nIGEgcG9pbnQgb24gYSBwbGFuZSwgb3IgdGhlIGhlaWdodCBhbmQgd2lkdGggb2YgYSBwbGFuZVxuICogbm90IHJlcXVpcmluZyBhbnkgb3RoZXIgZnJhbWUgb2YgcmVmZXJlbmNlLlxuICpcbiAqIEBtZW1iZXJvZiBPcGVuU2VhZHJhZ29uXG4gKiBAcGFyYW0ge051bWJlcn0gW3hdIFRoZSB2ZWN0b3IgY29tcG9uZW50ICd4Jy4gRGVmYXVsdHMgdG8gdGhlIG9yaWdpbiBhdCAwLlxuICogQHBhcmFtIHtOdW1iZXJ9IFt5XSBUaGUgdmVjdG9yIGNvbXBvbmVudCAneScuIERlZmF1bHRzIHRvIHRoZSBvcmlnaW4gYXQgMC5cbiAqL1xuJC5Qb2ludCA9IGZ1bmN0aW9uKCB4LCB5ICkge1xuICAgIC8qKlxuICAgICAqIFRoZSB2ZWN0b3IgY29tcG9uZW50ICd4Jy5cbiAgICAgKiBAbWVtYmVyIHtOdW1iZXJ9IHhcbiAgICAgKiBAbWVtYmVyb2YgT3BlblNlYWRyYWdvbi5Qb2ludCNcbiAgICAgKi9cbiAgICB0aGlzLnggPSB0eXBlb2YgKCB4ICkgPT0gXCJudW1iZXJcIiA/IHggOiAwO1xuICAgIC8qKlxuICAgICAqIFRoZSB2ZWN0b3IgY29tcG9uZW50ICd5Jy5cbiAgICAgKiBAbWVtYmVyIHtOdW1iZXJ9IHlcbiAgICAgKiBAbWVtYmVyb2YgT3BlblNlYWRyYWdvbi5Qb2ludCNcbiAgICAgKi9cbiAgICB0aGlzLnkgPSB0eXBlb2YgKCB5ICkgPT0gXCJudW1iZXJcIiA/IHkgOiAwO1xufTtcblxuLyoqIEBsZW5kcyBPcGVuU2VhZHJhZ29uLlBvaW50LnByb3RvdHlwZSAqL1xuJC5Qb2ludC5wcm90b3R5cGUgPSB7XG4gICAgLyoqXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHJldHVybnMge09wZW5TZWFkcmFnb24uUG9pbnR9IGEgZHVwbGljYXRlIG9mIHRoaXMgUG9pbnRcbiAgICAgKi9cbiAgICBjbG9uZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBuZXcgJC5Qb2ludCh0aGlzLngsIHRoaXMueSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEFkZCBhbm90aGVyIFBvaW50IHRvIHRoaXMgcG9pbnQgYW5kIHJldHVybiBhIG5ldyBQb2ludC5cbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge09wZW5TZWFkcmFnb24uUG9pbnR9IHBvaW50IFRoZSBwb2ludCB0byBhZGQgdmVjdG9yIGNvbXBvbmVudHMuXG4gICAgICogQHJldHVybnMge09wZW5TZWFkcmFnb24uUG9pbnR9IEEgbmV3IHBvaW50IHJlcHJlc2VudGluZyB0aGUgc3VtIG9mIHRoZVxuICAgICAqICB2ZWN0b3IgY29tcG9uZW50c1xuICAgICAqL1xuICAgIHBsdXM6IGZ1bmN0aW9uKCBwb2ludCApIHtcbiAgICAgICAgcmV0dXJuIG5ldyAkLlBvaW50KFxuICAgICAgICAgICAgdGhpcy54ICsgcG9pbnQueCxcbiAgICAgICAgICAgIHRoaXMueSArIHBvaW50LnlcbiAgICAgICAgKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU3Vic3RyYWN0IGFub3RoZXIgUG9pbnQgdG8gdGhpcyBwb2ludCBhbmQgcmV0dXJuIGEgbmV3IFBvaW50LlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7T3BlblNlYWRyYWdvbi5Qb2ludH0gcG9pbnQgVGhlIHBvaW50IHRvIHN1YnN0cmFjdCB2ZWN0b3IgY29tcG9uZW50cy5cbiAgICAgKiBAcmV0dXJucyB7T3BlblNlYWRyYWdvbi5Qb2ludH0gQSBuZXcgcG9pbnQgcmVwcmVzZW50aW5nIHRoZSBzdWJzdHJhY3Rpb24gb2YgdGhlXG4gICAgICogIHZlY3RvciBjb21wb25lbnRzXG4gICAgICovXG4gICAgbWludXM6IGZ1bmN0aW9uKCBwb2ludCApIHtcbiAgICAgICAgcmV0dXJuIG5ldyAkLlBvaW50KFxuICAgICAgICAgICAgdGhpcy54IC0gcG9pbnQueCxcbiAgICAgICAgICAgIHRoaXMueSAtIHBvaW50LnlcbiAgICAgICAgKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogTXVsdGlwbHkgdGhpcyBwb2ludCBieSBhIGZhY3RvciBhbmQgcmV0dXJuIGEgbmV3IFBvaW50LlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBmYWN0b3IgVGhlIGZhY3RvciB0byBtdWx0aXBseSB2ZWN0b3IgY29tcG9uZW50cy5cbiAgICAgKiBAcmV0dXJucyB7T3BlblNlYWRyYWdvbi5Qb2ludH0gQSBuZXcgcG9pbnQgcmVwcmVzZW50aW5nIHRoZSBtdWx0aXBsaWNhdGlvblxuICAgICAqICBvZiB0aGUgdmVjdG9yIGNvbXBvbmVudHMgYnkgdGhlIGZhY3RvclxuICAgICAqL1xuICAgIHRpbWVzOiBmdW5jdGlvbiggZmFjdG9yICkge1xuICAgICAgICByZXR1cm4gbmV3ICQuUG9pbnQoXG4gICAgICAgICAgICB0aGlzLnggKiBmYWN0b3IsXG4gICAgICAgICAgICB0aGlzLnkgKiBmYWN0b3JcbiAgICAgICAgKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogRGl2aWRlIHRoaXMgcG9pbnQgYnkgYSBmYWN0b3IgYW5kIHJldHVybiBhIG5ldyBQb2ludC5cbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gZmFjdG9yIFRoZSBmYWN0b3IgdG8gZGl2aWRlIHZlY3RvciBjb21wb25lbnRzLlxuICAgICAqIEByZXR1cm5zIHtPcGVuU2VhZHJhZ29uLlBvaW50fSBBIG5ldyBwb2ludCByZXByZXNlbnRpbmcgdGhlIGRpdmlzaW9uIG9mIHRoZVxuICAgICAqICB2ZWN0b3IgY29tcG9uZW50cyBieSB0aGUgZmFjdG9yXG4gICAgICovXG4gICAgZGl2aWRlOiBmdW5jdGlvbiggZmFjdG9yICkge1xuICAgICAgICByZXR1cm4gbmV3ICQuUG9pbnQoXG4gICAgICAgICAgICB0aGlzLnggLyBmYWN0b3IsXG4gICAgICAgICAgICB0aGlzLnkgLyBmYWN0b3JcbiAgICAgICAgKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ29tcHV0ZSB0aGUgb3Bwb3NpdGUgb2YgdGhpcyBwb2ludCBhbmQgcmV0dXJuIGEgbmV3IFBvaW50LlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEByZXR1cm5zIHtPcGVuU2VhZHJhZ29uLlBvaW50fSBBIG5ldyBwb2ludCByZXByZXNlbnRpbmcgdGhlIG9wcG9zaXRlIG9mIHRoZVxuICAgICAqICB2ZWN0b3IgY29tcG9uZW50c1xuICAgICAqL1xuICAgIG5lZ2F0ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBuZXcgJC5Qb2ludCggLXRoaXMueCwgLXRoaXMueSApO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDb21wdXRlIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoaXMgcG9pbnQgYW5kIGFub3RoZXIgcG9pbnQuXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtPcGVuU2VhZHJhZ29uLlBvaW50fSBwb2ludCBUaGUgcG9pbnQgdG8gY29tcHV0ZSB0aGUgZGlzdGFuY2Ugd2l0aC5cbiAgICAgKiBAcmV0dXJucyB7TnVtYmVyfSBUaGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgMiBwb2ludHNcbiAgICAgKi9cbiAgICBkaXN0YW5jZVRvOiBmdW5jdGlvbiggcG9pbnQgKSB7XG4gICAgICAgIHJldHVybiBNYXRoLnNxcnQoXG4gICAgICAgICAgICBNYXRoLnBvdyggdGhpcy54IC0gcG9pbnQueCwgMiApICtcbiAgICAgICAgICAgIE1hdGgucG93KCB0aGlzLnkgLSBwb2ludC55LCAyIClcbiAgICAgICAgKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQXBwbHkgYSBmdW5jdGlvbiB0byBlYWNoIGNvb3JkaW5hdGUgb2YgdGhpcyBwb2ludCBhbmQgcmV0dXJuIGEgbmV3IHBvaW50LlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGFwcGx5IHRvIGVhY2ggY29vcmRpbmF0ZS5cbiAgICAgKiBAcmV0dXJucyB7T3BlblNlYWRyYWdvbi5Qb2ludH0gQSBuZXcgcG9pbnQgd2l0aCB0aGUgY29vcmRpbmF0ZXMgY29tcHV0ZWRcbiAgICAgKiBieSB0aGUgc3BlY2lmaWVkIGZ1bmN0aW9uXG4gICAgICovXG4gICAgYXBwbHk6IGZ1bmN0aW9uKCBmdW5jICkge1xuICAgICAgICByZXR1cm4gbmV3ICQuUG9pbnQoIGZ1bmMoIHRoaXMueCApLCBmdW5jKCB0aGlzLnkgKSApO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiB0aGlzIHBvaW50IGlzIGVxdWFsIHRvIGFub3RoZXIgb25lLlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7T3BlblNlYWRyYWdvbi5Qb2ludH0gcG9pbnQgVGhlIHBvaW50IHRvIGNvbXBhcmUgdGhpcyBwb2ludCB3aXRoLlxuICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB0cnVlIGlmIHRoZXkgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuXG4gICAgICovXG4gICAgZXF1YWxzOiBmdW5jdGlvbiggcG9pbnQgKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBwb2ludCBpbnN0YW5jZW9mICQuUG9pbnRcbiAgICAgICAgKSAmJiAoXG4gICAgICAgICAgICB0aGlzLnggPT09IHBvaW50LnhcbiAgICAgICAgKSAmJiAoXG4gICAgICAgICAgICB0aGlzLnkgPT09IHBvaW50LnlcbiAgICAgICAgKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUm90YXRlcyB0aGUgcG9pbnQgYXJvdW5kIHRoZSBzcGVjaWZpZWQgcGl2b3RcbiAgICAgKiBGcm9tIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNDQ2NTkzMS9yb3RhdGUtcmVjdGFuZ2xlLWFyb3VuZC1hLXBvaW50XG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGRlZ3Jlc3MgdG8gcm90YXRlIGFyb3VuZCB0aGUgcGl2b3QuXG4gICAgICogQHBhcmFtIHtPcGVuU2VhZHJhZ29uLlBvaW50fSBbcGl2b3Q9KDAsMCldIFBvaW50IGFyb3VuZCB3aGljaCB0byByb3RhdGUuXG4gICAgICogRGVmYXVsdHMgdG8gdGhlIG9yaWdpbi5cbiAgICAgKiBAcmV0dXJucyB7T3BlblNlYWRyYWdvbi5Qb2ludH0uIEEgbmV3IHBvaW50IHJlcHJlc2VudGluZyB0aGUgcG9pbnQgcm90YXRlZCBhcm91bmQgdGhlIHNwZWNpZmllZCBwaXZvdFxuICAgICAqL1xuICAgIHJvdGF0ZTogZnVuY3Rpb24gKGRlZ3JlZXMsIHBpdm90KSB7XG4gICAgICAgIHBpdm90ID0gcGl2b3QgfHwgbmV3ICQuUG9pbnQoMCwgMCk7XG4gICAgICAgIHZhciBjb3M7XG4gICAgICAgIHZhciBzaW47XG4gICAgICAgIC8vIEF2b2lkIGZsb2F0IGNvbXB1dGF0aW9ucyB3aGVuIHBvc3NpYmxlXG4gICAgICAgIGlmIChkZWdyZWVzICUgOTAgPT09IDApIHtcbiAgICAgICAgICAgIHZhciBkID0gZGVncmVlcyAlIDM2MDtcbiAgICAgICAgICAgIGlmIChkIDwgMCkge1xuICAgICAgICAgICAgICAgIGQgKz0gMzYwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3dpdGNoIChkKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICBjb3MgPSAxO1xuICAgICAgICAgICAgICAgICAgICBzaW4gPSAwO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDkwOlxuICAgICAgICAgICAgICAgICAgICBjb3MgPSAwO1xuICAgICAgICAgICAgICAgICAgICBzaW4gPSAxO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDE4MDpcbiAgICAgICAgICAgICAgICAgICAgY29zID0gLTE7XG4gICAgICAgICAgICAgICAgICAgIHNpbiA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjcwOlxuICAgICAgICAgICAgICAgICAgICBjb3MgPSAwO1xuICAgICAgICAgICAgICAgICAgICBzaW4gPSAtMTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgYW5nbGUgPSBkZWdyZWVzICogTWF0aC5QSSAvIDE4MC4wO1xuICAgICAgICAgICAgY29zID0gTWF0aC5jb3MoYW5nbGUpO1xuICAgICAgICAgICAgc2luID0gTWF0aC5zaW4oYW5nbGUpO1xuICAgICAgICB9XG4gICAgICAgIHZhciB4ID0gY29zICogKHRoaXMueCAtIHBpdm90LngpIC0gc2luICogKHRoaXMueSAtIHBpdm90LnkpICsgcGl2b3QueDtcbiAgICAgICAgdmFyIHkgPSBzaW4gKiAodGhpcy54IC0gcGl2b3QueCkgKyBjb3MgKiAodGhpcy55IC0gcGl2b3QueSkgKyBwaXZvdC55O1xuICAgICAgICByZXR1cm4gbmV3ICQuUG9pbnQoeCwgeSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENvbnZlcnQgdGhpcyBwb2ludCB0byBhIHN0cmluZyBpbiB0aGUgZm9ybWF0ICh4LHkpIHdoZXJlIHggYW5kIHkgYXJlXG4gICAgICogcm91bmRlZCB0byB0aGUgbmVhcmVzdCBpbnRlZ2VyLlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IEEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgcG9pbnQuXG4gICAgICovXG4gICAgdG9TdHJpbmc6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gXCIoXCIgKyAoTWF0aC5yb3VuZCh0aGlzLnggKiAxMDApIC8gMTAwKSArIFwiLFwiICsgKE1hdGgucm91bmQodGhpcy55ICogMTAwKSAvIDEwMCkgKyBcIilcIjtcbiAgICB9XG59O1xuXG59KCBPcGVuU2VhZHJhZ29uICkpO1xuXG4vKlxuICogT3BlblNlYWRyYWdvbiAtIFRpbGVTb3VyY2VcbiAqXG4gKiBDb3B5cmlnaHQgKEMpIDIwMDkgQ29kZVBsZXggRm91bmRhdGlvblxuICogQ29weXJpZ2h0IChDKSAyMDEwLTIwMTMgT3BlblNlYWRyYWdvbiBjb250cmlidXRvcnNcbiAqXG4gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmVcbiAqIG1ldDpcbiAqXG4gKiAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiAqICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAqXG4gKiAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0XG4gKiAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGVcbiAqICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cbiAqXG4gKiAtIE5laXRoZXIgdGhlIG5hbWUgb2YgQ29kZVBsZXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0c1xuICogICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbVxuICogICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuICpcbiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlNcbiAqIFwiQVMgSVNcIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1RcbiAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUlxuICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUXG4gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCxcbiAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRFxuICogVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUlxuICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkdcbiAqIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJU1xuICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4gKi9cblxuKGZ1bmN0aW9uKCAkICl7XG5cblxuLyoqXG4gKiBAY2xhc3MgVGlsZVNvdXJjZVxuICogQGNsYXNzZGVzYyBUaGUgVGlsZVNvdXJjZSBjb250YWlucyB0aGUgbW9zdCBiYXNpYyBpbXBsZW1lbnRhdGlvbiByZXF1aXJlZCB0byBjcmVhdGUgYVxuICogc21vb3RoIHRyYW5zaXRpb24gYmV0d2VlbiBsYXllcnMgaW4gYW4gaW1hZ2UgcHlyYW1pZC4gSXQgaGFzIG9ubHkgYSBzaW5nbGUga2V5XG4gKiBpbnRlcmZhY2UgdGhhdCBtdXN0IGJlIGltcGxlbWVudGVkIHRvIGNvbXBsZXRlIGl0cyBrZXkgZnVuY3Rpb25hbGl0eTpcbiAqICdnZXRUaWxlVXJsJy4gIEl0IGFsc28gaGFzIHNldmVyYWwgb3B0aW9uYWwgaW50ZXJmYWNlcyB0aGF0IGNhbiBiZVxuICogaW1wbGVtZW50ZWQgaWYgYSBuZXcgVGlsZVNvdXJjZSB3aXNoZXMgdG8gc3VwcG9ydCBjb25maWd1cmF0aW9uIHZpYSBhIHNpbXBsZVxuICogb2JqZWN0IG9yIGFycmF5ICgnY29uZmlndXJlJykgYW5kIGlmIHRoZSB0aWxlIHNvdXJjZSBzdXBwb3J0cyBvciByZXF1aXJlc1xuICogY29uZmlndXJhdGlvbiB2aWEgcmV0cmlldmFsIG9mIGEgZG9jdW1lbnQgb24gdGhlIG5ldHdvcmsgYWxhIEFKQVggb3IgSlNPTlAsXG4gKiAoJ2dldEltYWdlSW5mbycpLlxuICogPGJyLz5cbiAqIEJ5IGRlZmF1bHQgdGhlIGltYWdlIHB5cmFtaWQgaXMgc3BsaXQgaW50byBOIGxheWVycyB3aGVyZSB0aGUgaW1hZ2UncyBsb25nZXN0XG4gKiBzaWRlIGluIE0gKGluIHBpeGVscyksIHdoZXJlIE4gaXMgdGhlIHNtYWxsZXN0IGludGVnZXIgd2hpY2ggc2F0aXNmaWVzXG4gKiAgICAgIDxzdHJvbmc+Ml4oTisxKSA+PSBNPC9zdHJvbmc+LlxuICpcbiAqIEBtZW1iZXJvZiBPcGVuU2VhZHJhZ29uXG4gKiBAZXh0ZW5kcyBPcGVuU2VhZHJhZ29uLkV2ZW50U291cmNlXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICogICAgICBZb3UgY2FuIGVpdGhlciBzcGVjaWZ5IGEgVVJMLCBvciBsaXRlcmFsbHkgZGVmaW5lIHRoZSBUaWxlU291cmNlIChieSBzcGVjaWZ5aW5nXG4gKiAgICAgIHdpZHRoLCBoZWlnaHQsIHRpbGVTaXplLCB0aWxlT3ZlcmxhcCwgbWluTGV2ZWwsIGFuZCBtYXhMZXZlbCkuIEZvciB0aGUgZm9ybWVyLFxuICogICAgICB0aGUgZXh0ZW5kaW5nIGNsYXNzIGlzIGV4cGVjdGVkIHRvIGltcGxlbWVudCAnZ2V0SW1hZ2VJbmZvJyBhbmQgJ2NvbmZpZ3VyZScuXG4gKiAgICAgIEZvciB0aGUgbGF0dGVyLCB0aGUgY29uc3RydWN0aW9uIGlzIGFzc3VtZWQgdG8gb2NjdXIgdGhyb3VnaFxuICogICAgICB0aGUgZXh0ZW5kaW5nIGNsYXNzZXMgaW1wbGVtZW50YXRpb24gb2YgJ2NvbmZpZ3VyZScuXG4gKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMudXJsXVxuICogICAgICBUaGUgVVJMIGZvciB0aGUgZGF0YSBuZWNlc3NhcnkgZm9yIHRoaXMgVGlsZVNvdXJjZS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLnN1Y2Nlc3NdXG4gKiAgICAgIEEgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHVwb24gc3VjY2Vzc2Z1bCBjcmVhdGlvbi5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuYWpheFdpdGhDcmVkZW50aWFsc11cbiAqICAgICAgSWYgdGhpcyBUaWxlU291cmNlIG5lZWRzIHRvIG1ha2UgYW4gQUpBWCBjYWxsLCB0aGlzIHNwZWNpZmllcyB3aGV0aGVyIHRvIHNldFxuICogICAgICB0aGUgWEhSJ3Mgd2l0aENyZWRlbnRpYWxzIChmb3IgYWNjZXNzaW5nIHNlY3VyZSBkYXRhKS5cbiAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy53aWR0aF1cbiAqICAgICAgV2lkdGggb2YgdGhlIHNvdXJjZSBpbWFnZSBhdCBtYXggcmVzb2x1dGlvbiBpbiBwaXhlbHMuXG4gKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuaGVpZ2h0XVxuICogICAgICBIZWlnaHQgb2YgdGhlIHNvdXJjZSBpbWFnZSBhdCBtYXggcmVzb2x1dGlvbiBpbiBwaXhlbHMuXG4gKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMudGlsZVNpemVdXG4gKiAgICAgIFRoZSBzaXplIG9mIHRoZSB0aWxlcyB0byBhc3N1bWVkIHRvIG1ha2UgdXAgZWFjaCBweXJhbWlkIGxheWVyIGluIHBpeGVscy5cbiAqICAgICAgVGlsZSBzaXplIGRldGVybWluZXMgdGhlIHBvaW50IGF0IHdoaWNoIHRoZSBpbWFnZSBweXJhbWlkIG11c3QgYmVcbiAqICAgICAgZGl2aWRlZCBpbnRvIGEgbWF0cml4IG9mIHNtYWxsZXIgaW1hZ2VzLlxuICogICAgICBVc2Ugb3B0aW9ucy50aWxlV2lkdGggYW5kIG9wdGlvbnMudGlsZUhlaWdodCB0byBzdXBwb3J0IG5vbi1zcXVhcmUgdGlsZXMuXG4gKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMudGlsZVdpZHRoXVxuICogICAgICBUaGUgd2lkdGggb2YgdGhlIHRpbGVzIHRvIGFzc3VtZWQgdG8gbWFrZSB1cCBlYWNoIHB5cmFtaWQgbGF5ZXIgaW4gcGl4ZWxzLlxuICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLnRpbGVIZWlnaHRdXG4gKiAgICAgIFRoZSBoZWlnaHQgb2YgdGhlIHRpbGVzIHRvIGFzc3VtZWQgdG8gbWFrZSB1cCBlYWNoIHB5cmFtaWQgbGF5ZXIgaW4gcGl4ZWxzLlxuICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLnRpbGVPdmVybGFwXVxuICogICAgICBUaGUgbnVtYmVyIG9mIHBpeGVscyBlYWNoIHRpbGUgaXMgZXhwZWN0ZWQgdG8gb3ZlcmxhcCB0b3VjaGluZyB0aWxlcy5cbiAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5taW5MZXZlbF1cbiAqICAgICAgVGhlIG1pbmltdW0gbGV2ZWwgdG8gYXR0ZW1wdCB0byBsb2FkLlxuICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLm1heExldmVsXVxuICogICAgICBUaGUgbWF4aW11bSBsZXZlbCB0byBhdHRlbXB0IHRvIGxvYWQuXG4gKi9cbiQuVGlsZVNvdXJjZSA9IGZ1bmN0aW9uKCB3aWR0aCwgaGVpZ2h0LCB0aWxlU2l6ZSwgdGlsZU92ZXJsYXAsIG1pbkxldmVsLCBtYXhMZXZlbCApIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgdmFyIGFyZ3MgPSBhcmd1bWVudHMsXG4gICAgICAgIG9wdGlvbnMsXG4gICAgICAgIGk7XG5cbiAgICBpZiggJC5pc1BsYWluT2JqZWN0KCB3aWR0aCApICl7XG4gICAgICAgIG9wdGlvbnMgPSB3aWR0aDtcbiAgICB9ZWxzZXtcbiAgICAgICAgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIHdpZHRoOiBhcmdzWzBdLFxuICAgICAgICAgICAgaGVpZ2h0OiBhcmdzWzFdLFxuICAgICAgICAgICAgdGlsZVNpemU6IGFyZ3NbMl0sXG4gICAgICAgICAgICB0aWxlT3ZlcmxhcDogYXJnc1szXSxcbiAgICAgICAgICAgIG1pbkxldmVsOiBhcmdzWzRdLFxuICAgICAgICAgICAgbWF4TGV2ZWw6IGFyZ3NbNV1cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvL1RpbGUgc291cmNlcyBzdXBwbHkgc29tZSBldmVudHMsIG5hbWVseSAncmVhZHknIHdoZW4gdGhleSBtdXN0IGJlIGNvbmZpZ3VyZWRcbiAgICAvL2J5IGFzeW5jaHJvbm91c2x5IGZldGNoaW5nIHRoZWlyIGNvbmZpZ3VyYXRpb24gZGF0YS5cbiAgICAkLkV2ZW50U291cmNlLmNhbGwoIHRoaXMgKTtcblxuICAgIC8vd2UgYWxsb3cgb3B0aW9ucyB0byBvdmVycmlkZSBhbnl0aGluZyB3ZSBkb250IHRyZWF0IGFzXG4gICAgLy9yZXF1aXJlZCB2aWEgaWRpb21hdGljIG9wdGlvbnMgb3Igd2hpY2ggaXMgZnVuY3Rpb25hbGx5XG4gICAgLy9zZXQgZGVwZW5kaW5nIG9uIHRoZSBzdGF0ZSBvZiB0aGUgcmVhZGluZXNzIG9mIHRoaXMgdGlsZVxuICAgIC8vc291cmNlXG4gICAgJC5leHRlbmQoIHRydWUsIHRoaXMsIG9wdGlvbnMgKTtcblxuICAgIGlmICghdGhpcy5zdWNjZXNzKSB7XG4gICAgICAgIC8vQW55IGZ1bmN0aW9ucyB0aGF0IGFyZSBwYXNzZWQgYXMgYXJndW1lbnRzIGFyZSBib3VuZCB0byB0aGUgcmVhZHkgY2FsbGJhY2tcbiAgICAgICAgZm9yICggaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKysgKSB7XG4gICAgICAgICAgICBpZiAoICQuaXNGdW5jdGlvbiggYXJndW1lbnRzWyBpIF0gKSApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN1Y2Nlc3MgPSBhcmd1bWVudHNbIGkgXTtcbiAgICAgICAgICAgICAgICAvL29ubHkgb25lIGNhbGxiYWNrIHBlciBjb25zdHJ1Y3RvclxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc3VjY2Vzcykge1xuICAgICAgICB0aGlzLmFkZEhhbmRsZXIoICdyZWFkeScsIGZ1bmN0aW9uICggZXZlbnQgKSB7XG4gICAgICAgICAgICBfdGhpcy5zdWNjZXNzKCBldmVudCApO1xuICAgICAgICB9ICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmF0aW8gb2Ygd2lkdGggdG8gaGVpZ2h0XG4gICAgICogQG1lbWJlciB7TnVtYmVyfSBhc3BlY3RSYXRpb1xuICAgICAqIEBtZW1iZXJvZiBPcGVuU2VhZHJhZ29uLlRpbGVTb3VyY2UjXG4gICAgICovXG4gICAgLyoqXG4gICAgICogVmVjdG9yIHN0b3JpbmcgeCBhbmQgeSBkaW1lbnNpb25zICggd2lkdGggYW5kIGhlaWdodCByZXNwZWN0aXZlbHkgKS5cbiAgICAgKiBAbWVtYmVyIHtPcGVuU2VhZHJhZ29uLlBvaW50fSBkaW1lbnNpb25zXG4gICAgICogQG1lbWJlcm9mIE9wZW5TZWFkcmFnb24uVGlsZVNvdXJjZSNcbiAgICAgKi9cbiAgICAvKipcbiAgICAgKiBUaGUgb3ZlcmxhcCBpbiBwaXhlbHMgZWFjaCB0aWxlIHNoYXJlcyB3aXRoIGl0cyBhZGphY2VudCBuZWlnaGJvcnMuXG4gICAgICogQG1lbWJlciB7TnVtYmVyfSB0aWxlT3ZlcmxhcFxuICAgICAqIEBtZW1iZXJvZiBPcGVuU2VhZHJhZ29uLlRpbGVTb3VyY2UjXG4gICAgICovXG4gICAgLyoqXG4gICAgICogVGhlIG1pbmltdW0gcHlyYW1pZCBsZXZlbCB0aGlzIHRpbGUgc291cmNlIHN1cHBvcnRzIG9yIHNob3VsZCBhdHRlbXB0IHRvIGxvYWQuXG4gICAgICogQG1lbWJlciB7TnVtYmVyfSBtaW5MZXZlbFxuICAgICAqIEBtZW1iZXJvZiBPcGVuU2VhZHJhZ29uLlRpbGVTb3VyY2UjXG4gICAgICovXG4gICAgLyoqXG4gICAgICogVGhlIG1heGltdW0gcHlyYW1pZCBsZXZlbCB0aGlzIHRpbGUgc291cmNlIHN1cHBvcnRzIG9yIHNob3VsZCBhdHRlbXB0IHRvIGxvYWQuXG4gICAgICogQG1lbWJlciB7TnVtYmVyfSBtYXhMZXZlbFxuICAgICAqIEBtZW1iZXJvZiBPcGVuU2VhZHJhZ29uLlRpbGVTb3VyY2UjXG4gICAgICovXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAbWVtYmVyIHtCb29sZWFufSByZWFkeVxuICAgICAqIEBtZW1iZXJvZiBPcGVuU2VhZHJhZ29uLlRpbGVTb3VyY2UjXG4gICAgICovXG5cbiAgICBpZiggJ3N0cmluZycgPT0gJC50eXBlKCBhcmd1bWVudHNbIDAgXSApICl7XG4gICAgICAgIHRoaXMudXJsID0gYXJndW1lbnRzWzBdO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnVybCkge1xuICAgICAgICAvL2luIGNhc2UgdGhlIGdldEltYWdlSW5mbyBtZXRob2QgaXMgb3ZlcnJpZGVuIGFuZC9vciBpbXBsaWVzIGFuXG4gICAgICAgIC8vYXN5bmMgbWVjaGFuaXNtIHNldCBzb21lIHNhZmUgZGVmYXVsdHMgZmlyc3RcbiAgICAgICAgdGhpcy5hc3BlY3RSYXRpbyA9IDE7XG4gICAgICAgIHRoaXMuZGltZW5zaW9ucyAgPSBuZXcgJC5Qb2ludCggMTAsIDEwICk7XG4gICAgICAgIHRoaXMuX3RpbGVXaWR0aCAgPSAwO1xuICAgICAgICB0aGlzLl90aWxlSGVpZ2h0ID0gMDtcbiAgICAgICAgdGhpcy50aWxlT3ZlcmxhcCA9IDA7XG4gICAgICAgIHRoaXMubWluTGV2ZWwgICAgPSAwO1xuICAgICAgICB0aGlzLm1heExldmVsICAgID0gMDtcbiAgICAgICAgdGhpcy5yZWFkeSAgICAgICA9IGZhbHNlO1xuICAgICAgICAvL2NvbmZpZ3VyYXRpb24gdmlhIHVybCBpbXBsaWVzIHRoZSBleHRlbmRpbmcgY2xhc3NcbiAgICAgICAgLy9pbXBsZW1lbnRzIGFuZCAnY29uZmlndXJlJ1xuICAgICAgICB0aGlzLmdldEltYWdlSW5mbyggdGhpcy51cmwgKTtcblxuICAgIH0gZWxzZSB7XG5cbiAgICAgICAgLy9leHBsaWNpdCBjb25maWd1cmF0aW9uIHZpYSBwb3NpdGlvbmFsIGFyZ3MgaW4gY29uc3RydWN0b3JcbiAgICAgICAgLy9vciB0aGUgbW9yZSBpZGlvbWF0aWMgJ29wdGlvbnMnIG9iamVjdFxuICAgICAgICB0aGlzLnJlYWR5ICAgICAgID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5hc3BlY3RSYXRpbyA9ICggb3B0aW9ucy53aWR0aCAmJiBvcHRpb25zLmhlaWdodCApID9cbiAgICAgICAgICAgICggIG9wdGlvbnMud2lkdGggLyBvcHRpb25zLmhlaWdodCApIDogMTtcbiAgICAgICAgdGhpcy5kaW1lbnNpb25zICA9IG5ldyAkLlBvaW50KCBvcHRpb25zLndpZHRoLCBvcHRpb25zLmhlaWdodCApO1xuXG4gICAgICAgIGlmICggdGhpcy50aWxlU2l6ZSApe1xuICAgICAgICAgICAgdGhpcy5fdGlsZVdpZHRoID0gdGhpcy5fdGlsZUhlaWdodCA9IHRoaXMudGlsZVNpemU7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy50aWxlU2l6ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmKCB0aGlzLnRpbGVXaWR0aCApe1xuICAgICAgICAgICAgICAgIC8vIFdlIHdlcmUgcGFzc2VkIHRpbGVXaWR0aCBpbiBvcHRpb25zLCBidXQgd2Ugd2FudCB0byByZW5hbWUgaXRcbiAgICAgICAgICAgICAgICAvLyB3aXRoIGEgbGVhZGluZyB1bmRlcnNjb3JlIHRvIG1ha2UgY2xlYXIgdGhhdCBpdCBpcyBub3Qgc2FmZSB0byBkaXJlY3RseSBtb2RpZnkgaXRcbiAgICAgICAgICAgICAgICB0aGlzLl90aWxlV2lkdGggPSB0aGlzLnRpbGVXaWR0aDtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy50aWxlV2lkdGg7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX3RpbGVXaWR0aCA9IDA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmKCB0aGlzLnRpbGVIZWlnaHQgKXtcbiAgICAgICAgICAgICAgICAvLyBTZWUgbm90ZSBhYm92ZSBhYm91dCByZW5hbWluZyB0aGlzLnRpbGVXaWR0aFxuICAgICAgICAgICAgICAgIHRoaXMuX3RpbGVIZWlnaHQgPSB0aGlzLnRpbGVIZWlnaHQ7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMudGlsZUhlaWdodDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdGlsZUhlaWdodCA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnRpbGVPdmVybGFwID0gb3B0aW9ucy50aWxlT3ZlcmxhcCA/IG9wdGlvbnMudGlsZU92ZXJsYXAgOiAwO1xuICAgICAgICB0aGlzLm1pbkxldmVsICAgID0gb3B0aW9ucy5taW5MZXZlbCA/IG9wdGlvbnMubWluTGV2ZWwgOiAwO1xuICAgICAgICB0aGlzLm1heExldmVsICAgID0gKCB1bmRlZmluZWQgIT09IG9wdGlvbnMubWF4TGV2ZWwgJiYgbnVsbCAhPT0gb3B0aW9ucy5tYXhMZXZlbCApID9cbiAgICAgICAgICAgIG9wdGlvbnMubWF4TGV2ZWwgOiAoXG4gICAgICAgICAgICAgICAgKCBvcHRpb25zLndpZHRoICYmIG9wdGlvbnMuaGVpZ2h0ICkgPyBNYXRoLmNlaWwoXG4gICAgICAgICAgICAgICAgICAgIE1hdGgubG9nKCBNYXRoLm1heCggb3B0aW9ucy53aWR0aCwgb3B0aW9ucy5oZWlnaHQgKSApIC9cbiAgICAgICAgICAgICAgICAgICAgTWF0aC5sb2coIDIgKVxuICAgICAgICAgICAgICAgICkgOiAwXG4gICAgICAgICAgICApO1xuICAgICAgICBpZiggdGhpcy5zdWNjZXNzICYmICQuaXNGdW5jdGlvbiggdGhpcy5zdWNjZXNzICkgKXtcbiAgICAgICAgICAgIHRoaXMuc3VjY2VzcyggdGhpcyApO1xuICAgICAgICB9XG4gICAgfVxuXG5cbn07XG5cbi8qKiBAbGVuZHMgT3BlblNlYWRyYWdvbi5UaWxlU291cmNlLnByb3RvdHlwZSAqL1xuJC5UaWxlU291cmNlLnByb3RvdHlwZSA9IHtcblxuICAgIGdldFRpbGVTaXplOiBmdW5jdGlvbiggbGV2ZWwgKSB7XG4gICAgICAgICQuY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIFwiW1RpbGVTb3VyY2UuZ2V0VGlsZVNpemVdIGlzIGRlcHJlY2F0ZWQuXCIgK1xuICAgICAgICAgICAgXCJVc2UgVGlsZVNvdXJjZS5nZXRUaWxlV2lkdGgoKSBhbmQgVGlsZVNvdXJjZS5nZXRUaWxlSGVpZ2h0KCkgaW5zdGVhZFwiXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB0aGlzLl90aWxlV2lkdGg7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgdGlsZVdpZHRoIGZvciBhIGdpdmVuIGxldmVsLlxuICAgICAqIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgaWYgdGlsZVdpZHRoIGNhbiBiZSBkaWZmZXJlbnQgYXQgZGlmZmVyZW50IGxldmVsc1xuICAgICAqICAgc3VjaCBhcyBpbiBJSUlGVGlsZVNvdXJjZS4gIENvZGUgc2hvdWxkIHVzZSB0aGlzIGZ1bmN0aW9uIHJhdGhlciB0aGFuIHJlYWRpbmdcbiAgICAgKiAgIGZyb20gLl90aWxlV2lkdGggZGlyZWN0bHkuXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGxldmVsXG4gICAgICovXG4gICAgZ2V0VGlsZVdpZHRoOiBmdW5jdGlvbiggbGV2ZWwgKSB7XG4gICAgICAgIGlmICghdGhpcy5fdGlsZVdpZHRoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRUaWxlU2l6ZShsZXZlbCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3RpbGVXaWR0aDtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSB0aWxlSGVpZ2h0IGZvciBhIGdpdmVuIGxldmVsLlxuICAgICAqIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgaWYgdGlsZUhlaWdodCBjYW4gYmUgZGlmZmVyZW50IGF0IGRpZmZlcmVudCBsZXZlbHNcbiAgICAgKiAgIHN1Y2ggYXMgaW4gSUlJRlRpbGVTb3VyY2UuICBDb2RlIHNob3VsZCB1c2UgdGhpcyBmdW5jdGlvbiByYXRoZXIgdGhhbiByZWFkaW5nXG4gICAgICogICBmcm9tIC5fdGlsZUhlaWdodCBkaXJlY3RseS5cbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gbGV2ZWxcbiAgICAgKi9cbiAgICBnZXRUaWxlSGVpZ2h0OiBmdW5jdGlvbiggbGV2ZWwgKSB7XG4gICAgICAgIGlmICghdGhpcy5fdGlsZUhlaWdodCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VGlsZVNpemUobGV2ZWwpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl90aWxlSGVpZ2h0O1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gbGV2ZWxcbiAgICAgKi9cbiAgICBnZXRMZXZlbFNjYWxlOiBmdW5jdGlvbiggbGV2ZWwgKSB7XG5cbiAgICAgICAgLy8gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9vcGVuc2VhZHJhZ29uL29wZW5zZWFkcmFnb24vaXNzdWVzLzIyXG4gICAgICAgIC8vIHdlIHVzZSB0aGUgdGlsZXNvdXJjZXMgaW1wbGVtZW50YXRpb24gb2YgZ2V0TGV2ZWxTY2FsZSB0byBnZW5lcmF0ZVxuICAgICAgICAvLyBhIG1lbW9pemVkIHJlLWltcGxlbWVudGF0aW9uXG4gICAgICAgIHZhciBsZXZlbFNjYWxlQ2FjaGUgPSB7fSxcbiAgICAgICAgICAgIGk7XG4gICAgICAgIGZvciggaSA9IDA7IGkgPD0gdGhpcy5tYXhMZXZlbDsgaSsrICl7XG4gICAgICAgICAgICBsZXZlbFNjYWxlQ2FjaGVbIGkgXSA9IDEgLyBNYXRoLnBvdygyLCB0aGlzLm1heExldmVsIC0gaSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5nZXRMZXZlbFNjYWxlID0gZnVuY3Rpb24oIF9sZXZlbCApe1xuICAgICAgICAgICAgcmV0dXJuIGxldmVsU2NhbGVDYWNoZVsgX2xldmVsIF07XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB0aGlzLmdldExldmVsU2NhbGUoIGxldmVsICk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBsZXZlbFxuICAgICAqL1xuICAgIGdldE51bVRpbGVzOiBmdW5jdGlvbiggbGV2ZWwgKSB7XG4gICAgICAgIHZhciBzY2FsZSA9IHRoaXMuZ2V0TGV2ZWxTY2FsZSggbGV2ZWwgKSxcbiAgICAgICAgICAgIHggPSBNYXRoLmNlaWwoIHNjYWxlICogdGhpcy5kaW1lbnNpb25zLnggLyB0aGlzLmdldFRpbGVXaWR0aChsZXZlbCkgKSxcbiAgICAgICAgICAgIHkgPSBNYXRoLmNlaWwoIHNjYWxlICogdGhpcy5kaW1lbnNpb25zLnkgLyB0aGlzLmdldFRpbGVIZWlnaHQobGV2ZWwpICk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyAkLlBvaW50KCB4LCB5ICk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBsZXZlbFxuICAgICAqL1xuICAgIGdldFBpeGVsUmF0aW86IGZ1bmN0aW9uKCBsZXZlbCApIHtcbiAgICAgICAgdmFyIGltYWdlU2l6ZVNjYWxlZCA9IHRoaXMuZGltZW5zaW9ucy50aW1lcyggdGhpcy5nZXRMZXZlbFNjYWxlKCBsZXZlbCApICksXG4gICAgICAgICAgICByeCA9IDEuMCAvIGltYWdlU2l6ZVNjYWxlZC54LFxuICAgICAgICAgICAgcnkgPSAxLjAgLyBpbWFnZVNpemVTY2FsZWQueTtcblxuICAgICAgICByZXR1cm4gbmV3ICQuUG9pbnQocngsIHJ5KTtcbiAgICB9LFxuXG5cbiAgICAvKipcbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gbGV2ZWxcbiAgICAgKi9cbiAgICBnZXRDbG9zZXN0TGV2ZWw6IGZ1bmN0aW9uKCByZWN0ICkge1xuICAgICAgICB2YXIgaSxcbiAgICAgICAgICAgIHRpbGVzUGVyU2lkZSxcbiAgICAgICAgICAgIHRpbGVzO1xuXG4gICAgICAgIGZvciggaSA9IHRoaXMubWluTGV2ZWw7IGkgPCB0aGlzLm1heExldmVsOyBpKysgKXtcbiAgICAgICAgICAgIHRpbGVzID0gdGhpcy5nZXROdW1UaWxlcyggaSApO1xuICAgICAgICAgICAgdGlsZXNQZXJTaWRlID0gbmV3ICQuUG9pbnQoXG4gICAgICAgICAgICAgIE1hdGguZmxvb3IoIHJlY3QueCAvIHRoaXMuZ2V0VGlsZVdpZHRoKGkpICksXG4gICAgICAgICAgICAgIE1hdGguZmxvb3IoIHJlY3QueSAvIHRoaXMuZ2V0VGlsZUhlaWdodChpKSApXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBpZiggdGlsZXMueCArIDEgPj0gdGlsZXNQZXJTaWRlLnggJiYgdGlsZXMueSArIDEgPj0gdGlsZXNQZXJTaWRlLnkgKXtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gTWF0aC5tYXgoIDAsIGkgLSAxICk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBsZXZlbFxuICAgICAqIEBwYXJhbSB7T3BlblNlYWRyYWdvbi5Qb2ludH0gcG9pbnRcbiAgICAgKi9cbiAgICBnZXRUaWxlQXRQb2ludDogZnVuY3Rpb24oIGxldmVsLCBwb2ludCApIHtcbiAgICAgICAgdmFyIHBpeGVsID0gcG9pbnQudGltZXMoIHRoaXMuZGltZW5zaW9ucy54ICkudGltZXMoIHRoaXMuZ2V0TGV2ZWxTY2FsZShsZXZlbCkgKSxcbiAgICAgICAgICAgIHR4ID0gTWF0aC5mbG9vciggcGl4ZWwueCAvIHRoaXMuZ2V0VGlsZVdpZHRoKGxldmVsKSApLFxuICAgICAgICAgICAgdHkgPSBNYXRoLmZsb29yKCBwaXhlbC55IC8gdGhpcy5nZXRUaWxlSGVpZ2h0KGxldmVsKSApO1xuXG4gICAgICAgIHJldHVybiBuZXcgJC5Qb2ludCggdHgsIHR5ICk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBsZXZlbFxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSB4XG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHlcbiAgICAgKi9cbiAgICBnZXRUaWxlQm91bmRzOiBmdW5jdGlvbiggbGV2ZWwsIHgsIHkgKSB7XG4gICAgICAgIHZhciBkaW1lbnNpb25zU2NhbGVkID0gdGhpcy5kaW1lbnNpb25zLnRpbWVzKCB0aGlzLmdldExldmVsU2NhbGUoIGxldmVsICkgKSxcbiAgICAgICAgICAgIHRpbGVXaWR0aCA9IHRoaXMuZ2V0VGlsZVdpZHRoKGxldmVsKSxcbiAgICAgICAgICAgIHRpbGVIZWlnaHQgPSB0aGlzLmdldFRpbGVIZWlnaHQobGV2ZWwpLFxuICAgICAgICAgICAgcHggPSAoIHggPT09IDAgKSA/IDAgOiB0aWxlV2lkdGggKiB4IC0gdGhpcy50aWxlT3ZlcmxhcCxcbiAgICAgICAgICAgIHB5ID0gKCB5ID09PSAwICkgPyAwIDogdGlsZUhlaWdodCAqIHkgLSB0aGlzLnRpbGVPdmVybGFwLFxuICAgICAgICAgICAgc3ggPSB0aWxlV2lkdGggKyAoIHggPT09IDAgPyAxIDogMiApICogdGhpcy50aWxlT3ZlcmxhcCxcbiAgICAgICAgICAgIHN5ID0gdGlsZUhlaWdodCArICggeSA9PT0gMCA/IDEgOiAyICkgKiB0aGlzLnRpbGVPdmVybGFwLFxuICAgICAgICAgICAgc2NhbGUgPSAxLjAgLyBkaW1lbnNpb25zU2NhbGVkLng7XG5cbiAgICAgICAgc3ggPSBNYXRoLm1pbiggc3gsIGRpbWVuc2lvbnNTY2FsZWQueCAtIHB4ICk7XG4gICAgICAgIHN5ID0gTWF0aC5taW4oIHN5LCBkaW1lbnNpb25zU2NhbGVkLnkgLSBweSApO1xuXG4gICAgICAgIHJldHVybiBuZXcgJC5SZWN0KCBweCAqIHNjYWxlLCBweSAqIHNjYWxlLCBzeCAqIHNjYWxlLCBzeSAqIHNjYWxlICk7XG4gICAgfSxcblxuXG4gICAgLyoqXG4gICAgICogUmVzcG9uc2libGUgZm9yIHJldHJpZXZpbmcsIGFuZCBjYWNoaW5nIHRoZVxuICAgICAqIGltYWdlIG1ldGFkYXRhIHBlcnRpbmVudCB0byB0aGlzIFRpbGVTb3VyY2VzIGltcGxlbWVudGF0aW9uLlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB1cmxcbiAgICAgKiBAdGhyb3dzIHtFcnJvcn1cbiAgICAgKi9cbiAgICBnZXRJbWFnZUluZm86IGZ1bmN0aW9uKCB1cmwgKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXMsXG4gICAgICAgICAgICBjYWxsYmFja05hbWUsXG4gICAgICAgICAgICBjYWxsYmFjayxcbiAgICAgICAgICAgIHJlYWR5U291cmNlLFxuICAgICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICAgIHVybFBhcnRzLFxuICAgICAgICAgICAgZmlsZW5hbWUsXG4gICAgICAgICAgICBsYXN0RG90O1xuXG5cbiAgICAgICAgaWYoIHVybCApIHtcbiAgICAgICAgICAgIHVybFBhcnRzID0gdXJsLnNwbGl0KCAnLycgKTtcbiAgICAgICAgICAgIGZpbGVuYW1lID0gdXJsUGFydHNbIHVybFBhcnRzLmxlbmd0aCAtIDEgXTtcbiAgICAgICAgICAgIGxhc3REb3QgID0gZmlsZW5hbWUubGFzdEluZGV4T2YoICcuJyApO1xuICAgICAgICAgICAgaWYgKCBsYXN0RG90ID4gLTEgKSB7XG4gICAgICAgICAgICAgICAgdXJsUGFydHNbIHVybFBhcnRzLmxlbmd0aCAtIDEgXSA9IGZpbGVuYW1lLnNsaWNlKCAwLCBsYXN0RG90ICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjYWxsYmFjayA9IGZ1bmN0aW9uKCBkYXRhICl7XG4gICAgICAgICAgICBpZiggdHlwZW9mKGRhdGEpID09PSBcInN0cmluZ1wiICkge1xuICAgICAgICAgICAgICAgIGRhdGEgPSAkLnBhcnNlWG1sKCBkYXRhICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgJFRpbGVTb3VyY2UgPSAkLlRpbGVTb3VyY2UuZGV0ZXJtaW5lVHlwZSggX3RoaXMsIGRhdGEsIHVybCApO1xuICAgICAgICAgICAgaWYgKCAhJFRpbGVTb3VyY2UgKSB7XG4gICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICogUmFpc2VkIHdoZW4gYW4gZXJyb3Igb2NjdXJzIGxvYWRpbmcgYSBUaWxlU291cmNlLlxuICAgICAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgICAgICogQGV2ZW50IG9wZW4tZmFpbGVkXG4gICAgICAgICAgICAgICAgICogQG1lbWJlcm9mIE9wZW5TZWFkcmFnb24uVGlsZVNvdXJjZVxuICAgICAgICAgICAgICAgICAqIEB0eXBlIHtvYmplY3R9XG4gICAgICAgICAgICAgICAgICogQHByb3BlcnR5IHtPcGVuU2VhZHJhZ29uLlRpbGVTb3VyY2V9IGV2ZW50U291cmNlIC0gQSByZWZlcmVuY2UgdG8gdGhlIFRpbGVTb3VyY2Ugd2hpY2ggcmFpc2VkIHRoZSBldmVudC5cbiAgICAgICAgICAgICAgICAgKiBAcHJvcGVydHkge1N0cmluZ30gbWVzc2FnZVxuICAgICAgICAgICAgICAgICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBzb3VyY2VcbiAgICAgICAgICAgICAgICAgKiBAcHJvcGVydHkgez9PYmplY3R9IHVzZXJEYXRhIC0gQXJiaXRyYXJ5IHN1YnNjcmliZXItZGVmaW5lZCBvYmplY3QuXG4gICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgX3RoaXMucmFpc2VFdmVudCggJ29wZW4tZmFpbGVkJywgeyBtZXNzYWdlOiBcIlVuYWJsZSB0byBsb2FkIFRpbGVTb3VyY2VcIiwgc291cmNlOiB1cmwgfSApO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgb3B0aW9ucyA9ICRUaWxlU291cmNlLnByb3RvdHlwZS5jb25maWd1cmUuYXBwbHkoIF90aGlzLCBbIGRhdGEsIHVybCBdKTtcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmFqYXhXaXRoQ3JlZGVudGlhbHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIG9wdGlvbnMuYWpheFdpdGhDcmVkZW50aWFscyA9IF90aGlzLmFqYXhXaXRoQ3JlZGVudGlhbHM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlYWR5U291cmNlID0gbmV3ICRUaWxlU291cmNlKCBvcHRpb25zICk7XG4gICAgICAgICAgICBfdGhpcy5yZWFkeSA9IHRydWU7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIFJhaXNlZCB3aGVuIGEgVGlsZVNvdXJjZSBpcyBvcGVuZWQgYW5kIGluaXRpYWxpemVkLlxuICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAqIEBldmVudCByZWFkeVxuICAgICAgICAgICAgICogQG1lbWJlcm9mIE9wZW5TZWFkcmFnb24uVGlsZVNvdXJjZVxuICAgICAgICAgICAgICogQHR5cGUge29iamVjdH1cbiAgICAgICAgICAgICAqIEBwcm9wZXJ0eSB7T3BlblNlYWRyYWdvbi5UaWxlU291cmNlfSBldmVudFNvdXJjZSAtIEEgcmVmZXJlbmNlIHRvIHRoZSBUaWxlU291cmNlIHdoaWNoIHJhaXNlZCB0aGUgZXZlbnQuXG4gICAgICAgICAgICAgKiBAcHJvcGVydHkge09iamVjdH0gdGlsZVNvdXJjZVxuICAgICAgICAgICAgICogQHByb3BlcnR5IHs/T2JqZWN0fSB1c2VyRGF0YSAtIEFyYml0cmFyeSBzdWJzY3JpYmVyLWRlZmluZWQgb2JqZWN0LlxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBfdGhpcy5yYWlzZUV2ZW50KCAncmVhZHknLCB7IHRpbGVTb3VyY2U6IHJlYWR5U291cmNlIH0gKTtcbiAgICAgICAgfTtcblxuICAgICAgICBpZiggdXJsLm1hdGNoKC9cXC5qcyQvKSApe1xuICAgICAgICAgICAgLy9UT0RPOiBJdHMgbm90IHZlcnkgZmxleGlibGUgdG8gcmVxdWlyZSB0aWxlIHNvdXJjZXMgdG8gZW5kIGpzb25wXG4gICAgICAgICAgICAvLyAgICAgIHJlcXVlc3QgZm9yIGluZm8gIHdpdGggYSB1cmwgdGhhdCBlbmRzIHdpdGggJy5qcycgYnV0IGZvclxuICAgICAgICAgICAgLy8gICAgICBub3cgaXQncyB0aGUgb25seSB3YXkgSSBzZWUgdG8gZGlzdGluZ3Vpc2ggdW5pZm9ybWx5LlxuICAgICAgICAgICAgY2FsbGJhY2tOYW1lID0gdXJsLnNwbGl0KCAnLycgKS5wb3AoKS5yZXBsYWNlKCcuanMnLCcnKTtcbiAgICAgICAgICAgICQuanNvbnAoe1xuICAgICAgICAgICAgICAgIHVybDogdXJsLFxuICAgICAgICAgICAgICAgIGFzeW5jOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBjYWxsYmFja05hbWU6IGNhbGxiYWNrTmFtZSxcbiAgICAgICAgICAgICAgICBjYWxsYmFjazogY2FsbGJhY2tcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gcmVxdWVzdCBpbmZvIHZpYSB4aHIgYXN5bmNocm9ub3VzbHkuXG4gICAgICAgICAgICAkLm1ha2VBamF4UmVxdWVzdCgge1xuICAgICAgICAgICAgICAgIHVybDogdXJsLFxuICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5hamF4V2l0aENyZWRlbnRpYWxzLFxuICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKCB4aHIgKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBkYXRhID0gcHJvY2Vzc1Jlc3BvbnNlKCB4aHIgKTtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soIGRhdGEgKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGVycm9yOiBmdW5jdGlvbiAoIHhociwgZXhjICkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgbXNnO1xuXG4gICAgICAgICAgICAgICAgICAgIC8qXG4gICAgICAgICAgICAgICAgICAgICAgICBJRSA8IDEwIHdpbGwgYmxvY2sgWEhSIHJlcXVlc3RzIHRvIGRpZmZlcmVudCBvcmlnaW5zLiBBbnkgcHJvcGVydHkgYWNjZXNzIG9uIHRoZSByZXF1ZXN0XG4gICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Qgd2lsbCByYWlzZSBhbiBleGNlcHRpb24gd2hpY2ggd2UnbGwgYXR0ZW1wdCB0byBoYW5kbGUgYnkgZm9ybWF0dGluZyB0aGUgb3JpZ2luYWxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbiByYXRoZXIgdGhhbiB0aGUgc2Vjb25kIG9uZSByYWlzZWQgd2hlbiB3ZSB0cnkgdG8gYWNjZXNzIHhoci5zdGF0dXNcbiAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtc2cgPSBcIkhUVFAgXCIgKyB4aHIuc3RhdHVzICsgXCIgYXR0ZW1wdGluZyB0byBsb2FkIFRpbGVTb3VyY2VcIjtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoIGUgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZm9ybWF0dGVkRXhjO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCB0eXBlb2YoIGV4YyApID09IFwidW5kZWZpbmVkXCIgfHwgIWV4Yy50b1N0cmluZyApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXR0ZWRFeGMgPSBcIlVua25vd24gZXJyb3JcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGVkRXhjID0gZXhjLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIG1zZyA9IGZvcm1hdHRlZEV4YyArIFwiIGF0dGVtcHRpbmcgdG8gbG9hZCBUaWxlU291cmNlXCI7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvKioqXG4gICAgICAgICAgICAgICAgICAgICAqIFJhaXNlZCB3aGVuIGFuIGVycm9yIG9jY3VycyBsb2FkaW5nIGEgVGlsZVNvdXJjZS5cbiAgICAgICAgICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAgICAgICAgICogQGV2ZW50IG9wZW4tZmFpbGVkXG4gICAgICAgICAgICAgICAgICAgICAqIEBtZW1iZXJvZiBPcGVuU2VhZHJhZ29uLlRpbGVTb3VyY2VcbiAgICAgICAgICAgICAgICAgICAgICogQHR5cGUge29iamVjdH1cbiAgICAgICAgICAgICAgICAgICAgICogQHByb3BlcnR5IHtPcGVuU2VhZHJhZ29uLlRpbGVTb3VyY2V9IGV2ZW50U291cmNlIC0gQSByZWZlcmVuY2UgdG8gdGhlIFRpbGVTb3VyY2Ugd2hpY2ggcmFpc2VkIHRoZSBldmVudC5cbiAgICAgICAgICAgICAgICAgICAgICogQHByb3BlcnR5IHtTdHJpbmd9IG1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgICAgICogQHByb3BlcnR5IHtTdHJpbmd9IHNvdXJjZVxuICAgICAgICAgICAgICAgICAgICAgKiBAcHJvcGVydHkgez9PYmplY3R9IHVzZXJEYXRhIC0gQXJiaXRyYXJ5IHN1YnNjcmliZXItZGVmaW5lZCBvYmplY3QuXG4gICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy5yYWlzZUV2ZW50KCAnb3Blbi1mYWlsZWQnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBtc2csXG4gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IHVybFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFJlc3BvbnNpYmxlIGRldGVybWluaW5nIGlmIGEgdGhlIHBhcnRpY3VsYXIgVGlsZVNvdXJjZSBzdXBwb3J0cyB0aGVcbiAgICAgKiBkYXRhIGZvcm1hdCAoIGFuZCBhbGxvd2VkIHRvIGFwcGx5IGxvZ2ljIGFnYWluc3QgdGhlIHVybCB0aGUgZGF0YSB3YXNcbiAgICAgKiBsb2FkZWQgZnJvbSwgaWYgYW55ICkuIE92ZXJyaWRpbmcgaW1wbGVtZW50YXRpb25zIGFyZSBleHBlY3RlZCB0byBkb1xuICAgICAqIHNvbWV0aGluZyBzbWFydCB3aXRoIGRhdGEgYW5kIC8gb3IgdXJsIHRvIGRldGVybWluZSBzdXBwb3J0LiAgQWxzb1xuICAgICAqIHVuZGVyc3RhbmQgdGhhdCBpdGVyYXRpb24gb3JkZXIgb2YgVGlsZVNvdXJjZXMgaXMgbm90IGd1YXJ1bnRlZWQgc29cbiAgICAgKiBwbGVhc2UgbWFrZSBzdXJlIHlvdXIgZGF0YSBvciB1cmwgaXMgZXhwcmVzc2l2ZSBlbm91Z2ggdG8gZW5zdXJlIGEgc2ltcGxlXG4gICAgICogYW5kIHN1ZmZpY2llbnQgbWVjaGFuaXNpbSBmb3IgY2xlYXIgZGV0ZXJtaW5hdGlvbi5cbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge1N0cmluZ3xPYmplY3R8QXJyYXl8RG9jdW1lbnR9IGRhdGFcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdXJsIC0gdGhlIHVybCB0aGUgZGF0YSB3YXMgbG9hZGVkXG4gICAgICogICAgICBmcm9tIGlmIGFueS5cbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIHN1cHBvcnRzOiBmdW5jdGlvbiggZGF0YSwgdXJsICkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFJlc3BvbnNpYmxlIGZvciBwYXJzaW5nIGFuZCBjb25maWd1cmluZyB0aGVcbiAgICAgKiBpbWFnZSBtZXRhZGF0YSBwZXJ0aW5lbnQgdG8gdGhpcyBUaWxlU291cmNlcyBpbXBsZW1lbnRhdGlvbi5cbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBub3QgaW1wbGVtZW50ZWQgYnkgdGhpcyBjbGFzcyBvdGhlciB0aGFuIHRvIHRocm93IGFuIEVycm9yXG4gICAgICogYW5ub3VuY2luZyB5b3UgaGF2ZSB0byBpbXBsZW1lbnQgaXQuICBCZWNhdXNlIG9mIHRoZSB2YXJpZXR5IG9mIHRpbGVcbiAgICAgKiBzZXJ2ZXIgdGVjaG5vbG9naWVzLCBhbmQgdmFyaW91cyBzcGVjaWZpY2F0aW9ucyBmb3IgYnVpbGRpbmcgaW1hZ2VcbiAgICAgKiBweXJhbWlkcywgdGhpcyBtZXRob2QgaXMgaGVyZSB0byBhbGxvdyBlYXN5IGludGVncmF0aW9uLlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7U3RyaW5nfE9iamVjdHxBcnJheXxEb2N1bWVudH0gZGF0YVxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB1cmwgLSB0aGUgdXJsIHRoZSBkYXRhIHdhcyBsb2FkZWRcbiAgICAgKiAgICAgIGZyb20gaWYgYW55LlxuICAgICAqIEByZXR1cm4ge09iamVjdH0gb3B0aW9ucyAtIEEgZGljdGlvbmFyeSBvZiBrZXl3b3JkIGFyZ3VtZW50cyBzdWZmaWNpZW50XG4gICAgICogICAgICB0byBjb25maWd1cmUgdGhpcyB0aWxlIHNvdXJjZXMgY29uc3RydWN0b3IuXG4gICAgICogQHRocm93cyB7RXJyb3J9XG4gICAgICovXG4gICAgY29uZmlndXJlOiBmdW5jdGlvbiggZGF0YSwgdXJsICkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIFwiTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC5cIiApO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSZXNwb25zaWJsZSBmb3IgcmV0cml2aW5nIHRoZSB1cmwgd2hpY2ggd2lsbCByZXR1cm4gYW4gaW1hZ2UgZm9yIHRoZVxuICAgICAqIHJlZ2lvbiBzcGVjaWZpZWQgYnkgdGhlIGdpdmVuIHgsIHksIGFuZCBsZXZlbCBjb21wb25lbnRzLlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIG5vdCBpbXBsZW1lbnRlZCBieSB0aGlzIGNsYXNzIG90aGVyIHRoYW4gdG8gdGhyb3cgYW4gRXJyb3JcbiAgICAgKiBhbm5vdW5jaW5nIHlvdSBoYXZlIHRvIGltcGxlbWVudCBpdC4gIEJlY2F1c2Ugb2YgdGhlIHZhcmlldHkgb2YgdGlsZVxuICAgICAqIHNlcnZlciB0ZWNobm9sb2dpZXMsIGFuZCB2YXJpb3VzIHNwZWNpZmljYXRpb25zIGZvciBidWlsZGluZyBpbWFnZVxuICAgICAqIHB5cmFtaWRzLCB0aGlzIG1ldGhvZCBpcyBoZXJlIHRvIGFsbG93IGVhc3kgaW50ZWdyYXRpb24uXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGxldmVsXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHhcbiAgICAgKiBAcGFyYW0ge051bWJlcn0geVxuICAgICAqIEB0aHJvd3Mge0Vycm9yfVxuICAgICAqL1xuICAgIGdldFRpbGVVcmw6IGZ1bmN0aW9uKCBsZXZlbCwgeCwgeSApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCBcIk1ldGhvZCBub3QgaW1wbGVtZW50ZWQuXCIgKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGxldmVsXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHhcbiAgICAgKiBAcGFyYW0ge051bWJlcn0geVxuICAgICAqL1xuICAgIHRpbGVFeGlzdHM6IGZ1bmN0aW9uKCBsZXZlbCwgeCwgeSApIHtcbiAgICAgICAgdmFyIG51bVRpbGVzID0gdGhpcy5nZXROdW1UaWxlcyggbGV2ZWwgKTtcbiAgICAgICAgcmV0dXJuICBsZXZlbCA+PSB0aGlzLm1pbkxldmVsICYmXG4gICAgICAgICAgICAgICAgbGV2ZWwgPD0gdGhpcy5tYXhMZXZlbCAmJlxuICAgICAgICAgICAgICAgIHggPj0gMCAmJlxuICAgICAgICAgICAgICAgIHkgPj0gMCAmJlxuICAgICAgICAgICAgICAgIHggPCBudW1UaWxlcy54ICYmXG4gICAgICAgICAgICAgICAgeSA8IG51bVRpbGVzLnk7XG4gICAgfVxufTtcblxuXG4kLmV4dGVuZCggdHJ1ZSwgJC5UaWxlU291cmNlLnByb3RvdHlwZSwgJC5FdmVudFNvdXJjZS5wcm90b3R5cGUgKTtcblxuXG4vKipcbiAqIERlY2lkZXMgd2hldGhlciB0byB0cnkgdG8gcHJvY2VzcyB0aGUgcmVzcG9uc2UgYXMgeG1sLCBqc29uLCBvciBoYW5kIGJhY2tcbiAqIHRoZSB0ZXh0XG4gKiBAcHJpdmF0ZVxuICogQGlubmVyXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7WE1MSHR0cFJlcXVlc3R9IHhociAtIHRoZSBjb21wbGV0ZWQgbmV0d29yayByZXF1ZXN0XG4gKi9cbmZ1bmN0aW9uIHByb2Nlc3NSZXNwb25zZSggeGhyICl7XG4gICAgdmFyIHJlc3BvbnNlVGV4dCA9IHhoci5yZXNwb25zZVRleHQsXG4gICAgICAgIHN0YXR1cyAgICAgICA9IHhoci5zdGF0dXMsXG4gICAgICAgIHN0YXR1c1RleHQsXG4gICAgICAgIGRhdGE7XG5cbiAgICBpZiAoICF4aHIgKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvciggJC5nZXRTdHJpbmcoIFwiRXJyb3JzLlNlY3VyaXR5XCIgKSApO1xuICAgIH0gZWxzZSBpZiAoIHhoci5zdGF0dXMgIT09IDIwMCAmJiB4aHIuc3RhdHVzICE9PSAwICkge1xuICAgICAgICBzdGF0dXMgICAgID0geGhyLnN0YXR1cztcbiAgICAgICAgc3RhdHVzVGV4dCA9ICggc3RhdHVzID09IDQwNCApID9cbiAgICAgICAgICAgIFwiTm90IEZvdW5kXCIgOlxuICAgICAgICAgICAgeGhyLnN0YXR1c1RleHQ7XG4gICAgICAgIHRocm93IG5ldyBFcnJvciggJC5nZXRTdHJpbmcoIFwiRXJyb3JzLlN0YXR1c1wiLCBzdGF0dXMsIHN0YXR1c1RleHQgKSApO1xuICAgIH1cblxuICAgIGlmKCByZXNwb25zZVRleHQubWF0Y2goL1xccyo8LiovKSApe1xuICAgICAgICB0cnl7XG4gICAgICAgIGRhdGEgPSAoIHhoci5yZXNwb25zZVhNTCAmJiB4aHIucmVzcG9uc2VYTUwuZG9jdW1lbnRFbGVtZW50ICkgP1xuICAgICAgICAgICAgeGhyLnJlc3BvbnNlWE1MIDpcbiAgICAgICAgICAgICQucGFyc2VYbWwoIHJlc3BvbnNlVGV4dCApO1xuICAgICAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgICAgIGRhdGEgPSB4aHIucmVzcG9uc2VUZXh0O1xuICAgICAgICB9XG4gICAgfWVsc2UgaWYoIHJlc3BvbnNlVGV4dC5tYXRjaCgvXFxzKltcXHtcXFtdLiovKSApe1xuICAgICAgICBkYXRhID0gJC5wYXJzZUpTT04ocmVzcG9uc2VUZXh0KTtcbiAgICB9ZWxzZXtcbiAgICAgICAgZGF0YSA9IHJlc3BvbnNlVGV4dDtcbiAgICB9XG4gICAgcmV0dXJuIGRhdGE7XG59XG5cblxuLyoqXG4gKiBEZXRlcm1pbmVzIHRoZSBUaWxlU291cmNlIEltcGxlbWVudGF0aW9uIGJ5IGludHJvc3BlY3Rpb24gb2YgT3BlblNlYWRyYWdvblxuICogbmFtZXNwYWNlLCBjYWxsaW5nIGVhY2ggVGlsZVNvdXJjZSBpbXBsZW1lbnRhdGlvbiBvZiAnaXNUeXBlJ1xuICogQHByaXZhdGVcbiAqIEBpbm5lclxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0ge09iamVjdHxBcnJheXxEb2N1bWVudH0gZGF0YSAtIHRoZSB0aWxlIHNvdXJjZSBjb25maWd1cmF0aW9uIG9iamVjdFxuICogQHBhcmFtIHtTdHJpbmd9IHVybCAtIHRoZSB1cmwgd2hlcmUgdGhlIHRpbGUgc291cmNlIGNvbmZpZ3VyYXRpb24gb2JqZWN0IHdhc1xuICogICAgICBsb2FkZWQgZnJvbSwgaWYgYW55LlxuICovXG4kLlRpbGVTb3VyY2UuZGV0ZXJtaW5lVHlwZSA9IGZ1bmN0aW9uKCB0aWxlU291cmNlLCBkYXRhLCB1cmwgKXtcbiAgICB2YXIgcHJvcGVydHk7XG4gICAgZm9yKCBwcm9wZXJ0eSBpbiBPcGVuU2VhZHJhZ29uICl7XG4gICAgICAgIGlmKCBwcm9wZXJ0eS5tYXRjaCgvLitUaWxlU291cmNlJC8pICYmXG4gICAgICAgICAgICAkLmlzRnVuY3Rpb24oIE9wZW5TZWFkcmFnb25bIHByb3BlcnR5IF0gKSAmJlxuICAgICAgICAgICAgJC5pc0Z1bmN0aW9uKCBPcGVuU2VhZHJhZ29uWyBwcm9wZXJ0eSBdLnByb3RvdHlwZS5zdXBwb3J0cyApICYmXG4gICAgICAgICAgICBPcGVuU2VhZHJhZ29uWyBwcm9wZXJ0eSBdLnByb3RvdHlwZS5zdXBwb3J0cy5jYWxsKCB0aWxlU291cmNlLCBkYXRhLCB1cmwgKVxuICAgICAgICApe1xuICAgICAgICAgICAgcmV0dXJuIE9wZW5TZWFkcmFnb25bIHByb3BlcnR5IF07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAkLmNvbnNvbGUuZXJyb3IoIFwiTm8gVGlsZVNvdXJjZSB3YXMgYWJsZSB0byBvcGVuICVzICVzXCIsIHVybCwgZGF0YSApO1xufTtcblxuXG59KCBPcGVuU2VhZHJhZ29uICkpO1xuXG4vKlxuICogT3BlblNlYWRyYWdvbiAtIER6aVRpbGVTb3VyY2VcbiAqXG4gKiBDb3B5cmlnaHQgKEMpIDIwMDkgQ29kZVBsZXggRm91bmRhdGlvblxuICogQ29weXJpZ2h0IChDKSAyMDEwLTIwMTMgT3BlblNlYWRyYWdvbiBjb250cmlidXRvcnNcbiAqXG4gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmVcbiAqIG1ldDpcbiAqXG4gKiAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiAqICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAqXG4gKiAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0XG4gKiAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGVcbiAqICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cbiAqXG4gKiAtIE5laXRoZXIgdGhlIG5hbWUgb2YgQ29kZVBsZXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0c1xuICogICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbVxuICogICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuICpcbiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlNcbiAqIFwiQVMgSVNcIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1RcbiAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUlxuICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUXG4gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCxcbiAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRFxuICogVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUlxuICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkdcbiAqIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJU1xuICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4gKi9cblxuKGZ1bmN0aW9uKCAkICl7XG5cbi8qKlxuICogQGNsYXNzIER6aVRpbGVTb3VyY2VcbiAqIEBtZW1iZXJvZiBPcGVuU2VhZHJhZ29uXG4gKiBAZXh0ZW5kcyBPcGVuU2VhZHJhZ29uLlRpbGVTb3VyY2VcbiAqIEBwYXJhbSB7TnVtYmVyfE9iamVjdH0gd2lkdGggLSB0aGUgcGl4ZWwgd2lkdGggb2YgdGhlIGltYWdlIG9yIHRoZSBpZGlvbWF0aWNcbiAqICAgICAgb3B0aW9ucyBvYmplY3Qgd2hpY2ggaXMgdXNlZCBpbnN0ZWFkIG9mIHBvc2l0aW9uYWwgYXJndW1lbnRzLlxuICogQHBhcmFtIHtOdW1iZXJ9IGhlaWdodFxuICogQHBhcmFtIHtOdW1iZXJ9IHRpbGVTaXplXG4gKiBAcGFyYW0ge051bWJlcn0gdGlsZU92ZXJsYXBcbiAqIEBwYXJhbSB7U3RyaW5nfSB0aWxlc1VybFxuICogQHBhcmFtIHtTdHJpbmd9IGZpbGVGb3JtYXRcbiAqIEBwYXJhbSB7T3BlblNlYWRyYWdvbi5EaXNwbGF5UmVjdFtdfSBkaXNwbGF5UmVjdHNcbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSB0aWxlc1VybFxuICogQHByb3BlcnR5IHtTdHJpbmd9IGZpbGVGb3JtYXRcbiAqIEBwcm9wZXJ0eSB7T3BlblNlYWRyYWdvbi5EaXNwbGF5UmVjdFtdfSBkaXNwbGF5UmVjdHNcbiAqL1xuJC5EemlUaWxlU291cmNlID0gZnVuY3Rpb24oIHdpZHRoLCBoZWlnaHQsIHRpbGVTaXplLCB0aWxlT3ZlcmxhcCwgdGlsZXNVcmwsIGZpbGVGb3JtYXQsIGRpc3BsYXlSZWN0cywgbWluTGV2ZWwsIG1heExldmVsICkge1xuICAgIHZhciBpLFxuICAgICAgICByZWN0LFxuICAgICAgICBsZXZlbCxcbiAgICAgICAgb3B0aW9ucztcblxuICAgIGlmKCAkLmlzUGxhaW5PYmplY3QoIHdpZHRoICkgKXtcbiAgICAgICAgb3B0aW9ucyA9IHdpZHRoO1xuICAgIH1lbHNle1xuICAgICAgICBvcHRpb25zID0ge1xuICAgICAgICAgICAgd2lkdGg6IGFyZ3VtZW50c1sgMCBdLFxuICAgICAgICAgICAgaGVpZ2h0OiBhcmd1bWVudHNbIDEgXSxcbiAgICAgICAgICAgIHRpbGVTaXplOiBhcmd1bWVudHNbIDIgXSxcbiAgICAgICAgICAgIHRpbGVPdmVybGFwOiBhcmd1bWVudHNbIDMgXSxcbiAgICAgICAgICAgIHRpbGVzVXJsOiBhcmd1bWVudHNbIDQgXSxcbiAgICAgICAgICAgIGZpbGVGb3JtYXQ6IGFyZ3VtZW50c1sgNSBdLFxuICAgICAgICAgICAgZGlzcGxheVJlY3RzOiBhcmd1bWVudHNbIDYgXSxcbiAgICAgICAgICAgIG1pbkxldmVsOiBhcmd1bWVudHNbIDcgXSxcbiAgICAgICAgICAgIG1heExldmVsOiBhcmd1bWVudHNbIDggXVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHRoaXMuX2xldmVsUmVjdHMgID0ge307XG4gICAgdGhpcy50aWxlc1VybCAgICAgPSBvcHRpb25zLnRpbGVzVXJsO1xuICAgIHRoaXMuZmlsZUZvcm1hdCAgID0gb3B0aW9ucy5maWxlRm9ybWF0O1xuICAgIHRoaXMuZGlzcGxheVJlY3RzID0gb3B0aW9ucy5kaXNwbGF5UmVjdHM7XG5cbiAgICBpZiAoIHRoaXMuZGlzcGxheVJlY3RzICkge1xuICAgICAgICBmb3IgKCBpID0gdGhpcy5kaXNwbGF5UmVjdHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0gKSB7XG4gICAgICAgICAgICByZWN0ID0gdGhpcy5kaXNwbGF5UmVjdHNbIGkgXTtcbiAgICAgICAgICAgIGZvciAoIGxldmVsID0gcmVjdC5taW5MZXZlbDsgbGV2ZWwgPD0gcmVjdC5tYXhMZXZlbDsgbGV2ZWwrKyApIHtcbiAgICAgICAgICAgICAgICBpZiAoICF0aGlzLl9sZXZlbFJlY3RzWyBsZXZlbCBdICkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9sZXZlbFJlY3RzWyBsZXZlbCBdID0gW107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuX2xldmVsUmVjdHNbIGxldmVsIF0ucHVzaCggcmVjdCApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgJC5UaWxlU291cmNlLmFwcGx5KCB0aGlzLCBbIG9wdGlvbnMgXSApO1xuXG59O1xuXG4kLmV4dGVuZCggJC5EemlUaWxlU291cmNlLnByb3RvdHlwZSwgJC5UaWxlU291cmNlLnByb3RvdHlwZSwgLyoqIEBsZW5kcyBPcGVuU2VhZHJhZ29uLkR6aVRpbGVTb3VyY2UucHJvdG90eXBlICove1xuXG5cbiAgICAvKipcbiAgICAgKiBEZXRlcm1pbmUgaWYgdGhlIGRhdGEgYW5kL29yIHVybCBpbXBseSB0aGUgaW1hZ2Ugc2VydmljZSBpcyBzdXBwb3J0ZWQgYnlcbiAgICAgKiB0aGlzIHRpbGUgc291cmNlLlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7T2JqZWN0fEFycmF5fSBkYXRhXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG9wdGlvbmFsIC0gdXJsXG4gICAgICovXG4gICAgc3VwcG9ydHM6IGZ1bmN0aW9uKCBkYXRhLCB1cmwgKXtcbiAgICAgICAgdmFyIG5zO1xuICAgICAgICBpZiAoIGRhdGEuSW1hZ2UgKSB7XG4gICAgICAgICAgICBucyA9IGRhdGEuSW1hZ2UueG1sbnM7XG4gICAgICAgIH0gZWxzZSBpZiAoIGRhdGEuZG9jdW1lbnRFbGVtZW50KSB7XG4gICAgICAgICAgICBpZiAoXCJJbWFnZVwiID09IGRhdGEuZG9jdW1lbnRFbGVtZW50LmxvY2FsTmFtZSB8fCBcIkltYWdlXCIgPT0gZGF0YS5kb2N1bWVudEVsZW1lbnQudGFnTmFtZSkge1xuICAgICAgICAgICAgICAgIG5zID0gZGF0YS5kb2N1bWVudEVsZW1lbnQubmFtZXNwYWNlVVJJO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICggXCJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RlZXB6b29tLzIwMDhcIiA9PSBucyB8fFxuICAgICAgICAgICAgXCJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RlZXB6b29tLzIwMDlcIiA9PSBucyApO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7T2JqZWN0fFhNTERvY3VtZW50fSBkYXRhIC0gdGhlIHJhdyBjb25maWd1cmF0aW9uXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHVybCAtIHRoZSB1cmwgdGhlIGRhdGEgd2FzIHJldHJlaXZlZCBmcm9tIGlmIGFueS5cbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IG9wdGlvbnMgLSBBIGRpY3Rpb25hcnkgb2Yga2V5d29yZCBhcmd1bWVudHMgc3VmZmljaWVudFxuICAgICAqICAgICAgdG8gY29uZmlndXJlIHRoaXMgdGlsZSBzb3VyY2VzIGNvbnN0cnVjdG9yLlxuICAgICAqL1xuICAgIGNvbmZpZ3VyZTogZnVuY3Rpb24oIGRhdGEsIHVybCApe1xuXG4gICAgICAgIHZhciBvcHRpb25zO1xuXG4gICAgICAgIGlmKCAhJC5pc1BsYWluT2JqZWN0KGRhdGEpICl7XG5cbiAgICAgICAgICAgIG9wdGlvbnMgPSBjb25maWd1cmVGcm9tWE1MKCB0aGlzLCBkYXRhICk7XG5cbiAgICAgICAgfWVsc2V7XG5cbiAgICAgICAgICAgIG9wdGlvbnMgPSBjb25maWd1cmVGcm9tT2JqZWN0KCB0aGlzLCBkYXRhICk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodXJsICYmICFvcHRpb25zLnRpbGVzVXJsKSB7XG4gICAgICAgICAgICBvcHRpb25zLnRpbGVzVXJsID0gdXJsLnJlcGxhY2UoXG4gICAgICAgICAgICAgICAgICAgIC8oW15cXC9dKz8pKFxcLihkeml8eG1sfGpzKSk/XFwvPyhcXD8uKik/JC8sICckMV9maWxlcy8nKTtcblxuICAgICAgICAgICAgaWYgKHVybC5zZWFyY2goL1xcLihkeml8eG1sfGpzKVxcPy8pICE9IC0xKSB7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5xdWVyeVBhcmFtcyA9IHVybC5tYXRjaCgvXFw/LiovKTtcbiAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgIG9wdGlvbnMucXVlcnlQYXJhbXMgPSAnJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvcHRpb25zO1xuICAgIH0sXG5cblxuICAgIC8qKlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBsZXZlbFxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSB4XG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHlcbiAgICAgKi9cbiAgICBnZXRUaWxlVXJsOiBmdW5jdGlvbiggbGV2ZWwsIHgsIHkgKSB7XG4gICAgICAgIHJldHVybiBbIHRoaXMudGlsZXNVcmwsIGxldmVsLCAnLycsIHgsICdfJywgeSwgJy4nLCB0aGlzLmZpbGVGb3JtYXQsIHRoaXMucXVlcnlQYXJhbXMgXS5qb2luKCAnJyApO1xuICAgIH0sXG5cblxuICAgIC8qKlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBsZXZlbFxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSB4XG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHlcbiAgICAgKi9cbiAgICB0aWxlRXhpc3RzOiBmdW5jdGlvbiggbGV2ZWwsIHgsIHkgKSB7XG4gICAgICAgIHZhciByZWN0cyA9IHRoaXMuX2xldmVsUmVjdHNbIGxldmVsIF0sXG4gICAgICAgICAgICByZWN0LFxuICAgICAgICAgICAgc2NhbGUsXG4gICAgICAgICAgICB4TWluLFxuICAgICAgICAgICAgeU1pbixcbiAgICAgICAgICAgIHhNYXgsXG4gICAgICAgICAgICB5TWF4LFxuICAgICAgICAgICAgaTtcblxuICAgICAgICBpZiAoICFyZWN0cyB8fCAhcmVjdHMubGVuZ3RoICkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKCBpID0gcmVjdHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0gKSB7XG4gICAgICAgICAgICByZWN0ID0gcmVjdHNbIGkgXTtcblxuICAgICAgICAgICAgaWYgKCBsZXZlbCA8IHJlY3QubWluTGV2ZWwgfHwgbGV2ZWwgPiByZWN0Lm1heExldmVsICkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzY2FsZSA9IHRoaXMuZ2V0TGV2ZWxTY2FsZSggbGV2ZWwgKTtcbiAgICAgICAgICAgIHhNaW4gPSByZWN0LnggKiBzY2FsZTtcbiAgICAgICAgICAgIHlNaW4gPSByZWN0LnkgKiBzY2FsZTtcbiAgICAgICAgICAgIHhNYXggPSB4TWluICsgcmVjdC53aWR0aCAqIHNjYWxlO1xuICAgICAgICAgICAgeU1heCA9IHlNaW4gKyByZWN0LmhlaWdodCAqIHNjYWxlO1xuXG4gICAgICAgICAgICB4TWluID0gTWF0aC5mbG9vciggeE1pbiAvIHRoaXMudGlsZVNpemUgKTtcbiAgICAgICAgICAgIHlNaW4gPSBNYXRoLmZsb29yKCB5TWluIC8gdGhpcy50aWxlU2l6ZSApO1xuICAgICAgICAgICAgeE1heCA9IE1hdGguY2VpbCggeE1heCAvIHRoaXMudGlsZVNpemUgKTtcbiAgICAgICAgICAgIHlNYXggPSBNYXRoLmNlaWwoIHlNYXggLyB0aGlzLnRpbGVTaXplICk7XG5cbiAgICAgICAgICAgIGlmICggeE1pbiA8PSB4ICYmIHggPCB4TWF4ICYmIHlNaW4gPD0geSAmJiB5IDwgeU1heCApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59KTtcblxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAaW5uZXJcbiAqIEBmdW5jdGlvblxuICovXG5mdW5jdGlvbiBjb25maWd1cmVGcm9tWE1MKCB0aWxlU291cmNlLCB4bWxEb2MgKXtcblxuICAgIGlmICggIXhtbERvYyB8fCAheG1sRG9jLmRvY3VtZW50RWxlbWVudCApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCAkLmdldFN0cmluZyggXCJFcnJvcnMuWG1sXCIgKSApO1xuICAgIH1cblxuICAgIHZhciByb290ICAgICAgICAgICA9IHhtbERvYy5kb2N1bWVudEVsZW1lbnQsXG4gICAgICAgIHJvb3ROYW1lICAgICAgID0gcm9vdC5sb2NhbE5hbWUgfHwgcm9vdC50YWdOYW1lLFxuICAgICAgICBucyAgICAgICAgICAgICA9IHhtbERvYy5kb2N1bWVudEVsZW1lbnQubmFtZXNwYWNlVVJJLFxuICAgICAgICBjb25maWd1cmF0aW9uICA9IG51bGwsXG4gICAgICAgIGRpc3BsYXlSZWN0cyAgID0gW10sXG4gICAgICAgIGRpc3BSZWN0Tm9kZXMsXG4gICAgICAgIGRpc3BSZWN0Tm9kZSxcbiAgICAgICAgcmVjdE5vZGUsXG4gICAgICAgIHNpemVOb2RlLFxuICAgICAgICBpO1xuXG4gICAgaWYgKCByb290TmFtZSA9PSBcIkltYWdlXCIgKSB7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHNpemVOb2RlID0gcm9vdC5nZXRFbGVtZW50c0J5VGFnTmFtZShcIlNpemVcIiApWyAwIF07XG4gICAgICAgICAgICBpZiAoc2l6ZU5vZGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHNpemVOb2RlID0gcm9vdC5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKG5zLCBcIlNpemVcIiApWyAwIF07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gPSB7XG4gICAgICAgICAgICAgICAgSW1hZ2U6IHtcbiAgICAgICAgICAgICAgICAgICAgeG1sbnM6ICAgICAgIFwiaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZWVwem9vbS8yMDA4XCIsXG4gICAgICAgICAgICAgICAgICAgIFVybDogICAgICAgICByb290LmdldEF0dHJpYnV0ZSggXCJVcmxcIiApLFxuICAgICAgICAgICAgICAgICAgICBGb3JtYXQ6ICAgICAgcm9vdC5nZXRBdHRyaWJ1dGUoIFwiRm9ybWF0XCIgKSxcbiAgICAgICAgICAgICAgICAgICAgRGlzcGxheVJlY3Q6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIE92ZXJsYXA6ICAgICBwYXJzZUludCggcm9vdC5nZXRBdHRyaWJ1dGUoIFwiT3ZlcmxhcFwiICksIDEwICksXG4gICAgICAgICAgICAgICAgICAgIFRpbGVTaXplOiAgICBwYXJzZUludCggcm9vdC5nZXRBdHRyaWJ1dGUoIFwiVGlsZVNpemVcIiApLCAxMCApLFxuICAgICAgICAgICAgICAgICAgICBTaXplOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBIZWlnaHQ6IHBhcnNlSW50KCBzaXplTm9kZS5nZXRBdHRyaWJ1dGUoIFwiSGVpZ2h0XCIgKSwgMTAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFdpZHRoOiAgcGFyc2VJbnQoIHNpemVOb2RlLmdldEF0dHJpYnV0ZSggXCJXaWR0aFwiICksIDEwIClcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGlmICggISQuaW1hZ2VGb3JtYXRTdXBwb3J0ZWQoIGNvbmZpZ3VyYXRpb24uSW1hZ2UuRm9ybWF0ICkgKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICAgICAkLmdldFN0cmluZyggXCJFcnJvcnMuSW1hZ2VGb3JtYXRcIiwgY29uZmlndXJhdGlvbi5JbWFnZS5Gb3JtYXQudG9VcHBlckNhc2UoKSApXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZGlzcFJlY3ROb2RlcyA9IHJvb3QuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJEaXNwbGF5UmVjdFwiICk7XG4gICAgICAgICAgICBpZiAoZGlzcFJlY3ROb2RlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgZGlzcFJlY3ROb2RlcyA9IHJvb3QuZ2V0RWxlbWVudHNCeVRhZ05hbWVOUyhucywgXCJEaXNwbGF5UmVjdFwiIClbIDAgXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yICggaSA9IDA7IGkgPCBkaXNwUmVjdE5vZGVzLmxlbmd0aDsgaSsrICkge1xuICAgICAgICAgICAgICAgIGRpc3BSZWN0Tm9kZSA9IGRpc3BSZWN0Tm9kZXNbIGkgXTtcbiAgICAgICAgICAgICAgICByZWN0Tm9kZSAgICAgPSBkaXNwUmVjdE5vZGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJSZWN0XCIgKVsgMCBdO1xuICAgICAgICAgICAgICAgIGlmIChyZWN0Tm9kZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlY3ROb2RlID0gZGlzcFJlY3ROb2RlLmdldEVsZW1lbnRzQnlUYWdOYW1lTlMobnMsIFwiUmVjdFwiIClbIDAgXTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBkaXNwbGF5UmVjdHMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIFJlY3Q6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFg6IHBhcnNlSW50KCByZWN0Tm9kZS5nZXRBdHRyaWJ1dGUoIFwiWFwiICksIDEwICksXG4gICAgICAgICAgICAgICAgICAgICAgICBZOiBwYXJzZUludCggcmVjdE5vZGUuZ2V0QXR0cmlidXRlKCBcIllcIiApLCAxMCApLFxuICAgICAgICAgICAgICAgICAgICAgICAgV2lkdGg6IHBhcnNlSW50KCByZWN0Tm9kZS5nZXRBdHRyaWJ1dGUoIFwiV2lkdGhcIiApLCAxMCApLFxuICAgICAgICAgICAgICAgICAgICAgICAgSGVpZ2h0OiBwYXJzZUludCggcmVjdE5vZGUuZ2V0QXR0cmlidXRlKCBcIkhlaWdodFwiICksIDEwICksXG4gICAgICAgICAgICAgICAgICAgICAgICBNaW5MZXZlbDogcGFyc2VJbnQoIGRpc3BSZWN0Tm9kZS5nZXRBdHRyaWJ1dGUoIFwiTWluTGV2ZWxcIiApLCAxMCApLFxuICAgICAgICAgICAgICAgICAgICAgICAgTWF4TGV2ZWw6IHBhcnNlSW50KCBkaXNwUmVjdE5vZGUuZ2V0QXR0cmlidXRlKCBcIk1heExldmVsXCIgKSwgMTAgKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmKCBkaXNwbGF5UmVjdHMubGVuZ3RoICl7XG4gICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbi5JbWFnZS5EaXNwbGF5UmVjdCA9IGRpc3BsYXlSZWN0cztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGNvbmZpZ3VyZUZyb21PYmplY3QoIHRpbGVTb3VyY2UsIGNvbmZpZ3VyYXRpb24gKTtcblxuICAgICAgICB9IGNhdGNoICggZSApIHtcbiAgICAgICAgICAgIHRocm93IChlIGluc3RhbmNlb2YgRXJyb3IpID9cbiAgICAgICAgICAgICAgICBlIDpcbiAgICAgICAgICAgICAgICBuZXcgRXJyb3IoICQuZ2V0U3RyaW5nKFwiRXJyb3JzLkR6aVwiKSApO1xuICAgICAgICB9XG4gICAgfSBlbHNlIGlmICggcm9vdE5hbWUgPT0gXCJDb2xsZWN0aW9uXCIgKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvciggJC5nZXRTdHJpbmcoIFwiRXJyb3JzLkR6Y1wiICkgKTtcbiAgICB9IGVsc2UgaWYgKCByb290TmFtZSA9PSBcIkVycm9yXCIgKSB7XG4gICAgICAgIHZhciBtZXNzYWdlTm9kZSA9IHJvb3QuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJNZXNzYWdlXCIpWzBdO1xuICAgICAgICB2YXIgbWVzc2FnZSA9IG1lc3NhZ2VOb2RlLmZpcnN0Q2hpbGQubm9kZVZhbHVlO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKCAkLmdldFN0cmluZyggXCJFcnJvcnMuRHppXCIgKSApO1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAaW5uZXJcbiAqIEBmdW5jdGlvblxuICovXG5mdW5jdGlvbiBjb25maWd1cmVGcm9tT2JqZWN0KCB0aWxlU291cmNlLCBjb25maWd1cmF0aW9uICl7XG4gICAgdmFyIGltYWdlRGF0YSAgICAgPSBjb25maWd1cmF0aW9uLkltYWdlLFxuICAgICAgICB0aWxlc1VybCAgICAgID0gaW1hZ2VEYXRhLlVybCxcbiAgICAgICAgZmlsZUZvcm1hdCAgICA9IGltYWdlRGF0YS5Gb3JtYXQsXG4gICAgICAgIHNpemVEYXRhICAgICAgPSBpbWFnZURhdGEuU2l6ZSxcbiAgICAgICAgZGlzcFJlY3REYXRhICA9IGltYWdlRGF0YS5EaXNwbGF5UmVjdCB8fCBbXSxcbiAgICAgICAgd2lkdGggICAgICAgICA9IHBhcnNlSW50KCBzaXplRGF0YS5XaWR0aCwgMTAgKSxcbiAgICAgICAgaGVpZ2h0ICAgICAgICA9IHBhcnNlSW50KCBzaXplRGF0YS5IZWlnaHQsIDEwICksXG4gICAgICAgIHRpbGVTaXplICAgICAgPSBwYXJzZUludCggaW1hZ2VEYXRhLlRpbGVTaXplLCAxMCApLFxuICAgICAgICB0aWxlT3ZlcmxhcCAgID0gcGFyc2VJbnQoIGltYWdlRGF0YS5PdmVybGFwLCAxMCApLFxuICAgICAgICBkaXNwbGF5UmVjdHMgID0gW10sXG4gICAgICAgIHJlY3REYXRhLFxuICAgICAgICBpO1xuXG4gICAgLy9UT0RPOiBuZWVkIHRvIGZpZ3VyZSBvdXQgb3V0IHRvIGJldHRlciBoYW5kbGUgaW1hZ2UgZm9ybWF0IGNvbXBhdGliaWxpdHlcbiAgICAvLyAgICAgIHdoaWNoIGFjdHVhbGx5IGluY2x1ZGVzIGFkZGl0aW9uYWwgZmlsZSBmb3JtYXRzIGxpa2UgeG1sIGFuZCBwZGZcbiAgICAvLyAgICAgIGFuZCBwbGFpbiB0ZXh0IGZvciB2YXJpb3VzIHRpbGVzb3VyY2UgaW1wbGVtZW50YXRpb25zIHRvIGF2b2lkIGxvd1xuICAgIC8vICAgICAgbGV2ZWwgZXJyb3JzLlxuICAgIC8vXG4gICAgLy8gICAgICBGb3Igbm93LCBqdXN0IGRvbid0IHBlcmZvcm0gdGhlIGNoZWNrLlxuICAgIC8vXG4gICAgLyppZiAoICFpbWFnZUZvcm1hdFN1cHBvcnRlZCggZmlsZUZvcm1hdCApICkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAkLmdldFN0cmluZyggXCJFcnJvcnMuSW1hZ2VGb3JtYXRcIiwgZmlsZUZvcm1hdC50b1VwcGVyQ2FzZSgpIClcbiAgICAgICAgKTtcbiAgICB9Ki9cblxuICAgIGZvciAoIGkgPSAwOyBpIDwgZGlzcFJlY3REYXRhLmxlbmd0aDsgaSsrICkge1xuICAgICAgICByZWN0RGF0YSA9IGRpc3BSZWN0RGF0YVsgaSBdLlJlY3Q7XG5cbiAgICAgICAgZGlzcGxheVJlY3RzLnB1c2goIG5ldyAkLkRpc3BsYXlSZWN0KFxuICAgICAgICAgICAgcGFyc2VJbnQoIHJlY3REYXRhLlgsIDEwICksXG4gICAgICAgICAgICBwYXJzZUludCggcmVjdERhdGEuWSwgMTAgKSxcbiAgICAgICAgICAgIHBhcnNlSW50KCByZWN0RGF0YS5XaWR0aCwgMTAgKSxcbiAgICAgICAgICAgIHBhcnNlSW50KCByZWN0RGF0YS5IZWlnaHQsIDEwICksXG4gICAgICAgICAgICBwYXJzZUludCggcmVjdERhdGEuTWluTGV2ZWwsIDEwICksXG4gICAgICAgICAgICBwYXJzZUludCggcmVjdERhdGEuTWF4TGV2ZWwsIDEwIClcbiAgICAgICAgKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuICQuZXh0ZW5kKHRydWUsIHtcbiAgICAgICAgd2lkdGg6IHdpZHRoLCAvKiB3aWR0aCAqcmVxdWlyZWQgKi9cbiAgICAgICAgaGVpZ2h0OiBoZWlnaHQsIC8qIGhlaWdodCAqcmVxdWlyZWQgKi9cbiAgICAgICAgdGlsZVNpemU6IHRpbGVTaXplLCAvKiB0aWxlU2l6ZSAqcmVxdWlyZWQgKi9cbiAgICAgICAgdGlsZU92ZXJsYXA6IHRpbGVPdmVybGFwLCAvKiB0aWxlT3ZlcmxhcCAqcmVxdWlyZWQgKi9cbiAgICAgICAgbWluTGV2ZWw6IG51bGwsIC8qIG1pbkxldmVsICovXG4gICAgICAgIG1heExldmVsOiBudWxsLCAvKiBtYXhMZXZlbCAqL1xuICAgICAgICB0aWxlc1VybDogdGlsZXNVcmwsIC8qIHRpbGVzVXJsICovXG4gICAgICAgIGZpbGVGb3JtYXQ6IGZpbGVGb3JtYXQsIC8qIGZpbGVGb3JtYXQgKi9cbiAgICAgICAgZGlzcGxheVJlY3RzOiBkaXNwbGF5UmVjdHMgLyogZGlzcGxheVJlY3RzICovXG4gICAgfSwgY29uZmlndXJhdGlvbiApO1xuXG59XG5cbn0oIE9wZW5TZWFkcmFnb24gKSk7XG5cbi8qXG4gKiBPcGVuU2VhZHJhZ29uIC0gSUlJRlRpbGVTb3VyY2VcbiAqXG4gKiBDb3B5cmlnaHQgKEMpIDIwMDkgQ29kZVBsZXggRm91bmRhdGlvblxuICogQ29weXJpZ2h0IChDKSAyMDEwLTIwMTMgT3BlblNlYWRyYWdvbiBjb250cmlidXRvcnNcbiAqXG4gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmVcbiAqIG1ldDpcbiAqXG4gKiAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiAqICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAqXG4gKiAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0XG4gKiAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGVcbiAqICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cbiAqXG4gKiAtIE5laXRoZXIgdGhlIG5hbWUgb2YgQ29kZVBsZXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0c1xuICogICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbVxuICogICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuICpcbiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlNcbiAqIFwiQVMgSVNcIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1RcbiAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUlxuICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUXG4gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCxcbiAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRFxuICogVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUlxuICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkdcbiAqIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJU1xuICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4gKi9cblxuKGZ1bmN0aW9uKCAkICl7XG5cbi8qKlxuICogQGNsYXNzIElJSUZUaWxlU291cmNlXG4gKiBAY2xhc3NkZXNjIEEgY2xpZW50IGltcGxlbWVudGF0aW9uIG9mIHRoZSBJbnRlcm5hdGlvbmFsIEltYWdlIEludGVyb3BlcmFiaWxpdHkgRnJhbWV3b3JrXG4gKiBGb3JtYXQ6IEltYWdlIEFQSSAxLjAgLSAyLjFcbiAqXG4gKiBAbWVtYmVyb2YgT3BlblNlYWRyYWdvblxuICogQGV4dGVuZHMgT3BlblNlYWRyYWdvbi5UaWxlU291cmNlXG4gKiBAc2VlIGh0dHA6Ly9paWlmLmlvL2FwaS9pbWFnZS9cbiAqL1xuJC5JSUlGVGlsZVNvdXJjZSA9IGZ1bmN0aW9uKCBvcHRpb25zICl7XG5cblxuICAgICQuZXh0ZW5kKCB0cnVlLCB0aGlzLCBvcHRpb25zICk7XG5cbiAgICBpZiAoICEoIHRoaXMuaGVpZ2h0ICYmIHRoaXMud2lkdGggJiYgdGhpc1snQGlkJ10gKSApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCAnSUlJRiByZXF1aXJlZCBwYXJhbWV0ZXJzIG5vdCBwcm92aWRlZC4nICk7XG4gICAgfVxuXG4gICAgb3B0aW9ucy50aWxlU2l6ZVBlclNjYWxlRmFjdG9yID0ge307XG5cbiAgICAvLyBOLkIuIDIuMCByZW5hbWVkIHNjYWxlX2ZhY3RvcnMgdG8gc2NhbGVGYWN0b3JzXG4gICAgaWYgKCB0aGlzLnRpbGVfd2lkdGggJiYgdGhpcy50aWxlX2hlaWdodCApIHtcbiAgICAgICAgb3B0aW9ucy50aWxlV2lkdGggPSB0aGlzLnRpbGVfd2lkdGg7XG4gICAgICAgIG9wdGlvbnMudGlsZUhlaWdodCA9IHRoaXMudGlsZV9oZWlnaHQ7XG4gICAgfSBlbHNlIGlmICggdGhpcy50aWxlX3dpZHRoICkge1xuICAgICAgICBvcHRpb25zLnRpbGVTaXplID0gdGhpcy50aWxlX3dpZHRoO1xuICAgIH0gZWxzZSBpZiAoIHRoaXMudGlsZV9oZWlnaHQgKSB7XG4gICAgICAgIG9wdGlvbnMudGlsZVNpemUgPSB0aGlzLnRpbGVfaGVpZ2h0O1xuICAgIH0gZWxzZSBpZiAoIHRoaXMudGlsZXMgKSB7XG4gICAgICAgIC8vIFZlcnNpb24gMi4wIGZvcndhcmRzXG4gICAgICAgIGlmICggdGhpcy50aWxlcy5sZW5ndGggPT0gMSApIHtcbiAgICAgICAgICAgIG9wdGlvbnMudGlsZVdpZHRoICA9IHRoaXMudGlsZXNbMF0ud2lkdGg7XG4gICAgICAgICAgICAvLyBVc2UgaGVpZ2h0IGlmIHByb3ZpZGVkLCBvdGhlcndpc2UgYXNzdW1lIHNxdWFyZSB0aWxlcyBhbmQgdXNlIHdpZHRoLlxuICAgICAgICAgICAgb3B0aW9ucy50aWxlSGVpZ2h0ID0gdGhpcy50aWxlc1swXS5oZWlnaHQgfHwgdGhpcy50aWxlc1swXS53aWR0aDtcbiAgICAgICAgICAgIHRoaXMuc2NhbGVfZmFjdG9ycyA9IHRoaXMudGlsZXNbMF0uc2NhbGVGYWN0b3JzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gTXVsdGlwbGUgdGlsZSBzaXplcyBhdCBkaWZmZXJlbnQgbGV2ZWxzXG4gICAgICAgICAgICB0aGlzLnNjYWxlX2ZhY3RvcnMgPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIHQgPSAwOyB0IDwgdGhpcy50aWxlcy5sZW5ndGg7IHQrKyApIHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBzZiA9IDA7IHNmIDwgdGhpcy50aWxlc1t0XS5zY2FsZUZhY3RvcnMubGVuZ3RoOyBzZisrKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzY2FsZUZhY3RvciA9IHRoaXMudGlsZXNbdF0uc2NhbGVGYWN0b3JzW3NmXTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY2FsZV9mYWN0b3JzLnB1c2goc2NhbGVGYWN0b3IpO1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnRpbGVTaXplUGVyU2NhbGVGYWN0b3Jbc2NhbGVGYWN0b3JdID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHRoaXMudGlsZXNbdF0ud2lkdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IHRoaXMudGlsZXNbdF0uaGVpZ2h0IHx8IHRoaXMudGlsZXNbdF0ud2lkdGhcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCBjYW5CZVRpbGVkKG9wdGlvbnMucHJvZmlsZSkgKSB7XG4gICAgICAgIC8vIHVzZSB0aGUgbGFyZ2VzdCBvZiB0aWxlT3B0aW9ucyB0aGF0IGlzIHNtYWxsZXIgdGhhbiB0aGUgc2hvcnQgZGltZW5zaW9uXG4gICAgICAgIHZhciBzaG9ydERpbSA9IE1hdGgubWluKCB0aGlzLmhlaWdodCwgdGhpcy53aWR0aCApLFxuICAgICAgICAgICAgdGlsZU9wdGlvbnMgPSBbMjU2LDUxMiwxMDI0XSxcbiAgICAgICAgICAgIHNtYWxsZXJUaWxlcyA9IFtdO1xuXG4gICAgICAgIGZvciAoIHZhciBjID0gMDsgYyA8IHRpbGVPcHRpb25zLmxlbmd0aDsgYysrICkge1xuICAgICAgICAgICAgaWYgKCB0aWxlT3B0aW9uc1tjXSA8PSBzaG9ydERpbSApIHtcbiAgICAgICAgICAgICAgICBzbWFsbGVyVGlsZXMucHVzaCggdGlsZU9wdGlvbnNbY10gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICggc21hbGxlclRpbGVzLmxlbmd0aCA+IDAgKSB7XG4gICAgICAgICAgICBvcHRpb25zLnRpbGVTaXplID0gTWF0aC5tYXguYXBwbHkoIG51bGwsIHNtYWxsZXJUaWxlcyApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gSWYgd2UncmUgc21hbGxlciB0aGFuIDI1NiwganVzdCB1c2UgdGhlIHNob3J0IHNpZGUuXG4gICAgICAgICAgICBvcHRpb25zLnRpbGVTaXplID0gc2hvcnREaW07XG4gICAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMuc2l6ZXMgJiYgdGhpcy5zaXplcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIC8vIFRoaXMgaW5mby5qc29uIGNhbid0IGJlIHRpbGVkLCBidXQgd2UgY2FuIHN0aWxsIGNvbnN0cnVjdCBhIGxlZ2FjeSBweXJhbWlkIGZyb20gdGhlIHNpemVzIGFycmF5LiBcbiAgICAgICAgLy8gSW4gdGhpcyBtb2RlLCBJSUlGVGlsZVNvdXJjZSB3aWxsIGNhbGwgZnVuY3Rpb25zIGZyb20gdGhlIGFic3RyYWN0IGJhc2VUaWxlU291cmNlIG9yIHRoZSBcbiAgICAgICAgLy8gTGVnYWN5VGlsZVNvdXJjZSBpbnN0ZWFkIG9mIHBlcmZvcm1pbmcgSUlJRiB0aWxpbmcuICAgICAgXG4gICAgICAgIHRoaXMuZW11bGF0ZUxlZ2FjeUltYWdlUHlyYW1pZCA9IHRydWU7XG4gICAgICAgIFxuICAgICAgICBvcHRpb25zLmxldmVscyA9IGNvbnN0cnVjdExldmVscyggdGhpcyApO1xuICAgICAgICAvLyB1c2UgdGhlIGxhcmdlc3QgYXZhaWxhYmxlIHNpemUgdG8gZGVmaW5lIHRpbGVzXG4gICAgICAgICQuZXh0ZW5kKCB0cnVlLCBvcHRpb25zLCB7XG4gICAgICAgICAgICB3aWR0aDogb3B0aW9ucy5sZXZlbHNbIG9wdGlvbnMubGV2ZWxzLmxlbmd0aCAtIDEgXS53aWR0aCxcbiAgICAgICAgICAgIGhlaWdodDogb3B0aW9ucy5sZXZlbHNbIG9wdGlvbnMubGV2ZWxzLmxlbmd0aCAtIDEgXS5oZWlnaHQsXG4gICAgICAgICAgICB0aWxlU2l6ZTogTWF0aC5tYXgoIG9wdGlvbnMuaGVpZ2h0LCBvcHRpb25zLndpZHRoICksXG4gICAgICAgICAgICB0aWxlT3ZlcmxhcDogMCxcbiAgICAgICAgICAgIG1pbkxldmVsOiAwLFxuICAgICAgICAgICAgbWF4TGV2ZWw6IG9wdGlvbnMubGV2ZWxzLmxlbmd0aCAtIDFcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMubGV2ZWxzID0gb3B0aW9ucy5sZXZlbHM7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgJC5jb25zb2xlLmVycm9yKFwiTm90aGluZyBpbiB0aGUgaW5mby5qc29uIHRvIGNvbnN0cnVjdCBpbWFnZSBweXJhbWlkcyBmcm9tXCIpO1xuICAgIH1cblxuICAgIGlmICghb3B0aW9ucy5tYXhMZXZlbCAmJiAhdGhpcy5lbXVsYXRlTGVnYWN5SW1hZ2VQeXJhbWlkKSB7XG4gICAgICAgIGlmICghdGhpcy5zY2FsZV9mYWN0b3JzKSB7XG4gICAgICAgICAgICBvcHRpb25zLm1heExldmVsID0gTnVtYmVyKE1hdGguY2VpbChNYXRoLmxvZyhNYXRoLm1heCh0aGlzLndpZHRoLCB0aGlzLmhlaWdodCksIDIpKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBvcHRpb25zLm1heExldmVsID0gTWF0aC5mbG9vcihNYXRoLnBvdyhNYXRoLm1heC5hcHBseShudWxsLCB0aGlzLnNjYWxlX2ZhY3RvcnMpLCAwLjUpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgICQuVGlsZVNvdXJjZS5hcHBseSggdGhpcywgWyBvcHRpb25zIF0gKTtcbn07XG5cbiQuZXh0ZW5kKCAkLklJSUZUaWxlU291cmNlLnByb3RvdHlwZSwgJC5UaWxlU291cmNlLnByb3RvdHlwZSwgLyoqIEBsZW5kcyBPcGVuU2VhZHJhZ29uLklJSUZUaWxlU291cmNlLnByb3RvdHlwZSAqL3tcbiAgICAvKipcbiAgICAgKiBEZXRlcm1pbmUgaWYgdGhlIGRhdGEgYW5kL29yIHVybCBpbXBseSB0aGUgaW1hZ2Ugc2VydmljZSBpcyBzdXBwb3J0ZWQgYnlcbiAgICAgKiB0aGlzIHRpbGUgc291cmNlLlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7T2JqZWN0fEFycmF5fSBkYXRhXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG9wdGlvbmFsIC0gdXJsXG4gICAgICovXG4gICAgIFxuICAgIHN1cHBvcnRzOiBmdW5jdGlvbiggZGF0YSwgdXJsICkge1xuICAgICAgICAvLyBWZXJzaW9uIDIuMCBhbmQgZm9yd2FyZHNcbiAgICAgICAgaWYgKGRhdGEucHJvdG9jb2wgJiYgZGF0YS5wcm90b2NvbCA9PSAnaHR0cDovL2lpaWYuaW8vYXBpL2ltYWdlJykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIC8vIFZlcnNpb24gMS4xXG4gICAgICAgIH0gZWxzZSBpZiAoIGRhdGFbJ0Bjb250ZXh0J10gJiYgKFxuICAgICAgICAgICAgZGF0YVsnQGNvbnRleHQnXSA9PSBcImh0dHA6Ly9saWJyYXJ5LnN0YW5mb3JkLmVkdS9paWlmL2ltYWdlLWFwaS8xLjEvY29udGV4dC5qc29uXCIgfHxcbiAgICAgICAgICAgIGRhdGFbJ0Bjb250ZXh0J10gPT0gXCJodHRwOi8vaWlpZi5pby9hcGkvaW1hZ2UvMS9jb250ZXh0Lmpzb25cIikgKSB7XG4gICAgICAgICAgICAvLyBOLkIuIHRoZSBpaWlmLmlvIGNvbnRleHQgaXMgd3JvbmcsIGJ1dCB3aGVyZSB0aGUgcmVwcmVzZW50YXRpb24gbGl2ZXMgc28gbGlrZWx5IHRvIGJlIHVzZWRcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgICAgIC8vIFZlcnNpb24gMS4wXG4gICAgICAgIH0gZWxzZSBpZiAoIGRhdGEucHJvZmlsZSAmJlxuICAgICAgICAgICAgZGF0YS5wcm9maWxlLmluZGV4T2YoXCJodHRwOi8vbGlicmFyeS5zdGFuZm9yZC5lZHUvaWlpZi9pbWFnZS1hcGkvY29tcGxpYW5jZS5odG1sXCIpID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmICggZGF0YS5pZGVudGlmaWVyICYmIGRhdGEud2lkdGggJiYgZGF0YS5oZWlnaHQgKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmICggZGF0YS5kb2N1bWVudEVsZW1lbnQgJiZcbiAgICAgICAgICAgIFwiaW5mb1wiID09IGRhdGEuZG9jdW1lbnRFbGVtZW50LnRhZ05hbWUgJiZcbiAgICAgICAgICAgIFwiaHR0cDovL2xpYnJhcnkuc3RhbmZvcmQuZWR1L2lpaWYvaW1hZ2UtYXBpL25zL1wiID09XG4gICAgICAgICAgICAgICAgZGF0YS5kb2N1bWVudEVsZW1lbnQubmFtZXNwYWNlVVJJKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcblxuICAgICAgICAvLyBOb3QgSUlJRlxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGRhdGEgLSB0aGUgcmF3IGNvbmZpZ3VyYXRpb25cbiAgICAgKiBAZXhhbXBsZSA8Y2FwdGlvbj5JSUlGIDEuMSBJbmZvIExvb2tzIGxpa2UgdGhpczwvY2FwdGlvbj5cbiAgICAgKiB7XG4gICAgICogICBcIkBjb250ZXh0XCIgOiBcImh0dHA6Ly9saWJyYXJ5LnN0YW5mb3JkLmVkdS9paWlmL2ltYWdlLWFwaS8xLjEvY29udGV4dC5qc29uXCIsXG4gICAgICogICBcIkBpZFwiIDogXCJodHRwOi8vaWlpZi5leGFtcGxlLmNvbS9wcmVmaXgvMUUzNDc1MEQtMzhEQi00ODI1LUEzOEEtQjYwQTM0NUU1OTFDXCIsXG4gICAgICogICBcIndpZHRoXCIgOiA2MDAwLFxuICAgICAqICAgXCJoZWlnaHRcIiA6IDQwMDAsXG4gICAgICogICBcInNjYWxlX2ZhY3RvcnNcIiA6IFsgMSwgMiwgNCBdLFxuICAgICAqICAgXCJ0aWxlX3dpZHRoXCIgOiAxMDI0LFxuICAgICAqICAgXCJ0aWxlX2hlaWdodFwiIDogMTAyNCxcbiAgICAgKiAgIFwiZm9ybWF0c1wiIDogWyBcImpwZ1wiLCBcInBuZ1wiIF0sXG4gICAgICogICBcInF1YWxpdGllc1wiIDogWyBcIm5hdGl2ZVwiLCBcImdyZXlcIiBdLFxuICAgICAqICAgXCJwcm9maWxlXCIgOiBcImh0dHA6Ly9saWJyYXJ5LnN0YW5mb3JkLmVkdS9paWlmL2ltYWdlLWFwaS8xLjEvY29tcGxpYW5jZS5odG1sI2xldmVsMFwiXG4gICAgICogfVxuICAgICAqL1xuICAgIGNvbmZpZ3VyZTogZnVuY3Rpb24oIGRhdGEsIHVybCApe1xuICAgICAgICAvLyBUcnkgdG8gZGVkdWNlIG91ciB2ZXJzaW9uIGFuZCBmYWtlIGl0IHVwd2FyZHMgaWYgbmVlZGVkXG4gICAgICAgIGlmICggISQuaXNQbGFpbk9iamVjdChkYXRhKSApIHtcbiAgICAgICAgICAgIHZhciBvcHRpb25zID0gY29uZmlndXJlRnJvbVhtbDEwKCBkYXRhICk7XG4gICAgICAgICAgICBvcHRpb25zWydAY29udGV4dCddID0gXCJodHRwOi8vaWlpZi5pby9hcGkvaW1hZ2UvMS4wL2NvbnRleHQuanNvblwiO1xuICAgICAgICAgICAgb3B0aW9uc1snQGlkJ10gPSB1cmwucmVwbGFjZSgnL2luZm8ueG1sJywgJycpO1xuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnM7XG4gICAgICAgIH0gZWxzZSBpZiAoICFkYXRhWydAY29udGV4dCddICkge1xuICAgICAgICAgICAgZGF0YVsnQGNvbnRleHQnXSA9ICdodHRwOi8vaWlpZi5pby9hcGkvaW1hZ2UvMS4wL2NvbnRleHQuanNvbic7XG4gICAgICAgICAgICBkYXRhWydAaWQnXSA9IHVybC5yZXBsYWNlKCcvaW5mby5qc29uJywgJycpO1xuICAgICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdGhlIHRpbGVXaWR0aCBmb3IgdGhlIGdpdmVuIGxldmVsLlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBsZXZlbFxuICAgICAqL1xuICAgIGdldFRpbGVXaWR0aDogZnVuY3Rpb24oIGxldmVsICkge1xuXG4gICAgICAgIGlmKHRoaXMuZW11bGF0ZUxlZ2FjeUltYWdlUHlyYW1pZCkge1xuICAgICAgICAgICAgcmV0dXJuICQuVGlsZVNvdXJjZS5wcm90b3R5cGUuZ2V0VGlsZVdpZHRoLmNhbGwodGhpcywgbGV2ZWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHNjYWxlRmFjdG9yID0gTWF0aC5wb3coMiwgdGhpcy5tYXhMZXZlbCAtIGxldmVsKTtcblxuICAgICAgICBpZiAodGhpcy50aWxlU2l6ZVBlclNjYWxlRmFjdG9yICYmIHRoaXMudGlsZVNpemVQZXJTY2FsZUZhY3RvcltzY2FsZUZhY3Rvcl0pIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRpbGVTaXplUGVyU2NhbGVGYWN0b3Jbc2NhbGVGYWN0b3JdLndpZHRoO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl90aWxlV2lkdGg7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgdGlsZUhlaWdodCBmb3IgdGhlIGdpdmVuIGxldmVsLlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBsZXZlbFxuICAgICAqL1xuICAgIGdldFRpbGVIZWlnaHQ6IGZ1bmN0aW9uKCBsZXZlbCApIHtcblxuICAgICAgICBpZih0aGlzLmVtdWxhdGVMZWdhY3lJbWFnZVB5cmFtaWQpIHtcbiAgICAgICAgICAgIHJldHVybiAkLlRpbGVTb3VyY2UucHJvdG90eXBlLmdldFRpbGVIZWlnaHQuY2FsbCh0aGlzLCBsZXZlbCk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgc2NhbGVGYWN0b3IgPSBNYXRoLnBvdygyLCB0aGlzLm1heExldmVsIC0gbGV2ZWwpO1xuXG4gICAgICAgIGlmICh0aGlzLnRpbGVTaXplUGVyU2NhbGVGYWN0b3IgJiYgdGhpcy50aWxlU2l6ZVBlclNjYWxlRmFjdG9yW3NjYWxlRmFjdG9yXSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudGlsZVNpemVQZXJTY2FsZUZhY3RvcltzY2FsZUZhY3Rvcl0uaGVpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl90aWxlSGVpZ2h0O1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gbGV2ZWxcbiAgICAgKi9cbiAgICBnZXRMZXZlbFNjYWxlOiBmdW5jdGlvbiAoIGxldmVsICkge1xuXG4gICAgICAgIGlmKHRoaXMuZW11bGF0ZUxlZ2FjeUltYWdlUHlyYW1pZCkge1xuICAgICAgICAgICAgdmFyIGxldmVsU2NhbGUgPSBOYU47XG4gICAgICAgICAgICBpZiAodGhpcy5sZXZlbHMubGVuZ3RoID4gMCAmJiBsZXZlbCA+PSB0aGlzLm1pbkxldmVsICYmIGxldmVsIDw9IHRoaXMubWF4TGV2ZWwpIHtcbiAgICAgICAgICAgICAgICBsZXZlbFNjYWxlID1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sZXZlbHNbbGV2ZWxdLndpZHRoIC9cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sZXZlbHNbdGhpcy5tYXhMZXZlbF0ud2lkdGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbGV2ZWxTY2FsZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAkLlRpbGVTb3VyY2UucHJvdG90eXBlLmdldExldmVsU2NhbGUuY2FsbCh0aGlzLCBsZXZlbCk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBsZXZlbFxuICAgICAqL1xuICAgIGdldE51bVRpbGVzOiBmdW5jdGlvbiggbGV2ZWwgKSB7XG5cbiAgICAgICAgaWYodGhpcy5lbXVsYXRlTGVnYWN5SW1hZ2VQeXJhbWlkKSB7XG4gICAgICAgICAgICB2YXIgc2NhbGUgPSB0aGlzLmdldExldmVsU2NhbGUobGV2ZWwpO1xuICAgICAgICAgICAgaWYgKHNjYWxlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyAkLlBvaW50KDEsIDEpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3ICQuUG9pbnQoMCwgMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gJC5UaWxlU291cmNlLnByb3RvdHlwZS5nZXROdW1UaWxlcy5jYWxsKHRoaXMsIGxldmVsKTtcbiAgICB9LFxuXG5cbiAgICAvKipcbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gbGV2ZWxcbiAgICAgKiBAcGFyYW0ge09wZW5TZWFkcmFnb24uUG9pbnR9IHBvaW50XG4gICAgICovXG4gICAgZ2V0VGlsZUF0UG9pbnQ6IGZ1bmN0aW9uKCBsZXZlbCwgcG9pbnQgKSB7XG5cbiAgICAgICAgaWYodGhpcy5lbXVsYXRlTGVnYWN5SW1hZ2VQeXJhbWlkKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3ICQuUG9pbnQoMCwgMCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gJC5UaWxlU291cmNlLnByb3RvdHlwZS5nZXRUaWxlQXRQb2ludC5jYWxsKHRoaXMsIGxldmVsLCBwb2ludCk7XG4gICAgfSxcblxuXG4gICAgLyoqXG4gICAgICogUmVzcG9uc2libGUgZm9yIHJldHJpZXZpbmcgdGhlIHVybCB3aGljaCB3aWxsIHJldHVybiBhbiBpbWFnZSBmb3IgdGhlXG4gICAgICogcmVnaW9uIHNwZWNpZmllZCBieSB0aGUgZ2l2ZW4geCwgeSwgYW5kIGxldmVsIGNvbXBvbmVudHMuXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGxldmVsIC0geiBpbmRleFxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSB4XG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHlcbiAgICAgKiBAdGhyb3dzIHtFcnJvcn1cbiAgICAgKi9cbiAgICBnZXRUaWxlVXJsOiBmdW5jdGlvbiggbGV2ZWwsIHgsIHkgKXtcblxuICAgICAgICBpZih0aGlzLmVtdWxhdGVMZWdhY3lJbWFnZVB5cmFtaWQpIHtcbiAgICAgICAgICAgIHZhciB1cmwgPSBudWxsO1xuICAgICAgICAgICAgaWYgKCB0aGlzLmxldmVscy5sZW5ndGggPiAwICYmIGxldmVsID49IHRoaXMubWluTGV2ZWwgJiYgbGV2ZWwgPD0gdGhpcy5tYXhMZXZlbCApIHtcbiAgICAgICAgICAgICAgICB1cmwgPSB0aGlzLmxldmVsc1sgbGV2ZWwgXS51cmw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdXJsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8jIGNvbnN0YW50c1xuICAgICAgICB2YXIgSUlJRl9ST1RBVElPTiA9ICcwJyxcbiAgICAgICAgICAgIC8vIyMgZ2V0IHRoZSBzY2FsZSAobGV2ZWwgYXMgYSBkZWNpbWFsKVxuICAgICAgICAgICAgc2NhbGUgPSBNYXRoLnBvdyggMC41LCB0aGlzLm1heExldmVsIC0gbGV2ZWwgKSxcblxuICAgICAgICAgICAgLy8jIGltYWdlIGRpbWVuc2lvbnMgYXQgdGhpcyBsZXZlbFxuICAgICAgICAgICAgbGV2ZWxXaWR0aCA9IE1hdGguY2VpbCggdGhpcy53aWR0aCAqIHNjYWxlICksXG4gICAgICAgICAgICBsZXZlbEhlaWdodCA9IE1hdGguY2VpbCggdGhpcy5oZWlnaHQgKiBzY2FsZSApLFxuXG4gICAgICAgICAgICAvLyMjIGlpaWYgcmVnaW9uXG4gICAgICAgICAgICB0aWxlV2lkdGgsXG4gICAgICAgICAgICB0aWxlSGVpZ2h0LFxuICAgICAgICAgICAgaWlpZlRpbGVTaXplV2lkdGgsXG4gICAgICAgICAgICBpaWlmVGlsZVNpemVIZWlnaHQsXG4gICAgICAgICAgICBpaWlmUmVnaW9uLFxuICAgICAgICAgICAgaWlpZlRpbGVYLFxuICAgICAgICAgICAgaWlpZlRpbGVZLFxuICAgICAgICAgICAgaWlpZlRpbGVXLFxuICAgICAgICAgICAgaWlpZlRpbGVILFxuICAgICAgICAgICAgaWlpZlNpemUsXG4gICAgICAgICAgICBpaWlmUXVhbGl0eSxcbiAgICAgICAgICAgIHVyaTtcblxuICAgICAgICB0aWxlV2lkdGggPSB0aGlzLmdldFRpbGVXaWR0aChsZXZlbCk7XG4gICAgICAgIHRpbGVIZWlnaHQgPSB0aGlzLmdldFRpbGVIZWlnaHQobGV2ZWwpO1xuICAgICAgICBpaWlmVGlsZVNpemVXaWR0aCA9IE1hdGguY2VpbCggdGlsZVdpZHRoIC8gc2NhbGUgKTtcbiAgICAgICAgaWlpZlRpbGVTaXplSGVpZ2h0ID0gTWF0aC5jZWlsKCB0aWxlSGVpZ2h0IC8gc2NhbGUgKTtcblxuICAgICAgICBpZiAoIHRoaXNbJ0Bjb250ZXh0J10uaW5kZXhPZignLzEuMC9jb250ZXh0Lmpzb24nKSA+IC0xIHx8XG4gICAgICAgICAgICAgdGhpc1snQGNvbnRleHQnXS5pbmRleE9mKCcvMS4xL2NvbnRleHQuanNvbicpID4gLTEgfHxcbiAgICAgICAgICAgICB0aGlzWydAY29udGV4dCddLmluZGV4T2YoJy8xL2NvbnRleHQuanNvbicpID4gLTEgKSB7XG4gICAgICAgICAgICBpaWlmUXVhbGl0eSA9IFwibmF0aXZlLmpwZ1wiO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWlpZlF1YWxpdHkgPSBcImRlZmF1bHQuanBnXCI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIGxldmVsV2lkdGggPCB0aWxlV2lkdGggJiYgbGV2ZWxIZWlnaHQgPCB0aWxlSGVpZ2h0ICl7XG4gICAgICAgICAgICBpaWlmU2l6ZSA9IGxldmVsV2lkdGggKyBcIixcIjtcbiAgICAgICAgICAgIGlpaWZSZWdpb24gPSAnZnVsbCc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpaWlmVGlsZVggPSB4ICogaWlpZlRpbGVTaXplV2lkdGg7XG4gICAgICAgICAgICBpaWlmVGlsZVkgPSB5ICogaWlpZlRpbGVTaXplSGVpZ2h0O1xuICAgICAgICAgICAgaWlpZlRpbGVXID0gTWF0aC5taW4oIGlpaWZUaWxlU2l6ZVdpZHRoLCB0aGlzLndpZHRoIC0gaWlpZlRpbGVYICk7XG4gICAgICAgICAgICBpaWlmVGlsZUggPSBNYXRoLm1pbiggaWlpZlRpbGVTaXplSGVpZ2h0LCB0aGlzLmhlaWdodCAtIGlpaWZUaWxlWSApO1xuICAgICAgICAgICAgaWlpZlNpemUgPSBNYXRoLmNlaWwoIGlpaWZUaWxlVyAqIHNjYWxlICkgKyBcIixcIjtcbiAgICAgICAgICAgIGlpaWZSZWdpb24gPSBbIGlpaWZUaWxlWCwgaWlpZlRpbGVZLCBpaWlmVGlsZVcsIGlpaWZUaWxlSCBdLmpvaW4oICcsJyApO1xuICAgICAgICB9XG4gICAgICAgIHVyaSA9IFsgdGhpc1snQGlkJ10sIGlpaWZSZWdpb24sIGlpaWZTaXplLCBJSUlGX1JPVEFUSU9OLCBpaWlmUXVhbGl0eSBdLmpvaW4oICcvJyApO1xuXG4gICAgICAgIHJldHVybiB1cmk7XG4gICAgfVxuXG4gIH0pO1xuXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lIHdoZXRoZXIgYXJiaXRyYXJ5IHRpbGUgcmVxdWVzdHMgY2FuIGJlIG1hZGUgYWdhaW5zdCBhIHNlcnZpY2Ugd2l0aCB0aGUgZ2l2ZW4gcHJvZmlsZVxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBwcm9maWxlIC0gSUlJRiBwcm9maWxlIG9iamVjdFxuICAgICAqIEB0aHJvd3Mge0Vycm9yfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNhbkJlVGlsZWQgKHByb2ZpbGUgKSB7XG4gICAgICAgIHZhciBsZXZlbDBQcm9maWxlcyA9IFtcbiAgICAgICAgICAgIFwiaHR0cDovL2xpYnJhcnkuc3RhbmZvcmQuZWR1L2lpaWYvaW1hZ2UtYXBpL2NvbXBsaWFuY2UuaHRtbCNsZXZlbDBcIixcbiAgICAgICAgICAgIFwiaHR0cDovL2xpYnJhcnkuc3RhbmZvcmQuZWR1L2lpaWYvaW1hZ2UtYXBpLzEuMS9jb21wbGlhbmNlLmh0bWwjbGV2ZWwwXCIsXG4gICAgICAgICAgICBcImh0dHA6Ly9paWlmLmlvL2FwaS9pbWFnZS8yL2xldmVsMC5qc29uXCJcbiAgICAgICAgXTtcbiAgICAgICAgdmFyIGlzTGV2ZWwwID0gKGxldmVsMFByb2ZpbGVzLmluZGV4T2YocHJvZmlsZVswXSkgIT0gLTEpO1xuICAgICAgICByZXR1cm4gIWlzTGV2ZWwwIHx8IChwcm9maWxlLmluZGV4T2YoXCJzaXplQnlXXCIpICE9IC0xKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBCdWlsZCB0aGUgbGVnYWN5IHB5cmFtaWQgVVJMcyAob25lIHRpbGUgcGVyIGxldmVsKVxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIC0gaW5mb0pzb25cbiAgICAgKiBAdGhyb3dzIHtFcnJvcn1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjb25zdHJ1Y3RMZXZlbHMob3B0aW9ucykge1xuICAgICAgICB2YXIgbGV2ZWxzID0gW107XG4gICAgICAgIGZvcih2YXIgaT0wOyBpPG9wdGlvbnMuc2l6ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldmVscy5wdXNoKHtcbiAgICAgICAgICAgICAgICB1cmw6IG9wdGlvbnNbJ0BpZCddICsgJy9mdWxsLycgKyBvcHRpb25zLnNpemVzW2ldLndpZHRoICsgJywvMC9kZWZhdWx0LmpwZycsXG4gICAgICAgICAgICAgICAgd2lkdGg6IG9wdGlvbnMuc2l6ZXNbaV0ud2lkdGgsXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiBvcHRpb25zLnNpemVzW2ldLmhlaWdodFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxldmVscy5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEud2lkdGggLSBiLndpZHRoO30pO1xuICAgIH1cblxuXG4gICAgZnVuY3Rpb24gY29uZmlndXJlRnJvbVhtbDEwKHhtbERvYykge1xuICAgICAgICAvL3BhcnNlIHRoZSB4bWxcbiAgICAgICAgaWYgKCAheG1sRG9jIHx8ICF4bWxEb2MuZG9jdW1lbnRFbGVtZW50ICkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCAkLmdldFN0cmluZyggXCJFcnJvcnMuWG1sXCIgKSApO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHJvb3QgICAgICAgICAgICA9IHhtbERvYy5kb2N1bWVudEVsZW1lbnQsXG4gICAgICAgICAgICByb290TmFtZSAgICAgICAgPSByb290LnRhZ05hbWUsXG4gICAgICAgICAgICBjb25maWd1cmF0aW9uICAgPSBudWxsO1xuXG4gICAgICAgIGlmICggcm9vdE5hbWUgPT0gXCJpbmZvXCIgKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gPSB7fTtcbiAgICAgICAgICAgICAgICBwYXJzZVhNTDEwKCByb290LCBjb25maWd1cmF0aW9uICk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbmZpZ3VyYXRpb247XG5cbiAgICAgICAgICAgIH0gY2F0Y2ggKCBlICkge1xuICAgICAgICAgICAgICAgIHRocm93IChlIGluc3RhbmNlb2YgRXJyb3IpID9cbiAgICAgICAgICAgICAgICAgICAgZSA6XG4gICAgICAgICAgICAgICAgICAgIG5ldyBFcnJvciggJC5nZXRTdHJpbmcoXCJFcnJvcnMuSUlJRlwiKSApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvciggJC5nZXRTdHJpbmcoIFwiRXJyb3JzLklJSUZcIiApICk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcGFyc2VYTUwxMCggbm9kZSwgY29uZmlndXJhdGlvbiwgcHJvcGVydHkgKSB7XG4gICAgICAgIHZhciBpLFxuICAgICAgICAgICAgdmFsdWU7XG4gICAgICAgIGlmICggbm9kZS5ub2RlVHlwZSA9PSAzICYmIHByb3BlcnR5ICkgey8vdGV4dCBub2RlXG4gICAgICAgICAgICB2YWx1ZSA9IG5vZGUubm9kZVZhbHVlLnRyaW0oKTtcbiAgICAgICAgICAgIGlmKCB2YWx1ZS5tYXRjaCgvXlxcZCokLykpe1xuICAgICAgICAgICAgICAgIHZhbHVlID0gTnVtYmVyKCB2YWx1ZSApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYoICFjb25maWd1cmF0aW9uWyBwcm9wZXJ0eSBdICl7XG4gICAgICAgICAgICAgICAgY29uZmlndXJhdGlvblsgcHJvcGVydHkgXSA9IHZhbHVlO1xuICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgaWYoICEkLmlzQXJyYXkoIGNvbmZpZ3VyYXRpb25bIHByb3BlcnR5IF0gKSApe1xuICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uWyBwcm9wZXJ0eSBdID0gWyBjb25maWd1cmF0aW9uWyBwcm9wZXJ0eSBdIF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb25bIHByb3BlcnR5IF0ucHVzaCggdmFsdWUgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmKCBub2RlLm5vZGVUeXBlID09IDEgKXtcbiAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBub2RlLmNoaWxkTm9kZXMubGVuZ3RoOyBpKysgKXtcbiAgICAgICAgICAgICAgICBwYXJzZVhNTDEwKCBub2RlLmNoaWxkTm9kZXNbIGkgXSwgY29uZmlndXJhdGlvbiwgbm9kZS5ub2RlTmFtZSApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG5cblxufSggT3BlblNlYWRyYWdvbiApKTtcblxuLypcbiAqIE9wZW5TZWFkcmFnb24gLSBPc21UaWxlU291cmNlXG4gKlxuICogQ29weXJpZ2h0IChDKSAyMDA5IENvZGVQbGV4IEZvdW5kYXRpb25cbiAqIENvcHlyaWdodCAoQykgMjAxMC0yMDEzIE9wZW5TZWFkcmFnb24gY29udHJpYnV0b3JzXG4gKlxuICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlXG4gKiBtZXQ6XG4gKlxuICogLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4gKiAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4gKlxuICogLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodFxuICogICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlXG4gKiAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uXG4gKlxuICogLSBOZWl0aGVyIHRoZSBuYW1lIG9mIENvZGVQbGV4IEZvdW5kYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHNcbiAqICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb21cbiAqICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbiAqXG4gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTXG4gKiBcIkFTIElTXCIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UXG4gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1JcbiAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVFxuICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsXG4gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURURcbiAqIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1JcbiAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0ZcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HXG4gKiBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVNcbiAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICovXG5cbi8qXG4gKiBEZXJpdmVkIGZyb20gdGhlIE9TTSB0aWxlIHNvdXJjZSBpbiBSYWluZXIgU2ltb24ncyBzZWFqYXgtdXRpbHMgcHJvamVjdFxuICogPGh0dHA6Ly9naXRodWIuY29tL3JzaW1vbi9zZWFqYXgtdXRpbHM+LiAgUmFpbmVyIFNpbW9uIGhhcyBjb250cmlidXRlZFxuICogdGhlIGluY2x1ZGVkIGNvZGUgdG8gdGhlIE9wZW5TZWFkcmFnb24gcHJvamVjdCB1bmRlciB0aGUgTmV3IEJTRCBsaWNlbnNlO1xuICogc2VlIDxodHRwczovL2dpdGh1Yi5jb20vb3BlbnNlYWRyYWdvbi9vcGVuc2VhZHJhZ29uL2lzc3Vlcy81OD4uXG4gKi9cblxuXG4oZnVuY3Rpb24oICQgKXtcblxuLyoqXG4gKiBAY2xhc3MgT3NtVGlsZVNvdXJjZVxuICogQGNsYXNzZGVzYyBBIHRpbGVzb3VyY2UgaW1wbGVtZW50YXRpb24gZm9yIE9wZW5TdHJlZXRNYXAuPGJyPjxicj5cbiAqXG4gKiBOb3RlIDEuIFpvb21sZXZlbHMuIERlZXAgWm9vbSBhbmQgT1NNIGRlZmluZSB6b29tIGxldmVscyBkaWZmZXJlbnRseS4gSW4gIERlZXBcbiAqIFpvb20sIGxldmVsIDAgZXF1YWxzIGFuIGltYWdlIG9mIDF4MSBwaXhlbHMuIEluIE9TTSwgbGV2ZWwgMCBlcXVhbHMgYW4gaW1hZ2Ugb2ZcbiAqIDI1NngyNTYgbGV2ZWxzIChzZWUgaHR0cDovL2dhc2kuY2gvYmxvZy9pbnNpZGUtZGVlcC16b29tLTIpLiBJLmUuIHRoZXJlIGlzIGFcbiAqIGRpZmZlcmVuY2Ugb2YgbG9nMigyNTYpPTggbGV2ZWxzLjxicj48YnI+XG4gKlxuICogTm90ZSAyLiBJbWFnZSBkaW1lbnNpb24uIEFjY29yZGluZyB0byB0aGUgT1NNIFdpa2lcbiAqIChodHRwOi8vd2lraS5vcGVuc3RyZWV0bWFwLm9yZy93aWtpL1NsaXBweV9tYXBfdGlsZW5hbWVzI1pvb21fbGV2ZWxzKVxuICogdGhlIGhpZ2hlc3QgTWFwbmlrIHpvb20gbGV2ZWwgaGFzIDI1Ni4xNDR4MjU2LjE0NCB0aWxlcywgd2l0aCBhIDI1NngyNTZcbiAqIHBpeGVsIHNpemUuIEkuZS4gdGhlIERlZXAgWm9vbSBpbWFnZSBkaW1lbnNpb24gaXMgNjUuNTcyLjg2NHg2NS41NzIuODY0XG4gKiBwaXhlbHMuXG4gKlxuICogQG1lbWJlcm9mIE9wZW5TZWFkcmFnb25cbiAqIEBleHRlbmRzIE9wZW5TZWFkcmFnb24uVGlsZVNvdXJjZVxuICogQHBhcmFtIHtOdW1iZXJ8T2JqZWN0fSB3aWR0aCAtIHRoZSBwaXhlbCB3aWR0aCBvZiB0aGUgaW1hZ2Ugb3IgdGhlIGlkaW9tYXRpY1xuICogICAgICBvcHRpb25zIG9iamVjdCB3aGljaCBpcyB1c2VkIGluc3RlYWQgb2YgcG9zaXRpb25hbCBhcmd1bWVudHMuXG4gKiBAcGFyYW0ge051bWJlcn0gaGVpZ2h0XG4gKiBAcGFyYW0ge051bWJlcn0gdGlsZVNpemVcbiAqIEBwYXJhbSB7TnVtYmVyfSB0aWxlT3ZlcmxhcFxuICogQHBhcmFtIHtTdHJpbmd9IHRpbGVzVXJsXG4gKi9cbiQuT3NtVGlsZVNvdXJjZSA9IGZ1bmN0aW9uKCB3aWR0aCwgaGVpZ2h0LCB0aWxlU2l6ZSwgdGlsZU92ZXJsYXAsIHRpbGVzVXJsICkge1xuICAgIHZhciBvcHRpb25zO1xuXG4gICAgaWYoICQuaXNQbGFpbk9iamVjdCggd2lkdGggKSApe1xuICAgICAgICBvcHRpb25zID0gd2lkdGg7XG4gICAgfWVsc2V7XG4gICAgICAgIG9wdGlvbnMgPSB7XG4gICAgICAgICAgICB3aWR0aDogYXJndW1lbnRzWzBdLFxuICAgICAgICAgICAgaGVpZ2h0OiBhcmd1bWVudHNbMV0sXG4gICAgICAgICAgICB0aWxlU2l6ZTogYXJndW1lbnRzWzJdLFxuICAgICAgICAgICAgdGlsZU92ZXJsYXA6IGFyZ3VtZW50c1szXSxcbiAgICAgICAgICAgIHRpbGVzVXJsOiBhcmd1bWVudHNbNF1cbiAgICAgICAgfTtcbiAgICB9XG4gICAgLy9hcHBseSBkZWZhdWx0IHNldHRpbmcgZm9yIHN0YW5kYXJkIHB1YmxpYyBPcGVuU3RyZWF0TWFwcyBzZXJ2aWNlXG4gICAgLy9idXQgYWxsb3cgdGhlbSB0byBiZSBzcGVjaWZpZWQgc28gZmxpa3MgY2FuIGhvc3QgdGhlcmUgb3duIGluc3RhbmNlXG4gICAgLy9vciBhcHBseSBhZ2FpbnN0IG90aGVyIHNlcnZpY2VzIHN1cHBvcnR0aW5nIHRoZSBzYW1lIHN0YW5kYXJkXG4gICAgaWYoICFvcHRpb25zLndpZHRoIHx8ICFvcHRpb25zLmhlaWdodCApe1xuICAgICAgICBvcHRpb25zLndpZHRoID0gNjU1NzI4NjQ7XG4gICAgICAgIG9wdGlvbnMuaGVpZ2h0ID0gNjU1NzI4NjQ7XG4gICAgfVxuICAgIGlmKCAhb3B0aW9ucy50aWxlU2l6ZSApe1xuICAgICAgICBvcHRpb25zLnRpbGVTaXplID0gMjU2O1xuICAgICAgICBvcHRpb25zLnRpbGVPdmVybGFwID0gMDtcbiAgICB9XG4gICAgaWYoICFvcHRpb25zLnRpbGVzVXJsICl7XG4gICAgICAgIG9wdGlvbnMudGlsZXNVcmwgPSBcImh0dHA6Ly90aWxlLm9wZW5zdHJlZXRtYXAub3JnL1wiO1xuICAgIH1cbiAgICBvcHRpb25zLm1pbkxldmVsID0gODtcblxuICAgICQuVGlsZVNvdXJjZS5hcHBseSggdGhpcywgWyBvcHRpb25zIF0gKTtcblxufTtcblxuJC5leHRlbmQoICQuT3NtVGlsZVNvdXJjZS5wcm90b3R5cGUsICQuVGlsZVNvdXJjZS5wcm90b3R5cGUsIC8qKiBAbGVuZHMgT3BlblNlYWRyYWdvbi5Pc21UaWxlU291cmNlLnByb3RvdHlwZSAqL3tcblxuXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lIGlmIHRoZSBkYXRhIGFuZC9vciB1cmwgaW1wbHkgdGhlIGltYWdlIHNlcnZpY2UgaXMgc3VwcG9ydGVkIGJ5XG4gICAgICogdGhpcyB0aWxlIHNvdXJjZS5cbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge09iamVjdHxBcnJheX0gZGF0YVxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBvcHRpb25hbCAtIHVybFxuICAgICAqL1xuICAgIHN1cHBvcnRzOiBmdW5jdGlvbiggZGF0YSwgdXJsICl7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBkYXRhLnR5cGUgJiZcbiAgICAgICAgICAgIFwib3BlbnN0cmVldG1hcHNcIiA9PSBkYXRhLnR5cGVcbiAgICAgICAgKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZGF0YSAtIHRoZSByYXcgY29uZmlndXJhdGlvblxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB1cmwgLSB0aGUgdXJsIHRoZSBkYXRhIHdhcyByZXRyZWl2ZWQgZnJvbSBpZiBhbnkuXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBvcHRpb25zIC0gQSBkaWN0aW9uYXJ5IG9mIGtleXdvcmQgYXJndW1lbnRzIHN1ZmZpY2llbnRcbiAgICAgKiAgICAgIHRvIGNvbmZpZ3VyZSB0aGlzIHRpbGUgc291cmNlcyBjb25zdHJ1Y3Rvci5cbiAgICAgKi9cbiAgICBjb25maWd1cmU6IGZ1bmN0aW9uKCBkYXRhLCB1cmwgKXtcbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfSxcblxuXG4gICAgLyoqXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGxldmVsXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHhcbiAgICAgKiBAcGFyYW0ge051bWJlcn0geVxuICAgICAqL1xuICAgIGdldFRpbGVVcmw6IGZ1bmN0aW9uKCBsZXZlbCwgeCwgeSApIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGlsZXNVcmwgKyAobGV2ZWwgLSA4KSArIFwiL1wiICsgeCArIFwiL1wiICsgeSArIFwiLnBuZ1wiO1xuICAgIH1cbn0pO1xuXG5cbn0oIE9wZW5TZWFkcmFnb24gKSk7XG5cbi8qXG4gKiBPcGVuU2VhZHJhZ29uIC0gVG1zVGlsZVNvdXJjZVxuICpcbiAqIENvcHlyaWdodCAoQykgMjAwOSBDb2RlUGxleCBGb3VuZGF0aW9uXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMyBPcGVuU2VhZHJhZ29uIGNvbnRyaWJ1dG9yc1xuICpcbiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZVxuICogbWV0OlxuICpcbiAqIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuICogICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuICpcbiAqIC0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHRcbiAqICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZVxuICogICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuICpcbiAqIC0gTmVpdGhlciB0aGUgbmFtZSBvZiBDb2RlUGxleCBGb3VuZGF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzXG4gKiAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tXG4gKiAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4gKlxuICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SU1xuICogXCJBUyBJU1wiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVFxuICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SXG4gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFRcbiAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLFxuICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEXG4gKiBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SXG4gKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElOR1xuICogTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTXG4gKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiAqL1xuXG4vKlxuICogRGVyaXZlZCBmcm9tIHRoZSBUTVMgdGlsZSBzb3VyY2UgaW4gUmFpbmVyIFNpbW9uJ3Mgc2VhamF4LXV0aWxzIHByb2plY3RcbiAqIDxodHRwOi8vZ2l0aHViLmNvbS9yc2ltb24vc2VhamF4LXV0aWxzPi4gIFJhaW5lciBTaW1vbiBoYXMgY29udHJpYnV0ZWRcbiAqIHRoZSBpbmNsdWRlZCBjb2RlIHRvIHRoZSBPcGVuU2VhZHJhZ29uIHByb2plY3QgdW5kZXIgdGhlIE5ldyBCU0QgbGljZW5zZTtcbiAqIHNlZSA8aHR0cHM6Ly9naXRodWIuY29tL29wZW5zZWFkcmFnb24vb3BlbnNlYWRyYWdvbi9pc3N1ZXMvNTg+LlxuICovXG5cblxuKGZ1bmN0aW9uKCAkICl7XG5cbi8qKlxuICogQGNsYXNzIFRtc1RpbGVTb3VyY2VcbiAqIEBjbGFzc2Rlc2MgQSB0aWxlc291cmNlIGltcGxlbWVudGF0aW9uIGZvciBUaWxlZCBNYXAgU2VydmljZXMgKFRNUykuXG4gKiBUTVMgdGlsZSBzY2hlbWUgKCBbIGFzIHN1cHBvcnRlZCBieSBPcGVuTGF5ZXJzIF0gaXMgZGVzY3JpYmVkIGhlcmVcbiAqICggaHR0cDovL29wZW5sYXllcnMub3JnL2Rldi9leGFtcGxlcy90bXMuaHRtbCApLlxuICpcbiAqIEBtZW1iZXJvZiBPcGVuU2VhZHJhZ29uXG4gKiBAZXh0ZW5kcyBPcGVuU2VhZHJhZ29uLlRpbGVTb3VyY2VcbiAqIEBwYXJhbSB7TnVtYmVyfE9iamVjdH0gd2lkdGggLSB0aGUgcGl4ZWwgd2lkdGggb2YgdGhlIGltYWdlIG9yIHRoZSBpZGlvbWF0aWNcbiAqICAgICAgb3B0aW9ucyBvYmplY3Qgd2hpY2ggaXMgdXNlZCBpbnN0ZWFkIG9mIHBvc2l0aW9uYWwgYXJndW1lbnRzLlxuICogQHBhcmFtIHtOdW1iZXJ9IGhlaWdodFxuICogQHBhcmFtIHtOdW1iZXJ9IHRpbGVTaXplXG4gKiBAcGFyYW0ge051bWJlcn0gdGlsZU92ZXJsYXBcbiAqIEBwYXJhbSB7U3RyaW5nfSB0aWxlc1VybFxuICovXG4kLlRtc1RpbGVTb3VyY2UgPSBmdW5jdGlvbiggd2lkdGgsIGhlaWdodCwgdGlsZVNpemUsIHRpbGVPdmVybGFwLCB0aWxlc1VybCApIHtcbiAgICB2YXIgb3B0aW9ucztcblxuICAgIGlmKCAkLmlzUGxhaW5PYmplY3QoIHdpZHRoICkgKXtcbiAgICAgICAgb3B0aW9ucyA9IHdpZHRoO1xuICAgIH1lbHNle1xuICAgICAgICBvcHRpb25zID0ge1xuICAgICAgICAgICAgd2lkdGg6IGFyZ3VtZW50c1swXSxcbiAgICAgICAgICAgIGhlaWdodDogYXJndW1lbnRzWzFdLFxuICAgICAgICAgICAgdGlsZVNpemU6IGFyZ3VtZW50c1syXSxcbiAgICAgICAgICAgIHRpbGVPdmVybGFwOiBhcmd1bWVudHNbM10sXG4gICAgICAgICAgICB0aWxlc1VybDogYXJndW1lbnRzWzRdXG4gICAgICAgIH07XG4gICAgfVxuICAgIC8vIFRNUyBoYXMgaW50ZWdlciBtdWx0aXBsZXMgb2YgMjU2IGZvciB3aWR0aC9oZWlnaHQgYW5kIGFkZHMgYnVmZmVyXG4gICAgLy8gaWYgbmVjZXNzYXJ5IC0+IGFjY291bnQgZm9yIHRoaXMhXG4gICAgdmFyIGJ1ZmZlcmVkV2lkdGggPSBNYXRoLmNlaWwob3B0aW9ucy53aWR0aCAvIDI1NikgKiAyNTYsXG4gICAgICAgIGJ1ZmZlcmVkSGVpZ2h0ID0gTWF0aC5jZWlsKG9wdGlvbnMuaGVpZ2h0IC8gMjU2KSAqIDI1NixcbiAgICAgICAgbWF4O1xuXG4gICAgLy8gQ29tcHV0ZSBudW1iZXIgb2Ygem9vbWxldmVscyBpbiB0aGlzIHRpbGVzZXRcbiAgICBpZiAoYnVmZmVyZWRXaWR0aCA+IGJ1ZmZlcmVkSGVpZ2h0KSB7XG4gICAgICAgIG1heCA9IGJ1ZmZlcmVkV2lkdGggLyAyNTY7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgbWF4ID0gYnVmZmVyZWRIZWlnaHQgLyAyNTY7XG4gICAgfVxuICAgIG9wdGlvbnMubWF4TGV2ZWwgPSBNYXRoLmNlaWwoTWF0aC5sb2cobWF4KS9NYXRoLmxvZygyKSkgLSAxO1xuICAgIG9wdGlvbnMudGlsZVNpemUgPSAyNTY7XG4gICAgb3B0aW9ucy53aWR0aCA9IGJ1ZmZlcmVkV2lkdGg7XG4gICAgb3B0aW9ucy5oZWlnaHQgPSBidWZmZXJlZEhlaWdodDtcblxuICAgICQuVGlsZVNvdXJjZS5hcHBseSggdGhpcywgWyBvcHRpb25zIF0gKTtcblxufTtcblxuJC5leHRlbmQoICQuVG1zVGlsZVNvdXJjZS5wcm90b3R5cGUsICQuVGlsZVNvdXJjZS5wcm90b3R5cGUsIC8qKiBAbGVuZHMgT3BlblNlYWRyYWdvbi5UbXNUaWxlU291cmNlLnByb3RvdHlwZSAqL3tcblxuXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lIGlmIHRoZSBkYXRhIGFuZC9vciB1cmwgaW1wbHkgdGhlIGltYWdlIHNlcnZpY2UgaXMgc3VwcG9ydGVkIGJ5XG4gICAgICogdGhpcyB0aWxlIHNvdXJjZS5cbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge09iamVjdHxBcnJheX0gZGF0YVxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBvcHRpb25hbCAtIHVybFxuICAgICAqL1xuICAgIHN1cHBvcnRzOiBmdW5jdGlvbiggZGF0YSwgdXJsICl7XG4gICAgICAgIHJldHVybiAoIGRhdGEudHlwZSAmJiBcInRpbGVkbWFwc2VydmljZVwiID09IGRhdGEudHlwZSApO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIC0gdGhlIHJhdyBjb25maWd1cmF0aW9uXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHVybCAtIHRoZSB1cmwgdGhlIGRhdGEgd2FzIHJldHJlaXZlZCBmcm9tIGlmIGFueS5cbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IG9wdGlvbnMgLSBBIGRpY3Rpb25hcnkgb2Yga2V5d29yZCBhcmd1bWVudHMgc3VmZmljaWVudFxuICAgICAqICAgICAgdG8gY29uZmlndXJlIHRoaXMgdGlsZSBzb3VyY2VzIGNvbnN0cnVjdG9yLlxuICAgICAqL1xuICAgIGNvbmZpZ3VyZTogZnVuY3Rpb24oIGRhdGEsIHVybCApe1xuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICB9LFxuXG5cbiAgICAvKipcbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gbGV2ZWxcbiAgICAgKiBAcGFyYW0ge051bWJlcn0geFxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSB5XG4gICAgICovXG4gICAgZ2V0VGlsZVVybDogZnVuY3Rpb24oIGxldmVsLCB4LCB5ICkge1xuICAgICAgICAvLyBDb252ZXJ0IGZyb20gRGVlcCBab29tIGRlZmluaXRpb24gdG8gVE1TIHpvb20gZGVmaW5pdGlvblxuICAgICAgICB2YXIgeVRpbGVzID0gdGhpcy5nZXROdW1UaWxlcyggbGV2ZWwgKS55IC0gMTtcblxuICAgICAgICByZXR1cm4gdGhpcy50aWxlc1VybCArIGxldmVsICsgXCIvXCIgKyB4ICsgXCIvXCIgKyAgKHlUaWxlcyAtIHkpICsgXCIucG5nXCI7XG4gICAgfVxufSk7XG5cblxufSggT3BlblNlYWRyYWdvbiApKTtcblxuLypcbiAqIE9wZW5TZWFkcmFnb24gLSBMZWdhY3lUaWxlU291cmNlXG4gKlxuICogQ29weXJpZ2h0IChDKSAyMDA5IENvZGVQbGV4IEZvdW5kYXRpb25cbiAqIENvcHlyaWdodCAoQykgMjAxMC0yMDEzIE9wZW5TZWFkcmFnb24gY29udHJpYnV0b3JzXG4gKlxuICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlXG4gKiBtZXQ6XG4gKlxuICogLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4gKiAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4gKlxuICogLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodFxuICogICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlXG4gKiAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uXG4gKlxuICogLSBOZWl0aGVyIHRoZSBuYW1lIG9mIENvZGVQbGV4IEZvdW5kYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHNcbiAqICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb21cbiAqICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbiAqXG4gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTXG4gKiBcIkFTIElTXCIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UXG4gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1JcbiAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVFxuICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsXG4gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURURcbiAqIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1JcbiAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0ZcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HXG4gKiBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVNcbiAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICovXG5cbihmdW5jdGlvbiggJCApe1xuXG4vKipcbiAqIEBjbGFzcyBMZWdhY3lUaWxlU291cmNlXG4gKiBAY2xhc3NkZXNjIFRoZSBMZWdhY3lUaWxlU291cmNlIGFsbG93cyBzaW1wbGUsIHRyYWRpdGlvbmFsIGltYWdlIHB5cmFtaWRzIHRvIGJlIGxvYWRlZFxuICogaW50byBhbiBPcGVuU2VhZHJhZ29uIFZpZXdlci4gIEJhc2ljYWxseSwgdGhpcyB0cmFuc2xhdGVzIHRvIHRoZSBoaXN0b3JpY2FsbHlcbiAqIGNvbW1vbiBwcmFjdGljZSBvZiBzdGFydGluZyB3aXRoIGEgJ21hc3RlcicgaW1hZ2UsIG1heWJlIGEgdGlmZiBmb3IgZXhhbXBsZSxcbiAqIGFuZCBnZW5lcmF0aW5nIGEgc2V0IG9mICdzZXJ2aWNlJyBpbWFnZXMgbGlrZSBvbmUgb3IgbW9yZSB0aHVtYm5haWxzLCBhIG1lZGl1bVxuICogcmVzb2x1dGlvbiBpbWFnZSBhbmQgYSBoaWdoIHJlc29sdXRpb24gaW1hZ2UgaW4gc3RhbmRhcmQgd2ViIGZvcm1hdHMgbGlrZVxuICogcG5nIG9yIGpwZy5cbiAqXG4gKiBAbWVtYmVyb2YgT3BlblNlYWRyYWdvblxuICogQGV4dGVuZHMgT3BlblNlYWRyYWdvbi5UaWxlU291cmNlXG4gKiBAcGFyYW0ge0FycmF5fSBsZXZlbHMgQW4gYXJyYXkgb2YgZmlsZSBkZXNjcmlwdGlvbnMsIGVhY2ggaXMgYW4gb2JqZWN0IHdpdGhcbiAqICAgICAgYSAndXJsJywgYSAnd2lkdGgnLCBhbmQgYSAnaGVpZ2h0Jy4gIE92ZXJyaWRpbmcgY2xhc3NlcyBjYW4gZXhwZWN0IG1vcmVcbiAqICAgICAgcHJvcGVydGllcyBidXQgdGhlc2UgcHJvcGVydGllcyBhcmUgc3VmZmljaWVudCBmb3IgdGhpcyBpbXBsZW1lbnRhdGlvbi5cbiAqICAgICAgQWRkaXRpb25hbGx5LCB0aGUgbGV2ZWxzIGFyZSByZXF1aXJlZCB0byBiZSBsaXN0ZWQgaW4gb3JkZXIgZnJvbVxuICogICAgICBzbWFsbGVzdCB0byBsYXJnZXN0LlxuICogQHByb3BlcnR5IHtOdW1iZXJ9IGFzcGVjdFJhdGlvXG4gKiBAcHJvcGVydHkge051bWJlcn0gZGltZW5zaW9uc1xuICogQHByb3BlcnR5IHtOdW1iZXJ9IHRpbGVTaXplXG4gKiBAcHJvcGVydHkge051bWJlcn0gdGlsZU92ZXJsYXBcbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBtaW5MZXZlbFxuICogQHByb3BlcnR5IHtOdW1iZXJ9IG1heExldmVsXG4gKiBAcHJvcGVydHkge0FycmF5fSAgbGV2ZWxzXG4gKi9cbiQuTGVnYWN5VGlsZVNvdXJjZSA9IGZ1bmN0aW9uKCBsZXZlbHMgKSB7XG5cbiAgICB2YXIgb3B0aW9ucyxcbiAgICAgICAgd2lkdGgsXG4gICAgICAgIGhlaWdodDtcblxuICAgIGlmKCAkLmlzQXJyYXkoIGxldmVscyApICl7XG4gICAgICAgIG9wdGlvbnMgPSB7XG4gICAgICAgICAgICB0eXBlOiAnbGVnYWN5LWltYWdlLXB5cmFtaWQnLFxuICAgICAgICAgICAgbGV2ZWxzOiBsZXZlbHNcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvL2NsZWFuIHVwIHRoZSBsZXZlbHMgdG8gbWFrZSBzdXJlIHdlIHN1cHBvcnQgYWxsIGZvcm1hdHNcbiAgICBvcHRpb25zLmxldmVscyA9IGZpbHRlckZpbGVzKCBvcHRpb25zLmxldmVscyApO1xuXG4gICAgaWYgKCBvcHRpb25zLmxldmVscy5sZW5ndGggPiAwICkge1xuICAgICAgICB3aWR0aCA9IG9wdGlvbnMubGV2ZWxzWyBvcHRpb25zLmxldmVscy5sZW5ndGggLSAxIF0ud2lkdGg7XG4gICAgICAgIGhlaWdodCA9IG9wdGlvbnMubGV2ZWxzWyBvcHRpb25zLmxldmVscy5sZW5ndGggLSAxIF0uaGVpZ2h0O1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgd2lkdGggPSAwO1xuICAgICAgICBoZWlnaHQgPSAwO1xuICAgICAgICAkLmNvbnNvbGUuZXJyb3IoIFwiTm8gc3VwcG9ydGVkIGltYWdlIGZvcm1hdHMgZm91bmRcIiApO1xuICAgIH1cblxuICAgICQuZXh0ZW5kKCB0cnVlLCBvcHRpb25zLCB7XG4gICAgICAgIHdpZHRoOiB3aWR0aCxcbiAgICAgICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgICAgIHRpbGVTaXplOiBNYXRoLm1heCggaGVpZ2h0LCB3aWR0aCApLFxuICAgICAgICB0aWxlT3ZlcmxhcDogMCxcbiAgICAgICAgbWluTGV2ZWw6IDAsXG4gICAgICAgIG1heExldmVsOiBvcHRpb25zLmxldmVscy5sZW5ndGggPiAwID8gb3B0aW9ucy5sZXZlbHMubGVuZ3RoIC0gMSA6IDBcbiAgICB9ICk7XG5cbiAgICAkLlRpbGVTb3VyY2UuYXBwbHkoIHRoaXMsIFsgb3B0aW9ucyBdICk7XG5cbiAgICB0aGlzLmxldmVscyA9IG9wdGlvbnMubGV2ZWxzO1xufTtcblxuJC5leHRlbmQoICQuTGVnYWN5VGlsZVNvdXJjZS5wcm90b3R5cGUsICQuVGlsZVNvdXJjZS5wcm90b3R5cGUsIC8qKiBAbGVuZHMgT3BlblNlYWRyYWdvbi5MZWdhY3lUaWxlU291cmNlLnByb3RvdHlwZSAqL3tcbiAgICAvKipcbiAgICAgKiBEZXRlcm1pbmUgaWYgdGhlIGRhdGEgYW5kL29yIHVybCBpbXBseSB0aGUgaW1hZ2Ugc2VydmljZSBpcyBzdXBwb3J0ZWQgYnlcbiAgICAgKiB0aGlzIHRpbGUgc291cmNlLlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7T2JqZWN0fEFycmF5fSBkYXRhXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG9wdGlvbmFsIC0gdXJsXG4gICAgICovXG4gICAgc3VwcG9ydHM6IGZ1bmN0aW9uKCBkYXRhLCB1cmwgKXtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIGRhdGEudHlwZSAmJlxuICAgICAgICAgICAgXCJsZWdhY3ktaW1hZ2UtcHlyYW1pZFwiID09IGRhdGEudHlwZVxuICAgICAgICApIHx8IChcbiAgICAgICAgICAgIGRhdGEuZG9jdW1lbnRFbGVtZW50ICYmXG4gICAgICAgICAgICBcImxlZ2FjeS1pbWFnZS1weXJhbWlkXCIgPT0gZGF0YS5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCd0eXBlJylcbiAgICAgICAgKTtcbiAgICB9LFxuXG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7T2JqZWN0fFhNTERvY3VtZW50fSBjb25maWd1cmF0aW9uIC0gdGhlIHJhdyBjb25maWd1cmF0aW9uXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGRhdGFVcmwgLSB0aGUgdXJsIHRoZSBkYXRhIHdhcyByZXRyZWl2ZWQgZnJvbSBpZiBhbnkuXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBvcHRpb25zIC0gQSBkaWN0aW9uYXJ5IG9mIGtleXdvcmQgYXJndW1lbnRzIHN1ZmZpY2llbnRcbiAgICAgKiAgICAgIHRvIGNvbmZpZ3VyZSB0aGlzIHRpbGUgc291cmNlcyBjb25zdHJ1Y3Rvci5cbiAgICAgKi9cbiAgICBjb25maWd1cmU6IGZ1bmN0aW9uKCBjb25maWd1cmF0aW9uLCBkYXRhVXJsICl7XG5cbiAgICAgICAgdmFyIG9wdGlvbnM7XG5cbiAgICAgICAgaWYoICEkLmlzUGxhaW5PYmplY3QoY29uZmlndXJhdGlvbikgKXtcblxuICAgICAgICAgICAgb3B0aW9ucyA9IGNvbmZpZ3VyZUZyb21YTUwoIHRoaXMsIGNvbmZpZ3VyYXRpb24gKTtcblxuICAgICAgICB9ZWxzZXtcblxuICAgICAgICAgICAgb3B0aW9ucyA9IGNvbmZpZ3VyZUZyb21PYmplY3QoIHRoaXMsIGNvbmZpZ3VyYXRpb24gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvcHRpb25zO1xuXG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBsZXZlbFxuICAgICAqL1xuICAgIGdldExldmVsU2NhbGU6IGZ1bmN0aW9uICggbGV2ZWwgKSB7XG4gICAgICAgIHZhciBsZXZlbFNjYWxlID0gTmFOO1xuICAgICAgICBpZiAoIHRoaXMubGV2ZWxzLmxlbmd0aCA+IDAgJiYgbGV2ZWwgPj0gdGhpcy5taW5MZXZlbCAmJiBsZXZlbCA8PSB0aGlzLm1heExldmVsICkge1xuICAgICAgICAgICAgbGV2ZWxTY2FsZSA9XG4gICAgICAgICAgICAgICAgdGhpcy5sZXZlbHNbIGxldmVsIF0ud2lkdGggL1xuICAgICAgICAgICAgICAgIHRoaXMubGV2ZWxzWyB0aGlzLm1heExldmVsIF0ud2lkdGg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxldmVsU2NhbGU7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBsZXZlbFxuICAgICAqL1xuICAgIGdldE51bVRpbGVzOiBmdW5jdGlvbiggbGV2ZWwgKSB7XG4gICAgICAgIHZhciBzY2FsZSA9IHRoaXMuZ2V0TGV2ZWxTY2FsZSggbGV2ZWwgKTtcbiAgICAgICAgaWYgKCBzY2FsZSApe1xuICAgICAgICAgICAgcmV0dXJuIG5ldyAkLlBvaW50KCAxLCAxICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3ICQuUG9pbnQoIDAsIDAgKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gbGV2ZWxcbiAgICAgKiBAcGFyYW0ge09wZW5TZWFkcmFnb24uUG9pbnR9IHBvaW50XG4gICAgICovXG4gICAgZ2V0VGlsZUF0UG9pbnQ6IGZ1bmN0aW9uKCBsZXZlbCwgcG9pbnQgKSB7XG4gICAgICAgIHJldHVybiBuZXcgJC5Qb2ludCggMCwgMCApO1xuICAgIH0sXG5cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIG5vdCBpbXBsZW1lbnRlZCBieSB0aGlzIGNsYXNzIG90aGVyIHRoYW4gdG8gdGhyb3cgYW4gRXJyb3JcbiAgICAgKiBhbm5vdW5jaW5nIHlvdSBoYXZlIHRvIGltcGxlbWVudCBpdC4gIEJlY2F1c2Ugb2YgdGhlIHZhcmlldHkgb2YgdGlsZVxuICAgICAqIHNlcnZlciB0ZWNobm9sb2dpZXMsIGFuZCB2YXJpb3VzIHNwZWNpZmljYXRpb25zIGZvciBidWlsZGluZyBpbWFnZVxuICAgICAqIHB5cmFtaWRzLCB0aGlzIG1ldGhvZCBpcyBoZXJlIHRvIGFsbG93IGVhc3kgaW50ZWdyYXRpb24uXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGxldmVsXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHhcbiAgICAgKiBAcGFyYW0ge051bWJlcn0geVxuICAgICAqIEB0aHJvd3Mge0Vycm9yfVxuICAgICAqL1xuICAgIGdldFRpbGVVcmw6IGZ1bmN0aW9uICggbGV2ZWwsIHgsIHkgKSB7XG4gICAgICAgIHZhciB1cmwgPSBudWxsO1xuICAgICAgICBpZiAoIHRoaXMubGV2ZWxzLmxlbmd0aCA+IDAgJiYgbGV2ZWwgPj0gdGhpcy5taW5MZXZlbCAmJiBsZXZlbCA8PSB0aGlzLm1heExldmVsICkge1xuICAgICAgICAgICAgdXJsID0gdGhpcy5sZXZlbHNbIGxldmVsIF0udXJsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1cmw7XG4gICAgfVxufSApO1xuXG4vKipcbiAqIFRoaXMgbWV0aG9kIHJlbW92ZXMgYW55IGZpbGVzIGZyb20gdGhlIEFycmF5IHdoaWNoIGRvbnQgY29uZm9ybSB0byBvdXJcbiAqIGJhc2ljIHJlcXVpcmVtZW50cyBmb3IgYSAnbGV2ZWwnIGluIHRoZSBMZWdhY3lUaWxlU291cmNlLlxuICogQHByaXZhdGVcbiAqIEBpbm5lclxuICogQGZ1bmN0aW9uXG4gKi9cbmZ1bmN0aW9uIGZpbHRlckZpbGVzKCBmaWxlcyApe1xuICAgIHZhciBmaWx0ZXJlZCA9IFtdLFxuICAgICAgICBmaWxlLFxuICAgICAgICBpO1xuICAgIGZvciggaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKyApe1xuICAgICAgICBmaWxlID0gZmlsZXNbIGkgXTtcbiAgICAgICAgaWYoIGZpbGUuaGVpZ2h0ICYmXG4gICAgICAgICAgICBmaWxlLndpZHRoICYmXG4gICAgICAgICAgICBmaWxlLnVybCAmJiAoXG4gICAgICAgICAgICAgICAgZmlsZS51cmwudG9Mb3dlckNhc2UoKS5tYXRjaCgvXi4qXFwuKHBuZ3xqcGd8anBlZ3xnaWYpKD86XFw/LiopPyQvKSB8fCAoXG4gICAgICAgICAgICAgICAgICAgIGZpbGUubWltZXR5cGUgJiZcbiAgICAgICAgICAgICAgICAgICAgZmlsZS5taW1ldHlwZS50b0xvd2VyQ2FzZSgpLm1hdGNoKC9eLipcXC8ocG5nfGpwZ3xqcGVnfGdpZikkLylcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApICl7XG4gICAgICAgICAgICAvL1RoaXMgaXMgc3VmZmljaWVudCB0byBzZXJ2ZSBhcyBhIGxldmVsXG4gICAgICAgICAgICBmaWx0ZXJlZC5wdXNoKHtcbiAgICAgICAgICAgICAgICB1cmw6IGZpbGUudXJsLFxuICAgICAgICAgICAgICAgIHdpZHRoOiBOdW1iZXIoIGZpbGUud2lkdGggKSxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IE51bWJlciggZmlsZS5oZWlnaHQgKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAkLmNvbnNvbGUuZXJyb3IoICdVbnN1cHBvcnRlZCBpbWFnZSBmb3JtYXQ6ICVzJywgZmlsZS51cmwgPyBmaWxlLnVybCA6ICc8bm8gVVJMPicgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmaWx0ZXJlZC5zb3J0KGZ1bmN0aW9uKGEsYil7XG4gICAgICAgIHJldHVybiBhLmhlaWdodCAtIGIuaGVpZ2h0O1xuICAgIH0pO1xuXG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEBpbm5lclxuICogQGZ1bmN0aW9uXG4gKi9cbmZ1bmN0aW9uIGNvbmZpZ3VyZUZyb21YTUwoIHRpbGVTb3VyY2UsIHhtbERvYyApe1xuXG4gICAgaWYgKCAheG1sRG9jIHx8ICF4bWxEb2MuZG9jdW1lbnRFbGVtZW50ICkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoICQuZ2V0U3RyaW5nKCBcIkVycm9ycy5YbWxcIiApICk7XG4gICAgfVxuXG4gICAgdmFyIHJvb3QgICAgICAgICA9IHhtbERvYy5kb2N1bWVudEVsZW1lbnQsXG4gICAgICAgIHJvb3ROYW1lICAgICA9IHJvb3QudGFnTmFtZSxcbiAgICAgICAgY29uZiAgICAgICAgID0gbnVsbCxcbiAgICAgICAgbGV2ZWxzICAgICAgID0gW10sXG4gICAgICAgIGxldmVsLFxuICAgICAgICBpO1xuXG4gICAgaWYgKCByb290TmFtZSA9PSBcImltYWdlXCIgKSB7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbmYgPSB7XG4gICAgICAgICAgICAgICAgdHlwZTogICAgICAgIHJvb3QuZ2V0QXR0cmlidXRlKCBcInR5cGVcIiApLFxuICAgICAgICAgICAgICAgIGxldmVsczogICAgICBbXVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgbGV2ZWxzID0gcm9vdC5nZXRFbGVtZW50c0J5VGFnTmFtZSggXCJsZXZlbFwiICk7XG4gICAgICAgICAgICBmb3IgKCBpID0gMDsgaSA8IGxldmVscy5sZW5ndGg7IGkrKyApIHtcbiAgICAgICAgICAgICAgICBsZXZlbCA9IGxldmVsc1sgaSBdO1xuXG4gICAgICAgICAgICAgICAgY29uZi5sZXZlbHMgLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICB1cmw6ICAgIGxldmVsLmdldEF0dHJpYnV0ZSggXCJ1cmxcIiApLFxuICAgICAgICAgICAgICAgICAgICB3aWR0aDogIHBhcnNlSW50KCBsZXZlbC5nZXRBdHRyaWJ1dGUoIFwid2lkdGhcIiApLCAxMCApLFxuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IHBhcnNlSW50KCBsZXZlbC5nZXRBdHRyaWJ1dGUoIFwiaGVpZ2h0XCIgKSwgMTAgKVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gY29uZmlndXJlRnJvbU9iamVjdCggdGlsZVNvdXJjZSwgY29uZiApO1xuXG4gICAgICAgIH0gY2F0Y2ggKCBlICkge1xuICAgICAgICAgICAgdGhyb3cgKGUgaW5zdGFuY2VvZiBFcnJvcikgP1xuICAgICAgICAgICAgICAgIGUgOlxuICAgICAgICAgICAgICAgIG5ldyBFcnJvciggJ1Vua25vd24gZXJyb3IgcGFyc2luZyBMZWdhY3kgSW1hZ2UgUHlyYW1pZCBYTUwuJyApO1xuICAgICAgICB9XG4gICAgfSBlbHNlIGlmICggcm9vdE5hbWUgPT0gXCJjb2xsZWN0aW9uXCIgKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvciggJ0xlZ2FjeSBJbWFnZSBQeXJhbWlkIENvbGxlY3Rpb25zIG5vdCB5ZXQgc3VwcG9ydGVkLicgKTtcbiAgICB9IGVsc2UgaWYgKCByb290TmFtZSA9PSBcImVycm9yXCIgKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvciggJ0Vycm9yOiAnICsgeG1sRG9jICk7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKCAnVW5rbm93biBlbGVtZW50ICcgKyByb290TmFtZSApO1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAaW5uZXJcbiAqIEBmdW5jdGlvblxuICovXG5mdW5jdGlvbiBjb25maWd1cmVGcm9tT2JqZWN0KCB0aWxlU291cmNlLCBjb25maWd1cmF0aW9uICl7XG5cbiAgICByZXR1cm4gY29uZmlndXJhdGlvbi5sZXZlbHM7XG5cbn1cblxufSggT3BlblNlYWRyYWdvbiApKTtcblxuLypcbiAqIE9wZW5TZWFkcmFnb24gLSBJbWFnZVRpbGVTb3VyY2VcbiAqXG4gKiBDb3B5cmlnaHQgKEMpIDIwMDkgQ29kZVBsZXggRm91bmRhdGlvblxuICogQ29weXJpZ2h0IChDKSAyMDEwLTIwMTMgT3BlblNlYWRyYWdvbiBjb250cmlidXRvcnNcbiAqXG4gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmVcbiAqIG1ldDpcbiAqXG4gKiAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiAqICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAqXG4gKiAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0XG4gKiAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGVcbiAqICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cbiAqXG4gKiAtIE5laXRoZXIgdGhlIG5hbWUgb2YgQ29kZVBsZXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0c1xuICogICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbVxuICogICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuICpcbiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlNcbiAqIFwiQVMgSVNcIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1RcbiAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUlxuICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUXG4gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCxcbiAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRFxuICogVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUlxuICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkdcbiAqIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJU1xuICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4gKi9cblxuKGZ1bmN0aW9uICgkKSB7XG5cbiAgICAvKipcbiAgICAgKiBAY2xhc3MgSW1hZ2VUaWxlU291cmNlXG4gICAgICogQGNsYXNzZGVzYyBUaGUgSW1hZ2VUaWxlU291cmNlIGFsbG93cyBhIHNpbXBsZSBpbWFnZSB0byBiZSBsb2FkZWRcbiAgICAgKiBpbnRvIGFuIE9wZW5TZWFkcmFnb24gVmlld2VyLlxuICAgICAqIFRoZXJlIGFyZSAyIHdheXMgdG8gb3BlbiBhbiBJbWFnZVRpbGVTb3VyY2U6XG4gICAgICogMS4gdmlld2VyLm9wZW4oe3R5cGU6ICdpbWFnZScsIHVybDogZm9vVXJsfSk7XG4gICAgICogMi4gdmlld2VyLm9wZW4obmV3IE9wZW5TZWFkcmFnb24uSW1hZ2VUaWxlU291cmNlKHt1cmw6IGZvb1VybH0pKTtcbiAgICAgKlxuICAgICAqIFdpdGggdGhlIGZpcnN0IHN5bnRheCwgdGhlIGNyb3NzT3JpZ2luUG9saWN5LCBhamF4V2l0aENyZWRlbnRpYWxzIGFuZFxuICAgICAqIHVzZUNhbnZhcyBvcHRpb25zIGFyZSBpbmhlcml0ZWQgZnJvbSB0aGUgdmlld2VyIGlmIHRoZXkgYXJlIG5vdFxuICAgICAqIHNwZWNpZmllZCBkaXJlY3RseSBpbiB0aGUgb3B0aW9ucyBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgT3BlblNlYWRyYWdvblxuICAgICAqIEBleHRlbmRzIE9wZW5TZWFkcmFnb24uVGlsZVNvdXJjZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIE9wdGlvbnMgb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBvcHRpb25zLnVybCBVUkwgb2YgdGhlIGltYWdlXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5idWlsZFB5cmFtaWQ9dHJ1ZV0gSWYgc2V0IHRvIHRydWUgKGRlZmF1bHQpLCBhXG4gICAgICogcHlyYW1pZCB3aWxsIGJlIGJ1aWx0IGludGVybmFsbHkgdG8gcHJvdmlkZSBhIGJldHRlciBkb3duc2FtcGxpbmcuXG4gICAgICogQHBhcmFtIHtTdHJpbmd8Qm9vbGVhbn0gW29wdGlvbnMuY3Jvc3NPcmlnaW5Qb2xpY3k9ZmFsc2VdIFZhbGlkIHZhbHVlcyBhcmVcbiAgICAgKiAnQW5vbnltb3VzJywgJ3VzZS1jcmVkZW50aWFscycsIGFuZCBmYWxzZS4gSWYgZmFsc2UsIGltYWdlIHJlcXVlc3RzIHdpbGxcbiAgICAgKiBub3QgdXNlIENPUlMgcHJldmVudGluZyBpbnRlcm5hbCBweXJhbWlkIGJ1aWxkaW5nIGZvciBpbWFnZXMgZnJvbSBvdGhlclxuICAgICAqIGRvbWFpbnMuXG4gICAgICogQHBhcmFtIHtTdHJpbmd8Qm9vbGVhbn0gW29wdGlvbnMuYWpheFdpdGhDcmVkZW50aWFscz1mYWxzZV0gV2hldGhlciB0byBzZXRcbiAgICAgKiB0aGUgd2l0aENyZWRlbnRpYWxzIFhIUiBmbGFnIGZvciBBSkFYIHJlcXVlc3RzICh3aGVuIGxvYWRpbmcgdGlsZSBzb3VyY2VzKS5cbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnVzZUNhbnZhcz10cnVlXSBTZXQgdG8gZmFsc2UgdG8gcHJldmVudCBhbnkgdXNlXG4gICAgICogb2YgdGhlIGNhbnZhcyBBUEkuXG4gICAgICovXG4gICAgJC5JbWFnZVRpbGVTb3VyY2UgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuXG4gICAgICAgIG9wdGlvbnMgPSAkLmV4dGVuZCh7XG4gICAgICAgICAgICBidWlsZFB5cmFtaWQ6IHRydWUsXG4gICAgICAgICAgICBjcm9zc09yaWdpblBvbGljeTogZmFsc2UsXG4gICAgICAgICAgICBhamF4V2l0aENyZWRlbnRpYWxzOiBmYWxzZSxcbiAgICAgICAgICAgIHVzZUNhbnZhczogdHJ1ZVxuICAgICAgICB9LCBvcHRpb25zKTtcbiAgICAgICAgJC5UaWxlU291cmNlLmFwcGx5KHRoaXMsIFtvcHRpb25zXSk7XG5cbiAgICB9O1xuXG4gICAgJC5leHRlbmQoJC5JbWFnZVRpbGVTb3VyY2UucHJvdG90eXBlLCAkLlRpbGVTb3VyY2UucHJvdG90eXBlLCAvKiogQGxlbmRzIE9wZW5TZWFkcmFnb24uSW1hZ2VUaWxlU291cmNlLnByb3RvdHlwZSAqL3tcbiAgICAgICAgLyoqXG4gICAgICAgICAqIERldGVybWluZSBpZiB0aGUgZGF0YSBhbmQvb3IgdXJsIGltcGx5IHRoZSBpbWFnZSBzZXJ2aWNlIGlzIHN1cHBvcnRlZCBieVxuICAgICAgICAgKiB0aGlzIHRpbGUgc291cmNlLlxuICAgICAgICAgKiBAZnVuY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8QXJyYXl9IGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IG9wdGlvbmFsIC0gdXJsXG4gICAgICAgICAqL1xuICAgICAgICBzdXBwb3J0czogZnVuY3Rpb24gKGRhdGEsIHVybCkge1xuICAgICAgICAgICAgcmV0dXJuIGRhdGEudHlwZSAmJiBkYXRhLnR5cGUgPT09IFwiaW1hZ2VcIjtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqXG4gICAgICAgICAqIEBmdW5jdGlvblxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIHRoZSBvcHRpb25zXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBkYXRhVXJsIC0gdGhlIHVybCB0aGUgaW1hZ2Ugd2FzIHJldHJlaXZlZCBmcm9tLCBpZiBhbnkuXG4gICAgICAgICAqIEByZXR1cm4ge09iamVjdH0gb3B0aW9ucyAtIEEgZGljdGlvbmFyeSBvZiBrZXl3b3JkIGFyZ3VtZW50cyBzdWZmaWNpZW50XG4gICAgICAgICAqICAgICAgdG8gY29uZmlndXJlIHRoaXMgdGlsZSBzb3VyY2VzIGNvbnN0cnVjdG9yLlxuICAgICAgICAgKi9cbiAgICAgICAgY29uZmlndXJlOiBmdW5jdGlvbiAob3B0aW9ucywgZGF0YVVybCkge1xuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnM7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXNwb25zaWJsZSBmb3IgcmV0cmlldmluZywgYW5kIGNhY2hpbmcgdGhlXG4gICAgICAgICAqIGltYWdlIG1ldGFkYXRhIHBlcnRpbmVudCB0byB0aGlzIFRpbGVTb3VyY2VzIGltcGxlbWVudGF0aW9uLlxuICAgICAgICAgKiBAZnVuY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHVybFxuICAgICAgICAgKiBAdGhyb3dzIHtFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGdldEltYWdlSW5mbzogZnVuY3Rpb24gKHVybCkge1xuICAgICAgICAgICAgdmFyIGltYWdlID0gdGhpcy5faW1hZ2UgPSBuZXcgSW1hZ2UoKTtcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmNyb3NzT3JpZ2luUG9saWN5KSB7XG4gICAgICAgICAgICAgICAgaW1hZ2UuY3Jvc3NPcmlnaW4gPSB0aGlzLmNyb3NzT3JpZ2luUG9saWN5O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuYWpheFdpdGhDcmVkZW50aWFscykge1xuICAgICAgICAgICAgICAgIGltYWdlLnVzZUNyZWRlbnRpYWxzID0gdGhpcy5hamF4V2l0aENyZWRlbnRpYWxzO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAkLmFkZEV2ZW50KGltYWdlLCAnbG9hZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy53aWR0aCA9IGltYWdlLm5hdHVyYWxXaWR0aDtcbiAgICAgICAgICAgICAgICBfdGhpcy5oZWlnaHQgPSBpbWFnZS5uYXR1cmFsSGVpZ2h0O1xuICAgICAgICAgICAgICAgIF90aGlzLmFzcGVjdFJhdGlvID0gX3RoaXMud2lkdGggLyBfdGhpcy5oZWlnaHQ7XG4gICAgICAgICAgICAgICAgX3RoaXMuZGltZW5zaW9ucyA9IG5ldyAkLlBvaW50KF90aGlzLndpZHRoLCBfdGhpcy5oZWlnaHQpO1xuICAgICAgICAgICAgICAgIF90aGlzLl90aWxlV2lkdGggPSBfdGhpcy53aWR0aDtcbiAgICAgICAgICAgICAgICBfdGhpcy5fdGlsZUhlaWdodCA9IF90aGlzLmhlaWdodDtcbiAgICAgICAgICAgICAgICBfdGhpcy50aWxlT3ZlcmxhcCA9IDA7XG4gICAgICAgICAgICAgICAgX3RoaXMubWluTGV2ZWwgPSAwO1xuICAgICAgICAgICAgICAgIF90aGlzLmxldmVscyA9IF90aGlzLl9idWlsZExldmVscygpO1xuICAgICAgICAgICAgICAgIF90aGlzLm1heExldmVsID0gX3RoaXMubGV2ZWxzLmxlbmd0aCAtIDE7XG5cbiAgICAgICAgICAgICAgICBfdGhpcy5yZWFkeSA9IHRydWU7XG5cbiAgICAgICAgICAgICAgICAvLyBOb3RlOiB0aGlzIGV2ZW50IGlzIGRvY3VtZW50ZWQgZWxzZXdoZXJlLCBpbiBUaWxlU291cmNlXG4gICAgICAgICAgICAgICAgX3RoaXMucmFpc2VFdmVudCgncmVhZHknLCB7dGlsZVNvdXJjZTogX3RoaXN9KTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAkLmFkZEV2ZW50KGltYWdlLCAnZXJyb3InLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgLy8gTm90ZTogdGhpcyBldmVudCBpcyBkb2N1bWVudGVkIGVsc2V3aGVyZSwgaW4gVGlsZVNvdXJjZVxuICAgICAgICAgICAgICAgIF90aGlzLnJhaXNlRXZlbnQoJ29wZW4tZmFpbGVkJywge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBcIkVycm9yIGxvYWRpbmcgaW1hZ2UgYXQgXCIgKyB1cmwsXG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZTogdXJsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaW1hZ2Uuc3JjID0gdXJsO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQGZ1bmN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7TnVtYmVyfSBsZXZlbFxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0TGV2ZWxTY2FsZTogZnVuY3Rpb24gKGxldmVsKSB7XG4gICAgICAgICAgICB2YXIgbGV2ZWxTY2FsZSA9IE5hTjtcbiAgICAgICAgICAgIGlmIChsZXZlbCA+PSB0aGlzLm1pbkxldmVsICYmIGxldmVsIDw9IHRoaXMubWF4TGV2ZWwpIHtcbiAgICAgICAgICAgICAgICBsZXZlbFNjYWxlID1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGV2ZWxzW2xldmVsXS53aWR0aCAvXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxldmVsc1t0aGlzLm1heExldmVsXS53aWR0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBsZXZlbFNjYWxlO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQGZ1bmN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7TnVtYmVyfSBsZXZlbFxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0TnVtVGlsZXM6IGZ1bmN0aW9uIChsZXZlbCkge1xuICAgICAgICAgICAgdmFyIHNjYWxlID0gdGhpcy5nZXRMZXZlbFNjYWxlKGxldmVsKTtcbiAgICAgICAgICAgIGlmIChzY2FsZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgJC5Qb2ludCgxLCAxKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyAkLlBvaW50KDAsIDApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQGZ1bmN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7TnVtYmVyfSBsZXZlbFxuICAgICAgICAgKiBAcGFyYW0ge09wZW5TZWFkcmFnb24uUG9pbnR9IHBvaW50XG4gICAgICAgICAqL1xuICAgICAgICBnZXRUaWxlQXRQb2ludDogZnVuY3Rpb24gKGxldmVsLCBwb2ludCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyAkLlBvaW50KDAsIDApO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0cmlldmVzIGEgdGlsZSB1cmxcbiAgICAgICAgICogQGZ1bmN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7TnVtYmVyfSBsZXZlbCBMZXZlbCBvZiB0aGUgdGlsZVxuICAgICAgICAgKiBAcGFyYW0ge051bWJlcn0geCB4IGNvb3JkaW5hdGUgb2YgdGhlIHRpbGVcbiAgICAgICAgICogQHBhcmFtIHtOdW1iZXJ9IHkgeSBjb29yZGluYXRlIG9mIHRoZSB0aWxlXG4gICAgICAgICAqL1xuICAgICAgICBnZXRUaWxlVXJsOiBmdW5jdGlvbiAobGV2ZWwsIHgsIHkpIHtcbiAgICAgICAgICAgIHZhciB1cmwgPSBudWxsO1xuICAgICAgICAgICAgaWYgKGxldmVsID49IHRoaXMubWluTGV2ZWwgJiYgbGV2ZWwgPD0gdGhpcy5tYXhMZXZlbCkge1xuICAgICAgICAgICAgICAgIHVybCA9IHRoaXMubGV2ZWxzW2xldmVsXS51cmw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdXJsO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0cmlldmVzIGEgdGlsZSBjb250ZXh0IDJEXG4gICAgICAgICAqIEBmdW5jdGlvblxuICAgICAgICAgKiBAcGFyYW0ge051bWJlcn0gbGV2ZWwgTGV2ZWwgb2YgdGhlIHRpbGVcbiAgICAgICAgICogQHBhcmFtIHtOdW1iZXJ9IHggeCBjb29yZGluYXRlIG9mIHRoZSB0aWxlXG4gICAgICAgICAqIEBwYXJhbSB7TnVtYmVyfSB5IHkgY29vcmRpbmF0ZSBvZiB0aGUgdGlsZVxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0Q29udGV4dDJEOiBmdW5jdGlvbiAobGV2ZWwsIHgsIHkpIHtcbiAgICAgICAgICAgIHZhciBjb250ZXh0ID0gbnVsbDtcbiAgICAgICAgICAgIGlmIChsZXZlbCA+PSB0aGlzLm1pbkxldmVsICYmIGxldmVsIDw9IHRoaXMubWF4TGV2ZWwpIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0ID0gdGhpcy5sZXZlbHNbbGV2ZWxdLmNvbnRleHQyRDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0O1xuICAgICAgICB9LFxuXG4gICAgICAgIC8vIHByaXZhdGVcbiAgICAgICAgLy9cbiAgICAgICAgLy8gQnVpbGRzIHRoZSBkaWZmZXJlbnRzIGxldmVscyBvZiB0aGUgcHlyYW1pZCBpZiBwb3NzaWJsZVxuICAgICAgICAvLyAoaS5lLiBpZiBjYW52YXMgQVBJIGVuYWJsZWQgYW5kIG5vIGNhbnZhcyB0YWludGluZyBpc3N1ZSkuXG4gICAgICAgIF9idWlsZExldmVsczogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGxldmVscyA9IFt7XG4gICAgICAgICAgICAgICAgICAgIHVybDogdGhpcy5faW1hZ2Uuc3JjLFxuICAgICAgICAgICAgICAgICAgICB3aWR0aDogdGhpcy5faW1hZ2UubmF0dXJhbFdpZHRoLFxuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IHRoaXMuX2ltYWdlLm5hdHVyYWxIZWlnaHRcbiAgICAgICAgICAgICAgICB9XTtcblxuICAgICAgICAgICAgaWYgKCF0aGlzLmJ1aWxkUHlyYW1pZCB8fCAhJC5zdXBwb3J0c0NhbnZhcyB8fCAhdGhpcy51c2VDYW52YXMpIHtcbiAgICAgICAgICAgICAgICAvLyBXZSBkb24ndCBuZWVkIHRoZSBpbWFnZSBhbnltb3JlLiBBbGxvd3MgaXQgdG8gYmUgR0MuXG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuX2ltYWdlO1xuICAgICAgICAgICAgICAgIHJldHVybiBsZXZlbHM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBjdXJyZW50V2lkdGggPSB0aGlzLl9pbWFnZS5uYXR1cmFsV2lkdGg7XG4gICAgICAgICAgICB2YXIgY3VycmVudEhlaWdodCA9IHRoaXMuX2ltYWdlLm5hdHVyYWxIZWlnaHQ7XG5cbiAgICAgICAgICAgIHZhciBiaWdDYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xuICAgICAgICAgICAgdmFyIGJpZ0NvbnRleHQgPSBiaWdDYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpO1xuXG4gICAgICAgICAgICBiaWdDYW52YXMud2lkdGggPSBjdXJyZW50V2lkdGg7XG4gICAgICAgICAgICBiaWdDYW52YXMuaGVpZ2h0ID0gY3VycmVudEhlaWdodDtcbiAgICAgICAgICAgIGJpZ0NvbnRleHQuZHJhd0ltYWdlKHRoaXMuX2ltYWdlLCAwLCAwLCBjdXJyZW50V2lkdGgsIGN1cnJlbnRIZWlnaHQpO1xuICAgICAgICAgICAgLy8gV2UgY2FjaGUgdGhlIGNvbnRleHQgb2YgdGhlIGhpZ2hlc3QgbGV2ZWwgYmVjYXVzZSB0aGUgYnJvd3NlclxuICAgICAgICAgICAgLy8gaXMgYSBsb3QgZmFzdGVyIGF0IGRvd25zYW1wbGluZyBzb21ldGhpbmcgaXQgYWxyZWFkeSBoYXNcbiAgICAgICAgICAgIC8vIGRvd25zYW1wbGVkIGJlZm9yZS5cbiAgICAgICAgICAgIGxldmVsc1swXS5jb250ZXh0MkQgPSBiaWdDb250ZXh0O1xuICAgICAgICAgICAgLy8gV2UgZG9uJ3QgbmVlZCB0aGUgaW1hZ2UgYW55bW9yZS4gQWxsb3dzIGl0IHRvIGJlIEdDLlxuICAgICAgICAgICAgZGVsZXRlIHRoaXMuX2ltYWdlO1xuXG4gICAgICAgICAgICBpZiAoJC5pc0NhbnZhc1RhaW50ZWQoYmlnQ2FudmFzKSkge1xuICAgICAgICAgICAgICAgIC8vIElmIHRoZSBjYW52YXMgaXMgdGFpbnRlZCwgd2UgY2FuJ3QgY29tcHV0ZSB0aGUgcHlyYW1pZC5cbiAgICAgICAgICAgICAgICByZXR1cm4gbGV2ZWxzO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBXZSBidWlsZCBzbWFsbGVyIGxldmVscyB1bnRpbCBlaXRoZXIgd2lkdGggb3IgaGVpZ2h0IGJlY29tZXNcbiAgICAgICAgICAgIC8vIDEgcGl4ZWwgd2lkZS5cbiAgICAgICAgICAgIHdoaWxlIChjdXJyZW50V2lkdGggPj0gMiAmJiBjdXJyZW50SGVpZ2h0ID49IDIpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50V2lkdGggPSBNYXRoLmZsb29yKGN1cnJlbnRXaWR0aCAvIDIpO1xuICAgICAgICAgICAgICAgIGN1cnJlbnRIZWlnaHQgPSBNYXRoLmZsb29yKGN1cnJlbnRIZWlnaHQgLyAyKTtcbiAgICAgICAgICAgICAgICB2YXIgc21hbGxDYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xuICAgICAgICAgICAgICAgIHZhciBzbWFsbENvbnRleHQgPSBzbWFsbENhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7XG4gICAgICAgICAgICAgICAgc21hbGxDYW52YXMud2lkdGggPSBjdXJyZW50V2lkdGg7XG4gICAgICAgICAgICAgICAgc21hbGxDYW52YXMuaGVpZ2h0ID0gY3VycmVudEhlaWdodDtcbiAgICAgICAgICAgICAgICBzbWFsbENvbnRleHQuZHJhd0ltYWdlKGJpZ0NhbnZhcywgMCwgMCwgY3VycmVudFdpZHRoLCBjdXJyZW50SGVpZ2h0KTtcblxuICAgICAgICAgICAgICAgIGxldmVscy5zcGxpY2UoMCwgMCwge1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0MkQ6IHNtYWxsQ29udGV4dCxcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IGN1cnJlbnRXaWR0aCxcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBjdXJyZW50SGVpZ2h0XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBiaWdDYW52YXMgPSBzbWFsbENhbnZhcztcbiAgICAgICAgICAgICAgICBiaWdDb250ZXh0ID0gc21hbGxDb250ZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGxldmVscztcbiAgICAgICAgfVxuICAgIH0pO1xuXG59KE9wZW5TZWFkcmFnb24pKTtcblxuLypcbiAqIE9wZW5TZWFkcmFnb24gLSBUaWxlU291cmNlQ29sbGVjdGlvblxuICpcbiAqIENvcHlyaWdodCAoQykgMjAwOSBDb2RlUGxleCBGb3VuZGF0aW9uXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMyBPcGVuU2VhZHJhZ29uIGNvbnRyaWJ1dG9yc1xuICpcbiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZVxuICogbWV0OlxuICpcbiAqIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuICogICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuICpcbiAqIC0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHRcbiAqICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZVxuICogICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuICpcbiAqIC0gTmVpdGhlciB0aGUgbmFtZSBvZiBDb2RlUGxleCBGb3VuZGF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzXG4gKiAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tXG4gKiAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4gKlxuICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SU1xuICogXCJBUyBJU1wiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVFxuICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SXG4gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFRcbiAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLFxuICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEXG4gKiBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SXG4gKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElOR1xuICogTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTXG4gKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiAqL1xuXG4oZnVuY3Rpb24oICQgKXtcblxuLy8gZGVwcmVjYXRlZFxuJC5UaWxlU291cmNlQ29sbGVjdGlvbiA9IGZ1bmN0aW9uKCB0aWxlU2l6ZSwgdGlsZVNvdXJjZXMsIHJvd3MsIGxheW91dCAgKSB7XG4gICAgJC5jb25zb2xlLmVycm9yKCdUaWxlU291cmNlQ29sbGVjdGlvbiBpcyBkZXByZWNhdGVkOyB1c2UgV29ybGQgaW5zdGVhZCcpO1xufTtcblxufSggT3BlblNlYWRyYWdvbiApKTtcblxuLypcbiAqIE9wZW5TZWFkcmFnb24gLSBCdXR0b25cbiAqXG4gKiBDb3B5cmlnaHQgKEMpIDIwMDkgQ29kZVBsZXggRm91bmRhdGlvblxuICogQ29weXJpZ2h0IChDKSAyMDEwLTIwMTMgT3BlblNlYWRyYWdvbiBjb250cmlidXRvcnNcbiAqXG4gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmVcbiAqIG1ldDpcbiAqXG4gKiAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiAqICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAqXG4gKiAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0XG4gKiAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGVcbiAqICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cbiAqXG4gKiAtIE5laXRoZXIgdGhlIG5hbWUgb2YgQ29kZVBsZXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0c1xuICogICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbVxuICogICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuICpcbiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlNcbiAqIFwiQVMgSVNcIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1RcbiAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUlxuICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUXG4gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCxcbiAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRFxuICogVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUlxuICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkdcbiAqIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJU1xuICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4gKi9cblxuKGZ1bmN0aW9uKCAkICl7XG5cbi8qKlxuICogQW4gZW51bWVyYXRpb24gb2YgYnV0dG9uIHN0YXRlc1xuICogQG1lbWJlciBCdXR0b25TdGF0ZVxuICogQG1lbWJlcm9mIE9wZW5TZWFkcmFnb25cbiAqIEBzdGF0aWNcbiAqIEB0eXBlIHtPYmplY3R9XG4gKiBAcHJvcGVydHkge051bWJlcn0gUkVTVFxuICogQHByb3BlcnR5IHtOdW1iZXJ9IEdST1VQXG4gKiBAcHJvcGVydHkge051bWJlcn0gSE9WRVJcbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBET1dOXG4gKi9cbiQuQnV0dG9uU3RhdGUgPSB7XG4gICAgUkVTVDogICAwLFxuICAgIEdST1VQOiAgMSxcbiAgICBIT1ZFUjogIDIsXG4gICAgRE9XTjogICAzXG59O1xuXG4vKipcbiAqIEBjbGFzcyBCdXR0b25cbiAqIEBjbGFzc2Rlc2MgTWFuYWdlcyBldmVudHMsIGhvdmVyIHN0YXRlcyBmb3IgaW5kaXZpZHVhbCBidXR0b25zLCB0b29sLXRpcHMsIGFzIHdlbGxcbiAqIGFzIGZhZGluZyB0aGUgYnV0dG9ucyBvdXQgd2hlbiB0aGUgdXNlciBoYXMgbm90IGludGVyYWN0ZWQgd2l0aCB0aGVtXG4gKiBmb3IgYSBzcGVjaWZpZWQgcGVyaW9kLlxuICpcbiAqIEBtZW1iZXJvZiBPcGVuU2VhZHJhZ29uXG4gKiBAZXh0ZW5kcyBPcGVuU2VhZHJhZ29uLkV2ZW50U291cmNlXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICogQHBhcmFtIHtFbGVtZW50fSBbb3B0aW9ucy5lbGVtZW50PW51bGxdIEVsZW1lbnQgdG8gdXNlIGFzIHRoZSBidXR0b24uIElmIG5vdCBzcGVjaWZpZWQsIGFuIEhUTUwgJmx0O2J1dHRvbiZndDsgZWxlbWVudCBpcyBjcmVhdGVkLlxuICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLnRvb2x0aXA9bnVsbF0gUHJvdmlkZXMgY29udGV4dCBoZWxwIGZvciB0aGUgYnV0dG9uIHdoZW4gdGhlXG4gKiAgdXNlciBob3ZlcnMgb3ZlciBpdC5cbiAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5zcmNSZXN0PW51bGxdIFVSTCBvZiBpbWFnZSB0byB1c2UgaW4gJ3Jlc3QnIHN0YXRlLlxuICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLnNyY0dyb3VwPW51bGxdIFVSTCBvZiBpbWFnZSB0byB1c2UgaW4gJ3VwJyBzdGF0ZS5cbiAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5zcmNIb3Zlcj1udWxsXSBVUkwgb2YgaW1hZ2UgdG8gdXNlIGluICdob3Zlcicgc3RhdGUuXG4gKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuc3JjRG93bj1udWxsXSBVUkwgb2YgaW1hZ2UgdG8gdXNlIGluICdkb3duJyBzdGF0ZS5cbiAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5mYWRlRGVsYXk9MF0gSG93IGxvbmcgdG8gd2FpdCBiZWZvcmUgZmFkaW5nLlxuICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmZhZGVMZW5ndGg9MjAwMF0gSG93IGxvbmcgc2hvdWxkIGl0IHRha2UgdG8gZmFkZSB0aGUgYnV0dG9uLlxuICogQHBhcmFtIHtPcGVuU2VhZHJhZ29uLkV2ZW50SGFuZGxlcn0gW29wdGlvbnMub25QcmVzcz1udWxsXSBFdmVudCBoYW5kbGVyIGNhbGxiYWNrIGZvciB7QGxpbmsgT3BlblNlYWRyYWdvbi5CdXR0b24uZXZlbnQ6cHJlc3N9LlxuICogQHBhcmFtIHtPcGVuU2VhZHJhZ29uLkV2ZW50SGFuZGxlcn0gW29wdGlvbnMub25SZWxlYXNlPW51bGxdIEV2ZW50IGhhbmRsZXIgY2FsbGJhY2sgZm9yIHtAbGluayBPcGVuU2VhZHJhZ29uLkJ1dHRvbi5ldmVudDpyZWxlYXNlfS5cbiAqIEBwYXJhbSB7T3BlblNlYWRyYWdvbi5FdmVudEhhbmRsZXJ9IFtvcHRpb25zLm9uQ2xpY2s9bnVsbF0gRXZlbnQgaGFuZGxlciBjYWxsYmFjayBmb3Ige0BsaW5rIE9wZW5TZWFkcmFnb24uQnV0dG9uLmV2ZW50OmNsaWNrfS5cbiAqIEBwYXJhbSB7T3BlblNlYWRyYWdvbi5FdmVudEhhbmRsZXJ9IFtvcHRpb25zLm9uRW50ZXI9bnVsbF0gRXZlbnQgaGFuZGxlciBjYWxsYmFjayBmb3Ige0BsaW5rIE9wZW5TZWFkcmFnb24uQnV0dG9uLmV2ZW50OmVudGVyfS5cbiAqIEBwYXJhbSB7T3BlblNlYWRyYWdvbi5FdmVudEhhbmRsZXJ9IFtvcHRpb25zLm9uRXhpdD1udWxsXSBFdmVudCBoYW5kbGVyIGNhbGxiYWNrIGZvciB7QGxpbmsgT3BlblNlYWRyYWdvbi5CdXR0b24uZXZlbnQ6ZXhpdH0uXG4gKiBAcGFyYW0ge09wZW5TZWFkcmFnb24uRXZlbnRIYW5kbGVyfSBbb3B0aW9ucy5vbkZvY3VzPW51bGxdIEV2ZW50IGhhbmRsZXIgY2FsbGJhY2sgZm9yIHtAbGluayBPcGVuU2VhZHJhZ29uLkJ1dHRvbi5ldmVudDpmb2N1c30uXG4gKiBAcGFyYW0ge09wZW5TZWFkcmFnb24uRXZlbnRIYW5kbGVyfSBbb3B0aW9ucy5vbkJsdXI9bnVsbF0gRXZlbnQgaGFuZGxlciBjYWxsYmFjayBmb3Ige0BsaW5rIE9wZW5TZWFkcmFnb24uQnV0dG9uLmV2ZW50OmJsdXJ9LlxuICovXG4kLkJ1dHRvbiA9IGZ1bmN0aW9uKCBvcHRpb25zICkge1xuXG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICQuRXZlbnRTb3VyY2UuY2FsbCggdGhpcyApO1xuXG4gICAgJC5leHRlbmQoIHRydWUsIHRoaXMsIHtcblxuICAgICAgICB0b29sdGlwOiAgICAgICAgICAgIG51bGwsXG4gICAgICAgIHNyY1Jlc3Q6ICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgc3JjR3JvdXA6ICAgICAgICAgICBudWxsLFxuICAgICAgICBzcmNIb3ZlcjogICAgICAgICAgIG51bGwsXG4gICAgICAgIHNyY0Rvd246ICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgY2xpY2tUaW1lVGhyZXNob2xkOiAkLkRFRkFVTFRfU0VUVElOR1MuY2xpY2tUaW1lVGhyZXNob2xkLFxuICAgICAgICBjbGlja0Rpc3RUaHJlc2hvbGQ6ICQuREVGQVVMVF9TRVRUSU5HUy5jbGlja0Rpc3RUaHJlc2hvbGQsXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBIb3cgbG9uZyB0byB3YWl0IGJlZm9yZSBmYWRpbmcuXG4gICAgICAgICAqIEBtZW1iZXIge051bWJlcn0gZmFkZURlbGF5XG4gICAgICAgICAqIEBtZW1iZXJvZiBPcGVuU2VhZHJhZ29uLkJ1dHRvbiNcbiAgICAgICAgICovXG4gICAgICAgIGZhZGVEZWxheTogICAgICAgICAgMCxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEhvdyBsb25nIHNob3VsZCBpdCB0YWtlIHRvIGZhZGUgdGhlIGJ1dHRvbi5cbiAgICAgICAgICogQG1lbWJlciB7TnVtYmVyfSBmYWRlTGVuZ3RoXG4gICAgICAgICAqIEBtZW1iZXJvZiBPcGVuU2VhZHJhZ29uLkJ1dHRvbiNcbiAgICAgICAgICovXG4gICAgICAgIGZhZGVMZW5ndGg6ICAgICAgICAgMjAwMCxcbiAgICAgICAgb25QcmVzczogICAgICAgICAgICBudWxsLFxuICAgICAgICBvblJlbGVhc2U6ICAgICAgICAgIG51bGwsXG4gICAgICAgIG9uQ2xpY2s6ICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgb25FbnRlcjogICAgICAgICAgICBudWxsLFxuICAgICAgICBvbkV4aXQ6ICAgICAgICAgICAgIG51bGwsXG4gICAgICAgIG9uRm9jdXM6ICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgb25CbHVyOiAgICAgICAgICAgICBudWxsXG5cbiAgICB9LCBvcHRpb25zICk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYnV0dG9uIGVsZW1lbnQuXG4gICAgICogQG1lbWJlciB7RWxlbWVudH0gZWxlbWVudFxuICAgICAqIEBtZW1iZXJvZiBPcGVuU2VhZHJhZ29uLkJ1dHRvbiNcbiAgICAgKi9cbiAgICB0aGlzLmVsZW1lbnQgICAgICAgID0gb3B0aW9ucy5lbGVtZW50ICAgfHwgJC5tYWtlTmV1dHJhbEVsZW1lbnQoIFwiZGl2XCIgKTtcblxuICAgIC8vaWYgdGhlIHVzZXIgaGFzIHNwZWNpZmllZCB0aGUgZWxlbWVudCB0byBiaW5kIHRoZSBjb250cm9sIHRvIGV4cGxpY2l0bHlcbiAgICAvL3RoZW4gZG8gbm90IGFkZCB0aGUgZGVmYXVsdCBjb250cm9sIGltYWdlc1xuICAgIGlmICggIW9wdGlvbnMuZWxlbWVudCApIHtcbiAgICAgICAgdGhpcy5pbWdSZXN0ICAgICAgPSAkLm1ha2VUcmFuc3BhcmVudEltYWdlKCB0aGlzLnNyY1Jlc3QgKTtcbiAgICAgICAgdGhpcy5pbWdHcm91cCAgICAgPSAkLm1ha2VUcmFuc3BhcmVudEltYWdlKCB0aGlzLnNyY0dyb3VwICk7XG4gICAgICAgIHRoaXMuaW1nSG92ZXIgICAgID0gJC5tYWtlVHJhbnNwYXJlbnRJbWFnZSggdGhpcy5zcmNIb3ZlciApO1xuICAgICAgICB0aGlzLmltZ0Rvd24gICAgICA9ICQubWFrZVRyYW5zcGFyZW50SW1hZ2UoIHRoaXMuc3JjRG93biApO1xuXG4gICAgICAgIHRoaXMuaW1nUmVzdC5hbHQgID1cbiAgICAgICAgdGhpcy5pbWdHcm91cC5hbHQgPVxuICAgICAgICB0aGlzLmltZ0hvdmVyLmFsdCA9XG4gICAgICAgIHRoaXMuaW1nRG93bi5hbHQgID1cbiAgICAgICAgICAgIHRoaXMudG9vbHRpcDtcblxuICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSBcInJlbGF0aXZlXCI7XG4gICAgICAgICQuc2V0RWxlbWVudFRvdWNoQWN0aW9uTm9uZSggdGhpcy5lbGVtZW50ICk7XG5cbiAgICAgICAgdGhpcy5pbWdHcm91cC5zdHlsZS5wb3NpdGlvbiA9XG4gICAgICAgIHRoaXMuaW1nSG92ZXIuc3R5bGUucG9zaXRpb24gPVxuICAgICAgICB0aGlzLmltZ0Rvd24uc3R5bGUucG9zaXRpb24gID1cbiAgICAgICAgICAgIFwiYWJzb2x1dGVcIjtcblxuICAgICAgICB0aGlzLmltZ0dyb3VwLnN0eWxlLnRvcCA9XG4gICAgICAgIHRoaXMuaW1nSG92ZXIuc3R5bGUudG9wID1cbiAgICAgICAgdGhpcy5pbWdEb3duLnN0eWxlLnRvcCAgPVxuICAgICAgICAgICAgXCIwcHhcIjtcblxuICAgICAgICB0aGlzLmltZ0dyb3VwLnN0eWxlLmxlZnQgPVxuICAgICAgICB0aGlzLmltZ0hvdmVyLnN0eWxlLmxlZnQgPVxuICAgICAgICB0aGlzLmltZ0Rvd24uc3R5bGUubGVmdCAgPVxuICAgICAgICAgICAgXCIwcHhcIjtcblxuICAgICAgICB0aGlzLmltZ0hvdmVyLnN0eWxlLnZpc2liaWxpdHkgPVxuICAgICAgICB0aGlzLmltZ0Rvd24uc3R5bGUudmlzaWJpbGl0eSAgPVxuICAgICAgICAgICAgXCJoaWRkZW5cIjtcblxuICAgICAgICBpZiAoICQuQnJvd3Nlci52ZW5kb3IgPT0gJC5CUk9XU0VSUy5GSVJFRk9YICAmJiAkLkJyb3dzZXIudmVyc2lvbiA8IDMgKXtcbiAgICAgICAgICAgIHRoaXMuaW1nR3JvdXAuc3R5bGUudG9wID1cbiAgICAgICAgICAgIHRoaXMuaW1nSG92ZXIuc3R5bGUudG9wID1cbiAgICAgICAgICAgIHRoaXMuaW1nRG93bi5zdHlsZS50b3AgID1cbiAgICAgICAgICAgICAgICBcIlwiO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKCB0aGlzLmltZ1Jlc3QgKTtcbiAgICAgICAgdGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKCB0aGlzLmltZ0dyb3VwICk7XG4gICAgICAgIHRoaXMuZWxlbWVudC5hcHBlbmRDaGlsZCggdGhpcy5pbWdIb3ZlciApO1xuICAgICAgICB0aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQoIHRoaXMuaW1nRG93biApO1xuICAgIH1cblxuXG4gICAgdGhpcy5hZGRIYW5kbGVyKCBcInByZXNzXCIsICAgICB0aGlzLm9uUHJlc3MgKTtcbiAgICB0aGlzLmFkZEhhbmRsZXIoIFwicmVsZWFzZVwiLCAgIHRoaXMub25SZWxlYXNlICk7XG4gICAgdGhpcy5hZGRIYW5kbGVyKCBcImNsaWNrXCIsICAgICB0aGlzLm9uQ2xpY2sgKTtcbiAgICB0aGlzLmFkZEhhbmRsZXIoIFwiZW50ZXJcIiwgICAgIHRoaXMub25FbnRlciApO1xuICAgIHRoaXMuYWRkSGFuZGxlciggXCJleGl0XCIsICAgICAgdGhpcy5vbkV4aXQgKTtcbiAgICB0aGlzLmFkZEhhbmRsZXIoIFwiZm9jdXNcIiwgICAgIHRoaXMub25Gb2N1cyApO1xuICAgIHRoaXMuYWRkSGFuZGxlciggXCJibHVyXCIsICAgICAgdGhpcy5vbkJsdXIgKTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBidXR0b24ncyBjdXJyZW50IHN0YXRlLlxuICAgICAqIEBtZW1iZXIge09wZW5TZWFkcmFnb24uQnV0dG9uU3RhdGV9IGN1cnJlbnRTdGF0ZVxuICAgICAqIEBtZW1iZXJvZiBPcGVuU2VhZHJhZ29uLkJ1dHRvbiNcbiAgICAgKi9cbiAgICB0aGlzLmN1cnJlbnRTdGF0ZSA9ICQuQnV0dG9uU3RhdGUuR1JPVVA7XG5cbiAgICAvLyBXaGVuIHRoZSBidXR0b24gbGFzdCBiZWdhbiB0byBmYWRlLlxuICAgIHRoaXMuZmFkZUJlZ2luVGltZSAgPSBudWxsO1xuICAgIC8vIFdoZXRoZXIgdGhpcyBidXR0b24gc2hvdWxkIGZhZGUgYWZ0ZXIgdXNlciBzdG9wcyBpbnRlcmFjdGluZyB3aXRoIHRoZSB2aWV3cG9ydC5cbiAgICB0aGlzLnNob3VsZEZhZGUgICAgID0gZmFsc2U7XG5cbiAgICB0aGlzLmVsZW1lbnQuc3R5bGUuZGlzcGxheSAgPSBcImlubGluZS1ibG9ja1wiO1xuICAgIHRoaXMuZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9IFwicmVsYXRpdmVcIjtcbiAgICB0aGlzLmVsZW1lbnQudGl0bGUgICAgICAgICAgPSB0aGlzLnRvb2x0aXA7XG5cbiAgICAvKipcbiAgICAgKiBUcmFja3MgbW91c2UvdG91Y2gva2V5IGV2ZW50cyBvbiB0aGUgYnV0dG9uLlxuICAgICAqIEBtZW1iZXIge09wZW5TZWFkcmFnb24uTW91c2VUcmFja2VyfSB0cmFja2VyXG4gICAgICogQG1lbWJlcm9mIE9wZW5TZWFkcmFnb24uQnV0dG9uI1xuICAgICAqL1xuICAgIHRoaXMudHJhY2tlciA9IG5ldyAkLk1vdXNlVHJhY2tlcih7XG5cbiAgICAgICAgZWxlbWVudDogICAgICAgICAgICB0aGlzLmVsZW1lbnQsXG4gICAgICAgIGNsaWNrVGltZVRocmVzaG9sZDogdGhpcy5jbGlja1RpbWVUaHJlc2hvbGQsXG4gICAgICAgIGNsaWNrRGlzdFRocmVzaG9sZDogdGhpcy5jbGlja0Rpc3RUaHJlc2hvbGQsXG5cbiAgICAgICAgZW50ZXJIYW5kbGVyOiBmdW5jdGlvbiggZXZlbnQgKSB7XG4gICAgICAgICAgICBpZiAoIGV2ZW50Lmluc2lkZUVsZW1lbnRQcmVzc2VkICkge1xuICAgICAgICAgICAgICAgIGluVG8oIF90aGlzLCAkLkJ1dHRvblN0YXRlLkRPV04gKTtcbiAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgKiBSYWlzZWQgd2hlbiB0aGUgY3Vyc29yIGVudGVycyB0aGUgQnV0dG9uIGVsZW1lbnQuXG4gICAgICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAgICAgKiBAZXZlbnQgZW50ZXJcbiAgICAgICAgICAgICAgICAgKiBAbWVtYmVyb2YgT3BlblNlYWRyYWdvbi5CdXR0b25cbiAgICAgICAgICAgICAgICAgKiBAdHlwZSB7b2JqZWN0fVxuICAgICAgICAgICAgICAgICAqIEBwcm9wZXJ0eSB7T3BlblNlYWRyYWdvbi5CdXR0b259IGV2ZW50U291cmNlIC0gQSByZWZlcmVuY2UgdG8gdGhlIEJ1dHRvbiB3aGljaCByYWlzZWQgdGhlIGV2ZW50LlxuICAgICAgICAgICAgICAgICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBvcmlnaW5hbEV2ZW50IC0gVGhlIG9yaWdpbmFsIERPTSBldmVudC5cbiAgICAgICAgICAgICAgICAgKiBAcHJvcGVydHkgez9PYmplY3R9IHVzZXJEYXRhIC0gQXJiaXRyYXJ5IHN1YnNjcmliZXItZGVmaW5lZCBvYmplY3QuXG4gICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgX3RoaXMucmFpc2VFdmVudCggXCJlbnRlclwiLCB7IG9yaWdpbmFsRXZlbnQ6IGV2ZW50Lm9yaWdpbmFsRXZlbnQgfSApO1xuICAgICAgICAgICAgfSBlbHNlIGlmICggIWV2ZW50LmJ1dHRvbkRvd25BbnkgKSB7XG4gICAgICAgICAgICAgICAgaW5UbyggX3RoaXMsICQuQnV0dG9uU3RhdGUuSE9WRVIgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBmb2N1c0hhbmRsZXI6IGZ1bmN0aW9uICggZXZlbnQgKSB7XG4gICAgICAgICAgICB0aGlzLmVudGVySGFuZGxlciggZXZlbnQgKTtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogUmFpc2VkIHdoZW4gdGhlIEJ1dHRvbiBlbGVtZW50IHJlY2VpdmVzIGZvY3VzLlxuICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAqIEBldmVudCBmb2N1c1xuICAgICAgICAgICAgICogQG1lbWJlcm9mIE9wZW5TZWFkcmFnb24uQnV0dG9uXG4gICAgICAgICAgICAgKiBAdHlwZSB7b2JqZWN0fVxuICAgICAgICAgICAgICogQHByb3BlcnR5IHtPcGVuU2VhZHJhZ29uLkJ1dHRvbn0gZXZlbnRTb3VyY2UgLSBBIHJlZmVyZW5jZSB0byB0aGUgQnV0dG9uIHdoaWNoIHJhaXNlZCB0aGUgZXZlbnQuXG4gICAgICAgICAgICAgKiBAcHJvcGVydHkge09iamVjdH0gb3JpZ2luYWxFdmVudCAtIFRoZSBvcmlnaW5hbCBET00gZXZlbnQuXG4gICAgICAgICAgICAgKiBAcHJvcGVydHkgez9PYmplY3R9IHVzZXJEYXRhIC0gQXJiaXRyYXJ5IHN1YnNjcmliZXItZGVmaW5lZCBvYmplY3QuXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIF90aGlzLnJhaXNlRXZlbnQoIFwiZm9jdXNcIiwgeyBvcmlnaW5hbEV2ZW50OiBldmVudC5vcmlnaW5hbEV2ZW50IH0gKTtcbiAgICAgICAgfSxcblxuICAgICAgICBleGl0SGFuZGxlcjogZnVuY3Rpb24oIGV2ZW50ICkge1xuICAgICAgICAgICAgb3V0VG8oIF90aGlzLCAkLkJ1dHRvblN0YXRlLkdST1VQICk7XG4gICAgICAgICAgICBpZiAoIGV2ZW50Lmluc2lkZUVsZW1lbnRQcmVzc2VkICkge1xuICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAqIFJhaXNlZCB3aGVuIHRoZSBjdXJzb3IgbGVhdmVzIHRoZSBCdXR0b24gZWxlbWVudC5cbiAgICAgICAgICAgICAgICAgKlxuICAgICAgICAgICAgICAgICAqIEBldmVudCBleGl0XG4gICAgICAgICAgICAgICAgICogQG1lbWJlcm9mIE9wZW5TZWFkcmFnb24uQnV0dG9uXG4gICAgICAgICAgICAgICAgICogQHR5cGUge29iamVjdH1cbiAgICAgICAgICAgICAgICAgKiBAcHJvcGVydHkge09wZW5TZWFkcmFnb24uQnV0dG9ufSBldmVudFNvdXJjZSAtIEEgcmVmZXJlbmNlIHRvIHRoZSBCdXR0b24gd2hpY2ggcmFpc2VkIHRoZSBldmVudC5cbiAgICAgICAgICAgICAgICAgKiBAcHJvcGVydHkge09iamVjdH0gb3JpZ2luYWxFdmVudCAtIFRoZSBvcmlnaW5hbCBET00gZXZlbnQuXG4gICAgICAgICAgICAgICAgICogQHByb3BlcnR5IHs/T2JqZWN0fSB1c2VyRGF0YSAtIEFyYml0cmFyeSBzdWJzY3JpYmVyLWRlZmluZWQgb2JqZWN0LlxuICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgIF90aGlzLnJhaXNlRXZlbnQoIFwiZXhpdFwiLCB7IG9yaWdpbmFsRXZlbnQ6IGV2ZW50Lm9yaWdpbmFsRXZlbnQgfSApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIGJsdXJIYW5kbGVyOiBmdW5jdGlvbiAoIGV2ZW50ICkge1xuICAgICAgICAgICAgdGhpcy5leGl0SGFuZGxlciggZXZlbnQgKTtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogUmFpc2VkIHdoZW4gdGhlIEJ1dHRvbiBlbGVtZW50IGxvc2VzIGZvY3VzLlxuICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAqIEBldmVudCBibHVyXG4gICAgICAgICAgICAgKiBAbWVtYmVyb2YgT3BlblNlYWRyYWdvbi5CdXR0b25cbiAgICAgICAgICAgICAqIEB0eXBlIHtvYmplY3R9XG4gICAgICAgICAgICAgKiBAcHJvcGVydHkge09wZW5TZWFkcmFnb24uQnV0dG9ufSBldmVudFNvdXJjZSAtIEEgcmVmZXJlbmNlIHRvIHRoZSBCdXR0b24gd2hpY2ggcmFpc2VkIHRoZSBldmVudC5cbiAgICAgICAgICAgICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBvcmlnaW5hbEV2ZW50IC0gVGhlIG9yaWdpbmFsIERPTSBldmVudC5cbiAgICAgICAgICAgICAqIEBwcm9wZXJ0eSB7P09iamVjdH0gdXNlckRhdGEgLSBBcmJpdHJhcnkgc3Vic2NyaWJlci1kZWZpbmVkIG9iamVjdC5cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgX3RoaXMucmFpc2VFdmVudCggXCJibHVyXCIsIHsgb3JpZ2luYWxFdmVudDogZXZlbnQub3JpZ2luYWxFdmVudCB9ICk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgcHJlc3NIYW5kbGVyOiBmdW5jdGlvbiAoIGV2ZW50ICkge1xuICAgICAgICAgICAgaW5UbyggX3RoaXMsICQuQnV0dG9uU3RhdGUuRE9XTiApO1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBSYWlzZWQgd2hlbiBhIG1vdXNlIGJ1dHRvbiBpcyBwcmVzc2VkIG9yIHRvdWNoIG9jY3VycyBpbiB0aGUgQnV0dG9uIGVsZW1lbnQuXG4gICAgICAgICAgICAgKlxuICAgICAgICAgICAgICogQGV2ZW50IHByZXNzXG4gICAgICAgICAgICAgKiBAbWVtYmVyb2YgT3BlblNlYWRyYWdvbi5CdXR0b25cbiAgICAgICAgICAgICAqIEB0eXBlIHtvYmplY3R9XG4gICAgICAgICAgICAgKiBAcHJvcGVydHkge09wZW5TZWFkcmFnb24uQnV0dG9ufSBldmVudFNvdXJjZSAtIEEgcmVmZXJlbmNlIHRvIHRoZSBCdXR0b24gd2hpY2ggcmFpc2VkIHRoZSBldmVudC5cbiAgICAgICAgICAgICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBvcmlnaW5hbEV2ZW50IC0gVGhlIG9yaWdpbmFsIERPTSBldmVudC5cbiAgICAgICAgICAgICAqIEBwcm9wZXJ0eSB7P09iamVjdH0gdXNlckRhdGEgLSBBcmJpdHJhcnkgc3Vic2NyaWJlci1kZWZpbmVkIG9iamVjdC5cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgX3RoaXMucmFpc2VFdmVudCggXCJwcmVzc1wiLCB7IG9yaWdpbmFsRXZlbnQ6IGV2ZW50Lm9yaWdpbmFsRXZlbnQgfSApO1xuICAgICAgICB9LFxuXG4gICAgICAgIHJlbGVhc2VIYW5kbGVyOiBmdW5jdGlvbiggZXZlbnQgKSB7XG4gICAgICAgICAgICBpZiAoIGV2ZW50Lmluc2lkZUVsZW1lbnRQcmVzc2VkICYmIGV2ZW50Lmluc2lkZUVsZW1lbnRSZWxlYXNlZCApIHtcbiAgICAgICAgICAgICAgICBvdXRUbyggX3RoaXMsICQuQnV0dG9uU3RhdGUuSE9WRVIgKTtcbiAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgKiBSYWlzZWQgd2hlbiB0aGUgbW91c2UgYnV0dG9uIGlzIHJlbGVhc2VkIG9yIHRvdWNoIGVuZHMgaW4gdGhlIEJ1dHRvbiBlbGVtZW50LlxuICAgICAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgICAgICogQGV2ZW50IHJlbGVhc2VcbiAgICAgICAgICAgICAgICAgKiBAbWVtYmVyb2YgT3BlblNlYWRyYWdvbi5CdXR0b25cbiAgICAgICAgICAgICAgICAgKiBAdHlwZSB7b2JqZWN0fVxuICAgICAgICAgICAgICAgICAqIEBwcm9wZXJ0eSB7T3BlblNlYWRyYWdvbi5CdXR0b259IGV2ZW50U291cmNlIC0gQSByZWZlcmVuY2UgdG8gdGhlIEJ1dHRvbiB3aGljaCByYWlzZWQgdGhlIGV2ZW50LlxuICAgICAgICAgICAgICAgICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBvcmlnaW5hbEV2ZW50IC0gVGhlIG9yaWdpbmFsIERPTSBldmVudC5cbiAgICAgICAgICAgICAgICAgKiBAcHJvcGVydHkgez9PYmplY3R9IHVzZXJEYXRhIC0gQXJiaXRyYXJ5IHN1YnNjcmliZXItZGVmaW5lZCBvYmplY3QuXG4gICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgX3RoaXMucmFpc2VFdmVudCggXCJyZWxlYXNlXCIsIHsgb3JpZ2luYWxFdmVudDogZXZlbnQub3JpZ2luYWxFdmVudCB9ICk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCBldmVudC5pbnNpZGVFbGVtZW50UHJlc3NlZCApIHtcbiAgICAgICAgICAgICAgICBvdXRUbyggX3RoaXMsICQuQnV0dG9uU3RhdGUuR1JPVVAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaW5UbyggX3RoaXMsICQuQnV0dG9uU3RhdGUuSE9WRVIgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBjbGlja0hhbmRsZXI6IGZ1bmN0aW9uKCBldmVudCApIHtcbiAgICAgICAgICAgIGlmICggZXZlbnQucXVpY2sgKSB7XG4gICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICogUmFpc2VkIHdoZW4gYSBtb3VzZSBidXR0b24gaXMgcHJlc3NlZCBhbmQgcmVsZWFzZWQgb3IgdG91Y2ggaXMgaW5pdGlhdGVkIGFuZCBlbmRlZCBpbiB0aGUgQnV0dG9uIGVsZW1lbnQgd2l0aGluIHRoZSB0aW1lIGFuZCBkaXN0YW5jZSB0aHJlc2hvbGQuXG4gICAgICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAgICAgKiBAZXZlbnQgY2xpY2tcbiAgICAgICAgICAgICAgICAgKiBAbWVtYmVyb2YgT3BlblNlYWRyYWdvbi5CdXR0b25cbiAgICAgICAgICAgICAgICAgKiBAdHlwZSB7b2JqZWN0fVxuICAgICAgICAgICAgICAgICAqIEBwcm9wZXJ0eSB7T3BlblNlYWRyYWdvbi5CdXR0b259IGV2ZW50U291cmNlIC0gQSByZWZlcmVuY2UgdG8gdGhlIEJ1dHRvbiB3aGljaCByYWlzZWQgdGhlIGV2ZW50LlxuICAgICAgICAgICAgICAgICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBvcmlnaW5hbEV2ZW50IC0gVGhlIG9yaWdpbmFsIERPTSBldmVudC5cbiAgICAgICAgICAgICAgICAgKiBAcHJvcGVydHkgez9PYmplY3R9IHVzZXJEYXRhIC0gQXJiaXRyYXJ5IHN1YnNjcmliZXItZGVmaW5lZCBvYmplY3QuXG4gICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgX3RoaXMucmFpc2VFdmVudChcImNsaWNrXCIsIHsgb3JpZ2luYWxFdmVudDogZXZlbnQub3JpZ2luYWxFdmVudCB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBrZXlIYW5kbGVyOiBmdW5jdGlvbiggZXZlbnQgKXtcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coIFwiJXMgOiBoYW5kbGluZyBrZXkgJXMhXCIsIF90aGlzLnRvb2x0aXAsIGV2ZW50LmtleUNvZGUpO1xuICAgICAgICAgICAgaWYoIDEzID09PSBldmVudC5rZXlDb2RlICl7XG4gICAgICAgICAgICAgICAgLyoqKlxuICAgICAgICAgICAgICAgICAqIFJhaXNlZCB3aGVuIGEgbW91c2UgYnV0dG9uIGlzIHByZXNzZWQgYW5kIHJlbGVhc2VkIG9yIHRvdWNoIGlzIGluaXRpYXRlZCBhbmQgZW5kZWQgaW4gdGhlIEJ1dHRvbiBlbGVtZW50IHdpdGhpbiB0aGUgdGltZSBhbmQgZGlzdGFuY2UgdGhyZXNob2xkLlxuICAgICAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgICAgICogQGV2ZW50IGNsaWNrXG4gICAgICAgICAgICAgICAgICogQG1lbWJlcm9mIE9wZW5TZWFkcmFnb24uQnV0dG9uXG4gICAgICAgICAgICAgICAgICogQHR5cGUge29iamVjdH1cbiAgICAgICAgICAgICAgICAgKiBAcHJvcGVydHkge09wZW5TZWFkcmFnb24uQnV0dG9ufSBldmVudFNvdXJjZSAtIEEgcmVmZXJlbmNlIHRvIHRoZSBCdXR0b24gd2hpY2ggcmFpc2VkIHRoZSBldmVudC5cbiAgICAgICAgICAgICAgICAgKiBAcHJvcGVydHkge09iamVjdH0gb3JpZ2luYWxFdmVudCAtIFRoZSBvcmlnaW5hbCBET00gZXZlbnQuXG4gICAgICAgICAgICAgICAgICogQHByb3BlcnR5IHs/T2JqZWN0fSB1c2VyRGF0YSAtIEFyYml0cmFyeSBzdWJzY3JpYmVyLWRlZmluZWQgb2JqZWN0LlxuICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgIF90aGlzLnJhaXNlRXZlbnQoIFwiY2xpY2tcIiwgeyBvcmlnaW5hbEV2ZW50OiBldmVudC5vcmlnaW5hbEV2ZW50IH0gKTtcbiAgICAgICAgICAgICAgICAvKioqXG4gICAgICAgICAgICAgICAgICogUmFpc2VkIHdoZW4gdGhlIG1vdXNlIGJ1dHRvbiBpcyByZWxlYXNlZCBvciB0b3VjaCBlbmRzIGluIHRoZSBCdXR0b24gZWxlbWVudC5cbiAgICAgICAgICAgICAgICAgKlxuICAgICAgICAgICAgICAgICAqIEBldmVudCByZWxlYXNlXG4gICAgICAgICAgICAgICAgICogQG1lbWJlcm9mIE9wZW5TZWFkcmFnb24uQnV0dG9uXG4gICAgICAgICAgICAgICAgICogQHR5cGUge29iamVjdH1cbiAgICAgICAgICAgICAgICAgKiBAcHJvcGVydHkge09wZW5TZWFkcmFnb24uQnV0dG9ufSBldmVudFNvdXJjZSAtIEEgcmVmZXJlbmNlIHRvIHRoZSBCdXR0b24gd2hpY2ggcmFpc2VkIHRoZSBldmVudC5cbiAgICAgICAgICAgICAgICAgKiBAcHJvcGVydHkge09iamVjdH0gb3JpZ2luYWxFdmVudCAtIFRoZSBvcmlnaW5hbCBET00gZXZlbnQuXG4gICAgICAgICAgICAgICAgICogQHByb3BlcnR5IHs/T2JqZWN0fSB1c2VyRGF0YSAtIEFyYml0cmFyeSBzdWJzY3JpYmVyLWRlZmluZWQgb2JqZWN0LlxuICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgIF90aGlzLnJhaXNlRXZlbnQoIFwicmVsZWFzZVwiLCB7IG9yaWdpbmFsRXZlbnQ6IGV2ZW50Lm9yaWdpbmFsRXZlbnQgfSApO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICB9KTtcblxuICAgIG91dFRvKCB0aGlzLCAkLkJ1dHRvblN0YXRlLlJFU1QgKTtcbn07XG5cbiQuZXh0ZW5kKCAkLkJ1dHRvbi5wcm90b3R5cGUsICQuRXZlbnRTb3VyY2UucHJvdG90eXBlLCAvKiogQGxlbmRzIE9wZW5TZWFkcmFnb24uQnV0dG9uLnByb3RvdHlwZSAqL3tcblxuICAgIC8qKlxuICAgICAqIFRPRE86IERldGVybWluZSB3aGF0IHRoaXMgZnVuY3Rpb24gaXMgaW50ZW5kZWQgdG8gZG8gYW5kIGlmIGl0J3MgYWN0dWFsbHlcbiAgICAgKiB1c2VmdWwgYXMgYW4gQVBJIHBvaW50LlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqL1xuICAgIG5vdGlmeUdyb3VwRW50ZXI6IGZ1bmN0aW9uKCkge1xuICAgICAgICBpblRvKCB0aGlzLCAkLkJ1dHRvblN0YXRlLkdST1VQICk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFRPRE86IERldGVybWluZSB3aGF0IHRoaXMgZnVuY3Rpb24gaXMgaW50ZW5kZWQgdG8gZG8gYW5kIGlmIGl0J3MgYWN0dWFsbHlcbiAgICAgKiB1c2VmdWwgYXMgYW4gQVBJIHBvaW50LlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqL1xuICAgIG5vdGlmeUdyb3VwRXhpdDogZnVuY3Rpb24oKSB7XG4gICAgICAgIG91dFRvKCB0aGlzLCAkLkJ1dHRvblN0YXRlLlJFU1QgKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICovXG4gICAgZGlzYWJsZTogZnVuY3Rpb24oKXtcbiAgICAgICAgdGhpcy5ub3RpZnlHcm91cEV4aXQoKTtcbiAgICAgICAgdGhpcy5lbGVtZW50LmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgJC5zZXRFbGVtZW50T3BhY2l0eSggdGhpcy5lbGVtZW50LCAwLjIsIHRydWUgKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICovXG4gICAgZW5hYmxlOiBmdW5jdGlvbigpe1xuICAgICAgICB0aGlzLmVsZW1lbnQuZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgJC5zZXRFbGVtZW50T3BhY2l0eSggdGhpcy5lbGVtZW50LCAxLjAsIHRydWUgKTtcbiAgICAgICAgdGhpcy5ub3RpZnlHcm91cEVudGVyKCk7XG4gICAgfVxuXG59KTtcblxuXG5mdW5jdGlvbiBzY2hlZHVsZUZhZGUoIGJ1dHRvbiApIHtcbiAgICAkLnJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpe1xuICAgICAgICB1cGRhdGVGYWRlKCBidXR0b24gKTtcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlRmFkZSggYnV0dG9uICkge1xuICAgIHZhciBjdXJyZW50VGltZSxcbiAgICAgICAgZGVsdGFUaW1lLFxuICAgICAgICBvcGFjaXR5O1xuXG4gICAgaWYgKCBidXR0b24uc2hvdWxkRmFkZSApIHtcbiAgICAgICAgY3VycmVudFRpbWUgPSAkLm5vdygpO1xuICAgICAgICBkZWx0YVRpbWUgICA9IGN1cnJlbnRUaW1lIC0gYnV0dG9uLmZhZGVCZWdpblRpbWU7XG4gICAgICAgIG9wYWNpdHkgICAgID0gMS4wIC0gZGVsdGFUaW1lIC8gYnV0dG9uLmZhZGVMZW5ndGg7XG4gICAgICAgIG9wYWNpdHkgICAgID0gTWF0aC5taW4oIDEuMCwgb3BhY2l0eSApO1xuICAgICAgICBvcGFjaXR5ICAgICA9IE1hdGgubWF4KCAwLjAsIG9wYWNpdHkgKTtcblxuICAgICAgICBpZiggYnV0dG9uLmltZ0dyb3VwICl7XG4gICAgICAgICAgICAkLnNldEVsZW1lbnRPcGFjaXR5KCBidXR0b24uaW1nR3JvdXAsIG9wYWNpdHksIHRydWUgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIG9wYWNpdHkgPiAwICkge1xuICAgICAgICAgICAgLy8gZmFkZSBhZ2FpblxuICAgICAgICAgICAgc2NoZWR1bGVGYWRlKCBidXR0b24gKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gYmVnaW5GYWRpbmcoIGJ1dHRvbiApIHtcbiAgICBidXR0b24uc2hvdWxkRmFkZSA9IHRydWU7XG4gICAgYnV0dG9uLmZhZGVCZWdpblRpbWUgPSAkLm5vdygpICsgYnV0dG9uLmZhZGVEZWxheTtcbiAgICB3aW5kb3cuc2V0VGltZW91dCggZnVuY3Rpb24oKXtcbiAgICAgICAgc2NoZWR1bGVGYWRlKCBidXR0b24gKTtcbiAgICB9LCBidXR0b24uZmFkZURlbGF5ICk7XG59XG5cbmZ1bmN0aW9uIHN0b3BGYWRpbmcoIGJ1dHRvbiApIHtcbiAgICBidXR0b24uc2hvdWxkRmFkZSA9IGZhbHNlO1xuICAgIGlmKCBidXR0b24uaW1nR3JvdXAgKXtcbiAgICAgICAgJC5zZXRFbGVtZW50T3BhY2l0eSggYnV0dG9uLmltZ0dyb3VwLCAxLjAsIHRydWUgKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGluVG8oIGJ1dHRvbiwgbmV3U3RhdGUgKSB7XG5cbiAgICBpZiggYnV0dG9uLmVsZW1lbnQuZGlzYWJsZWQgKXtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICggbmV3U3RhdGUgPj0gJC5CdXR0b25TdGF0ZS5HUk9VUCAmJlxuICAgICAgICAgYnV0dG9uLmN1cnJlbnRTdGF0ZSA9PSAkLkJ1dHRvblN0YXRlLlJFU1QgKSB7XG4gICAgICAgIHN0b3BGYWRpbmcoIGJ1dHRvbiApO1xuICAgICAgICBidXR0b24uY3VycmVudFN0YXRlID0gJC5CdXR0b25TdGF0ZS5HUk9VUDtcbiAgICB9XG5cbiAgICBpZiAoIG5ld1N0YXRlID49ICQuQnV0dG9uU3RhdGUuSE9WRVIgJiZcbiAgICAgICAgIGJ1dHRvbi5jdXJyZW50U3RhdGUgPT0gJC5CdXR0b25TdGF0ZS5HUk9VUCApIHtcbiAgICAgICAgaWYoIGJ1dHRvbi5pbWdIb3ZlciApe1xuICAgICAgICAgICAgYnV0dG9uLmltZ0hvdmVyLnN0eWxlLnZpc2liaWxpdHkgPSBcIlwiO1xuICAgICAgICB9XG4gICAgICAgIGJ1dHRvbi5jdXJyZW50U3RhdGUgPSAkLkJ1dHRvblN0YXRlLkhPVkVSO1xuICAgIH1cblxuICAgIGlmICggbmV3U3RhdGUgPj0gJC5CdXR0b25TdGF0ZS5ET1dOICYmXG4gICAgICAgICBidXR0b24uY3VycmVudFN0YXRlID09ICQuQnV0dG9uU3RhdGUuSE9WRVIgKSB7XG4gICAgICAgIGlmKCBidXR0b24uaW1nRG93biApe1xuICAgICAgICAgICAgYnV0dG9uLmltZ0Rvd24uc3R5bGUudmlzaWJpbGl0eSA9IFwiXCI7XG4gICAgICAgIH1cbiAgICAgICAgYnV0dG9uLmN1cnJlbnRTdGF0ZSA9ICQuQnV0dG9uU3RhdGUuRE9XTjtcbiAgICB9XG59XG5cblxuZnVuY3Rpb24gb3V0VG8oIGJ1dHRvbiwgbmV3U3RhdGUgKSB7XG5cbiAgICBpZiggYnV0dG9uLmVsZW1lbnQuZGlzYWJsZWQgKXtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICggbmV3U3RhdGUgPD0gJC5CdXR0b25TdGF0ZS5IT1ZFUiAmJlxuICAgICAgICAgYnV0dG9uLmN1cnJlbnRTdGF0ZSA9PSAkLkJ1dHRvblN0YXRlLkRPV04gKSB7XG4gICAgICAgIGlmKCBidXR0b24uaW1nRG93biApe1xuICAgICAgICAgICAgYnV0dG9uLmltZ0Rvd24uc3R5bGUudmlzaWJpbGl0eSA9IFwiaGlkZGVuXCI7XG4gICAgICAgIH1cbiAgICAgICAgYnV0dG9uLmN1cnJlbnRTdGF0ZSA9ICQuQnV0dG9uU3RhdGUuSE9WRVI7XG4gICAgfVxuXG4gICAgaWYgKCBuZXdTdGF0ZSA8PSAkLkJ1dHRvblN0YXRlLkdST1VQICYmXG4gICAgICAgICBidXR0b24uY3VycmVudFN0YXRlID09ICQuQnV0dG9uU3RhdGUuSE9WRVIgKSB7XG4gICAgICAgIGlmKCBidXR0b24uaW1nSG92ZXIgKXtcbiAgICAgICAgICAgIGJ1dHRvbi5pbWdIb3Zlci5zdHlsZS52aXNpYmlsaXR5ID0gXCJoaWRkZW5cIjtcbiAgICAgICAgfVxuICAgICAgICBidXR0b24uY3VycmVudFN0YXRlID0gJC5CdXR0b25TdGF0ZS5HUk9VUDtcbiAgICB9XG5cbiAgICBpZiAoIG5ld1N0YXRlIDw9ICQuQnV0dG9uU3RhdGUuUkVTVCAmJlxuICAgICAgICAgYnV0dG9uLmN1cnJlbnRTdGF0ZSA9PSAkLkJ1dHRvblN0YXRlLkdST1VQICkge1xuICAgICAgICBiZWdpbkZhZGluZyggYnV0dG9uICk7XG4gICAgICAgIGJ1dHRvbi5jdXJyZW50U3RhdGUgPSAkLkJ1dHRvblN0YXRlLlJFU1Q7XG4gICAgfVxufVxuXG5cblxufSggT3BlblNlYWRyYWdvbiApKTtcblxuLypcbiAqIE9wZW5TZWFkcmFnb24gLSBCdXR0b25Hcm91cFxuICpcbiAqIENvcHlyaWdodCAoQykgMjAwOSBDb2RlUGxleCBGb3VuZGF0aW9uXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMyBPcGVuU2VhZHJhZ29uIGNvbnRyaWJ1dG9yc1xuICpcbiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZVxuICogbWV0OlxuICpcbiAqIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuICogICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuICpcbiAqIC0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHRcbiAqICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZVxuICogICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuICpcbiAqIC0gTmVpdGhlciB0aGUgbmFtZSBvZiBDb2RlUGxleCBGb3VuZGF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzXG4gKiAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tXG4gKiAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4gKlxuICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SU1xuICogXCJBUyBJU1wiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVFxuICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SXG4gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFRcbiAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLFxuICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEXG4gKiBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SXG4gKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElOR1xuICogTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTXG4gKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiAqL1xuXG4oZnVuY3Rpb24oICQgKXtcbi8qKlxuICogQGNsYXNzIEJ1dHRvbkdyb3VwXG4gKiBAY2xhc3NkZXNjIE1hbmFnZXMgZXZlbnRzIG9uIGdyb3VwcyBvZiBidXR0b25zLlxuICpcbiAqIEBtZW1iZXJvZiBPcGVuU2VhZHJhZ29uXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIEEgZGljdGlvbmFyeSBvZiBzZXR0aW5ncyBhcHBsaWVkIGFnYWluc3QgdGhlIGVudGlyZSBncm91cCBvZiBidXR0b25zLlxuICogQHBhcmFtIHtBcnJheX0gb3B0aW9ucy5idXR0b25zIEFycmF5IG9mIGJ1dHRvbnNcbiAqIEBwYXJhbSB7RWxlbWVudH0gW29wdGlvbnMuZWxlbWVudF0gRWxlbWVudCB0byB1c2UgYXMgdGhlIGNvbnRhaW5lclxuICoqL1xuJC5CdXR0b25Hcm91cCA9IGZ1bmN0aW9uKCBvcHRpb25zICkge1xuXG4gICAgJC5leHRlbmQoIHRydWUsIHRoaXMsIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGJ1dHRvbnMgdGhlbXNlbHZlcy5cbiAgICAgICAgICogQG1lbWJlciB7QXJyYXl9IGJ1dHRvbnNcbiAgICAgICAgICogQG1lbWJlcm9mIE9wZW5TZWFkcmFnb24uQnV0dG9uR3JvdXAjXG4gICAgICAgICAqL1xuICAgICAgICBidXR0b25zOiAgICAgICAgICAgIFtdLFxuICAgICAgICBjbGlja1RpbWVUaHJlc2hvbGQ6ICQuREVGQVVMVF9TRVRUSU5HUy5jbGlja1RpbWVUaHJlc2hvbGQsXG4gICAgICAgIGNsaWNrRGlzdFRocmVzaG9sZDogJC5ERUZBVUxUX1NFVFRJTkdTLmNsaWNrRGlzdFRocmVzaG9sZCxcbiAgICAgICAgbGFiZWxUZXh0OiAgICAgICAgICBcIlwiXG4gICAgfSwgb3B0aW9ucyApO1xuXG4gICAgLy8gY29weSB0aGUgYnV0dG9uIGVsZW1lbnRzICBUT0RPOiBXaHk/XG4gICAgdmFyIGJ1dHRvbnMgPSB0aGlzLmJ1dHRvbnMuY29uY2F0KFtdKSxcbiAgICAgICAgX3RoaXMgPSB0aGlzLFxuICAgICAgICBpO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHNoYXJlZCBjb250YWluZXIgZm9yIHRoZSBidXR0b25zLlxuICAgICAqIEBtZW1iZXIge0VsZW1lbnR9IGVsZW1lbnRcbiAgICAgKiBAbWVtYmVyb2YgT3BlblNlYWRyYWdvbi5CdXR0b25Hcm91cCNcbiAgICAgKi9cbiAgICB0aGlzLmVsZW1lbnQgPSBvcHRpb25zLmVsZW1lbnQgfHwgJC5tYWtlTmV1dHJhbEVsZW1lbnQoIFwiZGl2XCIgKTtcblxuICAgIC8vIFRPRE8gV2hhdCBpZiB0aGVyZSBJUyBhbiBvcHRpb25zLmdyb3VwIHNwZWNpZmllZD9cbiAgICBpZiggIW9wdGlvbnMuZ3JvdXAgKXtcbiAgICAgICAgdGhpcy5sYWJlbCAgID0gJC5tYWtlTmV1dHJhbEVsZW1lbnQoIFwibGFiZWxcIiApO1xuICAgICAgICAvL1RPRE86IHN1cHBvcnQgbGFiZWxzIGZvciBCdXR0b25Hcm91cHNcbiAgICAgICAgLy90aGlzLmxhYmVsLmlubmVySFRNTCA9IHRoaXMubGFiZWxUZXh0O1xuICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUuZGlzcGxheSA9IFwiaW5saW5lLWJsb2NrXCI7XG4gICAgICAgIHRoaXMuZWxlbWVudC5hcHBlbmRDaGlsZCggdGhpcy5sYWJlbCApO1xuICAgICAgICBmb3IgKCBpID0gMDsgaSA8IGJ1dHRvbnMubGVuZ3RoOyBpKysgKSB7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQoIGJ1dHRvbnNbIGkgXS5lbGVtZW50ICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAkLnNldEVsZW1lbnRUb3VjaEFjdGlvbk5vbmUoIHRoaXMuZWxlbWVudCApO1xuXG4gICAgLyoqXG4gICAgICogVHJhY2tzIG1vdXNlL3RvdWNoL2tleSBldmVudHMgYWNjcm9zcyB0aGUgZ3JvdXAgb2YgYnV0dG9ucy5cbiAgICAgKiBAbWVtYmVyIHtPcGVuU2VhZHJhZ29uLk1vdXNlVHJhY2tlcn0gdHJhY2tlclxuICAgICAqIEBtZW1iZXJvZiBPcGVuU2VhZHJhZ29uLkJ1dHRvbkdyb3VwI1xuICAgICAqL1xuICAgIHRoaXMudHJhY2tlciA9IG5ldyAkLk1vdXNlVHJhY2tlcih7XG4gICAgICAgIGVsZW1lbnQ6ICAgICAgICAgICAgdGhpcy5lbGVtZW50LFxuICAgICAgICBjbGlja1RpbWVUaHJlc2hvbGQ6IHRoaXMuY2xpY2tUaW1lVGhyZXNob2xkLFxuICAgICAgICBjbGlja0Rpc3RUaHJlc2hvbGQ6IHRoaXMuY2xpY2tEaXN0VGhyZXNob2xkLFxuICAgICAgICBlbnRlckhhbmRsZXI6IGZ1bmN0aW9uICggZXZlbnQgKSB7XG4gICAgICAgICAgICB2YXIgaTtcbiAgICAgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgX3RoaXMuYnV0dG9ucy5sZW5ndGg7IGkrKyApIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5idXR0b25zWyBpIF0ubm90aWZ5R3JvdXBFbnRlcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBleGl0SGFuZGxlcjogZnVuY3Rpb24gKCBldmVudCApIHtcbiAgICAgICAgICAgIHZhciBpO1xuICAgICAgICAgICAgaWYgKCAhZXZlbnQuaW5zaWRlRWxlbWVudFByZXNzZWQgKSB7XG4gICAgICAgICAgICAgICAgZm9yICggaSA9IDA7IGkgPCBfdGhpcy5idXR0b25zLmxlbmd0aDsgaSsrICkge1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy5idXR0b25zWyBpIF0ubm90aWZ5R3JvdXBFeGl0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgIH0pO1xufTtcblxuLyoqIEBsZW5kcyBPcGVuU2VhZHJhZ29uLkJ1dHRvbkdyb3VwLnByb3RvdHlwZSAqL1xuJC5CdXR0b25Hcm91cC5wcm90b3R5cGUgPSB7XG5cbiAgICAvKipcbiAgICAgKiBUT0RPOiBGaWd1cmUgb3V0IHdoeSB0aGlzIGlzIHVzZWQgb24gdGhlIHB1YmxpYyBBUEkgYW5kIGlmIGEgbW9yZSB1c2VmdWxcbiAgICAgKiBhcGkgY2FuIGJlIGNyZWF0ZWQuXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBlbXVsYXRlRW50ZXI6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLnRyYWNrZXIuZW50ZXJIYW5kbGVyKCB7IGV2ZW50U291cmNlOiB0aGlzLnRyYWNrZXIgfSApO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBUT0RPOiBGaWd1cmUgb3V0IHdoeSB0aGlzIGlzIHVzZWQgb24gdGhlIHB1YmxpYyBBUEkgYW5kIGlmIGEgbW9yZSB1c2VmdWxcbiAgICAgKiBhcGkgY2FuIGJlIGNyZWF0ZWQuXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBlbXVsYXRlRXhpdDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMudHJhY2tlci5leGl0SGFuZGxlciggeyBldmVudFNvdXJjZTogdGhpcy50cmFja2VyIH0gKTtcbiAgICB9XG59O1xuXG5cbn0oIE9wZW5TZWFkcmFnb24gKSk7XG5cbi8qXG4gKiBPcGVuU2VhZHJhZ29uIC0gUmVjdFxuICpcbiAqIENvcHlyaWdodCAoQykgMjAwOSBDb2RlUGxleCBGb3VuZGF0aW9uXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMyBPcGVuU2VhZHJhZ29uIGNvbnRyaWJ1dG9yc1xuICpcbiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZVxuICogbWV0OlxuICpcbiAqIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuICogICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuICpcbiAqIC0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHRcbiAqICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZVxuICogICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuICpcbiAqIC0gTmVpdGhlciB0aGUgbmFtZSBvZiBDb2RlUGxleCBGb3VuZGF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzXG4gKiAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tXG4gKiAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4gKlxuICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SU1xuICogXCJBUyBJU1wiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVFxuICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SXG4gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFRcbiAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLFxuICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEXG4gKiBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SXG4gKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElOR1xuICogTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTXG4gKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiAqL1xuXG4oZnVuY3Rpb24oJCkge1xuXG4vKipcbiAqIEBjbGFzcyBSZWN0XG4gKiBAY2xhc3NkZXNjIEEgUmVjdGFuZ2xlIGlzIGRlc2NyaWJlZCBieSBpdCB0b3AgbGVmdCBjb29yZGluYXRlcyAoeCwgeSksIHdpZHRoLFxuICogaGVpZ2h0IGFuZCBkZWdyZWVzIG9mIHJvdGF0aW9uIGFyb3VuZCAoeCwgeSkuXG4gKiBOb3RlIHRoYXQgdGhlIGNvb3JkaW5hdGUgc3lzdGVtIHVzZWQgaXMgdGhlIG9uZSBjb21tb25seSB1c2VkIHdpdGggaW1hZ2VzOlxuICogeCBpbmNyZWFzZXMgd2hlbiBnb2luZyB0byB0aGUgcmlnaHRcbiAqIHkgaW5jcmVhc2VzIHdoZW4gZ29pbmcgdG8gdGhlIGJvdHRvbVxuICogZGVncmVlcyBpbmNyZWFzZXMgY2xvY2t3aXNlIHdpdGggMCBiZWluZyB0aGUgaG9yaXpvbnRhbFxuICpcbiAqIFRoZSBjb25zdHJ1Y3RvciBub3JtYWxpemVzIHRoZSByZWN0YW5nbGUgdG8gYWx3YXlzIGhhdmUgMCA8PSBkZWdyZWVzIDwgOTBcbiAqXG4gKiBAbWVtYmVyb2YgT3BlblNlYWRyYWdvblxuICogQHBhcmFtIHtOdW1iZXJ9IFt4PTBdIFRoZSB2ZWN0b3IgY29tcG9uZW50ICd4Jy5cbiAqIEBwYXJhbSB7TnVtYmVyfSBbeT0wXSBUaGUgdmVjdG9yIGNvbXBvbmVudCAneScuXG4gKiBAcGFyYW0ge051bWJlcn0gW3dpZHRoPTBdIFRoZSB2ZWN0b3IgY29tcG9uZW50ICd3aWR0aCcuXG4gKiBAcGFyYW0ge051bWJlcn0gW2hlaWdodD0wXSBUaGUgdmVjdG9yIGNvbXBvbmVudCAnaGVpZ2h0Jy5cbiAqIEBwYXJhbSB7TnVtYmVyfSBbZGVncmVlcz0wXSBSb3RhdGlvbiBvZiB0aGUgcmVjdGFuZ2xlIGFyb3VuZCAoeCx5KSBpbiBkZWdyZWVzLlxuICovXG4kLlJlY3QgPSBmdW5jdGlvbih4LCB5LCB3aWR0aCwgaGVpZ2h0LCBkZWdyZWVzKSB7XG4gICAgLyoqXG4gICAgICogVGhlIHZlY3RvciBjb21wb25lbnQgJ3gnLlxuICAgICAqIEBtZW1iZXIge051bWJlcn0geFxuICAgICAqIEBtZW1iZXJvZiBPcGVuU2VhZHJhZ29uLlJlY3QjXG4gICAgICovXG4gICAgdGhpcy54ID0gdHlwZW9mKHgpID09PSBcIm51bWJlclwiID8geCA6IDA7XG4gICAgLyoqXG4gICAgICogVGhlIHZlY3RvciBjb21wb25lbnQgJ3knLlxuICAgICAqIEBtZW1iZXIge051bWJlcn0geVxuICAgICAqIEBtZW1iZXJvZiBPcGVuU2VhZHJhZ29uLlJlY3QjXG4gICAgICovXG4gICAgdGhpcy55ID0gdHlwZW9mKHkpID09PSBcIm51bWJlclwiID8geSA6IDA7XG4gICAgLyoqXG4gICAgICogVGhlIHZlY3RvciBjb21wb25lbnQgJ3dpZHRoJy5cbiAgICAgKiBAbWVtYmVyIHtOdW1iZXJ9IHdpZHRoXG4gICAgICogQG1lbWJlcm9mIE9wZW5TZWFkcmFnb24uUmVjdCNcbiAgICAgKi9cbiAgICB0aGlzLndpZHRoICA9IHR5cGVvZih3aWR0aCkgPT09IFwibnVtYmVyXCIgPyB3aWR0aCA6IDA7XG4gICAgLyoqXG4gICAgICogVGhlIHZlY3RvciBjb21wb25lbnQgJ2hlaWdodCcuXG4gICAgICogQG1lbWJlciB7TnVtYmVyfSBoZWlnaHRcbiAgICAgKiBAbWVtYmVyb2YgT3BlblNlYWRyYWdvbi5SZWN0I1xuICAgICAqL1xuICAgIHRoaXMuaGVpZ2h0ID0gdHlwZW9mKGhlaWdodCkgPT09IFwibnVtYmVyXCIgPyBoZWlnaHQgOiAwO1xuXG4gICAgdGhpcy5kZWdyZWVzID0gdHlwZW9mKGRlZ3JlZXMpID09PSBcIm51bWJlclwiID8gZGVncmVlcyA6IDA7XG5cbiAgICAvLyBOb3JtYWxpemVzIHRoZSByZWN0YW5nbGUuXG4gICAgdGhpcy5kZWdyZWVzID0gdGhpcy5kZWdyZWVzICUgMzYwO1xuICAgIGlmICh0aGlzLmRlZ3JlZXMgPCAwKSB7XG4gICAgICAgIHRoaXMuZGVncmVlcyArPSAzNjA7XG4gICAgfVxuICAgIHZhciBuZXdUb3BMZWZ0LCBuZXdXaWR0aDtcbiAgICBpZiAodGhpcy5kZWdyZWVzID49IDI3MCkge1xuICAgICAgICBuZXdUb3BMZWZ0ID0gdGhpcy5nZXRUb3BSaWdodCgpO1xuICAgICAgICB0aGlzLnggPSBuZXdUb3BMZWZ0Lng7XG4gICAgICAgIHRoaXMueSA9IG5ld1RvcExlZnQueTtcbiAgICAgICAgbmV3V2lkdGggPSB0aGlzLmhlaWdodDtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSB0aGlzLndpZHRoO1xuICAgICAgICB0aGlzLndpZHRoID0gbmV3V2lkdGg7XG4gICAgICAgIHRoaXMuZGVncmVlcyAtPSAyNzA7XG4gICAgfSBlbHNlIGlmICh0aGlzLmRlZ3JlZXMgPj0gMTgwKSB7XG4gICAgICAgIG5ld1RvcExlZnQgPSB0aGlzLmdldEJvdHRvbVJpZ2h0KCk7XG4gICAgICAgIHRoaXMueCA9IG5ld1RvcExlZnQueDtcbiAgICAgICAgdGhpcy55ID0gbmV3VG9wTGVmdC55O1xuICAgICAgICB0aGlzLmRlZ3JlZXMgLT0gMTgwO1xuICAgIH0gZWxzZSBpZiAodGhpcy5kZWdyZWVzID49IDkwKSB7XG4gICAgICAgIG5ld1RvcExlZnQgPSB0aGlzLmdldEJvdHRvbUxlZnQoKTtcbiAgICAgICAgdGhpcy54ID0gbmV3VG9wTGVmdC54O1xuICAgICAgICB0aGlzLnkgPSBuZXdUb3BMZWZ0Lnk7XG4gICAgICAgIG5ld1dpZHRoID0gdGhpcy5oZWlnaHQ7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gdGhpcy53aWR0aDtcbiAgICAgICAgdGhpcy53aWR0aCA9IG5ld1dpZHRoO1xuICAgICAgICB0aGlzLmRlZ3JlZXMgLT0gOTA7XG4gICAgfVxufTtcblxuLyoqXG4gKiBCdWlsZHMgYSByZWN0YW5nbGUgaGF2aW5nIHRoZSAzIHNwZWNpZmllZCBwb2ludHMgYXMgc3VtbWl0cy5cbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJvZiBPcGVuU2VhZHJhZ29uLlJlY3RcbiAqIEBwYXJhbSB7T3BlblNlYWRyYWdvbi5Qb2ludH0gdG9wTGVmdFxuICogQHBhcmFtIHtPcGVuU2VhZHJhZ29uLlBvaW50fSB0b3BSaWdodFxuICogQHBhcmFtIHtPcGVuU2VhZHJhZ29uLlBvaW50fSBib3R0b21MZWZ0XG4gKiBAcmV0dXJucyB7T3BlblNlYWRyYWdvbi5SZWN0fVxuICovXG4kLlJlY3QuZnJvbVN1bW1pdHMgPSBmdW5jdGlvbih0b3BMZWZ0LCB0b3BSaWdodCwgYm90dG9tTGVmdCkge1xuICAgIHZhciB3aWR0aCA9IHRvcExlZnQuZGlzdGFuY2VUbyh0b3BSaWdodCk7XG4gICAgdmFyIGhlaWdodCA9IHRvcExlZnQuZGlzdGFuY2VUbyhib3R0b21MZWZ0KTtcbiAgICB2YXIgZGlmZiA9IHRvcFJpZ2h0Lm1pbnVzKHRvcExlZnQpO1xuICAgIHZhciByYWRpYW5zID0gTWF0aC5hdGFuKGRpZmYueSAvIGRpZmYueCk7XG4gICAgaWYgKGRpZmYueCA8IDApIHtcbiAgICAgICAgcmFkaWFucyArPSBNYXRoLlBJO1xuICAgIH0gZWxzZSBpZiAoZGlmZi55IDwgMCkge1xuICAgICAgICByYWRpYW5zICs9IDIgKiBNYXRoLlBJO1xuICAgIH1cbiAgICByZXR1cm4gbmV3ICQuUmVjdChcbiAgICAgICAgdG9wTGVmdC54LFxuICAgICAgICB0b3BMZWZ0LnksXG4gICAgICAgIHdpZHRoLFxuICAgICAgICBoZWlnaHQsXG4gICAgICAgIHJhZGlhbnMgLyBNYXRoLlBJICogMTgwKTtcbn07XG5cbi8qKiBAbGVuZHMgT3BlblNlYWRyYWdvbi5SZWN0LnByb3RvdHlwZSAqL1xuJC5SZWN0LnByb3RvdHlwZSA9IHtcbiAgICAvKipcbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcmV0dXJucyB7T3BlblNlYWRyYWdvbi5SZWN0fSBhIGR1cGxpY2F0ZSBvZiB0aGlzIFJlY3RcbiAgICAgKi9cbiAgICBjbG9uZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBuZXcgJC5SZWN0KFxuICAgICAgICAgICAgdGhpcy54LFxuICAgICAgICAgICAgdGhpcy55LFxuICAgICAgICAgICAgdGhpcy53aWR0aCxcbiAgICAgICAgICAgIHRoaXMuaGVpZ2h0LFxuICAgICAgICAgICAgdGhpcy5kZWdyZWVzKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogVGhlIGFzcGVjdCByYXRpbyBpcyBzaW1wbHkgdGhlIHJhdGlvIG9mIHdpZHRoIHRvIGhlaWdodC5cbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcmV0dXJucyB7TnVtYmVyfSBUaGUgcmF0aW8gb2Ygd2lkdGggdG8gaGVpZ2h0LlxuICAgICAqL1xuICAgIGdldEFzcGVjdFJhdGlvOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMud2lkdGggLyB0aGlzLmhlaWdodDtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUHJvdmlkZXMgdGhlIGNvb3JkaW5hdGVzIG9mIHRoZSB1cHBlci1sZWZ0IGNvcm5lciBvZiB0aGUgcmVjdGFuZ2xlIGFzIGFcbiAgICAgKiBwb2ludC5cbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcmV0dXJucyB7T3BlblNlYWRyYWdvbi5Qb2ludH0gVGhlIGNvb3JkaW5hdGUgb2YgdGhlIHVwcGVyLWxlZnQgY29ybmVyIG9mXG4gICAgICogIHRoZSByZWN0YW5nbGUuXG4gICAgICovXG4gICAgZ2V0VG9wTGVmdDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBuZXcgJC5Qb2ludChcbiAgICAgICAgICAgIHRoaXMueCxcbiAgICAgICAgICAgIHRoaXMueVxuICAgICAgICApO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBQcm92aWRlcyB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIGJvdHRvbS1yaWdodCBjb3JuZXIgb2YgdGhlIHJlY3RhbmdsZSBhcyBhXG4gICAgICogcG9pbnQuXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHJldHVybnMge09wZW5TZWFkcmFnb24uUG9pbnR9IFRoZSBjb29yZGluYXRlIG9mIHRoZSBib3R0b20tcmlnaHQgY29ybmVyIG9mXG4gICAgICogIHRoZSByZWN0YW5nbGUuXG4gICAgICovXG4gICAgZ2V0Qm90dG9tUmlnaHQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gbmV3ICQuUG9pbnQodGhpcy54ICsgdGhpcy53aWR0aCwgdGhpcy55ICsgdGhpcy5oZWlnaHQpXG4gICAgICAgICAgICAucm90YXRlKHRoaXMuZGVncmVlcywgdGhpcy5nZXRUb3BMZWZ0KCkpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBQcm92aWRlcyB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIHRvcC1yaWdodCBjb3JuZXIgb2YgdGhlIHJlY3RhbmdsZSBhcyBhXG4gICAgICogcG9pbnQuXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHJldHVybnMge09wZW5TZWFkcmFnb24uUG9pbnR9IFRoZSBjb29yZGluYXRlIG9mIHRoZSB0b3AtcmlnaHQgY29ybmVyIG9mXG4gICAgICogIHRoZSByZWN0YW5nbGUuXG4gICAgICovXG4gICAgZ2V0VG9wUmlnaHQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gbmV3ICQuUG9pbnQodGhpcy54ICsgdGhpcy53aWR0aCwgdGhpcy55KVxuICAgICAgICAgICAgLnJvdGF0ZSh0aGlzLmRlZ3JlZXMsIHRoaXMuZ2V0VG9wTGVmdCgpKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUHJvdmlkZXMgdGhlIGNvb3JkaW5hdGVzIG9mIHRoZSBib3R0b20tbGVmdCBjb3JuZXIgb2YgdGhlIHJlY3RhbmdsZSBhcyBhXG4gICAgICogcG9pbnQuXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHJldHVybnMge09wZW5TZWFkcmFnb24uUG9pbnR9IFRoZSBjb29yZGluYXRlIG9mIHRoZSBib3R0b20tbGVmdCBjb3JuZXIgb2ZcbiAgICAgKiAgdGhlIHJlY3RhbmdsZS5cbiAgICAgKi9cbiAgICBnZXRCb3R0b21MZWZ0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIG5ldyAkLlBvaW50KHRoaXMueCwgdGhpcy55ICsgdGhpcy5oZWlnaHQpXG4gICAgICAgICAgICAucm90YXRlKHRoaXMuZGVncmVlcywgdGhpcy5nZXRUb3BMZWZ0KCkpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDb21wdXRlcyB0aGUgY2VudGVyIG9mIHRoZSByZWN0YW5nbGUuXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHJldHVybnMge09wZW5TZWFkcmFnb24uUG9pbnR9IFRoZSBjZW50ZXIgb2YgdGhlIHJlY3RhbmdsZSBhcyByZXByZXNlbnRlZFxuICAgICAqICBhcyByZXByZXNlbnRlZCBieSBhIDItZGltZW5zaW9uYWwgdmVjdG9yICh4LHkpXG4gICAgICovXG4gICAgZ2V0Q2VudGVyOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIG5ldyAkLlBvaW50KFxuICAgICAgICAgICAgdGhpcy54ICsgdGhpcy53aWR0aCAvIDIuMCxcbiAgICAgICAgICAgIHRoaXMueSArIHRoaXMuaGVpZ2h0IC8gMi4wXG4gICAgICAgICkucm90YXRlKHRoaXMuZGVncmVlcywgdGhpcy5nZXRUb3BMZWZ0KCkpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IGNvbXBvbmVudCBhcyBhIHZlY3RvciBPcGVuU2VhZHJhZ29uLlBvaW50XG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHJldHVybnMge09wZW5TZWFkcmFnb24uUG9pbnR9IFRoZSAyIGRpbWVuc2lvbmFsIHZlY3RvciByZXByZXNlbnRpbmcgdGhlXG4gICAgICogIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUuXG4gICAgICovXG4gICAgZ2V0U2l6ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBuZXcgJC5Qb2ludCh0aGlzLndpZHRoLCB0aGlzLmhlaWdodCk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIERldGVybWluZXMgaWYgdHdvIFJlY3RhbmdsZXMgaGF2ZSBlcXVpdmFsZW50IGNvbXBvbmVudHMuXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtPcGVuU2VhZHJhZ29uLlJlY3R9IHJlY3RhbmdsZSBUaGUgUmVjdGFuZ2xlIHRvIGNvbXBhcmUgdG8uXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn0gJ3RydWUnIGlmIGFsbCBjb21wb25lbnRzIGFyZSBlcXVhbCwgb3RoZXJ3aXNlICdmYWxzZScuXG4gICAgICovXG4gICAgZXF1YWxzOiBmdW5jdGlvbihvdGhlcikge1xuICAgICAgICByZXR1cm4gKG90aGVyIGluc3RhbmNlb2YgJC5SZWN0KSAmJlxuICAgICAgICAgICAgdGhpcy54ID09PSBvdGhlci54ICYmXG4gICAgICAgICAgICB0aGlzLnkgPT09IG90aGVyLnkgJiZcbiAgICAgICAgICAgIHRoaXMud2lkdGggPT09IG90aGVyLndpZHRoICYmXG4gICAgICAgICAgICB0aGlzLmhlaWdodCA9PT0gb3RoZXIuaGVpZ2h0ICYmXG4gICAgICAgICAgICB0aGlzLmRlZ3JlZXMgPT09IG90aGVyLmRlZ3JlZXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICogTXVsdGlwbHkgYWxsIGRpbWVuc2lvbnMgKGV4Y2VwdCBkZWdyZWVzKSBpbiB0aGlzIFJlY3QgYnkgYSBmYWN0b3IgYW5kXG4gICAgKiByZXR1cm4gYSBuZXcgUmVjdC5cbiAgICAqIEBmdW5jdGlvblxuICAgICogQHBhcmFtIHtOdW1iZXJ9IGZhY3RvciBUaGUgZmFjdG9yIHRvIG11bHRpcGx5IHZlY3RvciBjb21wb25lbnRzLlxuICAgICogQHJldHVybnMge09wZW5TZWFkcmFnb24uUmVjdH0gQSBuZXcgcmVjdCByZXByZXNlbnRpbmcgdGhlIG11bHRpcGxpY2F0aW9uXG4gICAgKiAgb2YgdGhlIHZlY3RvciBjb21wb25lbnRzIGJ5IHRoZSBmYWN0b3JcbiAgICAqL1xuICAgIHRpbWVzOiBmdW5jdGlvbihmYWN0b3IpIHtcbiAgICAgICAgcmV0dXJuIG5ldyAkLlJlY3QoXG4gICAgICAgICAgICB0aGlzLnggKiBmYWN0b3IsXG4gICAgICAgICAgICB0aGlzLnkgKiBmYWN0b3IsXG4gICAgICAgICAgICB0aGlzLndpZHRoICogZmFjdG9yLFxuICAgICAgICAgICAgdGhpcy5oZWlnaHQgKiBmYWN0b3IsXG4gICAgICAgICAgICB0aGlzLmRlZ3JlZXMpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAqIFRyYW5zbGF0ZS9tb3ZlIHRoaXMgUmVjdCBieSBhIHZlY3RvciBhbmQgcmV0dXJuIG5ldyBSZWN0LlxuICAgICogQGZ1bmN0aW9uXG4gICAgKiBAcGFyYW0ge09wZW5TZWFkcmFnb24uUG9pbnR9IGRlbHRhIFRoZSB0cmFuc2xhdGlvbiB2ZWN0b3IuXG4gICAgKiBAcmV0dXJucyB7T3BlblNlYWRyYWdvbi5SZWN0fSBBIG5ldyByZWN0IHdpdGggYWx0ZXJlZCBwb3NpdGlvblxuICAgICovXG4gICAgdHJhbnNsYXRlOiBmdW5jdGlvbihkZWx0YSkge1xuICAgICAgICByZXR1cm4gbmV3ICQuUmVjdChcbiAgICAgICAgICAgIHRoaXMueCArIGRlbHRhLngsXG4gICAgICAgICAgICB0aGlzLnkgKyBkZWx0YS55LFxuICAgICAgICAgICAgdGhpcy53aWR0aCxcbiAgICAgICAgICAgIHRoaXMuaGVpZ2h0LFxuICAgICAgICAgICAgdGhpcy5kZWdyZWVzKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgc21hbGxlc3QgcmVjdGFuZ2xlIHRoYXQgd2lsbCBjb250YWluIHRoaXMgYW5kIHRoZSBnaXZlblxuICAgICAqIHJlY3RhbmdsZSBib3VuZGluZyBib3hlcy5cbiAgICAgKiBAcGFyYW0ge09wZW5TZWFkcmFnb24uUmVjdH0gcmVjdFxuICAgICAqIEByZXR1cm4ge09wZW5TZWFkcmFnb24uUmVjdH0gVGhlIG5ldyByZWN0YW5nbGUuXG4gICAgICovXG4gICAgdW5pb246IGZ1bmN0aW9uKHJlY3QpIHtcbiAgICAgICAgdmFyIHRoaXNCb3VuZGluZ0JveCA9IHRoaXMuZ2V0Qm91bmRpbmdCb3goKTtcbiAgICAgICAgdmFyIG90aGVyQm91bmRpbmdCb3ggPSByZWN0LmdldEJvdW5kaW5nQm94KCk7XG5cbiAgICAgICAgdmFyIGxlZnQgPSBNYXRoLm1pbih0aGlzQm91bmRpbmdCb3gueCwgb3RoZXJCb3VuZGluZ0JveC54KTtcbiAgICAgICAgdmFyIHRvcCA9IE1hdGgubWluKHRoaXNCb3VuZGluZ0JveC55LCBvdGhlckJvdW5kaW5nQm94LnkpO1xuICAgICAgICB2YXIgcmlnaHQgPSBNYXRoLm1heChcbiAgICAgICAgICAgIHRoaXNCb3VuZGluZ0JveC54ICsgdGhpc0JvdW5kaW5nQm94LndpZHRoLFxuICAgICAgICAgICAgb3RoZXJCb3VuZGluZ0JveC54ICsgb3RoZXJCb3VuZGluZ0JveC53aWR0aCk7XG4gICAgICAgIHZhciBib3R0b20gPSBNYXRoLm1heChcbiAgICAgICAgICAgIHRoaXNCb3VuZGluZ0JveC55ICsgdGhpc0JvdW5kaW5nQm94LmhlaWdodCxcbiAgICAgICAgICAgIG90aGVyQm91bmRpbmdCb3gueSArIG90aGVyQm91bmRpbmdCb3guaGVpZ2h0KTtcblxuICAgICAgICByZXR1cm4gbmV3ICQuUmVjdChcbiAgICAgICAgICAgIGxlZnQsXG4gICAgICAgICAgICB0b3AsXG4gICAgICAgICAgICByaWdodCAtIGxlZnQsXG4gICAgICAgICAgICBib3R0b20gLSB0b3ApO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBib3VuZGluZyBib3ggb2YgdGhlIGludGVyc2VjdGlvbiBvZiB0aGlzIHJlY3RhbmdsZSB3aXRoIHRoZVxuICAgICAqIGdpdmVuIHJlY3RhbmdsZS5cbiAgICAgKiBAcGFyYW0ge09wZW5TZWFkcmFnb24uUmVjdH0gcmVjdFxuICAgICAqIEByZXR1cm4ge09wZW5TZWFkcmFnb24uUmVjdH0gdGhlIGJvdW5kaW5nIGJveCBvZiB0aGUgaW50ZXJzZWN0aW9uXG4gICAgICogb3IgbnVsbCBpZiB0aGUgcmVjdGFuZ2xlcyBkb24ndCBpbnRlcnNlY3QuXG4gICAgICovXG4gICAgaW50ZXJzZWN0aW9uOiBmdW5jdGlvbihyZWN0KSB7XG4gICAgICAgIC8vIFNpbXBsaWZpZWQgdmVyc2lvbiBvZiBXZWlsZXIgQXRoZXJ0b24gY2xpcHBpbmcgYWxnb3JpdGhtXG4gICAgICAgIC8vIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1dlaWxlciVFMiU4MCU5M0F0aGVydG9uX2NsaXBwaW5nX2FsZ29yaXRobVxuICAgICAgICAvLyBCZWNhdXNlIHdlIGp1c3Qgd2FudCB0aGUgYm91bmRpbmcgYm94IG9mIHRoZSBpbnRlcnNlY3Rpb24sXG4gICAgICAgIC8vIHdlIGNhbiBqdXN0IGNvbXB1dGUgdGhlIGJvdW5kaW5nIGJveCBvZjpcbiAgICAgICAgLy8gMS4gYWxsIHRoZSBzdW1taXRzIG9mIHRoaXMgd2hpY2ggYXJlIGluc2lkZSByZWN0XG4gICAgICAgIC8vIDIuIGFsbCB0aGUgc3VtbWl0cyBvZiByZWN0IHdoaWNoIGFyZSBpbnNpZGUgdGhpc1xuICAgICAgICAvLyAzLiBhbGwgdGhlIGludGVyc2VjdGlvbnMgb2YgcmVjdCBhbmQgdGhpc1xuICAgICAgICB2YXIgRVBTSUxPTiA9IDAuMDAwMDAwMDAwMTtcblxuICAgICAgICB2YXIgaW50ZXJzZWN0aW9uUG9pbnRzID0gW107XG5cbiAgICAgICAgdmFyIHRoaXNUb3BMZWZ0ID0gdGhpcy5nZXRUb3BMZWZ0KCk7XG4gICAgICAgIGlmIChyZWN0LmNvbnRhaW5zUG9pbnQodGhpc1RvcExlZnQsIEVQU0lMT04pKSB7XG4gICAgICAgICAgICBpbnRlcnNlY3Rpb25Qb2ludHMucHVzaCh0aGlzVG9wTGVmdCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHRoaXNUb3BSaWdodCA9IHRoaXMuZ2V0VG9wUmlnaHQoKTtcbiAgICAgICAgaWYgKHJlY3QuY29udGFpbnNQb2ludCh0aGlzVG9wUmlnaHQsIEVQU0lMT04pKSB7XG4gICAgICAgICAgICBpbnRlcnNlY3Rpb25Qb2ludHMucHVzaCh0aGlzVG9wUmlnaHQpO1xuICAgICAgICB9XG4gICAgICAgIHZhciB0aGlzQm90dG9tTGVmdCA9IHRoaXMuZ2V0Qm90dG9tTGVmdCgpO1xuICAgICAgICBpZiAocmVjdC5jb250YWluc1BvaW50KHRoaXNCb3R0b21MZWZ0LCBFUFNJTE9OKSkge1xuICAgICAgICAgICAgaW50ZXJzZWN0aW9uUG9pbnRzLnB1c2godGhpc0JvdHRvbUxlZnQpO1xuICAgICAgICB9XG4gICAgICAgIHZhciB0aGlzQm90dG9tUmlnaHQgPSB0aGlzLmdldEJvdHRvbVJpZ2h0KCk7XG4gICAgICAgIGlmIChyZWN0LmNvbnRhaW5zUG9pbnQodGhpc0JvdHRvbVJpZ2h0LCBFUFNJTE9OKSkge1xuICAgICAgICAgICAgaW50ZXJzZWN0aW9uUG9pbnRzLnB1c2godGhpc0JvdHRvbVJpZ2h0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciByZWN0VG9wTGVmdCA9IHJlY3QuZ2V0VG9wTGVmdCgpO1xuICAgICAgICBpZiAodGhpcy5jb250YWluc1BvaW50KHJlY3RUb3BMZWZ0LCBFUFNJTE9OKSkge1xuICAgICAgICAgICAgaW50ZXJzZWN0aW9uUG9pbnRzLnB1c2gocmVjdFRvcExlZnQpO1xuICAgICAgICB9XG4gICAgICAgIHZhciByZWN0VG9wUmlnaHQgPSByZWN0LmdldFRvcFJpZ2h0KCk7XG4gICAgICAgIGlmICh0aGlzLmNvbnRhaW5zUG9pbnQocmVjdFRvcFJpZ2h0LCBFUFNJTE9OKSkge1xuICAgICAgICAgICAgaW50ZXJzZWN0aW9uUG9pbnRzLnB1c2gocmVjdFRvcFJpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcmVjdEJvdHRvbUxlZnQgPSByZWN0LmdldEJvdHRvbUxlZnQoKTtcbiAgICAgICAgaWYgKHRoaXMuY29udGFpbnNQb2ludChyZWN0Qm90dG9tTGVmdCwgRVBTSUxPTikpIHtcbiAgICAgICAgICAgIGludGVyc2VjdGlvblBvaW50cy5wdXNoKHJlY3RCb3R0b21MZWZ0KTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcmVjdEJvdHRvbVJpZ2h0ID0gcmVjdC5nZXRCb3R0b21SaWdodCgpO1xuICAgICAgICBpZiAodGhpcy5jb250YWluc1BvaW50KHJlY3RCb3R0b21SaWdodCwgRVBTSUxPTikpIHtcbiAgICAgICAgICAgIGludGVyc2VjdGlvblBvaW50cy5wdXNoKHJlY3RCb3R0b21SaWdodCk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgdGhpc1NlZ21lbnRzID0gdGhpcy5fZ2V0U2VnbWVudHMoKTtcbiAgICAgICAgdmFyIHJlY3RTZWdtZW50cyA9IHJlY3QuX2dldFNlZ21lbnRzKCk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpc1NlZ21lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgdGhpc1NlZ21lbnQgPSB0aGlzU2VnbWVudHNbaV07XG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHJlY3RTZWdtZW50cy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIHZhciByZWN0U2VnbWVudCA9IHJlY3RTZWdtZW50c1tqXTtcbiAgICAgICAgICAgICAgICB2YXIgaW50ZXJzZWN0ID0gZ2V0SW50ZXJzZWN0aW9uKHRoaXNTZWdtZW50WzBdLCB0aGlzU2VnbWVudFsxXSxcbiAgICAgICAgICAgICAgICAgICAgcmVjdFNlZ21lbnRbMF0sIHJlY3RTZWdtZW50WzFdKTtcbiAgICAgICAgICAgICAgICBpZiAoaW50ZXJzZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIGludGVyc2VjdGlvblBvaW50cy5wdXNoKGludGVyc2VjdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gR2V0IGludGVyc2VjdGlvbiBwb2ludCBvZiBzZWdtZW50cyBbYSxiXSBhbmQgW2MsZF1cbiAgICAgICAgZnVuY3Rpb24gZ2V0SW50ZXJzZWN0aW9uKGEsIGIsIGMsIGQpIHtcbiAgICAgICAgICAgIC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzE5NjgzNDUvMTQ0MDQwM1xuICAgICAgICAgICAgdmFyIGFiVmVjdG9yID0gYi5taW51cyhhKTtcbiAgICAgICAgICAgIHZhciBjZFZlY3RvciA9IGQubWludXMoYyk7XG5cbiAgICAgICAgICAgIHZhciBkZW5vbSA9IC1jZFZlY3Rvci54ICogYWJWZWN0b3IueSArIGFiVmVjdG9yLnggKiBjZFZlY3Rvci55O1xuICAgICAgICAgICAgaWYgKGRlbm9tID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBzID0gKGFiVmVjdG9yLnggKiAoYS55IC0gYy55KSAtIGFiVmVjdG9yLnkgKiAoYS54IC0gYy54KSkgLyBkZW5vbTtcbiAgICAgICAgICAgIHZhciB0ID0gKGNkVmVjdG9yLnggKiAoYS55IC0gYy55KSAtIGNkVmVjdG9yLnkgKiAoYS54IC0gYy54KSkgLyBkZW5vbTtcblxuICAgICAgICAgICAgaWYgKC1FUFNJTE9OIDw9IHMgJiYgcyA8PSAxIC0gRVBTSUxPTiAmJlxuICAgICAgICAgICAgICAgIC1FUFNJTE9OIDw9IHQgJiYgdCA8PSAxIC0gRVBTSUxPTikge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgJC5Qb2ludChhLnggKyB0ICogYWJWZWN0b3IueCwgYS55ICsgdCAqIGFiVmVjdG9yLnkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaW50ZXJzZWN0aW9uUG9pbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbWluWCA9IGludGVyc2VjdGlvblBvaW50c1swXS54O1xuICAgICAgICB2YXIgbWF4WCA9IGludGVyc2VjdGlvblBvaW50c1swXS54O1xuICAgICAgICB2YXIgbWluWSA9IGludGVyc2VjdGlvblBvaW50c1swXS55O1xuICAgICAgICB2YXIgbWF4WSA9IGludGVyc2VjdGlvblBvaW50c1swXS55O1xuICAgICAgICBmb3IgKHZhciBrID0gMTsgayA8IGludGVyc2VjdGlvblBvaW50cy5sZW5ndGg7IGsrKykge1xuICAgICAgICAgICAgdmFyIHBvaW50ID0gaW50ZXJzZWN0aW9uUG9pbnRzW2tdO1xuICAgICAgICAgICAgaWYgKHBvaW50LnggPCBtaW5YKSB7XG4gICAgICAgICAgICAgICAgbWluWCA9IHBvaW50Lng7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocG9pbnQueCA+IG1heFgpIHtcbiAgICAgICAgICAgICAgICBtYXhYID0gcG9pbnQueDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwb2ludC55IDwgbWluWSkge1xuICAgICAgICAgICAgICAgIG1pblkgPSBwb2ludC55O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBvaW50LnkgPiBtYXhZKSB7XG4gICAgICAgICAgICAgICAgbWF4WSA9IHBvaW50Lnk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyAkLlJlY3QobWluWCwgbWluWSwgbWF4WCAtIG1pblgsIG1heFkgLSBtaW5ZKTtcbiAgICB9LFxuXG4gICAgLy8gcHJpdmF0ZVxuICAgIF9nZXRTZWdtZW50czogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciB0b3BMZWZ0ID0gdGhpcy5nZXRUb3BMZWZ0KCk7XG4gICAgICAgIHZhciB0b3BSaWdodCA9IHRoaXMuZ2V0VG9wUmlnaHQoKTtcbiAgICAgICAgdmFyIGJvdHRvbUxlZnQgPSB0aGlzLmdldEJvdHRvbUxlZnQoKTtcbiAgICAgICAgdmFyIGJvdHRvbVJpZ2h0ID0gdGhpcy5nZXRCb3R0b21SaWdodCgpO1xuICAgICAgICByZXR1cm4gW1t0b3BMZWZ0LCB0b3BSaWdodF0sXG4gICAgICAgICAgICBbdG9wUmlnaHQsIGJvdHRvbVJpZ2h0XSxcbiAgICAgICAgICAgIFtib3R0b21SaWdodCwgYm90dG9tTGVmdF0sXG4gICAgICAgICAgICBbYm90dG9tTGVmdCwgdG9wTGVmdF1dO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSb3RhdGVzIGEgcmVjdGFuZ2xlIGFyb3VuZCBhIHBvaW50LlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBkZWdyZWVzIFRoZSBhbmdsZSBpbiBkZWdyZWVzIHRvIHJvdGF0ZS5cbiAgICAgKiBAcGFyYW0ge09wZW5TZWFkcmFnb24uUG9pbnR9IFtwaXZvdF0gVGhlIHBvaW50IGFib3V0IHdoaWNoIHRvIHJvdGF0ZS5cbiAgICAgKiBEZWZhdWx0cyB0byB0aGUgY2VudGVyIG9mIHRoZSByZWN0YW5nbGUuXG4gICAgICogQHJldHVybiB7T3BlblNlYWRyYWdvbi5SZWN0fVxuICAgICAqL1xuICAgIHJvdGF0ZTogZnVuY3Rpb24oZGVncmVlcywgcGl2b3QpIHtcbiAgICAgICAgZGVncmVlcyA9IGRlZ3JlZXMgJSAzNjA7XG4gICAgICAgIGlmIChkZWdyZWVzID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jbG9uZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkZWdyZWVzIDwgMCkge1xuICAgICAgICAgICAgZGVncmVlcyArPSAzNjA7XG4gICAgICAgIH1cblxuICAgICAgICBwaXZvdCA9IHBpdm90IHx8IHRoaXMuZ2V0Q2VudGVyKCk7XG4gICAgICAgIHZhciBuZXdUb3BMZWZ0ID0gdGhpcy5nZXRUb3BMZWZ0KCkucm90YXRlKGRlZ3JlZXMsIHBpdm90KTtcbiAgICAgICAgdmFyIG5ld1RvcFJpZ2h0ID0gdGhpcy5nZXRUb3BSaWdodCgpLnJvdGF0ZShkZWdyZWVzLCBwaXZvdCk7XG5cbiAgICAgICAgdmFyIGRpZmYgPSBuZXdUb3BSaWdodC5taW51cyhuZXdUb3BMZWZ0KTtcbiAgICAgICAgdmFyIHJhZGlhbnMgPSBNYXRoLmF0YW4oZGlmZi55IC8gZGlmZi54KTtcbiAgICAgICAgaWYgKGRpZmYueCA8IDApIHtcbiAgICAgICAgICAgIHJhZGlhbnMgKz0gTWF0aC5QSTtcbiAgICAgICAgfSBlbHNlIGlmIChkaWZmLnkgPCAwKSB7XG4gICAgICAgICAgICByYWRpYW5zICs9IDIgKiBNYXRoLlBJO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgJC5SZWN0KFxuICAgICAgICAgICAgbmV3VG9wTGVmdC54LFxuICAgICAgICAgICAgbmV3VG9wTGVmdC55LFxuICAgICAgICAgICAgdGhpcy53aWR0aCxcbiAgICAgICAgICAgIHRoaXMuaGVpZ2h0LFxuICAgICAgICAgICAgcmFkaWFucyAvIE1hdGguUEkgKiAxODApO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSZXRyaWV2ZXMgdGhlIHNtYWxsZXN0IGhvcml6b250YWwgKGRlZ3JlZXM9MCkgcmVjdGFuZ2xlIHdoaWNoIGNvbnRhaW5zXG4gICAgICogdGhpcyByZWN0YW5nbGUuXG4gICAgICogQHJldHVybnMge09wZW5TZWFkcmFnb24uUmVjdH1cbiAgICAgKi9cbiAgICBnZXRCb3VuZGluZ0JveDogZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICh0aGlzLmRlZ3JlZXMgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNsb25lKCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHRvcExlZnQgPSB0aGlzLmdldFRvcExlZnQoKTtcbiAgICAgICAgdmFyIHRvcFJpZ2h0ID0gdGhpcy5nZXRUb3BSaWdodCgpO1xuICAgICAgICB2YXIgYm90dG9tTGVmdCA9IHRoaXMuZ2V0Qm90dG9tTGVmdCgpO1xuICAgICAgICB2YXIgYm90dG9tUmlnaHQgPSB0aGlzLmdldEJvdHRvbVJpZ2h0KCk7XG4gICAgICAgIHZhciBtaW5YID0gTWF0aC5taW4odG9wTGVmdC54LCB0b3BSaWdodC54LCBib3R0b21MZWZ0LngsIGJvdHRvbVJpZ2h0LngpO1xuICAgICAgICB2YXIgbWF4WCA9IE1hdGgubWF4KHRvcExlZnQueCwgdG9wUmlnaHQueCwgYm90dG9tTGVmdC54LCBib3R0b21SaWdodC54KTtcbiAgICAgICAgdmFyIG1pblkgPSBNYXRoLm1pbih0b3BMZWZ0LnksIHRvcFJpZ2h0LnksIGJvdHRvbUxlZnQueSwgYm90dG9tUmlnaHQueSk7XG4gICAgICAgIHZhciBtYXhZID0gTWF0aC5tYXgodG9wTGVmdC55LCB0b3BSaWdodC55LCBib3R0b21MZWZ0LnksIGJvdHRvbVJpZ2h0LnkpO1xuICAgICAgICByZXR1cm4gbmV3ICQuUmVjdChcbiAgICAgICAgICAgIG1pblgsXG4gICAgICAgICAgICBtaW5ZLFxuICAgICAgICAgICAgbWF4WCAtIG1pblgsXG4gICAgICAgICAgICBtYXhZIC0gbWluWSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFJldHJpZXZlcyB0aGUgc21hbGxlc3QgaG9yaXpvbnRhbCAoZGVncmVlcz0wKSByZWN0YW5nbGUgd2hpY2ggY29udGFpbnNcbiAgICAgKiB0aGlzIHJlY3RhbmdsZSBhbmQgaGFzIGludGVnZXJzIHgsIHksIHdpZHRoIGFuZCBoZWlnaHRcbiAgICAgKiBAcmV0dXJucyB7T3BlblNlYWRyYWdvbi5SZWN0fVxuICAgICAqL1xuICAgIGdldEludGVnZXJCb3VuZGluZ0JveDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBib3VuZGluZ0JveCA9IHRoaXMuZ2V0Qm91bmRpbmdCb3goKTtcbiAgICAgICAgdmFyIHggPSBNYXRoLmZsb29yKGJvdW5kaW5nQm94LngpO1xuICAgICAgICB2YXIgeSA9IE1hdGguZmxvb3IoYm91bmRpbmdCb3gueSk7XG4gICAgICAgIHZhciB3aWR0aCA9IE1hdGguY2VpbChib3VuZGluZ0JveC53aWR0aCArIGJvdW5kaW5nQm94LnggLSB4KTtcbiAgICAgICAgdmFyIGhlaWdodCA9IE1hdGguY2VpbChib3VuZGluZ0JveC5oZWlnaHQgKyBib3VuZGluZ0JveC55IC0geSk7XG4gICAgICAgIHJldHVybiBuZXcgJC5SZWN0KHgsIHksIHdpZHRoLCBoZWlnaHQpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgYSBwb2ludCBpcyBpbnNpZGUgdGhpcyByZWN0YW5nbGUgKGVkZ2UgaW5jbHVkZWQpLlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7T3BlblNlYWRyYWdvbi5Qb2ludH0gcG9pbnRcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gW2Vwc2lsb249MF0gdGhlIG1hcmdpbiBvZiBlcnJvciBhbGxvd2VkXG4gICAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgdGhlIHBvaW50IGlzIGluc2lkZSB0aGlzIHJlY3RhbmdsZSwgZmFsc2VcbiAgICAgKiBvdGhlcndpc2UuXG4gICAgICovXG4gICAgY29udGFpbnNQb2ludDogZnVuY3Rpb24ocG9pbnQsIGVwc2lsb24pIHtcbiAgICAgICAgZXBzaWxvbiA9IGVwc2lsb24gfHwgMDtcblxuICAgICAgICAvLyBTZWUgaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMjc1Mjc1NC8xNDQwNDAzIGZvciBleHBsYW5hdGlvblxuICAgICAgICB2YXIgdG9wTGVmdCA9IHRoaXMuZ2V0VG9wTGVmdCgpO1xuICAgICAgICB2YXIgdG9wUmlnaHQgPSB0aGlzLmdldFRvcFJpZ2h0KCk7XG4gICAgICAgIHZhciBib3R0b21MZWZ0ID0gdGhpcy5nZXRCb3R0b21MZWZ0KCk7XG4gICAgICAgIHZhciB0b3BEaWZmID0gdG9wUmlnaHQubWludXModG9wTGVmdCk7XG4gICAgICAgIHZhciBsZWZ0RGlmZiA9IGJvdHRvbUxlZnQubWludXModG9wTGVmdCk7XG5cbiAgICAgICAgcmV0dXJuICgocG9pbnQueCAtIHRvcExlZnQueCkgKiB0b3BEaWZmLnggK1xuICAgICAgICAgICAgKHBvaW50LnkgLSB0b3BMZWZ0LnkpICogdG9wRGlmZi55ID49IC1lcHNpbG9uKSAmJlxuXG4gICAgICAgICAgICAoKHBvaW50LnggLSB0b3BSaWdodC54KSAqIHRvcERpZmYueCArXG4gICAgICAgICAgICAocG9pbnQueSAtIHRvcFJpZ2h0LnkpICogdG9wRGlmZi55IDw9IGVwc2lsb24pICYmXG5cbiAgICAgICAgICAgICgocG9pbnQueCAtIHRvcExlZnQueCkgKiBsZWZ0RGlmZi54ICtcbiAgICAgICAgICAgIChwb2ludC55IC0gdG9wTGVmdC55KSAqIGxlZnREaWZmLnkgPj0gLWVwc2lsb24pICYmXG5cbiAgICAgICAgICAgICgocG9pbnQueCAtIGJvdHRvbUxlZnQueCkgKiBsZWZ0RGlmZi54ICtcbiAgICAgICAgICAgIChwb2ludC55IC0gYm90dG9tTGVmdC55KSAqIGxlZnREaWZmLnkgPD0gZXBzaWxvbik7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFByb3ZpZGVzIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSByZWN0YW5nbGUgd2hpY2ggaXMgdXNlZnVsIGZvclxuICAgICAqIGRlYnVnZ2luZy5cbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBBIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgcmVjdGFuZ2xlLlxuICAgICAqL1xuICAgIHRvU3RyaW5nOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIFwiW1wiICtcbiAgICAgICAgICAgIChNYXRoLnJvdW5kKHRoaXMueCAqIDEwMCkgLyAxMDApICsgXCIsIFwiICtcbiAgICAgICAgICAgIChNYXRoLnJvdW5kKHRoaXMueSAqIDEwMCkgLyAxMDApICsgXCIsIFwiICtcbiAgICAgICAgICAgIChNYXRoLnJvdW5kKHRoaXMud2lkdGggKiAxMDApIC8gMTAwKSArIFwieFwiICtcbiAgICAgICAgICAgIChNYXRoLnJvdW5kKHRoaXMuaGVpZ2h0ICogMTAwKSAvIDEwMCkgKyBcIiwgXCIgK1xuICAgICAgICAgICAgKE1hdGgucm91bmQodGhpcy5kZWdyZWVzICogMTAwKSAvIDEwMCkgKyBcImRlZ1wiICtcbiAgICAgICAgICAgIFwiXVwiO1xuICAgIH1cbn07XG5cblxufShPcGVuU2VhZHJhZ29uKSk7XG5cbi8qXG4gKiBPcGVuU2VhZHJhZ29uIC0gUmVmZXJlbmNlU3RyaXBcbiAqXG4gKiBDb3B5cmlnaHQgKEMpIDIwMDkgQ29kZVBsZXggRm91bmRhdGlvblxuICogQ29weXJpZ2h0IChDKSAyMDEwLTIwMTMgT3BlblNlYWRyYWdvbiBjb250cmlidXRvcnNcbiAqXG4gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmVcbiAqIG1ldDpcbiAqXG4gKiAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiAqICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAqXG4gKiAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0XG4gKiAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGVcbiAqICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cbiAqXG4gKiAtIE5laXRoZXIgdGhlIG5hbWUgb2YgQ29kZVBsZXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0c1xuICogICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbVxuICogICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuICpcbiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlNcbiAqIFwiQVMgSVNcIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1RcbiAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUlxuICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUXG4gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCxcbiAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRFxuICogVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUlxuICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkdcbiAqIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJU1xuICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4gKi9cblxuKGZ1bmN0aW9uICggJCApIHtcblxuLy8gZGljdGlvbmFyeSBmcm9tIGlkIHRvIHByaXZhdGUgcHJvcGVydGllc1xudmFyIFRISVMgPSB7fTtcblxuLyoqXG4gKiAgVGhlIENvbGxlY3Rpb25EcmF3ZXIgaXMgYSByZWltcGxlbWVudGF0aW9uIGlmIHRoZSBEcmF3ZXIgQVBJIHRoYXRcbiAqICBmb2N1c2VzIG9uIGFsbG93aW5nIGEgdmlld3BvcnQgdG8gYmUgcmVkZWZpbmVkIGFzIGEgY29sbGVjdGlvblxuICogIG9mIHNtYWxsZXIgdmlld3BvcnRzLCBkZWZpbmVkIGJ5IGEgY2xlYXIgbnVtYmVyIG9mIHJvd3MgYW5kIC8gb3JcbiAqICBjb2x1bW5zIG9mIHdoaWNoIGVhY2ggaXRlbSBpbiB0aGUgbWF0cml4IG9mIHZpZXdwb3J0cyBoYXMgaXRzIG93blxuICogIHNvdXJjZS5cbiAqXG4gKiAgVGhpcyBpZGVhIGlzIGEgcmVleHByZXNzaW9uIG9mIHRoZSBpZGVhIG9mIGR6aSBjb2xsZWN0aW9uc1xuICogIHdoaWNoIGFsbG93cyBhIGNsZWFyZXIgYWxnb3JpdGhtIHRvIHJldXNlIHRoZSB0aWxlIHNvdXJjZXMgYWxyZWFkeVxuICogIHN1cHBvcnRlZCBieSBPcGVuU2VhZHJhZ29uLCBpbiBoZXRlcm9nZW5pb3VzIG9yIGhvbW9nZW5pb3VzXG4gKiAgc2VxdWVuY2VzIGp1c3QgbGlrZSBtaXhlZCBncm91cHMgYWxyZWFkeSBzdXBwb3J0ZWQgYnkgdGhlIHZpZXdlclxuICogIGZvciB0aGUgcHVycG9zZSBvZiBpbWFnZSBzZXF1bmNlcy5cbiAqXG4gKiAgVE9ETzogICBUaGUgZGlmZmljdWx0IHBhcnQgb2YgdGhpcyBmZWF0dXJlIGlzIGZpZ3VyaW5nIG91dCBob3cgdG8gZXhwcmVzc1xuICogICAgICAgICAgdGhpcyBmdW5jdGlvbmFsaXR5IGFzIGEgY29tYmluYXRpb24gb2YgdGhlIGZ1bmN0aW9uYWxpdHkgYWxyZWFkeVxuICogICAgICAgICAgcHJvdmlkZWQgYnkgRHJhd2VyLCBWaWV3cG9ydCwgVGlsZVNvdXJjZSwgYW5kIE5hdmlnYXRvci4gIEl0IG1heVxuICogICAgICAgICAgcmVxdWlyZSBiZXR0ZXIgYWJzdHJhY3Rpb24gYXQgdGhvc2UgcG9pbnRzIGluIG9yZGVyIHRvIGVmZmVjaWVudGx5XG4gKiAgICAgICAgICByZXVzZSB0aG9zZSBwYXJhZGlnbXMuXG4gKi9cbi8qKlxuICogQGNsYXNzIFJlZmVyZW5jZVN0cmlwXG4gKiBAbWVtYmVyb2YgT3BlblNlYWRyYWdvblxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAqL1xuJC5SZWZlcmVuY2VTdHJpcCA9IGZ1bmN0aW9uICggb3B0aW9ucyApIHtcblxuICAgIHZhciBfdGhpcyAgICAgICA9IHRoaXMsXG4gICAgICAgIHZpZXdlciAgICAgID0gb3B0aW9ucy52aWV3ZXIsXG4gICAgICAgIHZpZXdlclNpemUgID0gJC5nZXRFbGVtZW50U2l6ZSggdmlld2VyLmVsZW1lbnQgKSxcbiAgICAgICAgZWxlbWVudCxcbiAgICAgICAgc3R5bGUsXG4gICAgICAgIGk7XG5cbiAgICAvL1dlIG1heSBuZWVkIHRvIGNyZWF0ZSBhIG5ldyBlbGVtZW50IGFuZCBpZCBpZiB0aGV5IGRpZCBub3RcbiAgICAvL3Byb3ZpZGUgdGhlIGlkIGZvciB0aGUgZXhpc3RpbmcgZWxlbWVudFxuICAgIGlmICggIW9wdGlvbnMuaWQgKSB7XG4gICAgICAgIG9wdGlvbnMuaWQgICAgICAgICAgICAgID0gJ3JlZmVyZW5jZXN0cmlwLScgKyAkLm5vdygpO1xuICAgICAgICB0aGlzLmVsZW1lbnQgICAgICAgICAgICA9ICQubWFrZU5ldXRyYWxFbGVtZW50KCBcImRpdlwiICk7XG4gICAgICAgIHRoaXMuZWxlbWVudC5pZCAgICAgICAgID0gb3B0aW9ucy5pZDtcbiAgICAgICAgdGhpcy5lbGVtZW50LmNsYXNzTmFtZSAgPSAncmVmZXJlbmNlc3RyaXAnO1xuICAgIH1cblxuICAgIG9wdGlvbnMgPSAkLmV4dGVuZCggdHJ1ZSwge1xuICAgICAgICBzaXplUmF0aW86ICAkLkRFRkFVTFRfU0VUVElOR1MucmVmZXJlbmNlU3RyaXBTaXplUmF0aW8sXG4gICAgICAgIHBvc2l0aW9uOiAgICQuREVGQVVMVF9TRVRUSU5HUy5yZWZlcmVuY2VTdHJpcFBvc2l0aW9uLFxuICAgICAgICBzY3JvbGw6ICAgICAkLkRFRkFVTFRfU0VUVElOR1MucmVmZXJlbmNlU3RyaXBTY3JvbGwsXG4gICAgICAgIGNsaWNrVGltZVRocmVzaG9sZDogICQuREVGQVVMVF9TRVRUSU5HUy5jbGlja1RpbWVUaHJlc2hvbGRcbiAgICB9LCBvcHRpb25zLCB7XG4gICAgICAgIC8vcmVxdWlyZWQgb3ZlcnJpZGVzXG4gICAgICAgIGVsZW1lbnQ6ICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudCxcbiAgICAgICAgLy9UaGVzZSBuZWVkIHRvIGJlIG92ZXJyaWRkZW4gdG8gcHJldmVudCByZWN1cnNpb24gc2luY2VcbiAgICAgICAgLy90aGUgbmF2aWdhdG9yIGlzIGEgdmlld2VyIGFuZCBhIHZpZXdlciBoYXMgYSBuYXZpZ2F0b3JcbiAgICAgICAgc2hvd05hdmlnYXRvcjogICAgICAgICAgZmFsc2UsXG4gICAgICAgIG1vdXNlTmF2RW5hYmxlZDogICAgICAgIGZhbHNlLFxuICAgICAgICBzaG93TmF2aWdhdGlvbkNvbnRyb2w6ICBmYWxzZSxcbiAgICAgICAgc2hvd1NlcXVlbmNlQ29udHJvbDogICAgZmFsc2VcbiAgICB9ICk7XG5cbiAgICAkLmV4dGVuZCggdGhpcywgb3B0aW9ucyApO1xuICAgIC8vUHJpdmF0ZSBzdGF0ZSBwcm9wZXJ0aWVzXG4gICAgVEhJU1t0aGlzLmlkXSA9IHtcbiAgICAgICAgXCJhbmltYXRpbmdcIjogICAgICAgICAgIGZhbHNlXG4gICAgfTtcblxuICAgIHRoaXMubWluUGl4ZWxSYXRpbyA9IHRoaXMudmlld2VyLm1pblBpeGVsUmF0aW87XG5cbiAgICBzdHlsZSA9IHRoaXMuZWxlbWVudC5zdHlsZTtcbiAgICBzdHlsZS5tYXJnaW5Ub3AgICAgID0gJzBweCc7XG4gICAgc3R5bGUubWFyZ2luUmlnaHQgICA9ICcwcHgnO1xuICAgIHN0eWxlLm1hcmdpbkJvdHRvbSAgPSAnMHB4JztcbiAgICBzdHlsZS5tYXJnaW5MZWZ0ICAgID0gJzBweCc7XG4gICAgc3R5bGUubGVmdCAgICAgICAgICA9ICcwcHgnO1xuICAgIHN0eWxlLmJvdHRvbSAgICAgICAgPSAnMHB4JztcbiAgICBzdHlsZS5ib3JkZXIgICAgICAgID0gJzBweCc7XG4gICAgc3R5bGUuYmFja2dyb3VuZCAgICA9ICcjMDAwJztcbiAgICBzdHlsZS5wb3NpdGlvbiAgICAgID0gJ3JlbGF0aXZlJztcblxuICAgICQuc2V0RWxlbWVudFRvdWNoQWN0aW9uTm9uZSggdGhpcy5lbGVtZW50ICk7XG5cbiAgICAkLnNldEVsZW1lbnRPcGFjaXR5KCB0aGlzLmVsZW1lbnQsIDAuOCApO1xuXG4gICAgdGhpcy52aWV3ZXIgPSB2aWV3ZXI7XG4gICAgdGhpcy5pbm5lclRyYWNrZXIgPSBuZXcgJC5Nb3VzZVRyYWNrZXIoIHtcbiAgICAgICAgZWxlbWVudDogICAgICAgIHRoaXMuZWxlbWVudCxcbiAgICAgICAgZHJhZ0hhbmRsZXI6ICAgICQuZGVsZWdhdGUoIHRoaXMsIG9uU3RyaXBEcmFnICksXG4gICAgICAgIHNjcm9sbEhhbmRsZXI6ICAkLmRlbGVnYXRlKCB0aGlzLCBvblN0cmlwU2Nyb2xsICksXG4gICAgICAgIGVudGVySGFuZGxlcjogICAkLmRlbGVnYXRlKCB0aGlzLCBvblN0cmlwRW50ZXIgKSxcbiAgICAgICAgZXhpdEhhbmRsZXI6ICAgICQuZGVsZWdhdGUoIHRoaXMsIG9uU3RyaXBFeGl0ICksXG4gICAgICAgIGtleURvd25IYW5kbGVyOiAkLmRlbGVnYXRlKCB0aGlzLCBvbktleURvd24gKSxcbiAgICAgICAga2V5SGFuZGxlcjogICAgICQuZGVsZWdhdGUoIHRoaXMsIG9uS2V5UHJlc3MgKVxuICAgIH0gKTtcblxuICAgIC8vQ29udHJvbHMgdGhlIHBvc2l0aW9uIGFuZCBvcmllbnRhdGlvbiBvZiB0aGUgcmVmZXJlbmNlIHN0cmlwIGFuZCBzZXRzIHRoZVxuICAgIC8vYXBwcm9wcmlhdGUgd2lkdGggYW5kIGhlaWdodFxuICAgIGlmICggb3B0aW9ucy53aWR0aCAmJiBvcHRpb25zLmhlaWdodCApIHtcbiAgICAgICAgdGhpcy5lbGVtZW50LnN0eWxlLndpZHRoICA9IG9wdGlvbnMud2lkdGggKyAncHgnO1xuICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gb3B0aW9ucy5oZWlnaHQgKyAncHgnO1xuICAgICAgICB2aWV3ZXIuYWRkQ29udHJvbChcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudCxcbiAgICAgICAgICAgIHsgYW5jaG9yOiAkLkNvbnRyb2xBbmNob3IuQk9UVE9NX0xFRlQgfVxuICAgICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICggXCJob3Jpem9udGFsXCIgPT0gb3B0aW9ucy5zY3JvbGwgKSB7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUud2lkdGggPSAoXG4gICAgICAgICAgICAgICAgdmlld2VyU2l6ZS54ICpcbiAgICAgICAgICAgICAgICBvcHRpb25zLnNpemVSYXRpbyAqXG4gICAgICAgICAgICAgICAgdmlld2VyLnRpbGVTb3VyY2VzLmxlbmd0aFxuICAgICAgICAgICAgKSArICggMTIgKiB2aWV3ZXIudGlsZVNvdXJjZXMubGVuZ3RoICkgKyAncHgnO1xuXG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gKFxuICAgICAgICAgICAgICAgIHZpZXdlclNpemUueSAqXG4gICAgICAgICAgICAgICAgb3B0aW9ucy5zaXplUmF0aW9cbiAgICAgICAgICAgICkgKyAncHgnO1xuXG4gICAgICAgICAgICB2aWV3ZXIuYWRkQ29udHJvbChcbiAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQsXG4gICAgICAgICAgICAgICAgeyBhbmNob3I6ICQuQ29udHJvbEFuY2hvci5CT1RUT01fTEVGVCB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50LnN0eWxlLmhlaWdodCA9IChcbiAgICAgICAgICAgICAgICB2aWV3ZXJTaXplLnkgKlxuICAgICAgICAgICAgICAgIG9wdGlvbnMuc2l6ZVJhdGlvICpcbiAgICAgICAgICAgICAgICB2aWV3ZXIudGlsZVNvdXJjZXMubGVuZ3RoXG4gICAgICAgICAgICApICsgKCAxMiAqIHZpZXdlci50aWxlU291cmNlcy5sZW5ndGggKSArICdweCc7XG5cbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5zdHlsZS53aWR0aCA9IChcbiAgICAgICAgICAgICAgICB2aWV3ZXJTaXplLnggKlxuICAgICAgICAgICAgICAgIG9wdGlvbnMuc2l6ZVJhdGlvXG4gICAgICAgICAgICApICsgJ3B4JztcblxuICAgICAgICAgICAgdmlld2VyLmFkZENvbnRyb2woXG4gICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50LFxuICAgICAgICAgICAgICAgIHsgYW5jaG9yOiAkLkNvbnRyb2xBbmNob3IuVE9QX0xFRlQgfVxuICAgICAgICAgICAgKTtcblxuICAgICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5wYW5lbFdpZHRoID0gKCB2aWV3ZXJTaXplLnggKiB0aGlzLnNpemVSYXRpbyApICsgODtcbiAgICB0aGlzLnBhbmVsSGVpZ2h0ID0gKCB2aWV3ZXJTaXplLnkgKiB0aGlzLnNpemVSYXRpbyApICsgODtcbiAgICB0aGlzLnBhbmVscyA9IFtdO1xuXG4gICAgLypqc2hpbnQgbG9vcGZ1bmM6dHJ1ZSovXG4gICAgZm9yICggaSA9IDA7IGkgPCB2aWV3ZXIudGlsZVNvdXJjZXMubGVuZ3RoOyBpKysgKSB7XG5cbiAgICAgICAgZWxlbWVudCA9ICQubWFrZU5ldXRyYWxFbGVtZW50KCAnZGl2JyApO1xuICAgICAgICBlbGVtZW50LmlkID0gdGhpcy5lbGVtZW50LmlkICsgXCItXCIgKyBpO1xuXG4gICAgICAgIGVsZW1lbnQuc3R5bGUud2lkdGggICAgICAgICA9IF90aGlzLnBhbmVsV2lkdGggKyAncHgnO1xuICAgICAgICBlbGVtZW50LnN0eWxlLmhlaWdodCAgICAgICAgPSBfdGhpcy5wYW5lbEhlaWdodCArICdweCc7XG4gICAgICAgIGVsZW1lbnQuc3R5bGUuZGlzcGxheSAgICAgICA9ICdpbmxpbmUnO1xuICAgICAgICBlbGVtZW50LnN0eWxlLmZsb2F0ICAgICAgICAgPSAnbGVmdCc7IC8vV2Via2l0XG4gICAgICAgIGVsZW1lbnQuc3R5bGUuY3NzRmxvYXQgICAgICA9ICdsZWZ0JzsgLy9GaXJlZm94XG4gICAgICAgIGVsZW1lbnQuc3R5bGUuc3R5bGVGbG9hdCAgICA9ICdsZWZ0JzsgLy9JRVxuICAgICAgICBlbGVtZW50LnN0eWxlLnBhZGRpbmcgICAgICAgPSAnMnB4JztcbiAgICAgICAgJC5zZXRFbGVtZW50VG91Y2hBY3Rpb25Ob25lKCBlbGVtZW50ICk7XG5cbiAgICAgICAgZWxlbWVudC5pbm5lclRyYWNrZXIgPSBuZXcgJC5Nb3VzZVRyYWNrZXIoIHtcbiAgICAgICAgICAgIGVsZW1lbnQ6ICAgICAgICAgICAgZWxlbWVudCxcbiAgICAgICAgICAgIGNsaWNrVGltZVRocmVzaG9sZDogdGhpcy5jbGlja1RpbWVUaHJlc2hvbGQsXG4gICAgICAgICAgICBjbGlja0Rpc3RUaHJlc2hvbGQ6IHRoaXMuY2xpY2tEaXN0VGhyZXNob2xkLFxuICAgICAgICAgICAgcHJlc3NIYW5kbGVyOiBmdW5jdGlvbiAoIGV2ZW50ICkge1xuICAgICAgICAgICAgICAgIGV2ZW50LmV2ZW50U291cmNlLmRyYWdnaW5nID0gJC5ub3coKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZWxlYXNlSGFuZGxlcjogZnVuY3Rpb24gKCBldmVudCApIHtcbiAgICAgICAgICAgICAgICB2YXIgdHJhY2tlciA9IGV2ZW50LmV2ZW50U291cmNlLFxuICAgICAgICAgICAgICAgICAgICBpZCAgICAgID0gdHJhY2tlci5lbGVtZW50LmlkLFxuICAgICAgICAgICAgICAgICAgICBwYWdlICAgID0gTnVtYmVyKCBpZC5zcGxpdCggJy0nIClbMl0gKSxcbiAgICAgICAgICAgICAgICAgICAgbm93ICAgICA9ICQubm93KCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoIGV2ZW50Lmluc2lkZUVsZW1lbnRQcmVzc2VkICYmXG4gICAgICAgICAgICAgICAgICAgICBldmVudC5pbnNpZGVFbGVtZW50UmVsZWFzZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgIHRyYWNrZXIuZHJhZ2dpbmcgJiZcbiAgICAgICAgICAgICAgICAgICAgICggbm93IC0gdHJhY2tlci5kcmFnZ2luZyApIDwgdHJhY2tlci5jbGlja1RpbWVUaHJlc2hvbGQgKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyYWNrZXIuZHJhZ2dpbmcgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB2aWV3ZXIuZ29Ub1BhZ2UoIHBhZ2UgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gKTtcblxuICAgICAgICB0aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQoIGVsZW1lbnQgKTtcblxuICAgICAgICBlbGVtZW50LmFjdGl2ZVBhbmVsID0gZmFsc2U7XG5cbiAgICAgICAgdGhpcy5wYW5lbHMucHVzaCggZWxlbWVudCApO1xuXG4gICAgfVxuICAgIGxvYWRQYW5lbHMoIHRoaXMsIHRoaXMuc2Nyb2xsID09ICd2ZXJ0aWNhbCcgPyB2aWV3ZXJTaXplLnkgOiB2aWV3ZXJTaXplLngsIDAgKTtcbiAgICB0aGlzLnNldEZvY3VzKCAwICk7XG5cbn07XG5cbiQuZXh0ZW5kKCAkLlJlZmVyZW5jZVN0cmlwLnByb3RvdHlwZSwgJC5FdmVudFNvdXJjZS5wcm90b3R5cGUsICQuVmlld2VyLnByb3RvdHlwZSwgLyoqIEBsZW5kcyBPcGVuU2VhZHJhZ29uLlJlZmVyZW5jZVN0cmlwLnByb3RvdHlwZSAqL3tcblxuICAgIC8qKlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqL1xuICAgIHNldEZvY3VzOiBmdW5jdGlvbiAoIHBhZ2UgKSB7XG4gICAgICAgIHZhciBlbGVtZW50ICAgICAgPSAkLmdldEVsZW1lbnQoIHRoaXMuZWxlbWVudC5pZCArICctJyArIHBhZ2UgKSxcbiAgICAgICAgICAgIHZpZXdlclNpemUgICA9ICQuZ2V0RWxlbWVudFNpemUoIHRoaXMudmlld2VyLmNhbnZhcyApLFxuICAgICAgICAgICAgc2Nyb2xsV2lkdGggID0gTnVtYmVyKCB0aGlzLmVsZW1lbnQuc3R5bGUud2lkdGgucmVwbGFjZSggJ3B4JywgJycgKSApLFxuICAgICAgICAgICAgc2Nyb2xsSGVpZ2h0ID0gTnVtYmVyKCB0aGlzLmVsZW1lbnQuc3R5bGUuaGVpZ2h0LnJlcGxhY2UoICdweCcsICcnICkgKSxcbiAgICAgICAgICAgIG9mZnNldExlZnQgICA9IC1OdW1iZXIoIHRoaXMuZWxlbWVudC5zdHlsZS5tYXJnaW5MZWZ0LnJlcGxhY2UoICdweCcsICcnICkgKSxcbiAgICAgICAgICAgIG9mZnNldFRvcCAgICA9IC1OdW1iZXIoIHRoaXMuZWxlbWVudC5zdHlsZS5tYXJnaW5Ub3AucmVwbGFjZSggJ3B4JywgJycgKSApLFxuICAgICAgICAgICAgb2Zmc2V0O1xuXG4gICAgICAgIGlmICggdGhpcy5jdXJyZW50U2VsZWN0ZWQgIT09IGVsZW1lbnQgKSB7XG4gICAgICAgICAgICBpZiAoIHRoaXMuY3VycmVudFNlbGVjdGVkICkge1xuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFNlbGVjdGVkLnN0eWxlLmJhY2tncm91bmQgPSAnIzAwMCc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRTZWxlY3RlZCA9IGVsZW1lbnQ7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRTZWxlY3RlZC5zdHlsZS5iYWNrZ3JvdW5kID0gJyM5OTknO1xuXG4gICAgICAgICAgICBpZiAoICdob3Jpem9udGFsJyA9PSB0aGlzLnNjcm9sbCApIHtcbiAgICAgICAgICAgICAgICAvL3JpZ2h0IGxlZnRcbiAgICAgICAgICAgICAgICBvZmZzZXQgPSAoIE51bWJlciggcGFnZSApICkgKiAoIHRoaXMucGFuZWxXaWR0aCArIDMgKTtcbiAgICAgICAgICAgICAgICBpZiAoIG9mZnNldCA+IG9mZnNldExlZnQgKyB2aWV3ZXJTaXplLnggLSB0aGlzLnBhbmVsV2lkdGggKSB7XG4gICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IE1hdGgubWluKCBvZmZzZXQsICggc2Nyb2xsV2lkdGggLSB2aWV3ZXJTaXplLnggKSApO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUubWFyZ2luTGVmdCA9IC1vZmZzZXQgKyAncHgnO1xuICAgICAgICAgICAgICAgICAgICBsb2FkUGFuZWxzKCB0aGlzLCB2aWV3ZXJTaXplLngsIC1vZmZzZXQgKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCBvZmZzZXQgPCBvZmZzZXRMZWZ0ICkge1xuICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBNYXRoLm1heCggMCwgb2Zmc2V0IC0gdmlld2VyU2l6ZS54IC8gMiApO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUubWFyZ2luTGVmdCA9IC1vZmZzZXQgKyAncHgnO1xuICAgICAgICAgICAgICAgICAgICBsb2FkUGFuZWxzKCB0aGlzLCB2aWV3ZXJTaXplLngsIC1vZmZzZXQgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG9mZnNldCA9ICggTnVtYmVyKCBwYWdlICkgKSAqICggdGhpcy5wYW5lbEhlaWdodCArIDMgKTtcbiAgICAgICAgICAgICAgICBpZiAoIG9mZnNldCA+IG9mZnNldFRvcCArIHZpZXdlclNpemUueSAtIHRoaXMucGFuZWxIZWlnaHQgKSB7XG4gICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IE1hdGgubWluKCBvZmZzZXQsICggc2Nyb2xsSGVpZ2h0IC0gdmlld2VyU2l6ZS55ICkgKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50LnN0eWxlLm1hcmdpblRvcCA9IC1vZmZzZXQgKyAncHgnO1xuICAgICAgICAgICAgICAgICAgICBsb2FkUGFuZWxzKCB0aGlzLCB2aWV3ZXJTaXplLnksIC1vZmZzZXQgKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCBvZmZzZXQgPCBvZmZzZXRUb3AgKSB7XG4gICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IE1hdGgubWF4KCAwLCBvZmZzZXQgLSB2aWV3ZXJTaXplLnkgLyAyICk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5zdHlsZS5tYXJnaW5Ub3AgPSAtb2Zmc2V0ICsgJ3B4JztcbiAgICAgICAgICAgICAgICAgICAgbG9hZFBhbmVscyggdGhpcywgdmlld2VyU2l6ZS55LCAtb2Zmc2V0ICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRQYWdlID0gcGFnZTtcbiAgICAgICAgICAgIG9uU3RyaXBFbnRlci5jYWxsKCB0aGlzLCB7IGV2ZW50U291cmNlOiB0aGlzLmlubmVyVHJhY2tlciB9ICk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICovXG4gICAgdXBkYXRlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICggVEhJU1t0aGlzLmlkXS5hbmltYXRpbmcgKSB7XG4gICAgICAgICAgICAkLmNvbnNvbGUubG9nKCAnaW1hZ2UgcmVmZXJlbmNlIHN0cmlwIHVwZGF0ZScgKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9LFxuXG4gICAgLy8gT3ZlcnJpZGVzIFZpZXdlci5kZXN0cm95XG4gICAgZGVzdHJveTogZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICh0aGlzLmVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuZWxlbWVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbn0gKTtcblxuXG5cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQGlubmVyXG4gKiBAZnVuY3Rpb25cbiAqL1xuZnVuY3Rpb24gb25TdHJpcERyYWcoIGV2ZW50ICkge1xuXG4gICAgdmFyIG9mZnNldExlZnQgICA9IE51bWJlciggdGhpcy5lbGVtZW50LnN0eWxlLm1hcmdpbkxlZnQucmVwbGFjZSggJ3B4JywgJycgKSApLFxuICAgICAgICBvZmZzZXRUb3AgICAgPSBOdW1iZXIoIHRoaXMuZWxlbWVudC5zdHlsZS5tYXJnaW5Ub3AucmVwbGFjZSggJ3B4JywgJycgKSApLFxuICAgICAgICBzY3JvbGxXaWR0aCAgPSBOdW1iZXIoIHRoaXMuZWxlbWVudC5zdHlsZS53aWR0aC5yZXBsYWNlKCAncHgnLCAnJyApICksXG4gICAgICAgIHNjcm9sbEhlaWdodCA9IE51bWJlciggdGhpcy5lbGVtZW50LnN0eWxlLmhlaWdodC5yZXBsYWNlKCAncHgnLCAnJyApICksXG4gICAgICAgIHZpZXdlclNpemUgICA9ICQuZ2V0RWxlbWVudFNpemUoIHRoaXMudmlld2VyLmNhbnZhcyApO1xuICAgIHRoaXMuZHJhZ2dpbmcgPSB0cnVlO1xuICAgIGlmICggdGhpcy5lbGVtZW50ICkge1xuICAgICAgICBpZiAoICdob3Jpem9udGFsJyA9PSB0aGlzLnNjcm9sbCApIHtcbiAgICAgICAgICAgIGlmICggLWV2ZW50LmRlbHRhLnggPiAwICkge1xuICAgICAgICAgICAgICAgIC8vZm9yd2FyZFxuICAgICAgICAgICAgICAgIGlmICggb2Zmc2V0TGVmdCA+IC0oIHNjcm9sbFdpZHRoIC0gdmlld2VyU2l6ZS54ICkgKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5zdHlsZS5tYXJnaW5MZWZ0ID0gKCBvZmZzZXRMZWZ0ICsgKCBldmVudC5kZWx0YS54ICogMiApICkgKyAncHgnO1xuICAgICAgICAgICAgICAgICAgICBsb2FkUGFuZWxzKCB0aGlzLCB2aWV3ZXJTaXplLngsIG9mZnNldExlZnQgKyAoIGV2ZW50LmRlbHRhLnggKiAyICkgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCAtZXZlbnQuZGVsdGEueCA8IDAgKSB7XG4gICAgICAgICAgICAgICAgLy9yZXZlcnNlXG4gICAgICAgICAgICAgICAgaWYgKCBvZmZzZXRMZWZ0IDwgMCApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50LnN0eWxlLm1hcmdpbkxlZnQgPSAoIG9mZnNldExlZnQgKyAoIGV2ZW50LmRlbHRhLnggKiAyICkgKSArICdweCc7XG4gICAgICAgICAgICAgICAgICAgIGxvYWRQYW5lbHMoIHRoaXMsIHZpZXdlclNpemUueCwgb2Zmc2V0TGVmdCArICggZXZlbnQuZGVsdGEueCAqIDIgKSApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICggLWV2ZW50LmRlbHRhLnkgPiAwICkge1xuICAgICAgICAgICAgICAgIC8vZm9yd2FyZFxuICAgICAgICAgICAgICAgIGlmICggb2Zmc2V0VG9wID4gLSggc2Nyb2xsSGVpZ2h0IC0gdmlld2VyU2l6ZS55ICkgKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5zdHlsZS5tYXJnaW5Ub3AgPSAoIG9mZnNldFRvcCArICggZXZlbnQuZGVsdGEueSAqIDIgKSApICsgJ3B4JztcbiAgICAgICAgICAgICAgICAgICAgbG9hZFBhbmVscyggdGhpcywgdmlld2VyU2l6ZS55LCBvZmZzZXRUb3AgKyAoIGV2ZW50LmRlbHRhLnkgKiAyICkgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCAtZXZlbnQuZGVsdGEueSA8IDAgKSB7XG4gICAgICAgICAgICAgICAgLy9yZXZlcnNlXG4gICAgICAgICAgICAgICAgaWYgKCBvZmZzZXRUb3AgPCAwICkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUubWFyZ2luVG9wID0gKCBvZmZzZXRUb3AgKyAoIGV2ZW50LmRlbHRhLnkgKiAyICkgKSArICdweCc7XG4gICAgICAgICAgICAgICAgICAgIGxvYWRQYW5lbHMoIHRoaXMsIHZpZXdlclNpemUueSwgb2Zmc2V0VG9wICsgKCBldmVudC5kZWx0YS55ICogMiApICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcblxufVxuXG5cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQGlubmVyXG4gKiBAZnVuY3Rpb25cbiAqL1xuZnVuY3Rpb24gb25TdHJpcFNjcm9sbCggZXZlbnQgKSB7XG4gICAgdmFyIG9mZnNldExlZnQgICA9IE51bWJlciggdGhpcy5lbGVtZW50LnN0eWxlLm1hcmdpbkxlZnQucmVwbGFjZSggJ3B4JywgJycgKSApLFxuICAgICAgICBvZmZzZXRUb3AgICAgPSBOdW1iZXIoIHRoaXMuZWxlbWVudC5zdHlsZS5tYXJnaW5Ub3AucmVwbGFjZSggJ3B4JywgJycgKSApLFxuICAgICAgICBzY3JvbGxXaWR0aCAgPSBOdW1iZXIoIHRoaXMuZWxlbWVudC5zdHlsZS53aWR0aC5yZXBsYWNlKCAncHgnLCAnJyApICksXG4gICAgICAgIHNjcm9sbEhlaWdodCA9IE51bWJlciggdGhpcy5lbGVtZW50LnN0eWxlLmhlaWdodC5yZXBsYWNlKCAncHgnLCAnJyApICksXG4gICAgICAgIHZpZXdlclNpemUgICA9ICQuZ2V0RWxlbWVudFNpemUoIHRoaXMudmlld2VyLmNhbnZhcyApO1xuICAgIGlmICggdGhpcy5lbGVtZW50ICkge1xuICAgICAgICBpZiAoICdob3Jpem9udGFsJyA9PSB0aGlzLnNjcm9sbCApIHtcbiAgICAgICAgICAgIGlmICggZXZlbnQuc2Nyb2xsID4gMCApIHtcbiAgICAgICAgICAgICAgICAvL2ZvcndhcmRcbiAgICAgICAgICAgICAgICBpZiAoIG9mZnNldExlZnQgPiAtKCBzY3JvbGxXaWR0aCAtIHZpZXdlclNpemUueCApICkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUubWFyZ2luTGVmdCA9ICggb2Zmc2V0TGVmdCAtICggZXZlbnQuc2Nyb2xsICogNjAgKSApICsgJ3B4JztcbiAgICAgICAgICAgICAgICAgICAgbG9hZFBhbmVscyggdGhpcywgdmlld2VyU2l6ZS54LCBvZmZzZXRMZWZ0IC0gKCBldmVudC5zY3JvbGwgKiA2MCApICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmICggZXZlbnQuc2Nyb2xsIDwgMCApIHtcbiAgICAgICAgICAgICAgICAvL3JldmVyc2VcbiAgICAgICAgICAgICAgICBpZiAoIG9mZnNldExlZnQgPCAwICkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUubWFyZ2luTGVmdCA9ICggb2Zmc2V0TGVmdCAtICggZXZlbnQuc2Nyb2xsICogNjAgKSApICsgJ3B4JztcbiAgICAgICAgICAgICAgICAgICAgbG9hZFBhbmVscyggdGhpcywgdmlld2VyU2l6ZS54LCBvZmZzZXRMZWZ0IC0gKCBldmVudC5zY3JvbGwgKiA2MCApICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKCBldmVudC5zY3JvbGwgPCAwICkge1xuICAgICAgICAgICAgICAgIC8vc2Nyb2xsIHVwXG4gICAgICAgICAgICAgICAgaWYgKCBvZmZzZXRUb3AgPiB2aWV3ZXJTaXplLnkgLSBzY3JvbGxIZWlnaHQgKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5zdHlsZS5tYXJnaW5Ub3AgPSAoIG9mZnNldFRvcCArICggZXZlbnQuc2Nyb2xsICogNjAgKSApICsgJ3B4JztcbiAgICAgICAgICAgICAgICAgICAgbG9hZFBhbmVscyggdGhpcywgdmlld2VyU2l6ZS55LCBvZmZzZXRUb3AgKyAoIGV2ZW50LnNjcm9sbCAqIDYwICkgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCBldmVudC5zY3JvbGwgPiAwICkge1xuICAgICAgICAgICAgICAgIC8vc2Nyb2xsIGRvd21cbiAgICAgICAgICAgICAgICBpZiAoIG9mZnNldFRvcCA8IDAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5zdHlsZS5tYXJnaW5Ub3AgPSAoIG9mZnNldFRvcCArICggZXZlbnQuc2Nyb2xsICogNjAgKSApICsgJ3B4JztcbiAgICAgICAgICAgICAgICAgICAgbG9hZFBhbmVscyggdGhpcywgdmlld2VyU2l6ZS55LCBvZmZzZXRUb3AgKyAoIGV2ZW50LnNjcm9sbCAqIDYwICkgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy9jYW5jZWxzIGV2ZW50XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG5cbmZ1bmN0aW9uIGxvYWRQYW5lbHMoIHN0cmlwLCB2aWV3ZXJTaXplLCBzY3JvbGwgKSB7XG4gICAgdmFyIHBhbmVsU2l6ZSxcbiAgICAgICAgYWN0aXZlUGFuZWxzU3RhcnQsXG4gICAgICAgIGFjdGl2ZVBhbmVsc0VuZCxcbiAgICAgICAgbWluaVZpZXdlcixcbiAgICAgICAgc3R5bGUsXG4gICAgICAgIGksXG4gICAgICAgIGVsZW1lbnQ7XG4gICAgaWYgKCAnaG9yaXpvbnRhbCcgPT0gc3RyaXAuc2Nyb2xsICkge1xuICAgICAgICBwYW5lbFNpemUgPSBzdHJpcC5wYW5lbFdpZHRoO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHBhbmVsU2l6ZSA9IHN0cmlwLnBhbmVsSGVpZ2h0O1xuICAgIH1cbiAgICBhY3RpdmVQYW5lbHNTdGFydCA9IE1hdGguY2VpbCggdmlld2VyU2l6ZSAvIHBhbmVsU2l6ZSApICsgNTtcbiAgICBhY3RpdmVQYW5lbHNFbmQgPSBNYXRoLmNlaWwoICggTWF0aC5hYnMoIHNjcm9sbCApICsgdmlld2VyU2l6ZSApIC8gcGFuZWxTaXplICkgKyAxO1xuICAgIGFjdGl2ZVBhbmVsc1N0YXJ0ID0gYWN0aXZlUGFuZWxzRW5kIC0gYWN0aXZlUGFuZWxzU3RhcnQ7XG4gICAgYWN0aXZlUGFuZWxzU3RhcnQgPSBhY3RpdmVQYW5lbHNTdGFydCA8IDAgPyAwIDogYWN0aXZlUGFuZWxzU3RhcnQ7XG5cbiAgICBmb3IgKCBpID0gYWN0aXZlUGFuZWxzU3RhcnQ7IGkgPCBhY3RpdmVQYW5lbHNFbmQgJiYgaSA8IHN0cmlwLnBhbmVscy5sZW5ndGg7IGkrKyApIHtcbiAgICAgICAgZWxlbWVudCA9IHN0cmlwLnBhbmVsc1tpXTtcbiAgICAgICAgaWYgKCAhZWxlbWVudC5hY3RpdmVQYW5lbCApIHtcbiAgICAgICAgICAgIG1pbmlWaWV3ZXIgPSBuZXcgJC5WaWV3ZXIoIHtcbiAgICAgICAgICAgICAgICBpZDogICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmlkLFxuICAgICAgICAgICAgICAgIHRpbGVTb3VyY2VzOiAgICAgICAgICAgIFtzdHJpcC52aWV3ZXIudGlsZVNvdXJjZXNbaV1dLFxuICAgICAgICAgICAgICAgIGVsZW1lbnQ6ICAgICAgICAgICAgICAgIGVsZW1lbnQsXG4gICAgICAgICAgICAgICAgbmF2aWdhdG9yU2l6ZVJhdGlvOiAgICAgc3RyaXAuc2l6ZVJhdGlvLFxuICAgICAgICAgICAgICAgIHNob3dOYXZpZ2F0b3I6ICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgICAgIG1vdXNlTmF2RW5hYmxlZDogICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgICAgIHNob3dOYXZpZ2F0aW9uQ29udHJvbDogIGZhbHNlLFxuICAgICAgICAgICAgICAgIHNob3dTZXF1ZW5jZUNvbnRyb2w6ICAgIGZhbHNlLFxuICAgICAgICAgICAgICAgIGltbWVkaWF0ZVJlbmRlcjogICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICAgYmxlbmRUaW1lOiAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgICBhbmltYXRpb25UaW1lOiAgICAgICAgICAwXG4gICAgICAgICAgICB9ICk7XG5cbiAgICAgICAgICAgIG1pbmlWaWV3ZXIuZGlzcGxheVJlZ2lvbiAgICAgICAgICAgPSAkLm1ha2VOZXV0cmFsRWxlbWVudCggXCJkaXZcIiApO1xuICAgICAgICAgICAgbWluaVZpZXdlci5kaXNwbGF5UmVnaW9uLmlkICAgICAgICA9IGVsZW1lbnQuaWQgKyAnLWRpc3BsYXlyZWdpb24nO1xuICAgICAgICAgICAgbWluaVZpZXdlci5kaXNwbGF5UmVnaW9uLmNsYXNzTmFtZSA9ICdkaXNwbGF5cmVnaW9uJztcblxuICAgICAgICAgICAgc3R5bGUgICAgICAgICAgICAgICA9IG1pbmlWaWV3ZXIuZGlzcGxheVJlZ2lvbi5zdHlsZTtcbiAgICAgICAgICAgIHN0eWxlLnBvc2l0aW9uICAgICAgPSAncmVsYXRpdmUnO1xuICAgICAgICAgICAgc3R5bGUudG9wICAgICAgICAgICA9ICcwcHgnO1xuICAgICAgICAgICAgc3R5bGUubGVmdCAgICAgICAgICA9ICcwcHgnO1xuICAgICAgICAgICAgc3R5bGUuZm9udFNpemUgICAgICA9ICcwcHgnO1xuICAgICAgICAgICAgc3R5bGUub3ZlcmZsb3cgICAgICA9ICdoaWRkZW4nO1xuICAgICAgICAgICAgc3R5bGUuZmxvYXQgICAgICAgICA9ICdsZWZ0JzsgLy9XZWJraXRcbiAgICAgICAgICAgIHN0eWxlLmNzc0Zsb2F0ICAgICAgPSAnbGVmdCc7IC8vRmlyZWZveFxuICAgICAgICAgICAgc3R5bGUuc3R5bGVGbG9hdCAgICA9ICdsZWZ0JzsgLy9JRVxuICAgICAgICAgICAgc3R5bGUuekluZGV4ICAgICAgICA9IDk5OTk5OTk5OTtcbiAgICAgICAgICAgIHN0eWxlLmN1cnNvciAgICAgICAgPSAnZGVmYXVsdCc7XG4gICAgICAgICAgICBzdHlsZS53aWR0aCAgICAgICAgID0gKCBzdHJpcC5wYW5lbFdpZHRoIC0gNCApICsgJ3B4JztcbiAgICAgICAgICAgIHN0eWxlLmhlaWdodCAgICAgICAgPSAoIHN0cmlwLnBhbmVsSGVpZ2h0IC0gNCApICsgJ3B4JztcblxuICAgICAgICAgICAgLy8gVE9ETzogV2hhdCBpcyB0aGlzIGZvcj8gRnV0dXJlIGtleWJvYXJkIG5hdmlnYXRpb24gc3VwcG9ydD9cbiAgICAgICAgICAgIG1pbmlWaWV3ZXIuZGlzcGxheVJlZ2lvbi5pbm5lclRyYWNrZXIgPSBuZXcgJC5Nb3VzZVRyYWNrZXIoIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50OiBtaW5pVmlld2VyLmRpc3BsYXlSZWdpb24sXG4gICAgICAgICAgICAgICAgc3RhcnREaXNhYmxlZDogdHJ1ZVxuICAgICAgICAgICAgfSApO1xuXG4gICAgICAgICAgICBlbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCAnZGl2JyApWzBdLmFwcGVuZENoaWxkKFxuICAgICAgICAgICAgICAgIG1pbmlWaWV3ZXIuZGlzcGxheVJlZ2lvblxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgZWxlbWVudC5hY3RpdmVQYW5lbCA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG59XG5cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQGlubmVyXG4gKiBAZnVuY3Rpb25cbiAqL1xuZnVuY3Rpb24gb25TdHJpcEVudGVyKCBldmVudCApIHtcbiAgICB2YXIgZWxlbWVudCA9IGV2ZW50LmV2ZW50U291cmNlLmVsZW1lbnQ7XG5cbiAgICAvLyQuc2V0RWxlbWVudE9wYWNpdHkoZWxlbWVudCwgMC44KTtcblxuICAgIC8vZWxlbWVudC5zdHlsZS5ib3JkZXIgPSAnMXB4IHNvbGlkICM1NTUnO1xuICAgIC8vZWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kID0gJyMwMDAnO1xuXG4gICAgaWYgKCAnaG9yaXpvbnRhbCcgPT0gdGhpcy5zY3JvbGwgKSB7XG5cbiAgICAgICAgLy9lbGVtZW50LnN0eWxlLnBhZGRpbmdUb3AgPSBcIjBweFwiO1xuICAgICAgICBlbGVtZW50LnN0eWxlLm1hcmdpbkJvdHRvbSA9IFwiMHB4XCI7XG5cbiAgICB9IGVsc2Uge1xuXG4gICAgICAgIC8vZWxlbWVudC5zdHlsZS5wYWRkaW5nUmlnaHQgPSBcIjBweFwiO1xuICAgICAgICBlbGVtZW50LnN0eWxlLm1hcmdpbkxlZnQgPSBcIjBweFwiO1xuXG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAaW5uZXJcbiAqIEBmdW5jdGlvblxuICovXG5mdW5jdGlvbiBvblN0cmlwRXhpdCggZXZlbnQgKSB7XG4gICAgdmFyIGVsZW1lbnQgPSBldmVudC5ldmVudFNvdXJjZS5lbGVtZW50O1xuXG4gICAgaWYgKCAnaG9yaXpvbnRhbCcgPT0gdGhpcy5zY3JvbGwgKSB7XG5cbiAgICAgICAgLy9lbGVtZW50LnN0eWxlLnBhZGRpbmdUb3AgPSBcIjEwcHhcIjtcbiAgICAgICAgZWxlbWVudC5zdHlsZS5tYXJnaW5Cb3R0b20gPSBcIi1cIiArICggJC5nZXRFbGVtZW50U2l6ZSggZWxlbWVudCApLnkgLyAyICkgKyBcInB4XCI7XG5cbiAgICB9IGVsc2Uge1xuXG4gICAgICAgIC8vZWxlbWVudC5zdHlsZS5wYWRkaW5nUmlnaHQgPSBcIjEwcHhcIjtcbiAgICAgICAgZWxlbWVudC5zdHlsZS5tYXJnaW5MZWZ0ID0gXCItXCIgKyAoICQuZ2V0RWxlbWVudFNpemUoIGVsZW1lbnQgKS54IC8gMiApICsgXCJweFwiO1xuXG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAaW5uZXJcbiAqIEBmdW5jdGlvblxuICovXG5mdW5jdGlvbiBvbktleURvd24oIGV2ZW50ICkge1xuICAgIC8vY29uc29sZS5sb2coIGV2ZW50LmtleUNvZGUgKTtcblxuICAgIGlmICggIWV2ZW50LnByZXZlbnREZWZhdWx0QWN0aW9uICYmICFldmVudC5jdHJsICYmICFldmVudC5hbHQgJiYgIWV2ZW50Lm1ldGEgKSB7XG4gICAgICAgIHN3aXRjaCAoIGV2ZW50LmtleUNvZGUgKSB7XG4gICAgICAgICAgICBjYXNlIDM4OiAvL3VwIGFycm93XG4gICAgICAgICAgICAgICAgb25TdHJpcFNjcm9sbC5jYWxsKCB0aGlzLCB7IGV2ZW50U291cmNlOiB0aGlzLnRyYWNrZXIsIHBvc2l0aW9uOiBudWxsLCBzY3JvbGw6IDEsIHNoaWZ0OiBudWxsIH0gKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBjYXNlIDQwOiAvL2Rvd24gYXJyb3dcbiAgICAgICAgICAgICAgICBvblN0cmlwU2Nyb2xsLmNhbGwoIHRoaXMsIHsgZXZlbnRTb3VyY2U6IHRoaXMudHJhY2tlciwgcG9zaXRpb246IG51bGwsIHNjcm9sbDogLTEsIHNoaWZ0OiBudWxsIH0gKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBjYXNlIDM3OiAvL2xlZnQgYXJyb3dcbiAgICAgICAgICAgICAgICBvblN0cmlwU2Nyb2xsLmNhbGwoIHRoaXMsIHsgZXZlbnRTb3VyY2U6IHRoaXMudHJhY2tlciwgcG9zaXRpb246IG51bGwsIHNjcm9sbDogLTEsIHNoaWZ0OiBudWxsIH0gKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBjYXNlIDM5OiAvL3JpZ2h0IGFycm93XG4gICAgICAgICAgICAgICAgb25TdHJpcFNjcm9sbC5jYWxsKCB0aGlzLCB7IGV2ZW50U291cmNlOiB0aGlzLnRyYWNrZXIsIHBvc2l0aW9uOiBudWxsLCBzY3JvbGw6IDEsIHNoaWZ0OiBudWxsIH0gKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coICduYXZpZ2F0b3Iga2V5Y29kZSAlcycsIGV2ZW50LmtleUNvZGUgKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbn1cblxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAaW5uZXJcbiAqIEBmdW5jdGlvblxuICovXG5mdW5jdGlvbiBvbktleVByZXNzKCBldmVudCApIHtcbiAgICAvL2NvbnNvbGUubG9nKCBldmVudC5rZXlDb2RlICk7XG5cbiAgICBpZiAoICFldmVudC5wcmV2ZW50RGVmYXVsdEFjdGlvbiAmJiAhZXZlbnQuY3RybCAmJiAhZXZlbnQuYWx0ICYmICFldmVudC5tZXRhICkge1xuICAgICAgICBzd2l0Y2ggKCBldmVudC5rZXlDb2RlICkge1xuICAgICAgICAgICAgY2FzZSA2MTogLy89fCtcbiAgICAgICAgICAgICAgICBvblN0cmlwU2Nyb2xsLmNhbGwoIHRoaXMsIHsgZXZlbnRTb3VyY2U6IHRoaXMudHJhY2tlciwgcG9zaXRpb246IG51bGwsIHNjcm9sbDogMSwgc2hpZnQ6IG51bGwgfSApO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGNhc2UgNDU6IC8vLXxfXG4gICAgICAgICAgICAgICAgb25TdHJpcFNjcm9sbC5jYWxsKCB0aGlzLCB7IGV2ZW50U291cmNlOiB0aGlzLnRyYWNrZXIsIHBvc2l0aW9uOiBudWxsLCBzY3JvbGw6IC0xLCBzaGlmdDogbnVsbCB9ICk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgY2FzZSA0ODogLy8wfClcbiAgICAgICAgICAgIGNhc2UgMTE5OiAvL3dcbiAgICAgICAgICAgIGNhc2UgODc6IC8vV1xuICAgICAgICAgICAgICAgIG9uU3RyaXBTY3JvbGwuY2FsbCggdGhpcywgeyBldmVudFNvdXJjZTogdGhpcy50cmFja2VyLCBwb3NpdGlvbjogbnVsbCwgc2Nyb2xsOiAxLCBzaGlmdDogbnVsbCB9ICk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgY2FzZSAxMTU6IC8vc1xuICAgICAgICAgICAgY2FzZSA4MzogLy9TXG4gICAgICAgICAgICAgICAgb25TdHJpcFNjcm9sbC5jYWxsKCB0aGlzLCB7IGV2ZW50U291cmNlOiB0aGlzLnRyYWNrZXIsIHBvc2l0aW9uOiBudWxsLCBzY3JvbGw6IC0xLCBzaGlmdDogbnVsbCB9ICk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgY2FzZSA5NzogLy9hXG4gICAgICAgICAgICAgICAgb25TdHJpcFNjcm9sbC5jYWxsKCB0aGlzLCB7IGV2ZW50U291cmNlOiB0aGlzLnRyYWNrZXIsIHBvc2l0aW9uOiBudWxsLCBzY3JvbGw6IC0xLCBzaGlmdDogbnVsbCB9ICk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgY2FzZSAxMDA6IC8vZFxuICAgICAgICAgICAgICAgIG9uU3RyaXBTY3JvbGwuY2FsbCggdGhpcywgeyBldmVudFNvdXJjZTogdGhpcy50cmFja2VyLCBwb3NpdGlvbjogbnVsbCwgc2Nyb2xsOiAxLCBzaGlmdDogbnVsbCB9ICk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCAnbmF2aWdhdG9yIGtleWNvZGUgJXMnLCBldmVudC5rZXlDb2RlICk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG59XG5cblxuXG59ICggT3BlblNlYWRyYWdvbiApICk7XG5cbi8qXG4gKiBPcGVuU2VhZHJhZ29uIC0gRGlzcGxheVJlY3RcbiAqXG4gKiBDb3B5cmlnaHQgKEMpIDIwMDkgQ29kZVBsZXggRm91bmRhdGlvblxuICogQ29weXJpZ2h0IChDKSAyMDEwLTIwMTMgT3BlblNlYWRyYWdvbiBjb250cmlidXRvcnNcbiAqXG4gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmVcbiAqIG1ldDpcbiAqXG4gKiAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiAqICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAqXG4gKiAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0XG4gKiAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGVcbiAqICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cbiAqXG4gKiAtIE5laXRoZXIgdGhlIG5hbWUgb2YgQ29kZVBsZXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0c1xuICogICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbVxuICogICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuICpcbiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlNcbiAqIFwiQVMgSVNcIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1RcbiAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUlxuICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUXG4gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCxcbiAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRFxuICogVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUlxuICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkdcbiAqIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJU1xuICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4gKi9cblxuKGZ1bmN0aW9uKCAkICl7XG5cbi8qKlxuICogQGNsYXNzIERpc3BsYXlSZWN0XG4gKiBAY2xhc3NkZXNjIEEgZGlzcGxheSByZWN0YW5nbGUgaXMgdmVyeSBzaW1pbGFyIHRvIHtAbGluayBPcGVuU2VhZHJhZ29uLlJlY3R9IGJ1dCBhZGRzIHR3b1xuICogZmllbGRzLCAnbWluTGV2ZWwnIGFuZCAnbWF4TGV2ZWwnIHdoaWNoIGRlbm90ZSB0aGUgc3VwcG9ydGVkIHpvb20gbGV2ZWxzXG4gKiBmb3IgdGhpcyByZWN0YW5nbGUuXG4gKlxuICogQG1lbWJlcm9mIE9wZW5TZWFkcmFnb25cbiAqIEBleHRlbmRzIE9wZW5TZWFkcmFnb24uUmVjdFxuICogQHBhcmFtIHtOdW1iZXJ9IHggVGhlIHZlY3RvciBjb21wb25lbnQgJ3gnLlxuICogQHBhcmFtIHtOdW1iZXJ9IHkgVGhlIHZlY3RvciBjb21wb25lbnQgJ3knLlxuICogQHBhcmFtIHtOdW1iZXJ9IHdpZHRoIFRoZSB2ZWN0b3IgY29tcG9uZW50ICdoZWlnaHQnLlxuICogQHBhcmFtIHtOdW1iZXJ9IGhlaWdodCBUaGUgdmVjdG9yIGNvbXBvbmVudCAnd2lkdGgnLlxuICogQHBhcmFtIHtOdW1iZXJ9IG1pbkxldmVsIFRoZSBsb3dlc3Qgem9vbSBsZXZlbCBzdXBwb3J0ZWQuXG4gKiBAcGFyYW0ge051bWJlcn0gbWF4TGV2ZWwgVGhlIGhpZ2hlc3Qgem9vbSBsZXZlbCBzdXBwb3J0ZWQuXG4gKi9cbiQuRGlzcGxheVJlY3QgPSBmdW5jdGlvbiggeCwgeSwgd2lkdGgsIGhlaWdodCwgbWluTGV2ZWwsIG1heExldmVsICkge1xuICAgICQuUmVjdC5hcHBseSggdGhpcywgWyB4LCB5LCB3aWR0aCwgaGVpZ2h0IF0gKTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBsb3dlc3Qgem9vbSBsZXZlbCBzdXBwb3J0ZWQuXG4gICAgICogQG1lbWJlciB7TnVtYmVyfSBtaW5MZXZlbFxuICAgICAqIEBtZW1iZXJvZiBPcGVuU2VhZHJhZ29uLkRpc3BsYXlSZWN0I1xuICAgICAqL1xuICAgIHRoaXMubWluTGV2ZWwgPSBtaW5MZXZlbDtcbiAgICAvKipcbiAgICAgKiBUaGUgaGlnaGVzdCB6b29tIGxldmVsIHN1cHBvcnRlZC5cbiAgICAgKiBAbWVtYmVyIHtOdW1iZXJ9IG1heExldmVsXG4gICAgICogQG1lbWJlcm9mIE9wZW5TZWFkcmFnb24uRGlzcGxheVJlY3QjXG4gICAgICovXG4gICAgdGhpcy5tYXhMZXZlbCA9IG1heExldmVsO1xufTtcblxuJC5leHRlbmQoICQuRGlzcGxheVJlY3QucHJvdG90eXBlLCAkLlJlY3QucHJvdG90eXBlICk7XG5cbn0oIE9wZW5TZWFkcmFnb24gKSk7XG5cbi8qXG4gKiBPcGVuU2VhZHJhZ29uIC0gU3ByaW5nXG4gKlxuICogQ29weXJpZ2h0IChDKSAyMDA5IENvZGVQbGV4IEZvdW5kYXRpb25cbiAqIENvcHlyaWdodCAoQykgMjAxMC0yMDEzIE9wZW5TZWFkcmFnb24gY29udHJpYnV0b3JzXG4gKlxuICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlXG4gKiBtZXQ6XG4gKlxuICogLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4gKiAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4gKlxuICogLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodFxuICogICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlXG4gKiAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uXG4gKlxuICogLSBOZWl0aGVyIHRoZSBuYW1lIG9mIENvZGVQbGV4IEZvdW5kYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHNcbiAqICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb21cbiAqICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbiAqXG4gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTXG4gKiBcIkFTIElTXCIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UXG4gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1JcbiAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVFxuICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsXG4gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURURcbiAqIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1JcbiAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0ZcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HXG4gKiBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVNcbiAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICovXG5cbihmdW5jdGlvbiggJCApe1xuXG4vKipcbiAqIEBjbGFzcyBTcHJpbmdcbiAqIEBtZW1iZXJvZiBPcGVuU2VhZHJhZ29uXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIFNwcmluZyBjb25maWd1cmF0aW9uIHNldHRpbmdzLlxuICogQHBhcmFtIHtOdW1iZXJ9IG9wdGlvbnMuc3ByaW5nU3RpZmZuZXNzIC0gU3ByaW5nIHN0aWZmbmVzcy4gTXVzdCBiZSBncmVhdGVyIHRoYW4gemVyby5cbiAqIFRoZSBjbG9zZXIgdG8gemVybywgdGhlIGNsb3NlciB0byBsaW5lYXIgYW5pbWF0aW9uLlxuICogQHBhcmFtIHtOdW1iZXJ9IG9wdGlvbnMuYW5pbWF0aW9uVGltZSAtIEFuaW1hdGlvbiBkdXJhdGlvbiBwZXIgc3ByaW5nLCBpbiBzZWNvbmRzLlxuICogTXVzdCBiZSB6ZXJvIG9yIGdyZWF0ZXIuXG4gKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuaW5pdGlhbD0wXSAtIEluaXRpYWwgdmFsdWUgb2Ygc3ByaW5nLlxuICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5leHBvbmVudGlhbD1mYWxzZV0gLSBXaGV0aGVyIHRoaXMgc3ByaW5nIHJlcHJlc2VudHNcbiAqIGFuIGV4cG9uZW50aWFsIHNjYWxlIChzdWNoIGFzIHpvb20pIGFuZCBzaG91bGQgYmUgYW5pbWF0ZWQgYWNjb3JkaW5nbHkuIE5vdGUgdGhhdFxuICogZXhwb25lbnRpYWwgc3ByaW5ncyBtdXN0IGhhdmUgbm9uLXplcm8gdmFsdWVzLlxuICovXG4kLlNwcmluZyA9IGZ1bmN0aW9uKCBvcHRpb25zICkge1xuICAgIHZhciBhcmdzID0gYXJndW1lbnRzO1xuXG4gICAgaWYoIHR5cGVvZiggb3B0aW9ucyApICE9ICdvYmplY3QnICl7XG4gICAgICAgIC8vYWxsb3dzIGJhY2t3YXJkIGNvbXBhdGlibGUgdXNlIG9mICggaW5pdGlhbFZhbHVlLCBjb25maWcgKSBhc1xuICAgICAgICAvL2NvbnN0cnVjdG9yIHBhcmFtZXRlcnNcbiAgICAgICAgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIGluaXRpYWw6IGFyZ3MubGVuZ3RoICYmIHR5cGVvZiAoIGFyZ3NbIDAgXSApID09IFwibnVtYmVyXCIgP1xuICAgICAgICAgICAgICAgIGFyZ3NbIDAgXSA6XG4gICAgICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBTcHJpbmcgc3RpZmZuZXNzLlxuICAgICAgICAgICAgICogQG1lbWJlciB7TnVtYmVyfSBzcHJpbmdTdGlmZm5lc3NcbiAgICAgICAgICAgICAqIEBtZW1iZXJvZiBPcGVuU2VhZHJhZ29uLlNwcmluZyNcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgc3ByaW5nU3RpZmZuZXNzOiBhcmdzLmxlbmd0aCA+IDEgP1xuICAgICAgICAgICAgICAgIGFyZ3NbIDEgXS5zcHJpbmdTdGlmZm5lc3MgOlxuICAgICAgICAgICAgICAgIDUuMCxcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogQW5pbWF0aW9uIGR1cmF0aW9uIHBlciBzcHJpbmcuXG4gICAgICAgICAgICAgKiBAbWVtYmVyIHtOdW1iZXJ9IGFuaW1hdGlvblRpbWVcbiAgICAgICAgICAgICAqIEBtZW1iZXJvZiBPcGVuU2VhZHJhZ29uLlNwcmluZyNcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgYW5pbWF0aW9uVGltZTogYXJncy5sZW5ndGggPiAxID9cbiAgICAgICAgICAgICAgICBhcmdzWyAxIF0uYW5pbWF0aW9uVGltZSA6XG4gICAgICAgICAgICAgICAgMS41XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgJC5jb25zb2xlLmFzc2VydCh0eXBlb2Ygb3B0aW9ucy5zcHJpbmdTdGlmZm5lc3MgPT09IFwibnVtYmVyXCIgJiYgb3B0aW9ucy5zcHJpbmdTdGlmZm5lc3MgIT09IDAsXG4gICAgICAgIFwiW09wZW5TZWFkcmFnb24uU3ByaW5nXSBvcHRpb25zLnNwcmluZ1N0aWZmbmVzcyBtdXN0IGJlIGEgbm9uLXplcm8gbnVtYmVyXCIpO1xuXG4gICAgJC5jb25zb2xlLmFzc2VydCh0eXBlb2Ygb3B0aW9ucy5hbmltYXRpb25UaW1lID09PSBcIm51bWJlclwiICYmIG9wdGlvbnMuYW5pbWF0aW9uVGltZSA+PSAwLFxuICAgICAgICBcIltPcGVuU2VhZHJhZ29uLlNwcmluZ10gb3B0aW9ucy5hbmltYXRpb25UaW1lIG11c3QgYmUgYSBudW1iZXIgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDBcIik7XG5cbiAgICBpZiAob3B0aW9ucy5leHBvbmVudGlhbCkge1xuICAgICAgICB0aGlzLl9leHBvbmVudGlhbCA9IHRydWU7XG4gICAgICAgIGRlbGV0ZSBvcHRpb25zLmV4cG9uZW50aWFsO1xuICAgIH1cblxuICAgICQuZXh0ZW5kKCB0cnVlLCB0aGlzLCBvcHRpb25zKTtcblxuICAgIC8qKlxuICAgICAqIEBtZW1iZXIge09iamVjdH0gY3VycmVudFxuICAgICAqIEBtZW1iZXJvZiBPcGVuU2VhZHJhZ29uLlNwcmluZyNcbiAgICAgKiBAcHJvcGVydHkge051bWJlcn0gdmFsdWVcbiAgICAgKiBAcHJvcGVydHkge051bWJlcn0gdGltZVxuICAgICAqL1xuICAgIHRoaXMuY3VycmVudCA9IHtcbiAgICAgICAgdmFsdWU6IHR5cGVvZiAoIHRoaXMuaW5pdGlhbCApID09IFwibnVtYmVyXCIgP1xuICAgICAgICAgICAgdGhpcy5pbml0aWFsIDpcbiAgICAgICAgICAgICh0aGlzLl9leHBvbmVudGlhbCA/IDAgOiAxKSxcbiAgICAgICAgdGltZTogICQubm93KCkgLy8gYWx3YXlzIHdvcmsgaW4gbWlsbGlzZWNvbmRzXG4gICAgfTtcblxuICAgICQuY29uc29sZS5hc3NlcnQoIXRoaXMuX2V4cG9uZW50aWFsIHx8IHRoaXMuY3VycmVudC52YWx1ZSAhPT0gMCxcbiAgICAgICAgXCJbT3BlblNlYWRyYWdvbi5TcHJpbmddIHZhbHVlIG11c3QgYmUgbm9uLXplcm8gZm9yIGV4cG9uZW50aWFsIHNwcmluZ3NcIik7XG5cbiAgICAvKipcbiAgICAgKiBAbWVtYmVyIHtPYmplY3R9IHN0YXJ0XG4gICAgICogQG1lbWJlcm9mIE9wZW5TZWFkcmFnb24uU3ByaW5nI1xuICAgICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSB2YWx1ZVxuICAgICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSB0aW1lXG4gICAgICovXG4gICAgdGhpcy5zdGFydCA9IHtcbiAgICAgICAgdmFsdWU6IHRoaXMuY3VycmVudC52YWx1ZSxcbiAgICAgICAgdGltZTogIHRoaXMuY3VycmVudC50aW1lXG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEBtZW1iZXIge09iamVjdH0gdGFyZ2V0XG4gICAgICogQG1lbWJlcm9mIE9wZW5TZWFkcmFnb24uU3ByaW5nI1xuICAgICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSB2YWx1ZVxuICAgICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSB0aW1lXG4gICAgICovXG4gICAgdGhpcy50YXJnZXQgPSB7XG4gICAgICAgIHZhbHVlOiB0aGlzLmN1cnJlbnQudmFsdWUsXG4gICAgICAgIHRpbWU6ICB0aGlzLmN1cnJlbnQudGltZVxuICAgIH07XG5cbiAgICBpZiAodGhpcy5fZXhwb25lbnRpYWwpIHtcbiAgICAgICAgdGhpcy5zdGFydC5fbG9nVmFsdWUgPSBNYXRoLmxvZyh0aGlzLnN0YXJ0LnZhbHVlKTtcbiAgICAgICAgdGhpcy50YXJnZXQuX2xvZ1ZhbHVlID0gTWF0aC5sb2codGhpcy50YXJnZXQudmFsdWUpO1xuICAgICAgICB0aGlzLmN1cnJlbnQuX2xvZ1ZhbHVlID0gTWF0aC5sb2codGhpcy5jdXJyZW50LnZhbHVlKTtcbiAgICB9XG59O1xuXG4vKiogQGxlbmRzIE9wZW5TZWFkcmFnb24uU3ByaW5nLnByb3RvdHlwZSAqL1xuJC5TcHJpbmcucHJvdG90eXBlID0ge1xuXG4gICAgLyoqXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHRhcmdldFxuICAgICAqL1xuICAgIHJlc2V0VG86IGZ1bmN0aW9uKCB0YXJnZXQgKSB7XG4gICAgICAgICQuY29uc29sZS5hc3NlcnQoIXRoaXMuX2V4cG9uZW50aWFsIHx8IHRhcmdldCAhPT0gMCxcbiAgICAgICAgICAgIFwiW09wZW5TZWFkcmFnb24uU3ByaW5nLnJlc2V0VG9dIHRhcmdldCBtdXN0IGJlIG5vbi16ZXJvIGZvciBleHBvbmVudGlhbCBzcHJpbmdzXCIpO1xuXG4gICAgICAgIHRoaXMuc3RhcnQudmFsdWUgPSB0aGlzLnRhcmdldC52YWx1ZSA9IHRoaXMuY3VycmVudC52YWx1ZSA9IHRhcmdldDtcbiAgICAgICAgdGhpcy5zdGFydC50aW1lID0gdGhpcy50YXJnZXQudGltZSA9IHRoaXMuY3VycmVudC50aW1lID0gJC5ub3coKTtcblxuICAgICAgICBpZiAodGhpcy5fZXhwb25lbnRpYWwpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhcnQuX2xvZ1ZhbHVlID0gTWF0aC5sb2codGhpcy5zdGFydC52YWx1ZSk7XG4gICAgICAgICAgICB0aGlzLnRhcmdldC5fbG9nVmFsdWUgPSBNYXRoLmxvZyh0aGlzLnRhcmdldC52YWx1ZSk7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnQuX2xvZ1ZhbHVlID0gTWF0aC5sb2codGhpcy5jdXJyZW50LnZhbHVlKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gdGFyZ2V0XG4gICAgICovXG4gICAgc3ByaW5nVG86IGZ1bmN0aW9uKCB0YXJnZXQgKSB7XG4gICAgICAgICQuY29uc29sZS5hc3NlcnQoIXRoaXMuX2V4cG9uZW50aWFsIHx8IHRhcmdldCAhPT0gMCxcbiAgICAgICAgICAgIFwiW09wZW5TZWFkcmFnb24uU3ByaW5nLnNwcmluZ1RvXSB0YXJnZXQgbXVzdCBiZSBub24temVybyBmb3IgZXhwb25lbnRpYWwgc3ByaW5nc1wiKTtcblxuICAgICAgICB0aGlzLnN0YXJ0LnZhbHVlICA9IHRoaXMuY3VycmVudC52YWx1ZTtcbiAgICAgICAgdGhpcy5zdGFydC50aW1lICAgPSB0aGlzLmN1cnJlbnQudGltZTtcbiAgICAgICAgdGhpcy50YXJnZXQudmFsdWUgPSB0YXJnZXQ7XG4gICAgICAgIHRoaXMudGFyZ2V0LnRpbWUgID0gdGhpcy5zdGFydC50aW1lICsgMTAwMCAqIHRoaXMuYW5pbWF0aW9uVGltZTtcblxuICAgICAgICBpZiAodGhpcy5fZXhwb25lbnRpYWwpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhcnQuX2xvZ1ZhbHVlID0gTWF0aC5sb2codGhpcy5zdGFydC52YWx1ZSk7XG4gICAgICAgICAgICB0aGlzLnRhcmdldC5fbG9nVmFsdWUgPSBNYXRoLmxvZyh0aGlzLnRhcmdldC52YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGRlbHRhXG4gICAgICovXG4gICAgc2hpZnRCeTogZnVuY3Rpb24oIGRlbHRhICkge1xuICAgICAgICB0aGlzLnN0YXJ0LnZhbHVlICArPSBkZWx0YTtcbiAgICAgICAgdGhpcy50YXJnZXQudmFsdWUgKz0gZGVsdGE7XG5cbiAgICAgICAgaWYgKHRoaXMuX2V4cG9uZW50aWFsKSB7XG4gICAgICAgICAgICAkLmNvbnNvbGUuYXNzZXJ0KHRoaXMudGFyZ2V0LnZhbHVlICE9PSAwICYmIHRoaXMuc3RhcnQudmFsdWUgIT09IDAsXG4gICAgICAgICAgICAgICAgXCJbT3BlblNlYWRyYWdvbi5TcHJpbmcuc2hpZnRCeV0gc3ByaW5nIHZhbHVlIG11c3QgYmUgbm9uLXplcm8gZm9yIGV4cG9uZW50aWFsIHNwcmluZ3NcIik7XG5cbiAgICAgICAgICAgIHRoaXMuc3RhcnQuX2xvZ1ZhbHVlID0gTWF0aC5sb2codGhpcy5zdGFydC52YWx1ZSk7XG4gICAgICAgICAgICB0aGlzLnRhcmdldC5fbG9nVmFsdWUgPSBNYXRoLmxvZyh0aGlzLnRhcmdldC52YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgc2V0RXhwb25lbnRpYWw6IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX2V4cG9uZW50aWFsID0gdmFsdWU7XG5cbiAgICAgICAgaWYgKHRoaXMuX2V4cG9uZW50aWFsKSB7XG4gICAgICAgICAgICAkLmNvbnNvbGUuYXNzZXJ0KHRoaXMuY3VycmVudC52YWx1ZSAhPT0gMCAmJiB0aGlzLnRhcmdldC52YWx1ZSAhPT0gMCAmJiB0aGlzLnN0YXJ0LnZhbHVlICE9PSAwLFxuICAgICAgICAgICAgICAgIFwiW09wZW5TZWFkcmFnb24uU3ByaW5nLnNldEV4cG9uZW50aWFsXSBzcHJpbmcgdmFsdWUgbXVzdCBiZSBub24temVybyBmb3IgZXhwb25lbnRpYWwgc3ByaW5nc1wiKTtcblxuICAgICAgICAgICAgdGhpcy5zdGFydC5fbG9nVmFsdWUgPSBNYXRoLmxvZyh0aGlzLnN0YXJ0LnZhbHVlKTtcbiAgICAgICAgICAgIHRoaXMudGFyZ2V0Ll9sb2dWYWx1ZSA9IE1hdGgubG9nKHRoaXMudGFyZ2V0LnZhbHVlKTtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudC5fbG9nVmFsdWUgPSBNYXRoLmxvZyh0aGlzLmN1cnJlbnQudmFsdWUpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqL1xuICAgIHVwZGF0ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMuY3VycmVudC50aW1lICA9ICQubm93KCk7XG5cbiAgICAgICAgdmFyIHN0YXJ0VmFsdWUsIHRhcmdldFZhbHVlO1xuICAgICAgICBpZiAodGhpcy5fZXhwb25lbnRpYWwpIHtcbiAgICAgICAgICAgIHN0YXJ0VmFsdWUgPSB0aGlzLnN0YXJ0Ll9sb2dWYWx1ZTtcbiAgICAgICAgICAgIHRhcmdldFZhbHVlID0gdGhpcy50YXJnZXQuX2xvZ1ZhbHVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3RhcnRWYWx1ZSA9IHRoaXMuc3RhcnQudmFsdWU7XG4gICAgICAgICAgICB0YXJnZXRWYWx1ZSA9IHRoaXMudGFyZ2V0LnZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGN1cnJlbnRWYWx1ZSA9ICh0aGlzLmN1cnJlbnQudGltZSA+PSB0aGlzLnRhcmdldC50aW1lKSA/XG4gICAgICAgICAgICB0YXJnZXRWYWx1ZSA6XG4gICAgICAgICAgICBzdGFydFZhbHVlICtcbiAgICAgICAgICAgICAgICAoIHRhcmdldFZhbHVlIC0gc3RhcnRWYWx1ZSApICpcbiAgICAgICAgICAgICAgICB0cmFuc2Zvcm0oXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3ByaW5nU3RpZmZuZXNzLFxuICAgICAgICAgICAgICAgICAgICAoIHRoaXMuY3VycmVudC50aW1lIC0gdGhpcy5zdGFydC50aW1lICkgL1xuICAgICAgICAgICAgICAgICAgICAoIHRoaXMudGFyZ2V0LnRpbWUgIC0gdGhpcy5zdGFydC50aW1lIClcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgIGlmICh0aGlzLl9leHBvbmVudGlhbCkge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50LnZhbHVlID0gTWF0aC5leHAoY3VycmVudFZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudC52YWx1ZSA9IGN1cnJlbnRWYWx1ZTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHNwcmluZyBpcyBhdCB0aGUgdGFyZ2V0IHZhbHVlXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgYXQgdGFyZ2V0IHZhbHVlLCBmYWxzZSBvdGhlcndpc2VcbiAgICAgKi9cbiAgICBpc0F0VGFyZ2V0VmFsdWU6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50LnZhbHVlID09PSB0aGlzLnRhcmdldC52YWx1ZTtcbiAgICB9XG59O1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHRyYW5zZm9ybSggc3RpZmZuZXNzLCB4ICkge1xuICAgIHJldHVybiAoIDEuMCAtIE1hdGguZXhwKCBzdGlmZm5lc3MgKiAteCApICkgL1xuICAgICAgICAoIDEuMCAtIE1hdGguZXhwKCAtc3RpZmZuZXNzICkgKTtcbn1cblxufSggT3BlblNlYWRyYWdvbiApKTtcblxuLypcbiAqIE9wZW5TZWFkcmFnb24gLSBJbWFnZUxvYWRlclxuICpcbiAqIENvcHlyaWdodCAoQykgMjAwOSBDb2RlUGxleCBGb3VuZGF0aW9uXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMyBPcGVuU2VhZHJhZ29uIGNvbnRyaWJ1dG9yc1xuXG4gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmVcbiAqIG1ldDpcbiAqXG4gKiAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiAqICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAqXG4gKiAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0XG4gKiAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGVcbiAqICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cbiAqXG4gKiAtIE5laXRoZXIgdGhlIG5hbWUgb2YgQ29kZVBsZXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0c1xuICogICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbVxuICogICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuICpcbiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlNcbiAqIFwiQVMgSVNcIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1RcbiAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUlxuICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUXG4gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCxcbiAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRFxuICogVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUlxuICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkdcbiAqIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJU1xuICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4gKi9cblxuKGZ1bmN0aW9uKCAkICl7XG5cbi8vIHByaXZhdGUgY2xhc3NcbmZ1bmN0aW9uIEltYWdlSm9iICggb3B0aW9ucyApIHtcblxuICAgICQuZXh0ZW5kKCB0cnVlLCB0aGlzLCB7XG4gICAgICAgIHRpbWVvdXQ6ICAgICAgICAkLkRFRkFVTFRfU0VUVElOR1MudGltZW91dCxcbiAgICAgICAgam9iSWQ6ICAgICAgICAgIG51bGxcbiAgICB9LCBvcHRpb25zICk7XG5cbiAgICAvKipcbiAgICAgKiBJbWFnZSBvYmplY3Qgd2hpY2ggd2lsbCBjb250YWluIGRvd25sb2FkZWQgaW1hZ2UuXG4gICAgICogQG1lbWJlciB7SW1hZ2V9IGltYWdlXG4gICAgICogQG1lbWJlcm9mIE9wZW5TZWFkcmFnb24uSW1hZ2VKb2IjXG4gICAgICovXG4gICAgdGhpcy5pbWFnZSA9IG51bGw7XG59XG5cbkltYWdlSm9iLnByb3RvdHlwZSA9IHtcbiAgICBlcnJvck1zZzogbnVsbCxcbiAgICBzdGFydDogZnVuY3Rpb24oKXtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgICB0aGlzLmltYWdlID0gbmV3IEltYWdlKCk7XG5cbiAgICAgICAgaWYgKCB0aGlzLmNyb3NzT3JpZ2luUG9saWN5ICE9PSBmYWxzZSApIHtcbiAgICAgICAgICAgIHRoaXMuaW1hZ2UuY3Jvc3NPcmlnaW4gPSB0aGlzLmNyb3NzT3JpZ2luUG9saWN5O1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pbWFnZS5vbmxvYWQgPSBmdW5jdGlvbigpe1xuICAgICAgICAgICAgX3RoaXMuZmluaXNoKCB0cnVlICk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuaW1hZ2Uub25hYm9ydCA9IHRoaXMuaW1hZ2Uub25lcnJvciA9IGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICBfdGhpcy5lcnJvck1zZyA9IFwiSW1hZ2UgbG9hZCBhYm9ydGVkXCI7XG4gICAgICAgICAgICBfdGhpcy5maW5pc2goIGZhbHNlICk7XG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5qb2JJZCA9IHdpbmRvdy5zZXRUaW1lb3V0KCBmdW5jdGlvbigpe1xuICAgICAgICAgICAgX3RoaXMuZXJyb3JNc2cgPSBcIkltYWdlIGxvYWQgZXhjZWVkZWQgdGltZW91dFwiO1xuICAgICAgICAgICAgX3RoaXMuZmluaXNoKCBmYWxzZSApO1xuICAgICAgICB9LCB0aGlzLnRpbWVvdXQpO1xuXG4gICAgICAgIHRoaXMuaW1hZ2Uuc3JjID0gdGhpcy5zcmM7XG4gICAgfSxcblxuICAgIGZpbmlzaDogZnVuY3Rpb24oIHN1Y2Nlc3NmdWwgKSB7XG4gICAgICAgIHRoaXMuaW1hZ2Uub25sb2FkID0gdGhpcy5pbWFnZS5vbmVycm9yID0gdGhpcy5pbWFnZS5vbmFib3J0ID0gbnVsbDtcbiAgICAgICAgaWYgKCFzdWNjZXNzZnVsKSB7XG4gICAgICAgICAgICB0aGlzLmltYWdlID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICggdGhpcy5qb2JJZCApIHtcbiAgICAgICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQoIHRoaXMuam9iSWQgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2FsbGJhY2soIHRoaXMgKTtcbiAgICB9XG5cbn07XG5cbi8qKlxuICogQGNsYXNzIEltYWdlTG9hZGVyXG4gKiBAbWVtYmVyb2YgT3BlblNlYWRyYWdvblxuICogQGNsYXNzZGVzYyBIYW5kbGVzIGRvd25sb2FkaW5nIG9mIGEgc2V0IG9mIGltYWdlcyB1c2luZyBhc3luY2hyb25vdXMgcXVldWUgcGF0dGVybi5cbiAqIFlvdSBnZW5lcmFsbHkgd29uJ3QgaGF2ZSB0byBpbnRlcmFjdCB3aXRoIHRoZSBJbWFnZUxvYWRlciBkaXJlY3RseS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gT3B0aW9ucyBmb3IgdGhpcyBJbWFnZUxvYWRlci5cbiAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5qb2JMaW1pdF0gLSBUaGUgbnVtYmVyIG9mIGNvbmN1cnJlbnQgaW1hZ2UgcmVxdWVzdHMuIFNlZSBpbWFnZUxvYWRlckxpbWl0IGluIHtAbGluayBPcGVuU2VhZHJhZ29uLk9wdGlvbnN9IGZvciBkZXRhaWxzLlxuICovXG4kLkltYWdlTG9hZGVyID0gZnVuY3Rpb24oIG9wdGlvbnMgKSB7XG5cbiAgICAkLmV4dGVuZCggdHJ1ZSwgdGhpcywge1xuICAgICAgICBqb2JMaW1pdDogICAgICAgJC5ERUZBVUxUX1NFVFRJTkdTLmltYWdlTG9hZGVyTGltaXQsXG4gICAgICAgIGpvYlF1ZXVlOiAgICAgICBbXSxcbiAgICAgICAgam9ic0luUHJvZ3Jlc3M6IDBcbiAgICB9LCBvcHRpb25zICk7XG5cbn07XG5cbi8qKiBAbGVuZHMgT3BlblNlYWRyYWdvbi5JbWFnZUxvYWRlci5wcm90b3R5cGUgKi9cbiQuSW1hZ2VMb2FkZXIucHJvdG90eXBlID0ge1xuXG4gICAgLyoqXG4gICAgICogQWRkIGFuIHVubG9hZGVkIGltYWdlIHRvIHRoZSBsb2FkZXIgcXVldWUuXG4gICAgICogQG1ldGhvZFxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzcmMgLSBVUkwgb2YgaW1hZ2UgdG8gZG93bmxvYWQuXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGNyb3NzT3JpZ2luUG9saWN5IC0gQ09SUyBwb2xpY3kgdG8gdXNlIGZvciBkb3dubG9hZHNcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayAtIENhbGxlZCBvbmNlIGltYWdlIGhhcyBiZWVuIGRvd25sb2FkZWQuXG4gICAgICovXG4gICAgYWRkSm9iOiBmdW5jdGlvbiggb3B0aW9ucyApIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcyxcbiAgICAgICAgICAgIGNvbXBsZXRlID0gZnVuY3Rpb24oIGpvYiApIHtcbiAgICAgICAgICAgICAgICBjb21wbGV0ZUpvYiggX3RoaXMsIGpvYiwgb3B0aW9ucy5jYWxsYmFjayApO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGpvYk9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgc3JjOiBvcHRpb25zLnNyYyxcbiAgICAgICAgICAgICAgICBjcm9zc09yaWdpblBvbGljeTogb3B0aW9ucy5jcm9zc09yaWdpblBvbGljeSxcbiAgICAgICAgICAgICAgICBjYWxsYmFjazogY29tcGxldGUsXG4gICAgICAgICAgICAgICAgYWJvcnQ6IG9wdGlvbnMuYWJvcnRcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBuZXdKb2IgPSBuZXcgSW1hZ2VKb2IoIGpvYk9wdGlvbnMgKTtcblxuICAgICAgICBpZiAoICF0aGlzLmpvYkxpbWl0IHx8IHRoaXMuam9ic0luUHJvZ3Jlc3MgPCB0aGlzLmpvYkxpbWl0ICkge1xuICAgICAgICAgICAgbmV3Sm9iLnN0YXJ0KCk7XG4gICAgICAgICAgICB0aGlzLmpvYnNJblByb2dyZXNzKys7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmpvYlF1ZXVlLnB1c2goIG5ld0pvYiApO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENsZWFyIGFueSB1bnN0YXJ0ZWQgaW1hZ2UgbG9hZGluZyBqb2JzIGZyb20gdGhlIHF1ZXVlLlxuICAgICAqIEBtZXRob2RcbiAgICAgKi9cbiAgICBjbGVhcjogZnVuY3Rpb24oKSB7XG4gICAgICAgIGZvciggdmFyIGkgPSAwOyBpIDwgdGhpcy5qb2JRdWV1ZS5sZW5ndGg7IGkrKyApIHtcbiAgICAgICAgICAgIHZhciBqb2IgPSB0aGlzLmpvYlF1ZXVlW2ldO1xuICAgICAgICAgICAgaWYgKCB0eXBlb2Ygam9iLmFib3J0ID09PSBcImZ1bmN0aW9uXCIgKSB7XG4gICAgICAgICAgICAgICAgam9iLmFib3J0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmpvYlF1ZXVlID0gW107XG4gICAgfVxufTtcblxuLyoqXG4gKiBDbGVhbnMgdXAgSW1hZ2VKb2Igb25jZSBjb21wbGV0ZWQuXG4gKiBAbWV0aG9kXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIGxvYWRlciAtIEltYWdlTG9hZGVyIHVzZWQgdG8gc3RhcnQgam9iLlxuICogQHBhcmFtIGpvYiAtIFRoZSBJbWFnZUpvYiB0aGF0IGhhcyBjb21wbGV0ZWQuXG4gKiBAcGFyYW0gY2FsbGJhY2sgLSBDYWxsZWQgb25jZSBjbGVhbnVwIGlzIGZpbmlzaGVkLlxuICovXG5mdW5jdGlvbiBjb21wbGV0ZUpvYiggbG9hZGVyLCBqb2IsIGNhbGxiYWNrICkge1xuICAgIHZhciBuZXh0Sm9iO1xuXG4gICAgbG9hZGVyLmpvYnNJblByb2dyZXNzLS07XG5cbiAgICBpZiAoICghbG9hZGVyLmpvYkxpbWl0IHx8IGxvYWRlci5qb2JzSW5Qcm9ncmVzcyA8IGxvYWRlci5qb2JMaW1pdCkgJiYgbG9hZGVyLmpvYlF1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbmV4dEpvYiA9IGxvYWRlci5qb2JRdWV1ZS5zaGlmdCgpO1xuICAgICAgICBuZXh0Sm9iLnN0YXJ0KCk7XG4gICAgICAgIGxvYWRlci5qb2JzSW5Qcm9ncmVzcysrO1xuICAgIH1cblxuICAgIGNhbGxiYWNrKCBqb2IuaW1hZ2UsIGpvYi5lcnJvck1zZyApO1xufVxuXG59KCBPcGVuU2VhZHJhZ29uICkpO1xuXG4vKlxuICogT3BlblNlYWRyYWdvbiAtIFRpbGVcbiAqXG4gKiBDb3B5cmlnaHQgKEMpIDIwMDkgQ29kZVBsZXggRm91bmRhdGlvblxuICogQ29weXJpZ2h0IChDKSAyMDEwLTIwMTMgT3BlblNlYWRyYWdvbiBjb250cmlidXRvcnNcbiAqXG4gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmVcbiAqIG1ldDpcbiAqXG4gKiAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiAqICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAqXG4gKiAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0XG4gKiAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGVcbiAqICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cbiAqXG4gKiAtIE5laXRoZXIgdGhlIG5hbWUgb2YgQ29kZVBsZXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0c1xuICogICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbVxuICogICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuICpcbiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlNcbiAqIFwiQVMgSVNcIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1RcbiAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUlxuICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUXG4gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCxcbiAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRFxuICogVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUlxuICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkdcbiAqIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJU1xuICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4gKi9cblxuKGZ1bmN0aW9uKCAkICl7XG5cbi8qKlxuICogQGNsYXNzIFRpbGVcbiAqIEBtZW1iZXJvZiBPcGVuU2VhZHJhZ29uXG4gKiBAcGFyYW0ge051bWJlcn0gbGV2ZWwgVGhlIHpvb20gbGV2ZWwgdGhpcyB0aWxlIGJlbG9uZ3MgdG8uXG4gKiBAcGFyYW0ge051bWJlcn0geCBUaGUgdmVjdG9yIGNvbXBvbmVudCAneCcuXG4gKiBAcGFyYW0ge051bWJlcn0geSBUaGUgdmVjdG9yIGNvbXBvbmVudCAneScuXG4gKiBAcGFyYW0ge09wZW5TZWFkcmFnb24uUG9pbnR9IGJvdW5kcyBXaGVyZSB0aGlzIHRpbGUgZml0cywgaW4gbm9ybWFsaXplZFxuICogICAgICBjb29yZGluYXRlcy5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gZXhpc3RzIElzIHRoaXMgdGlsZSBhIHBhcnQgb2YgYSBzcGFyc2UgaW1hZ2U/ICggQWxzbyBoYXNcbiAqICAgICAgdGhpcyB0aWxlIGZhaWxlZCB0byBsb2FkPyApXG4gKiBAcGFyYW0ge1N0cmluZ30gdXJsIFRoZSBVUkwgb2YgdGhpcyB0aWxlJ3MgaW1hZ2UuXG4gKiBAcGFyYW0ge0NhbnZhc1JlbmRlcmluZ0NvbnRleHQyRH0gY29udGV4dDJEIFRoZSBjb250ZXh0MkQgb2YgdGhpcyB0aWxlIGlmIGl0XG4gKiBpcyBwcm92aWRlZCBkaXJlY3RseSBieSB0aGUgdGlsZSBzb3VyY2UuXG4gKi9cbiQuVGlsZSA9IGZ1bmN0aW9uKGxldmVsLCB4LCB5LCBib3VuZHMsIGV4aXN0cywgdXJsLCBjb250ZXh0MkQpIHtcbiAgICAvKipcbiAgICAgKiBUaGUgem9vbSBsZXZlbCB0aGlzIHRpbGUgYmVsb25ncyB0by5cbiAgICAgKiBAbWVtYmVyIHtOdW1iZXJ9IGxldmVsXG4gICAgICogQG1lbWJlcm9mIE9wZW5TZWFkcmFnb24uVGlsZSNcbiAgICAgKi9cbiAgICB0aGlzLmxldmVsICAgPSBsZXZlbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdmVjdG9yIGNvbXBvbmVudCAneCcuXG4gICAgICogQG1lbWJlciB7TnVtYmVyfSB4XG4gICAgICogQG1lbWJlcm9mIE9wZW5TZWFkcmFnb24uVGlsZSNcbiAgICAgKi9cbiAgICB0aGlzLnggICAgICAgPSB4O1xuICAgIC8qKlxuICAgICAqIFRoZSB2ZWN0b3IgY29tcG9uZW50ICd5Jy5cbiAgICAgKiBAbWVtYmVyIHtOdW1iZXJ9IHlcbiAgICAgKiBAbWVtYmVyb2YgT3BlblNlYWRyYWdvbi5UaWxlI1xuICAgICAqL1xuICAgIHRoaXMueSAgICAgICA9IHk7XG4gICAgLyoqXG4gICAgICogV2hlcmUgdGhpcyB0aWxlIGZpdHMsIGluIG5vcm1hbGl6ZWQgY29vcmRpbmF0ZXNcbiAgICAgKiBAbWVtYmVyIHtPcGVuU2VhZHJhZ29uLlJlY3R9IGJvdW5kc1xuICAgICAqIEBtZW1iZXJvZiBPcGVuU2VhZHJhZ29uLlRpbGUjXG4gICAgICovXG4gICAgdGhpcy5ib3VuZHMgID0gYm91bmRzO1xuICAgIC8qKlxuICAgICAqIElzIHRoaXMgdGlsZSBhIHBhcnQgb2YgYSBzcGFyc2UgaW1hZ2U/IEFsc28gaGFzIHRoaXMgdGlsZSBmYWlsZWQgdG8gbG9hZD9cbiAgICAgKiBAbWVtYmVyIHtCb29sZWFufSBleGlzdHNcbiAgICAgKiBAbWVtYmVyb2YgT3BlblNlYWRyYWdvbi5UaWxlI1xuICAgICAqL1xuICAgIHRoaXMuZXhpc3RzICA9IGV4aXN0cztcbiAgICAvKipcbiAgICAgKiBUaGUgVVJMIG9mIHRoaXMgdGlsZSdzIGltYWdlLlxuICAgICAqIEBtZW1iZXIge1N0cmluZ30gdXJsXG4gICAgICogQG1lbWJlcm9mIE9wZW5TZWFkcmFnb24uVGlsZSNcbiAgICAgKi9cbiAgICB0aGlzLnVybCAgICAgPSB1cmw7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbnRleHQyRCBvZiB0aGlzIHRpbGUgaWYgaXQgaXMgcHJvdmlkZWQgZGlyZWN0bHkgYnkgdGhlIHRpbGUgc291cmNlLlxuICAgICAqIEBtZW1iZXIge0NhbnZhc1JlbmRlcmluZ0NvbnRleHQyRH0gY29udGV4dDJEXG4gICAgICogQG1lbWJlck9mIE9wZW5TZWFkcmFnb24uVGlsZSNcbiAgICAgKi9cbiAgICB0aGlzLmNvbnRleHQyRCA9IGNvbnRleHQyRDtcbiAgICAvKipcbiAgICAgKiBJcyB0aGlzIHRpbGUgbG9hZGVkP1xuICAgICAqIEBtZW1iZXIge0Jvb2xlYW59IGxvYWRlZFxuICAgICAqIEBtZW1iZXJvZiBPcGVuU2VhZHJhZ29uLlRpbGUjXG4gICAgICovXG4gICAgdGhpcy5sb2FkZWQgID0gZmFsc2U7XG4gICAgLyoqXG4gICAgICogSXMgdGhpcyB0aWxlIGxvYWRpbmc/XG4gICAgICogQG1lbWJlciB7Qm9vbGVhbn0gbG9hZGluZ1xuICAgICAqIEBtZW1iZXJvZiBPcGVuU2VhZHJhZ29uLlRpbGUjXG4gICAgICovXG4gICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgSFRNTCBkaXYgZWxlbWVudCBmb3IgdGhpcyB0aWxlXG4gICAgICogQG1lbWJlciB7RWxlbWVudH0gZWxlbWVudFxuICAgICAqIEBtZW1iZXJvZiBPcGVuU2VhZHJhZ29uLlRpbGUjXG4gICAgICovXG4gICAgdGhpcy5lbGVtZW50ICAgID0gbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSFRNTCBpbWcgZWxlbWVudCBmb3IgdGhpcyB0aWxlLlxuICAgICAqIEBtZW1iZXIge0VsZW1lbnR9IGltZ0VsZW1lbnRcbiAgICAgKiBAbWVtYmVyb2YgT3BlblNlYWRyYWdvbi5UaWxlI1xuICAgICAqL1xuICAgIHRoaXMuaW1nRWxlbWVudCA9IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIEltYWdlIG9iamVjdCBmb3IgdGhpcyB0aWxlLlxuICAgICAqIEBtZW1iZXIge09iamVjdH0gaW1hZ2VcbiAgICAgKiBAbWVtYmVyb2YgT3BlblNlYWRyYWdvbi5UaWxlI1xuICAgICAqL1xuICAgIHRoaXMuaW1hZ2UgICAgICA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYWxpYXMgb2YgdGhpcy5lbGVtZW50LnN0eWxlLlxuICAgICAqIEBtZW1iZXIge1N0cmluZ30gc3R5bGVcbiAgICAgKiBAbWVtYmVyb2YgT3BlblNlYWRyYWdvbi5UaWxlI1xuICAgICAqL1xuICAgIHRoaXMuc3R5bGUgICAgICA9IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhpcyB0aWxlJ3MgcG9zaXRpb24gb24gc2NyZWVuLCBpbiBwaXhlbHMuXG4gICAgICogQG1lbWJlciB7T3BlblNlYWRyYWdvbi5Qb2ludH0gcG9zaXRpb25cbiAgICAgKiBAbWVtYmVyb2YgT3BlblNlYWRyYWdvbi5UaWxlI1xuICAgICAqL1xuICAgIHRoaXMucG9zaXRpb24gICA9IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhpcyB0aWxlJ3Mgc2l6ZSBvbiBzY3JlZW4sIGluIHBpeGVscy5cbiAgICAgKiBAbWVtYmVyIHtPcGVuU2VhZHJhZ29uLlBvaW50fSBzaXplXG4gICAgICogQG1lbWJlcm9mIE9wZW5TZWFkcmFnb24uVGlsZSNcbiAgICAgKi9cbiAgICB0aGlzLnNpemUgICAgICAgPSBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGFydCB0aW1lIG9mIHRoaXMgdGlsZSdzIGJsZW5kaW5nLlxuICAgICAqIEBtZW1iZXIge051bWJlcn0gYmxlbmRTdGFydFxuICAgICAqIEBtZW1iZXJvZiBPcGVuU2VhZHJhZ29uLlRpbGUjXG4gICAgICovXG4gICAgdGhpcy5ibGVuZFN0YXJ0ID0gbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVudCBvcGFjaXR5IHRoaXMgdGlsZSBzaG91bGQgYmUuXG4gICAgICogQG1lbWJlciB7TnVtYmVyfSBvcGFjaXR5XG4gICAgICogQG1lbWJlcm9mIE9wZW5TZWFkcmFnb24uVGlsZSNcbiAgICAgKi9cbiAgICB0aGlzLm9wYWNpdHkgICAgPSBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkaXN0YW5jZSBvZiB0aGlzIHRpbGUgdG8gdGhlIHZpZXdwb3J0IGNlbnRlci5cbiAgICAgKiBAbWVtYmVyIHtOdW1iZXJ9IGRpc3RhbmNlXG4gICAgICogQG1lbWJlcm9mIE9wZW5TZWFkcmFnb24uVGlsZSNcbiAgICAgKi9cbiAgICB0aGlzLmRpc3RhbmNlICAgPSBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB2aXNpYmlsaXR5IHNjb3JlIG9mIHRoaXMgdGlsZS5cbiAgICAgKiBAbWVtYmVyIHtOdW1iZXJ9IHZpc2liaWxpdHlcbiAgICAgKiBAbWVtYmVyb2YgT3BlblNlYWRyYWdvbi5UaWxlI1xuICAgICAqL1xuICAgIHRoaXMudmlzaWJpbGl0eSA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRoaXMgdGlsZSBpcyBjdXJyZW50bHkgYmVpbmcgZHJhd24uXG4gICAgICogQG1lbWJlciB7Qm9vbGVhbn0gYmVpbmdEcmF3blxuICAgICAqIEBtZW1iZXJvZiBPcGVuU2VhZHJhZ29uLlRpbGUjXG4gICAgICovXG4gICAgdGhpcy5iZWluZ0RyYXduICAgICA9IGZhbHNlO1xuICAgIC8qKlxuICAgICAqIFRpbWVzdGFtcCB0aGUgdGlsZSB3YXMgbGFzdCB0b3VjaGVkLlxuICAgICAqIEBtZW1iZXIge051bWJlcn0gbGFzdFRvdWNoVGltZVxuICAgICAqIEBtZW1iZXJvZiBPcGVuU2VhZHJhZ29uLlRpbGUjXG4gICAgICovXG4gICAgdGhpcy5sYXN0VG91Y2hUaW1lICA9IDA7XG59O1xuXG4vKiogQGxlbmRzIE9wZW5TZWFkcmFnb24uVGlsZS5wcm90b3R5cGUgKi9cbiQuVGlsZS5wcm90b3R5cGUgPSB7XG5cbiAgICAvKipcbiAgICAgKiBQcm92aWRlcyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHRpbGVzIGxldmVsIGFuZCAoeCx5KVxuICAgICAqIGNvbXBvbmVudHMuXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHJldHVybnMge1N0cmluZ31cbiAgICAgKi9cbiAgICB0b1N0cmluZzogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxldmVsICsgXCIvXCIgKyB0aGlzLnggKyBcIl9cIiArIHRoaXMueTtcbiAgICB9LFxuXG4gICAgLy8gcHJpdmF0ZVxuICAgIF9oYXNUcmFuc3BhcmVuY3lDaGFubmVsOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5jb250ZXh0MkQgfHwgdGhpcy51cmwubWF0Y2goJy5wbmcnKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmVuZGVycyB0aGUgdGlsZSBpbiBhbiBodG1sIGNvbnRhaW5lci5cbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGNvbnRhaW5lclxuICAgICAqL1xuICAgIGRyYXdIVE1MOiBmdW5jdGlvbiggY29udGFpbmVyICkge1xuICAgICAgICBpZiAoIXRoaXMuY2FjaGVJbWFnZVJlY29yZCkge1xuICAgICAgICAgICAgJC5jb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgICAgJ1tUaWxlLmRyYXdIVE1MXSBhdHRlbXB0aW5nIHRvIGRyYXcgdGlsZSAlcyB3aGVuIGl0XFwncyBub3QgY2FjaGVkJyxcbiAgICAgICAgICAgICAgICB0aGlzLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCAhdGhpcy5sb2FkZWQgKSB7XG4gICAgICAgICAgICAkLmNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgICBcIkF0dGVtcHRpbmcgdG8gZHJhdyB0aWxlICVzIHdoZW4gaXQncyBub3QgeWV0IGxvYWRlZC5cIixcbiAgICAgICAgICAgICAgICB0aGlzLnRvU3RyaW5nKClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvL0VYUEVSSU1FTlRBTCAtIHRyeWluZyB0byBmaWd1cmUgb3V0IGhvdyB0byBzY2FsZSB0aGUgY29udGFpbmVyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgY29udGVudCBkdXJpbmcgYW5pbWF0aW9uIG9mIHRoZSBjb250YWluZXIgc2l6ZS5cblxuICAgICAgICBpZiAoICF0aGlzLmVsZW1lbnQgKSB7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICQubWFrZU5ldXRyYWxFbGVtZW50KCBcImRpdlwiICk7XG4gICAgICAgICAgICB0aGlzLmltZ0VsZW1lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHRoaXMuY2FjaGVJbWFnZVJlY29yZC5nZXRJbWFnZSgpLmNsb25lTm9kZSgpO1xuICAgICAgICAgICAgdGhpcy5pbWdFbGVtZW50LnN0eWxlLm1zSW50ZXJwb2xhdGlvbk1vZGUgPSBcIm5lYXJlc3QtbmVpZ2hib3JcIjtcbiAgICAgICAgICAgIHRoaXMuaW1nRWxlbWVudC5zdHlsZS53aWR0aCAgICAgICAgICAgICAgID0gXCIxMDAlXCI7XG4gICAgICAgICAgICB0aGlzLmltZ0VsZW1lbnQuc3R5bGUuaGVpZ2h0ICAgICAgICAgICAgICA9IFwiMTAwJVwiO1xuXG4gICAgICAgICAgICB0aGlzLnN0eWxlICAgICAgICAgICAgICAgICAgICAgPSB0aGlzLmVsZW1lbnQuc3R5bGU7XG4gICAgICAgICAgICB0aGlzLnN0eWxlLnBvc2l0aW9uICAgICAgICAgICAgPSBcImFic29sdXRlXCI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCB0aGlzLmVsZW1lbnQucGFyZW50Tm9kZSAhPSBjb250YWluZXIgKSB7XG4gICAgICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoIHRoaXMuZWxlbWVudCApO1xuICAgICAgICB9XG4gICAgICAgIGlmICggdGhpcy5pbWdFbGVtZW50LnBhcmVudE5vZGUgIT0gdGhpcy5lbGVtZW50ICkge1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKCB0aGlzLmltZ0VsZW1lbnQgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc3R5bGUudG9wICAgICA9IHRoaXMucG9zaXRpb24ueSArIFwicHhcIjtcbiAgICAgICAgdGhpcy5zdHlsZS5sZWZ0ICAgID0gdGhpcy5wb3NpdGlvbi54ICsgXCJweFwiO1xuICAgICAgICB0aGlzLnN0eWxlLmhlaWdodCAgPSB0aGlzLnNpemUueSArIFwicHhcIjtcbiAgICAgICAgdGhpcy5zdHlsZS53aWR0aCAgID0gdGhpcy5zaXplLnggKyBcInB4XCI7XG5cbiAgICAgICAgJC5zZXRFbGVtZW50T3BhY2l0eSggdGhpcy5lbGVtZW50LCB0aGlzLm9wYWNpdHkgKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmVuZGVycyB0aGUgdGlsZSBpbiBhIGNhbnZhcy1iYXNlZCBjb250ZXh0LlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7Q2FudmFzfSBjb250ZXh0XG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZHJhd2luZ0hhbmRsZXIgLSBNZXRob2QgZm9yIGZpcmluZyB0aGUgZHJhd2luZyBldmVudC5cbiAgICAgKiBkcmF3aW5nSGFuZGxlcih7Y29udGV4dCwgdGlsZSwgcmVuZGVyZWR9KVxuICAgICAqIHdoZXJlIDxjb2RlPnJlbmRlcmVkPC9jb2RlPiBpcyB0aGUgY29udGV4dCB3aXRoIHRoZSBwcmUtZHJhd24gaW1hZ2UuXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IFtzY2FsZT0xXSAtIEFwcGx5IGEgc2NhbGUgdG8gcG9zaXRpb24gYW5kIHNpemVcbiAgICAgKiBAcGFyYW0ge09wZW5TZWFkcmFnb24uUG9pbnR9IFt0cmFuc2xhdGVdIC0gQSB0cmFuc2xhdGlvbiB2ZWN0b3JcbiAgICAgKi9cbiAgICBkcmF3Q2FudmFzOiBmdW5jdGlvbiggY29udGV4dCwgZHJhd2luZ0hhbmRsZXIsIHNjYWxlLCB0cmFuc2xhdGUgKSB7XG5cbiAgICAgICAgdmFyIHBvc2l0aW9uID0gdGhpcy5wb3NpdGlvbi50aW1lcygkLnBpeGVsRGVuc2l0eVJhdGlvKSxcbiAgICAgICAgICAgIHNpemUgICAgID0gdGhpcy5zaXplLnRpbWVzKCQucGl4ZWxEZW5zaXR5UmF0aW8pLFxuICAgICAgICAgICAgcmVuZGVyZWQ7XG5cbiAgICAgICAgaWYgKCF0aGlzLmNvbnRleHQyRCAmJiAhdGhpcy5jYWNoZUltYWdlUmVjb3JkKSB7XG4gICAgICAgICAgICAkLmNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgICAnW1RpbGUuZHJhd0NhbnZhc10gYXR0ZW1wdGluZyB0byBkcmF3IHRpbGUgJXMgd2hlbiBpdFxcJ3Mgbm90IGNhY2hlZCcsXG4gICAgICAgICAgICAgICAgdGhpcy50b1N0cmluZygpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlbmRlcmVkID0gdGhpcy5jb250ZXh0MkQgfHwgdGhpcy5jYWNoZUltYWdlUmVjb3JkLmdldFJlbmRlcmVkQ29udGV4dCgpO1xuXG4gICAgICAgIGlmICggIXRoaXMubG9hZGVkIHx8ICFyZW5kZXJlZCApe1xuICAgICAgICAgICAgJC5jb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgICAgXCJBdHRlbXB0aW5nIHRvIGRyYXcgdGlsZSAlcyB3aGVuIGl0J3Mgbm90IHlldCBsb2FkZWQuXCIsXG4gICAgICAgICAgICAgICAgdGhpcy50b1N0cmluZygpXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb250ZXh0LnNhdmUoKTtcblxuICAgICAgICBjb250ZXh0Lmdsb2JhbEFscGhhID0gdGhpcy5vcGFjaXR5O1xuXG4gICAgICAgIGlmICh0eXBlb2Ygc2NhbGUgPT09ICdudW1iZXInICYmIHNjYWxlICE9PSAxKSB7XG4gICAgICAgICAgICAvLyBkcmF3IHRpbGUgYXQgYSBkaWZmZXJlbnQgc2NhbGVcbiAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb24udGltZXMoc2NhbGUpO1xuICAgICAgICAgICAgc2l6ZSA9IHNpemUudGltZXMoc2NhbGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRyYW5zbGF0ZSBpbnN0YW5jZW9mICQuUG9pbnQpIHtcbiAgICAgICAgICAgIC8vIHNoaWZ0IHRpbGUgcG9zaXRpb24gc2xpZ2h0bHlcbiAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb24ucGx1cyh0cmFuc2xhdGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9pZiB3ZSBhcmUgc3VwcG9zZWQgdG8gYmUgcmVuZGVyaW5nIGZ1bGx5IG9wYXF1ZSByZWN0YW5nbGUsXG4gICAgICAgIC8vaWUgaXRzIGRvbmUgZmFkaW5nIG9yIGZhZGluZyBpcyB0dXJuZWQgb2ZmLCBhbmQgaWYgd2UgYXJlIGRyYXdpbmdcbiAgICAgICAgLy9hbiBpbWFnZSB3aXRoIGFuIGFscGhhIGNoYW5uZWwsIHRoZW4gdGhlIG9ubHkgd2F5XG4gICAgICAgIC8vdG8gYXZvaWQgc2VlaW5nIHRoZSB0aWxlIHVuZGVybmVhdGggaXMgdG8gY2xlYXIgdGhlIHJlY3RhbmdsZVxuICAgICAgICBpZiAoY29udGV4dC5nbG9iYWxBbHBoYSA9PT0gMSAmJiB0aGlzLl9oYXNUcmFuc3BhcmVuY3lDaGFubmVsKCkpIHtcbiAgICAgICAgICAgIC8vY2xlYXJpbmcgb25seSB0aGUgaW5zaWRlIG9mIHRoZSByZWN0YW5nbGUgb2NjdXBpZWRcbiAgICAgICAgICAgIC8vYnkgdGhlIHBuZyBwcmV2ZW50cyBlZGdlIGZsaWtlcmluZ1xuICAgICAgICAgICAgY29udGV4dC5jbGVhclJlY3QoXG4gICAgICAgICAgICAgICAgcG9zaXRpb24ueCArIDEsXG4gICAgICAgICAgICAgICAgcG9zaXRpb24ueSArIDEsXG4gICAgICAgICAgICAgICAgc2l6ZS54IC0gMixcbiAgICAgICAgICAgICAgICBzaXplLnkgLSAyXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVGhpcyBnaXZlcyB0aGUgYXBwbGljYXRpb24gYSBjaGFuY2UgdG8gbWFrZSBpbWFnZSBtYW5pcHVsYXRpb25cbiAgICAgICAgLy8gY2hhbmdlcyBhcyB3ZSBhcmUgcmVuZGVyaW5nIHRoZSBpbWFnZVxuICAgICAgICBkcmF3aW5nSGFuZGxlcih7Y29udGV4dDogY29udGV4dCwgdGlsZTogdGhpcywgcmVuZGVyZWQ6IHJlbmRlcmVkfSk7XG5cbiAgICAgICAgY29udGV4dC5kcmF3SW1hZ2UoXG4gICAgICAgICAgICByZW5kZXJlZC5jYW52YXMsXG4gICAgICAgICAgICAwLFxuICAgICAgICAgICAgMCxcbiAgICAgICAgICAgIHJlbmRlcmVkLmNhbnZhcy53aWR0aCxcbiAgICAgICAgICAgIHJlbmRlcmVkLmNhbnZhcy5oZWlnaHQsXG4gICAgICAgICAgICBwb3NpdGlvbi54LFxuICAgICAgICAgICAgcG9zaXRpb24ueSxcbiAgICAgICAgICAgIHNpemUueCxcbiAgICAgICAgICAgIHNpemUueVxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnRleHQucmVzdG9yZSgpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHJhdGlvIGJldHdlZW4gY3VycmVudCBhbmQgb3JpZ2luYWwgc2l6ZS5cbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcmV0dXJuIHtGbG9hdH1cbiAgICAgKi9cbiAgICBnZXRTY2FsZUZvckVkZ2VTbW9vdGhpbmc6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgY29udGV4dDtcbiAgICAgICAgaWYgKHRoaXMuY2FjaGVJbWFnZVJlY29yZCkge1xuICAgICAgICAgICAgY29udGV4dCA9IHRoaXMuY2FjaGVJbWFnZVJlY29yZC5nZXRSZW5kZXJlZENvbnRleHQoKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbnRleHQyRCkge1xuICAgICAgICAgICAgY29udGV4dCA9IHRoaXMuY29udGV4dDJEO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgJC5jb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgICAgJ1tUaWxlLmRyYXdDYW52YXNdIGF0dGVtcHRpbmcgdG8gZ2V0IHRpbGUgc2NhbGUgJXMgd2hlbiB0aWxlXFwncyBub3QgY2FjaGVkJyxcbiAgICAgICAgICAgICAgICB0aGlzLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbnRleHQuY2FudmFzLndpZHRoIC8gKHRoaXMuc2l6ZS54ICogJC5waXhlbERlbnNpdHlSYXRpbyk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdldCBhIHRyYW5zbGF0aW9uIHZlY3RvciB0aGF0IHdoZW4gYXBwbGllZCB0byB0aGUgdGlsZSBwb3NpdGlvbiBwcm9kdWNlcyBpbnRlZ2VyIGNvb3JkaW5hdGVzLlxuICAgICAqIE5lZWRlZCB0byBhdm9pZCBzd2ltbWluZyBhbmQgdHdpdGNoaW5nLlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBbc2NhbGU9MV0gLSBTY2FsZSB0byBiZSBhcHBsaWVkIHRvIHBvc2l0aW9uLlxuICAgICAqIEByZXR1cm4ge09wZW5TZWFkcmFnb24uUG9pbnR9XG4gICAgICovXG4gICAgZ2V0VHJhbnNsYXRpb25Gb3JFZGdlU21vb3RoaW5nOiBmdW5jdGlvbihzY2FsZSwgY2FudmFzU2l6ZSwgc2tldGNoQ2FudmFzU2l6ZSkge1xuICAgICAgICAvLyBUaGUgdHJhbnNsYXRpb24gdmVjdG9yIG11c3QgaGF2ZSBwb3NpdGl2ZSB2YWx1ZXMsIG90aGVyd2lzZSB0aGUgaW1hZ2UgZ29lcyBhIGJpdCBvZmZcbiAgICAgICAgLy8gdGhlIHNrZXRjaCBjYW52YXMgdG8gdGhlIHRvcCBhbmQgbGVmdCBhbmQgd2UgbXVzdCB1c2UgbmVnYXRpdmUgY29vcmRpbmF0ZXMgdG8gcmVwYWludCBpdFxuICAgICAgICAvLyB0byB0aGUgbWFpbiBjYW52YXMuIEluIHRoYXQgY2FzZSwgc29tZSBicm93c2VycyB0aHJvdzpcbiAgICAgICAgLy8gSU5ERVhfU0laRV9FUlI6IERPTSBFeGNlcHRpb24gMTogSW5kZXggb3Igc2l6ZSB3YXMgbmVnYXRpdmUsIG9yIGdyZWF0ZXIgdGhhbiB0aGUgYWxsb3dlZCB2YWx1ZS5cbiAgICAgICAgdmFyIHggPSBNYXRoLm1heCgxLCBNYXRoLmNlaWwoKHNrZXRjaENhbnZhc1NpemUueCAtIGNhbnZhc1NpemUueCkgLyAyKSk7XG4gICAgICAgIHZhciB5ID0gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKChza2V0Y2hDYW52YXNTaXplLnkgLSBjYW52YXNTaXplLnkpIC8gMikpO1xuICAgICAgICByZXR1cm4gbmV3ICQuUG9pbnQoeCwgeSkubWludXMoXG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uXG4gICAgICAgICAgICAgICAgLnRpbWVzKCQucGl4ZWxEZW5zaXR5UmF0aW8pXG4gICAgICAgICAgICAgICAgLnRpbWVzKHNjYWxlIHx8IDEpXG4gICAgICAgICAgICAgICAgLmFwcGx5KGZ1bmN0aW9uKHgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHggJSAxO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgdGlsZSBmcm9tIGl0cyBjb250YWluZXIuXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICovXG4gICAgdW5sb2FkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKCB0aGlzLmltZ0VsZW1lbnQgJiYgdGhpcy5pbWdFbGVtZW50LnBhcmVudE5vZGUgKSB7XG4gICAgICAgICAgICB0aGlzLmltZ0VsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggdGhpcy5pbWdFbGVtZW50ICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCB0aGlzLmVsZW1lbnQgJiYgdGhpcy5lbGVtZW50LnBhcmVudE5vZGUgKSB7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggdGhpcy5lbGVtZW50ICk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmVsZW1lbnQgICAgPSBudWxsO1xuICAgICAgICB0aGlzLmltZ0VsZW1lbnQgPSBudWxsO1xuICAgICAgICB0aGlzLmxvYWRlZCAgICAgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5sb2FkaW5nICAgID0gZmFsc2U7XG4gICAgfVxufTtcblxufSggT3BlblNlYWRyYWdvbiApKTtcblxuLypcbiAqIE9wZW5TZWFkcmFnb24gLSBPdmVybGF5XG4gKlxuICogQ29weXJpZ2h0IChDKSAyMDA5IENvZGVQbGV4IEZvdW5kYXRpb25cbiAqIENvcHlyaWdodCAoQykgMjAxMC0yMDEzIE9wZW5TZWFkcmFnb24gY29udHJpYnV0b3JzXG4gKlxuICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlXG4gKiBtZXQ6XG4gKlxuICogLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4gKiAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4gKlxuICogLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodFxuICogICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlXG4gKiAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uXG4gKlxuICogLSBOZWl0aGVyIHRoZSBuYW1lIG9mIENvZGVQbGV4IEZvdW5kYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHNcbiAqICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb21cbiAqICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbiAqXG4gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTXG4gKiBcIkFTIElTXCIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UXG4gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1JcbiAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVFxuICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsXG4gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURURcbiAqIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1JcbiAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0ZcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HXG4gKiBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVNcbiAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICovXG5cbihmdW5jdGlvbigkKSB7XG5cbiAgICAvKipcbiAgICAgKiBBbiBlbnVtZXJhdGlvbiBvZiBwb3NpdGlvbnMgdGhhdCBhbiBvdmVybGF5IG1heSBiZSBhc3NpZ25lZCByZWxhdGl2ZSB0b1xuICAgICAqIHRoZSB2aWV3cG9ydC5cbiAgICAgKiBJdCBpcyBpZGVudGljYWwgdG8gT3BlblNlYWRyYWdvbi5QbGFjZW1lbnQgYnV0IGlzIGtlcHQgZm9yIGJhY2t3YXJkXG4gICAgICogY29tcGF0aWJpbGl0eS5cbiAgICAgKiBAbWVtYmVyIE92ZXJsYXlQbGFjZW1lbnRcbiAgICAgKiBAbWVtYmVyb2YgT3BlblNlYWRyYWdvblxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBDRU5URVJcbiAgICAgKiBAcHJvcGVydHkge051bWJlcn0gVE9QX0xFRlRcbiAgICAgKiBAcHJvcGVydHkge051bWJlcn0gVE9QXG4gICAgICogQHByb3BlcnR5IHtOdW1iZXJ9IFRPUF9SSUdIVFxuICAgICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBSSUdIVFxuICAgICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBCT1RUT01fUklHSFRcbiAgICAgKiBAcHJvcGVydHkge051bWJlcn0gQk9UVE9NXG4gICAgICogQHByb3BlcnR5IHtOdW1iZXJ9IEJPVFRPTV9MRUZUXG4gICAgICogQHByb3BlcnR5IHtOdW1iZXJ9IExFRlRcbiAgICAgKi9cbiAgICAkLk92ZXJsYXlQbGFjZW1lbnQgPSAkLlBsYWNlbWVudDtcblxuICAgIC8qKlxuICAgICAqIEFuIGVudW1lcmF0aW9uIG9mIHBvc3NpYmxlIHdheXMgdG8gaGFuZGxlIG92ZXJsYXlzIHJvdGF0aW9uXG4gICAgICogQG1lbWJlciBPdmVybGF5Um90YXRpb25Nb2RlXG4gICAgICogQG1lbWJlck9mIE9wZW5TZWFkcmFnb25cbiAgICAgKiBAc3RhdGljXG4gICAgICogQHJlYWRvbmx5XG4gICAgICogQHByb3BlcnR5IHtOdW1iZXJ9IE5PX1JPVEFUSU9OIFRoZSBvdmVybGF5IGlnbm9yZSB0aGUgdmlld3BvcnQgcm90YXRpb24uXG4gICAgICogQHByb3BlcnR5IHtOdW1iZXJ9IEVYQUNUIFRoZSBvdmVybGF5IHVzZSBDU1MgMyB0cmFuc2Zvcm1zIHRvIHJvdGF0ZSB3aXRoXG4gICAgICogdGhlIHZpZXdwb3J0LiBJZiB0aGUgb3ZlcmxheSBjb250YWlucyB0ZXh0LCBpdCB3aWxsIGdldCByb3RhdGVkIGFzIHdlbGwuXG4gICAgICogQHByb3BlcnR5IHtOdW1iZXJ9IEJPVU5ESU5HX0JPWCBUaGUgb3ZlcmxheSBhZGp1c3RzIGZvciByb3RhdGlvbiBieVxuICAgICAqIHRha2luZyB0aGUgc2l6ZSBvZiB0aGUgYm91bmRpbmcgYm94IG9mIHRoZSByb3RhdGVkIGJvdW5kcy5cbiAgICAgKiBPbmx5IHZhbGlkIGZvciBvdmVybGF5cyB3aXRoIFJlY3QgbG9jYXRpb24gYW5kIHNjYWxhYmxlIGluIGJvdGggZGlyZWN0aW9ucy5cbiAgICAgKi9cbiAgICAkLk92ZXJsYXlSb3RhdGlvbk1vZGUgPSAkLmZyZWV6ZU9iamVjdCh7XG4gICAgICAgIE5PX1JPVEFUSU9OOiAxLFxuICAgICAgICBFWEFDVDogMixcbiAgICAgICAgQk9VTkRJTkdfQk9YOiAzXG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBAY2xhc3MgT3ZlcmxheVxuICAgICAqIEBjbGFzc2Rlc2MgUHJvdmlkZXMgYSB3YXkgdG8gZmxvYXQgYW4gSFRNTCBlbGVtZW50IG9uIHRvcCBvZiB0aGUgdmlld2VyIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgT3BlblNlYWRyYWdvblxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBvcHRpb25zLmVsZW1lbnRcbiAgICAgKiBAcGFyYW0ge09wZW5TZWFkcmFnb24uUG9pbnR8T3BlblNlYWRyYWdvbi5SZWN0fSBvcHRpb25zLmxvY2F0aW9uIC0gVGhlXG4gICAgICogbG9jYXRpb24gb2YgdGhlIG92ZXJsYXkgb24gdGhlIGltYWdlLiBJZiBhIHtAbGluayBPcGVuU2VhZHJhZ29uLlBvaW50fVxuICAgICAqIGlzIHNwZWNpZmllZCwgdGhlIG92ZXJsYXkgd2lsbCBiZSBsb2NhdGVkIGF0IHRoaXMgbG9jYXRpb24gd2l0aCByZXNwZWN0XG4gICAgICogdG8gdGhlIHBsYWNlbWVudCBvcHRpb24uIElmIGEge0BsaW5rIE9wZW5TZWFkcmFnb24uUmVjdH0gaXMgc3BlY2lmaWVkLFxuICAgICAqIHRoZSBvdmVybGF5IHdpbGwgYmUgcGxhY2VkIGF0IHRoaXMgbG9jYXRpb24gd2l0aCB0aGUgY29ycmVzcG9uZGluZyB3aWR0aFxuICAgICAqIGFuZCBoZWlnaHQgYW5kIHBsYWNlbWVudCBUT1BfTEVGVC5cbiAgICAgKiBAcGFyYW0ge09wZW5TZWFkcmFnb24uUGxhY2VtZW50fSBbb3B0aW9ucy5wbGFjZW1lbnQ9T3BlblNlYWRyYWdvbi5QbGFjZW1lbnQuVE9QX0xFRlRdXG4gICAgICogRGVmaW5lcyB3aGF0IHBhcnQgb2YgdGhlIG92ZXJsYXkgc2hvdWxkIGJlIGF0IHRoZSBzcGVjaWZpZWQgb3B0aW9ucy5sb2NhdGlvblxuICAgICAqIEBwYXJhbSB7T3BlblNlYWRyYWdvbi5PdmVybGF5Lk9uRHJhd0NhbGxiYWNrfSBbb3B0aW9ucy5vbkRyYXddXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5jaGVja1Jlc2l6ZT10cnVlXSBTZXQgdG8gZmFsc2UgdG8gYXZvaWQgdG9cbiAgICAgKiBjaGVjayB0aGUgc2l6ZSBvZiB0aGUgb3ZlcmxheSBldmVyeXRpbWUgaXQgaXMgZHJhd24gaW4gdGhlIGRpcmVjdGlvbnNcbiAgICAgKiB3aGljaCBhcmUgbm90IHNjYWxlZC4gSXQgd2lsbCBpbXByb3ZlIHBlcmZvcm1hbmNlcyBidXQgd2lsbCBjYXVzZSBhXG4gICAgICogbWlzYWxpZ25tZW50IGlmIHRoZSBvdmVybGF5IHNpemUgY2hhbmdlcy5cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMud2lkdGhdIFRoZSB3aWR0aCBvZiB0aGUgb3ZlcmxheSBpbiB2aWV3cG9ydFxuICAgICAqIGNvb3JkaW5hdGVzLiBJZiBzcGVjaWZpZWQsIHRoZSB3aWR0aCBvZiB0aGUgb3ZlcmxheSB3aWxsIGJlIGFkanVzdGVkIHdoZW5cbiAgICAgKiB0aGUgem9vbSBjaGFuZ2VzLlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5oZWlnaHRdIFRoZSBoZWlnaHQgb2YgdGhlIG92ZXJsYXkgaW4gdmlld3BvcnRcbiAgICAgKiBjb29yZGluYXRlcy4gSWYgc3BlY2lmaWVkLCB0aGUgaGVpZ2h0IG9mIHRoZSBvdmVybGF5IHdpbGwgYmUgYWRqdXN0ZWQgd2hlblxuICAgICAqIHRoZSB6b29tIGNoYW5nZXMuXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5yb3RhdGlvbk1vZGU9T3BlblNlYWRyYWdvbi5PdmVybGF5Um90YXRpb25Nb2RlLkVYQUNUXVxuICAgICAqIEhvdyB0byBoYW5kbGUgdGhlIHJvdGF0aW9uIG9mIHRoZSB2aWV3cG9ydC5cbiAgICAgKi9cbiAgICAkLk92ZXJsYXkgPSBmdW5jdGlvbihlbGVtZW50LCBsb2NhdGlvbiwgcGxhY2VtZW50KSB7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIG9uRHJhdyBjYWxsYmFjayBzaWduYXR1cmUgdXNlZCBieSB7QGxpbmsgT3BlblNlYWRyYWdvbi5PdmVybGF5fS5cbiAgICAgICAgICpcbiAgICAgICAgICogQGNhbGxiYWNrIE9uRHJhd0NhbGxiYWNrXG4gICAgICAgICAqIEBtZW1iZXJvZiBPcGVuU2VhZHJhZ29uLk92ZXJsYXlcbiAgICAgICAgICogQHBhcmFtIHtPcGVuU2VhZHJhZ29uLlBvaW50fSBwb3NpdGlvblxuICAgICAgICAgKiBAcGFyYW0ge09wZW5TZWFkcmFnb24uUG9pbnR9IHNpemVcbiAgICAgICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50XG4gICAgICAgICAqL1xuXG4gICAgICAgIHZhciBvcHRpb25zO1xuICAgICAgICBpZiAoJC5pc1BsYWluT2JqZWN0KGVsZW1lbnQpKSB7XG4gICAgICAgICAgICBvcHRpb25zID0gZWxlbWVudDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudDogZWxlbWVudCxcbiAgICAgICAgICAgICAgICBsb2NhdGlvbjogbG9jYXRpb24sXG4gICAgICAgICAgICAgICAgcGxhY2VtZW50OiBwbGFjZW1lbnRcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmVsZW1lbnQgPSBvcHRpb25zLmVsZW1lbnQ7XG4gICAgICAgIHRoaXMuc3R5bGUgPSBvcHRpb25zLmVsZW1lbnQuc3R5bGU7XG4gICAgICAgIHRoaXMuX2luaXQob3B0aW9ucyk7XG4gICAgfTtcblxuICAgIC8qKiBAbGVuZHMgT3BlblNlYWRyYWdvbi5PdmVybGF5LnByb3RvdHlwZSAqL1xuICAgICQuT3ZlcmxheS5wcm90b3R5cGUgPSB7XG5cbiAgICAgICAgLy8gcHJpdmF0ZVxuICAgICAgICBfaW5pdDogZnVuY3Rpb24ob3B0aW9ucykge1xuICAgICAgICAgICAgdGhpcy5sb2NhdGlvbiA9IG9wdGlvbnMubG9jYXRpb247XG4gICAgICAgICAgICB0aGlzLnBsYWNlbWVudCA9IG9wdGlvbnMucGxhY2VtZW50ID09PSB1bmRlZmluZWQgP1xuICAgICAgICAgICAgICAgICQuUGxhY2VtZW50LlRPUF9MRUZUIDogb3B0aW9ucy5wbGFjZW1lbnQ7XG4gICAgICAgICAgICB0aGlzLm9uRHJhdyA9IG9wdGlvbnMub25EcmF3O1xuICAgICAgICAgICAgdGhpcy5jaGVja1Jlc2l6ZSA9IG9wdGlvbnMuY2hlY2tSZXNpemUgPT09IHVuZGVmaW5lZCA/XG4gICAgICAgICAgICAgICAgdHJ1ZSA6IG9wdGlvbnMuY2hlY2tSZXNpemU7XG5cbiAgICAgICAgICAgIC8vIFdoZW4gdGhpcy53aWR0aCBpcyBub3QgbnVsbCwgdGhlIG92ZXJsYXkgZ2V0IHNjYWxlZCBob3Jpem9udGFsbHlcbiAgICAgICAgICAgIHRoaXMud2lkdGggPSBvcHRpb25zLndpZHRoID09PSB1bmRlZmluZWQgPyBudWxsIDogb3B0aW9ucy53aWR0aDtcblxuICAgICAgICAgICAgLy8gV2hlbiB0aGlzLmhlaWdodCBpcyBub3QgbnVsbCwgdGhlIG92ZXJsYXkgZ2V0IHNjYWxlZCB2ZXJ0aWNhbGx5XG4gICAgICAgICAgICB0aGlzLmhlaWdodCA9IG9wdGlvbnMuaGVpZ2h0ID09PSB1bmRlZmluZWQgPyBudWxsIDogb3B0aW9ucy5oZWlnaHQ7XG5cbiAgICAgICAgICAgIHRoaXMucm90YXRpb25Nb2RlID0gb3B0aW9ucy5yb3RhdGlvbk1vZGUgfHwgJC5PdmVybGF5Um90YXRpb25Nb2RlLkVYQUNUO1xuXG4gICAgICAgICAgICAvLyBIYXZpbmcgYSByZWN0IGFzIGxvY2F0aW9uIGlzIGEgc3ludGFjdGljIHN1Z2FyXG4gICAgICAgICAgICBpZiAodGhpcy5sb2NhdGlvbiBpbnN0YW5jZW9mICQuUmVjdCkge1xuICAgICAgICAgICAgICAgIHRoaXMud2lkdGggPSB0aGlzLmxvY2F0aW9uLndpZHRoO1xuICAgICAgICAgICAgICAgIHRoaXMuaGVpZ2h0ID0gdGhpcy5sb2NhdGlvbi5oZWlnaHQ7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2NhdGlvbiA9IHRoaXMubG9jYXRpb24uZ2V0VG9wTGVmdCgpO1xuICAgICAgICAgICAgICAgIHRoaXMucGxhY2VtZW50ID0gJC5QbGFjZW1lbnQuVE9QX0xFRlQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIERlcHJlY2F0ZWQgcHJvcGVydGllcyBrZXB0IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LlxuICAgICAgICAgICAgdGhpcy5zY2FsZXMgPSB0aGlzLndpZHRoICE9PSBudWxsICYmIHRoaXMuaGVpZ2h0ICE9PSBudWxsO1xuICAgICAgICAgICAgdGhpcy5ib3VuZHMgPSBuZXcgJC5SZWN0KFxuICAgICAgICAgICAgICAgIHRoaXMubG9jYXRpb24ueCwgdGhpcy5sb2NhdGlvbi55LCB0aGlzLndpZHRoLCB0aGlzLmhlaWdodCk7XG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uID0gdGhpcy5sb2NhdGlvbjtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogSW50ZXJuYWwgZnVuY3Rpb24gdG8gYWRqdXN0IHRoZSBwb3NpdGlvbiBvZiBhbiBvdmVybGF5XG4gICAgICAgICAqIGRlcGVuZGluZyBvbiBpdCBzaXplIGFuZCBwbGFjZW1lbnQuXG4gICAgICAgICAqIEBmdW5jdGlvblxuICAgICAgICAgKiBAcGFyYW0ge09wZW5TZWFkcmFnb24uUG9pbnR9IHBvc2l0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7T3BlblNlYWRyYWdvbi5Qb2ludH0gc2l6ZVxuICAgICAgICAgKi9cbiAgICAgICAgYWRqdXN0OiBmdW5jdGlvbihwb3NpdGlvbiwgc2l6ZSkge1xuICAgICAgICAgICAgdmFyIHByb3BlcnRpZXMgPSAkLlBsYWNlbWVudC5wcm9wZXJ0aWVzW3RoaXMucGxhY2VtZW50XTtcbiAgICAgICAgICAgIGlmICghcHJvcGVydGllcykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwcm9wZXJ0aWVzLmlzSG9yaXpvbnRhbGx5Q2VudGVyZWQpIHtcbiAgICAgICAgICAgICAgICBwb3NpdGlvbi54IC09IHNpemUueCAvIDI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnRpZXMuaXNSaWdodCkge1xuICAgICAgICAgICAgICAgIHBvc2l0aW9uLnggLT0gc2l6ZS54O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHByb3BlcnRpZXMuaXNWZXJ0aWNhbGx5Q2VudGVyZWQpIHtcbiAgICAgICAgICAgICAgICBwb3NpdGlvbi55IC09IHNpemUueSAvIDI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnRpZXMuaXNCb3R0b20pIHtcbiAgICAgICAgICAgICAgICBwb3NpdGlvbi55IC09IHNpemUueTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQGZ1bmN0aW9uXG4gICAgICAgICAqL1xuICAgICAgICBkZXN0cm95OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZhciBlbGVtZW50ID0gdGhpcy5lbGVtZW50O1xuICAgICAgICAgICAgdmFyIHN0eWxlID0gdGhpcy5zdHlsZTtcblxuICAgICAgICAgICAgaWYgKGVsZW1lbnQucGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlbGVtZW50KTtcbiAgICAgICAgICAgICAgICAvL3RoaXMgc2hvdWxkIGFsbG93IHVzIHRvIHByZXNlcnZlIG92ZXJsYXlzIHdoZW4gcmVxdWlyZWQgYmV0d2VlblxuICAgICAgICAgICAgICAgIC8vcGFnZXNcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5wcmV2RWxlbWVudFBhcmVudCkge1xuICAgICAgICAgICAgICAgICAgICBzdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICAgICAgICAgICAgICAvL2VsZW1lbnQucHJldkVsZW1lbnRQYXJlbnQuaW5zZXJ0QmVmb3JlKFxuICAgICAgICAgICAgICAgICAgICAvLyAgICBlbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICAvLyAgICBlbGVtZW50LnByZXZOZXh0U2libGluZ1xuICAgICAgICAgICAgICAgICAgICAvLyk7XG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBjbGVhciB0aGUgb25EcmF3IGNhbGxiYWNrXG4gICAgICAgICAgICB0aGlzLm9uRHJhdyA9IG51bGw7XG5cbiAgICAgICAgICAgIHN0eWxlLnRvcCA9IFwiXCI7XG4gICAgICAgICAgICBzdHlsZS5sZWZ0ID0gXCJcIjtcbiAgICAgICAgICAgIHN0eWxlLnBvc2l0aW9uID0gXCJcIjtcblxuICAgICAgICAgICAgaWYgKHRoaXMud2lkdGggIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBzdHlsZS53aWR0aCA9IFwiXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5oZWlnaHQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBzdHlsZS5oZWlnaHQgPSBcIlwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHRyYW5zZm9ybU9yaWdpblByb3AgPSAkLmdldENzc1Byb3BlcnR5V2l0aFZlbmRvclByZWZpeChcbiAgICAgICAgICAgICAgICAndHJhbnNmb3JtT3JpZ2luJyk7XG4gICAgICAgICAgICB2YXIgdHJhbnNmb3JtUHJvcCA9ICQuZ2V0Q3NzUHJvcGVydHlXaXRoVmVuZG9yUHJlZml4KFxuICAgICAgICAgICAgICAgICd0cmFuc2Zvcm0nKTtcbiAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1PcmlnaW5Qcm9wICYmIHRyYW5zZm9ybVByb3ApIHtcbiAgICAgICAgICAgICAgICBzdHlsZVt0cmFuc2Zvcm1PcmlnaW5Qcm9wXSA9IFwiXCI7XG4gICAgICAgICAgICAgICAgc3R5bGVbdHJhbnNmb3JtUHJvcF0gPSBcIlwiO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAZnVuY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtFbGVtZW50fSBjb250YWluZXJcbiAgICAgICAgICovXG4gICAgICAgIGRyYXdIVE1MOiBmdW5jdGlvbihjb250YWluZXIsIHZpZXdwb3J0KSB7XG4gICAgICAgICAgICB2YXIgZWxlbWVudCA9IHRoaXMuZWxlbWVudDtcbiAgICAgICAgICAgIGlmIChlbGVtZW50LnBhcmVudE5vZGUgIT09IGNvbnRhaW5lcikge1xuICAgICAgICAgICAgICAgIC8vc2F2ZSB0aGUgc291cmNlIHBhcmVudCBmb3IgbGF0ZXIgaWYgd2UgbmVlZCBpdFxuICAgICAgICAgICAgICAgIGVsZW1lbnQucHJldkVsZW1lbnRQYXJlbnQgPSBlbGVtZW50LnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5wcmV2TmV4dFNpYmxpbmcgPSBlbGVtZW50Lm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChlbGVtZW50KTtcblxuICAgICAgICAgICAgICAgIC8vIHRoaXMuc2l6ZSBpcyB1c2VkIGJ5IG92ZXJsYXlzIHdoaWNoIGRvbid0IGdldCBzY2FsZWQgaW4gYXRcbiAgICAgICAgICAgICAgICAvLyBsZWFzdCBvbmUgZGlyZWN0aW9uIHdoZW4gdGhpcy5jaGVja1Jlc2l6ZSBpcyBzZXQgdG8gZmFsc2UuXG4gICAgICAgICAgICAgICAgdGhpcy5zaXplID0gJC5nZXRFbGVtZW50U2l6ZShlbGVtZW50KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHBvc2l0aW9uQW5kU2l6ZSA9IHRoaXMuX2dldE92ZXJsYXlQb3NpdGlvbkFuZFNpemUodmlld3BvcnQpO1xuXG4gICAgICAgICAgICB2YXIgcG9zaXRpb24gPSBwb3NpdGlvbkFuZFNpemUucG9zaXRpb247XG4gICAgICAgICAgICB2YXIgc2l6ZSA9IHRoaXMuc2l6ZSA9IHBvc2l0aW9uQW5kU2l6ZS5zaXplO1xuICAgICAgICAgICAgdmFyIHJvdGF0ZSA9IHBvc2l0aW9uQW5kU2l6ZS5yb3RhdGU7XG5cbiAgICAgICAgICAgIC8vIGNhbGwgdGhlIG9uRHJhdyBjYWxsYmFjayBpZiBpdCBleGlzdHMgdG8gYWxsb3cgb25lIHRvIG92ZXJ3cml0ZVxuICAgICAgICAgICAgLy8gdGhlIGRyYXdpbmcvcG9zaXRpb25pbmcvc2l6aW5nIG9mIHRoZSBvdmVybGF5XG4gICAgICAgICAgICBpZiAodGhpcy5vbkRyYXcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9uRHJhdyhwb3NpdGlvbiwgc2l6ZSwgdGhpcy5lbGVtZW50KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIHN0eWxlID0gdGhpcy5zdHlsZTtcbiAgICAgICAgICAgICAgICBzdHlsZS5sZWZ0ID0gcG9zaXRpb24ueCArIFwicHhcIjtcbiAgICAgICAgICAgICAgICBzdHlsZS50b3AgPSBwb3NpdGlvbi55ICsgXCJweFwiO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLndpZHRoICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0eWxlLndpZHRoID0gc2l6ZS54ICsgXCJweFwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5oZWlnaHQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgc3R5bGUuaGVpZ2h0ID0gc2l6ZS55ICsgXCJweFwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgdHJhbnNmb3JtT3JpZ2luUHJvcCA9ICQuZ2V0Q3NzUHJvcGVydHlXaXRoVmVuZG9yUHJlZml4KFxuICAgICAgICAgICAgICAgICAgICAndHJhbnNmb3JtT3JpZ2luJyk7XG4gICAgICAgICAgICAgICAgdmFyIHRyYW5zZm9ybVByb3AgPSAkLmdldENzc1Byb3BlcnR5V2l0aFZlbmRvclByZWZpeChcbiAgICAgICAgICAgICAgICAgICAgJ3RyYW5zZm9ybScpO1xuICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1PcmlnaW5Qcm9wICYmIHRyYW5zZm9ybVByb3ApIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJvdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVbdHJhbnNmb3JtT3JpZ2luUHJvcF0gPSB0aGlzLl9nZXRUcmFuc2Zvcm1PcmlnaW4oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlW3RyYW5zZm9ybVByb3BdID0gXCJyb3RhdGUoXCIgKyByb3RhdGUgKyBcImRlZylcIjtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlW3RyYW5zZm9ybU9yaWdpblByb3BdID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlW3RyYW5zZm9ybVByb3BdID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzdHlsZS5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIjtcblxuICAgICAgICAgICAgICAgIGlmIChzdHlsZS5kaXNwbGF5ICE9PSAnbm9uZScpIHtcbiAgICAgICAgICAgICAgICAgICAgc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIC8vIHByaXZhdGVcbiAgICAgICAgX2dldE92ZXJsYXlQb3NpdGlvbkFuZFNpemU6IGZ1bmN0aW9uKHZpZXdwb3J0KSB7XG4gICAgICAgICAgICB2YXIgcG9zaXRpb24gPSB2aWV3cG9ydC5waXhlbEZyb21Qb2ludCh0aGlzLmxvY2F0aW9uLCB0cnVlKTtcbiAgICAgICAgICAgIHZhciBzaXplID0gdGhpcy5fZ2V0U2l6ZUluUGl4ZWxzKHZpZXdwb3J0KTtcbiAgICAgICAgICAgIHRoaXMuYWRqdXN0KHBvc2l0aW9uLCBzaXplKTtcblxuICAgICAgICAgICAgdmFyIHJvdGF0ZSA9IDA7XG4gICAgICAgICAgICBpZiAodmlld3BvcnQuZGVncmVlcyAmJlxuICAgICAgICAgICAgICAgIHRoaXMucm90YXRpb25Nb2RlICE9PSAkLk92ZXJsYXlSb3RhdGlvbk1vZGUuTk9fUk9UQVRJT04pIHtcbiAgICAgICAgICAgICAgICAvLyBCT1VORElOR19CT1ggaXMgb25seSB2YWxpZCBpZiBib3RoIGRpcmVjdGlvbnMgZ2V0IHNjYWxlZC5cbiAgICAgICAgICAgICAgICAvLyBHZXQgcmVwbGFjZWQgYnkgRVhBQ1Qgb3RoZXJ3aXNlLlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJvdGF0aW9uTW9kZSA9PT0gJC5PdmVybGF5Um90YXRpb25Nb2RlLkJPVU5ESU5HX0JPWCAmJlxuICAgICAgICAgICAgICAgICAgICB0aGlzLndpZHRoICE9PSBudWxsICYmIHRoaXMuaGVpZ2h0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciByZWN0ID0gbmV3ICQuUmVjdChwb3NpdGlvbi54LCBwb3NpdGlvbi55LCBzaXplLngsIHNpemUueSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBib3VuZGluZ0JveCA9IHRoaXMuX2dldEJvdW5kaW5nQm94KHJlY3QsIHZpZXdwb3J0LmRlZ3JlZXMpO1xuICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IGJvdW5kaW5nQm94LmdldFRvcExlZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IGJvdW5kaW5nQm94LmdldFNpemUoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByb3RhdGUgPSB2aWV3cG9ydC5kZWdyZWVzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogcG9zaXRpb24sXG4gICAgICAgICAgICAgICAgc2l6ZTogc2l6ZSxcbiAgICAgICAgICAgICAgICByb3RhdGU6IHJvdGF0ZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcblxuICAgICAgICAvLyBwcml2YXRlXG4gICAgICAgIF9nZXRTaXplSW5QaXhlbHM6IGZ1bmN0aW9uKHZpZXdwb3J0KSB7XG4gICAgICAgICAgICB2YXIgd2lkdGggPSB0aGlzLnNpemUueDtcbiAgICAgICAgICAgIHZhciBoZWlnaHQgPSB0aGlzLnNpemUueTtcbiAgICAgICAgICAgIGlmICh0aGlzLndpZHRoICE9PSBudWxsIHx8IHRoaXMuaGVpZ2h0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdmFyIHNjYWxlZFNpemUgPSB2aWV3cG9ydC5kZWx0YVBpeGVsc0Zyb21Qb2ludHNOb1JvdGF0ZShcbiAgICAgICAgICAgICAgICAgICAgbmV3ICQuUG9pbnQodGhpcy53aWR0aCB8fCAwLCB0aGlzLmhlaWdodCB8fCAwKSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMud2lkdGggIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgd2lkdGggPSBzY2FsZWRTaXplLng7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmhlaWdodCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBoZWlnaHQgPSBzY2FsZWRTaXplLnk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuY2hlY2tSZXNpemUgJiZcbiAgICAgICAgICAgICAgICAodGhpcy53aWR0aCA9PT0gbnVsbCB8fCB0aGlzLmhlaWdodCA9PT0gbnVsbCkpIHtcbiAgICAgICAgICAgICAgICB2YXIgZWx0U2l6ZSA9IHRoaXMuc2l6ZSA9ICQuZ2V0RWxlbWVudFNpemUodGhpcy5lbGVtZW50KTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy53aWR0aCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IGVsdFNpemUueDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaGVpZ2h0ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGhlaWdodCA9IGVsdFNpemUueTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbmV3ICQuUG9pbnQod2lkdGgsIGhlaWdodCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLy8gcHJpdmF0ZVxuICAgICAgICBfZ2V0Qm91bmRpbmdCb3g6IGZ1bmN0aW9uKHJlY3QsIGRlZ3JlZXMpIHtcbiAgICAgICAgICAgIHZhciByZWZQb2ludCA9IHRoaXMuX2dldFBsYWNlbWVudFBvaW50KHJlY3QpO1xuICAgICAgICAgICAgcmV0dXJuIHJlY3Qucm90YXRlKGRlZ3JlZXMsIHJlZlBvaW50KS5nZXRCb3VuZGluZ0JveCgpO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8vIHByaXZhdGVcbiAgICAgICAgX2dldFBsYWNlbWVudFBvaW50OiBmdW5jdGlvbihyZWN0KSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gbmV3ICQuUG9pbnQocmVjdC54LCByZWN0LnkpO1xuICAgICAgICAgICAgdmFyIHByb3BlcnRpZXMgPSAkLlBsYWNlbWVudC5wcm9wZXJ0aWVzW3RoaXMucGxhY2VtZW50XTtcbiAgICAgICAgICAgIGlmIChwcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHByb3BlcnRpZXMuaXNIb3Jpem9udGFsbHlDZW50ZXJlZCkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQueCArPSByZWN0LndpZHRoIC8gMjtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnRpZXMuaXNSaWdodCkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQueCArPSByZWN0LndpZHRoO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocHJvcGVydGllcy5pc1ZlcnRpY2FsbHlDZW50ZXJlZCkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQueSArPSByZWN0LmhlaWdodCAvIDI7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0aWVzLmlzQm90dG9tKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC55ICs9IHJlY3QuaGVpZ2h0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLy8gcHJpdmF0ZVxuICAgICAgICBfZ2V0VHJhbnNmb3JtT3JpZ2luOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSBcIlwiO1xuICAgICAgICAgICAgdmFyIHByb3BlcnRpZXMgPSAkLlBsYWNlbWVudC5wcm9wZXJ0aWVzW3RoaXMucGxhY2VtZW50XTtcbiAgICAgICAgICAgIGlmICghcHJvcGVydGllcykge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocHJvcGVydGllcy5pc0xlZnQpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBcImxlZnRcIjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcGVydGllcy5pc1JpZ2h0KSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gXCJyaWdodFwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHByb3BlcnRpZXMuaXNUb3ApIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gXCIgdG9wXCI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnRpZXMuaXNCb3R0b20pIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gXCIgYm90dG9tXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDaGFuZ2VzIHRoZSBvdmVybGF5IHNldHRpbmdzLlxuICAgICAgICAgKiBAZnVuY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtPcGVuU2VhZHJhZ29uLlBvaW50fE9wZW5TZWFkcmFnb24uUmVjdHxPYmplY3R9IGxvY2F0aW9uXG4gICAgICAgICAqIElmIGFuIG9iamVjdCBpcyBzcGVjaWZpZWQsIHRoZSBvcHRpb25zIGFyZSB0aGUgc2FtZSB0aGFuIHRoZSBjb25zdHJ1Y3RvclxuICAgICAgICAgKiBleGNlcHQgZm9yIHRoZSBlbGVtZW50IHdoaWNoIGNhbiBub3QgYmUgY2hhbmdlZC5cbiAgICAgICAgICogQHBhcmFtIHtPcGVuU2VhZHJhZ29uLlBsYWNlbWVudH0gcG9zaXRpb25cbiAgICAgICAgICovXG4gICAgICAgIHVwZGF0ZTogZnVuY3Rpb24obG9jYXRpb24sIHBsYWNlbWVudCkge1xuICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSAkLmlzUGxhaW5PYmplY3QobG9jYXRpb24pID8gbG9jYXRpb24gOiB7XG4gICAgICAgICAgICAgICAgbG9jYXRpb246IGxvY2F0aW9uLFxuICAgICAgICAgICAgICAgIHBsYWNlbWVudDogcGxhY2VtZW50XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5faW5pdCh7XG4gICAgICAgICAgICAgICAgbG9jYXRpb246IG9wdGlvbnMubG9jYXRpb24gfHwgdGhpcy5sb2NhdGlvbixcbiAgICAgICAgICAgICAgICBwbGFjZW1lbnQ6IG9wdGlvbnMucGxhY2VtZW50ICE9PSB1bmRlZmluZWQgP1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnBsYWNlbWVudCA6IHRoaXMucGxhY2VtZW50LFxuICAgICAgICAgICAgICAgIG9uRHJhdzogb3B0aW9ucy5vbkRyYXcgfHwgdGhpcy5vbkRyYXcsXG4gICAgICAgICAgICAgICAgY2hlY2tSZXNpemU6IG9wdGlvbnMuY2hlY2tSZXNpemUgfHwgdGhpcy5jaGVja1Jlc2l6ZSxcbiAgICAgICAgICAgICAgICB3aWR0aDogb3B0aW9ucy53aWR0aCAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy53aWR0aCA6IHRoaXMud2lkdGgsXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiBvcHRpb25zLmhlaWdodCAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5oZWlnaHQgOiB0aGlzLmhlaWdodCxcbiAgICAgICAgICAgICAgICByb3RhdGlvbk1vZGU6IG9wdGlvbnMucm90YXRpb25Nb2RlIHx8IHRoaXMucm90YXRpb25Nb2RlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyB0aGUgY3VycmVudCBib3VuZHMgb2YgdGhlIG92ZXJsYXkgaW4gdmlld3BvcnQgY29vcmRpbmF0ZXNcbiAgICAgICAgICogQGZ1bmN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7T3BlblNlYWRyYWdvbi5WaWV3cG9ydH0gdmlld3BvcnQgdGhlIHZpZXdwb3J0XG4gICAgICAgICAqIEByZXR1cm5zIHtPcGVuU2VhZHJhZ29uLlJlY3R9IG92ZXJsYXkgYm91bmRzXG4gICAgICAgICAqL1xuICAgICAgICBnZXRCb3VuZHM6IGZ1bmN0aW9uKHZpZXdwb3J0KSB7XG4gICAgICAgICAgICAkLmNvbnNvbGUuYXNzZXJ0KHZpZXdwb3J0LFxuICAgICAgICAgICAgICAgICdBIHZpZXdwb3J0IG11c3Qgbm93IGJlIHBhc3NlZCB0byBPdmVybGF5LmdldEJvdW5kcy4nKTtcbiAgICAgICAgICAgIHZhciB3aWR0aCA9IHRoaXMud2lkdGg7XG4gICAgICAgICAgICB2YXIgaGVpZ2h0ID0gdGhpcy5oZWlnaHQ7XG4gICAgICAgICAgICBpZiAod2lkdGggPT09IG51bGwgfHwgaGVpZ2h0ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdmFyIHNpemUgPSB2aWV3cG9ydC5kZWx0YVBvaW50c0Zyb21QaXhlbHNOb1JvdGF0ZSh0aGlzLnNpemUsIHRydWUpO1xuICAgICAgICAgICAgICAgIGlmICh3aWR0aCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IHNpemUueDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGhlaWdodCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBoZWlnaHQgPSBzaXplLnk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGxvY2F0aW9uID0gdGhpcy5sb2NhdGlvbi5jbG9uZSgpO1xuICAgICAgICAgICAgdGhpcy5hZGp1c3QobG9jYXRpb24sIG5ldyAkLlBvaW50KHdpZHRoLCBoZWlnaHQpKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9hZGp1c3RCb3VuZHNGb3JSb3RhdGlvbihcbiAgICAgICAgICAgICAgICB2aWV3cG9ydCwgbmV3ICQuUmVjdChsb2NhdGlvbi54LCBsb2NhdGlvbi55LCB3aWR0aCwgaGVpZ2h0KSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLy8gcHJpdmF0ZVxuICAgICAgICBfYWRqdXN0Qm91bmRzRm9yUm90YXRpb246IGZ1bmN0aW9uKHZpZXdwb3J0LCBib3VuZHMpIHtcbiAgICAgICAgICAgIGlmICghdmlld3BvcnQgfHxcbiAgICAgICAgICAgICAgICB2aWV3cG9ydC5kZWdyZWVzID09PSAwIHx8XG4gICAgICAgICAgICAgICAgdGhpcy5yb3RhdGlvbk1vZGUgPT09ICQuT3ZlcmxheVJvdGF0aW9uTW9kZS5FWEFDVCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBib3VuZHM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5yb3RhdGlvbk1vZGUgPT09ICQuT3ZlcmxheVJvdGF0aW9uTW9kZS5CT1VORElOR19CT1gpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiBvdmVybGF5IG5vdCBmdWxseSBzY2FsYWJsZSwgQk9VTkRJTkdfQk9YIGZhbGxzIGJhY2sgdG8gRVhBQ1RcbiAgICAgICAgICAgICAgICBpZiAodGhpcy53aWR0aCA9PT0gbnVsbCB8fCB0aGlzLmhlaWdodCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYm91bmRzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBJdCBpcyBlYXNpZXIgdG8ganVzdCBjb21wdXRlIHRoZSBwb3NpdGlvbiBhbmQgc2l6ZSBhbmRcbiAgICAgICAgICAgICAgICAvLyBjb252ZXJ0IHRvIHZpZXdwb3J0IGNvb3JkaW5hdGVzLlxuICAgICAgICAgICAgICAgIHZhciBwb3NpdGlvbkFuZFNpemUgPSB0aGlzLl9nZXRPdmVybGF5UG9zaXRpb25BbmRTaXplKHZpZXdwb3J0KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdmlld3BvcnQudmlld2VyRWxlbWVudFRvVmlld3BvcnRSZWN0YW5nbGUobmV3ICQuUmVjdChcbiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25BbmRTaXplLnBvc2l0aW9uLngsXG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uQW5kU2l6ZS5wb3NpdGlvbi55LFxuICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbkFuZFNpemUuc2l6ZS54LFxuICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbkFuZFNpemUuc2l6ZS55KSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIE5PX1JPVEFUSU9OIGNhc2VcbiAgICAgICAgICAgIHJldHVybiBib3VuZHMucm90YXRlKC12aWV3cG9ydC5kZWdyZWVzLFxuICAgICAgICAgICAgICAgIHRoaXMuX2dldFBsYWNlbWVudFBvaW50KGJvdW5kcykpO1xuICAgICAgICB9XG4gICAgfTtcblxufShPcGVuU2VhZHJhZ29uKSk7XG5cbi8qXG4gKiBPcGVuU2VhZHJhZ29uIC0gRHJhd2VyXG4gKlxuICogQ29weXJpZ2h0IChDKSAyMDA5IENvZGVQbGV4IEZvdW5kYXRpb25cbiAqIENvcHlyaWdodCAoQykgMjAxMC0yMDEzIE9wZW5TZWFkcmFnb24gY29udHJpYnV0b3JzXG4gKlxuICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlXG4gKiBtZXQ6XG4gKlxuICogLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4gKiAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4gKlxuICogLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodFxuICogICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlXG4gKiAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uXG4gKlxuICogLSBOZWl0aGVyIHRoZSBuYW1lIG9mIENvZGVQbGV4IEZvdW5kYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHNcbiAqICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb21cbiAqICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbiAqXG4gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTXG4gKiBcIkFTIElTXCIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UXG4gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1JcbiAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVFxuICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsXG4gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURURcbiAqIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1JcbiAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0ZcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HXG4gKiBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVNcbiAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICovXG5cbihmdW5jdGlvbiggJCApe1xuXG4vKipcbiAqIEBjbGFzcyBEcmF3ZXJcbiAqIEBtZW1iZXJvZiBPcGVuU2VhZHJhZ29uXG4gKiBAY2xhc3NkZXNjIEhhbmRsZXMgcmVuZGVyaW5nIG9mIHRpbGVzIGZvciBhbiB7QGxpbmsgT3BlblNlYWRyYWdvbi5WaWV3ZXJ9LlxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBPcHRpb25zIGZvciB0aGlzIERyYXdlci5cbiAqIEBwYXJhbSB7T3BlblNlYWRyYWdvbi5WaWV3ZXJ9IG9wdGlvbnMudmlld2VyIC0gVGhlIFZpZXdlciB0aGF0IG93bnMgdGhpcyBEcmF3ZXIuXG4gKiBAcGFyYW0ge09wZW5TZWFkcmFnb24uVmlld3BvcnR9IG9wdGlvbnMudmlld3BvcnQgLSBSZWZlcmVuY2UgdG8gVmlld2VyIHZpZXdwb3J0LlxuICogQHBhcmFtIHtFbGVtZW50fSBvcHRpb25zLmVsZW1lbnQgLSBQYXJlbnQgZWxlbWVudC5cbiAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5kZWJ1Z0dyaWRDb2xvcl0gLSBTZWUgZGVidWdHcmlkQ29sb3IgaW4ge0BsaW5rIE9wZW5TZWFkcmFnb24uT3B0aW9uc30gZm9yIGRldGFpbHMuXG4gKi9cbiQuRHJhd2VyID0gZnVuY3Rpb24oIG9wdGlvbnMgKSB7XG5cbiAgICAkLmNvbnNvbGUuYXNzZXJ0KCBvcHRpb25zLnZpZXdlciwgXCJbRHJhd2VyXSBvcHRpb25zLnZpZXdlciBpcyByZXF1aXJlZFwiICk7XG5cbiAgICAvL2JhY2t3YXJkIGNvbXBhdGliaWxpdHkgZm9yIHBvc2l0aW9uYWwgYXJncyB3aGlsZSBwcmVmZXJpbmcgbW9yZVxuICAgIC8vaWRpb21hdGljIGphdmFzY3JpcHQgb3B0aW9ucyBvYmplY3QgYXMgdGhlIG9ubHkgYXJndW1lbnRcbiAgICB2YXIgYXJncyAgPSBhcmd1bWVudHM7XG5cbiAgICBpZiggISQuaXNQbGFpbk9iamVjdCggb3B0aW9ucyApICl7XG4gICAgICAgIG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBzb3VyY2U6ICAgICBhcmdzWyAwIF0sIC8vIFJlZmVyZW5jZSB0byBWaWV3ZXIgdGlsZSBzb3VyY2UuXG4gICAgICAgICAgICB2aWV3cG9ydDogICBhcmdzWyAxIF0sIC8vIFJlZmVyZW5jZSB0byBWaWV3ZXIgdmlld3BvcnQuXG4gICAgICAgICAgICBlbGVtZW50OiAgICBhcmdzWyAyIF0gIC8vIFBhcmVudCBlbGVtZW50LlxuICAgICAgICB9O1xuICAgIH1cblxuICAgICQuY29uc29sZS5hc3NlcnQoIG9wdGlvbnMudmlld3BvcnQsIFwiW0RyYXdlcl0gb3B0aW9ucy52aWV3cG9ydCBpcyByZXF1aXJlZFwiICk7XG4gICAgJC5jb25zb2xlLmFzc2VydCggb3B0aW9ucy5lbGVtZW50LCBcIltEcmF3ZXJdIG9wdGlvbnMuZWxlbWVudCBpcyByZXF1aXJlZFwiICk7XG5cbiAgICBpZiAoIG9wdGlvbnMuc291cmNlICkge1xuICAgICAgICAkLmNvbnNvbGUuZXJyb3IoIFwiW0RyYXdlcl0gb3B0aW9ucy5zb3VyY2UgaXMgbm8gbG9uZ2VyIGFjY2VwdGVkOyB1c2UgVGlsZWRJbWFnZSBpbnN0ZWFkXCIgKTtcbiAgICB9XG5cbiAgICB0aGlzLnZpZXdlciA9IG9wdGlvbnMudmlld2VyO1xuICAgIHRoaXMudmlld3BvcnQgPSBvcHRpb25zLnZpZXdwb3J0O1xuICAgIHRoaXMuZGVidWdHcmlkQ29sb3IgPSBvcHRpb25zLmRlYnVnR3JpZENvbG9yIHx8ICQuREVGQVVMVF9TRVRUSU5HUy5kZWJ1Z0dyaWRDb2xvcjtcbiAgICBpZiAob3B0aW9ucy5vcGFjaXR5KSB7XG4gICAgICAgICQuY29uc29sZS5lcnJvciggXCJbRHJhd2VyXSBvcHRpb25zLm9wYWNpdHkgaXMgbm8gbG9uZ2VyIGFjY2VwdGVkOyBzZXQgdGhlIG9wYWNpdHkgb24gdGhlIFRpbGVkSW1hZ2UgaW5zdGVhZFwiICk7XG4gICAgfVxuXG4gICAgdGhpcy51c2VDYW52YXMgID0gJC5zdXBwb3J0c0NhbnZhcyAmJiAoIHRoaXMudmlld2VyID8gdGhpcy52aWV3ZXIudXNlQ2FudmFzIDogdHJ1ZSApO1xuICAgIC8qKlxuICAgICAqIFRoZSBwYXJlbnQgZWxlbWVudCBvZiB0aGlzIERyYXdlciBpbnN0YW5jZSwgcGFzc2VkIGluIHdoZW4gdGhlIERyYXdlciB3YXMgY3JlYXRlZC5cbiAgICAgKiBUaGUgcGFyZW50IG9mIHtAbGluayBPcGVuU2VhZHJhZ29uLkRyYXdlciNjYW52YXN9LlxuICAgICAqIEBtZW1iZXIge0VsZW1lbnR9IGNvbnRhaW5lclxuICAgICAqIEBtZW1iZXJvZiBPcGVuU2VhZHJhZ29uLkRyYXdlciNcbiAgICAgKi9cbiAgICB0aGlzLmNvbnRhaW5lciAgPSAkLmdldEVsZW1lbnQoIG9wdGlvbnMuZWxlbWVudCApO1xuICAgIC8qKlxuICAgICAqIEEgJmx0O2NhbnZhcyZndDsgZWxlbWVudCBpZiB0aGUgYnJvd3NlciBzdXBwb3J0cyB0aGVtLCBvdGhlcndpc2UgYSAmbHQ7ZGl2Jmd0OyBlbGVtZW50LlxuICAgICAqIENoaWxkIGVsZW1lbnQgb2Yge0BsaW5rIE9wZW5TZWFkcmFnb24uRHJhd2VyI2NvbnRhaW5lcn0uXG4gICAgICogQG1lbWJlciB7RWxlbWVudH0gY2FudmFzXG4gICAgICogQG1lbWJlcm9mIE9wZW5TZWFkcmFnb24uRHJhd2VyI1xuICAgICAqL1xuICAgIHRoaXMuY2FudmFzICAgICA9ICQubWFrZU5ldXRyYWxFbGVtZW50KCB0aGlzLnVzZUNhbnZhcyA/IFwiY2FudmFzXCIgOiBcImRpdlwiICk7XG4gICAgLyoqXG4gICAgICogMmQgZHJhd2luZyBjb250ZXh0IGZvciB7QGxpbmsgT3BlblNlYWRyYWdvbi5EcmF3ZXIjY2FudmFzfSBpZiBpdCdzIGEgJmx0O2NhbnZhcyZndDsgZWxlbWVudCwgb3RoZXJ3aXNlIG51bGwuXG4gICAgICogQG1lbWJlciB7T2JqZWN0fSBjb250ZXh0XG4gICAgICogQG1lbWJlcm9mIE9wZW5TZWFkcmFnb24uRHJhd2VyI1xuICAgICAqL1xuICAgIHRoaXMuY29udGV4dCAgICA9IHRoaXMudXNlQ2FudmFzID8gdGhpcy5jYW52YXMuZ2V0Q29udGV4dCggXCIyZFwiICkgOiBudWxsO1xuXG4gICAgLyoqXG4gICAgICogU2tldGNoIGNhbnZhcyB1c2VkIHRvIHRlbXBvcmFyaWx5IGRyYXcgdGlsZXMgd2hpY2ggY2Fubm90IGJlIGRyYXduIGRpcmVjdGx5XG4gICAgICogdG8gdGhlIG1haW4gY2FudmFzIGR1ZSB0byBvcGFjaXR5LiBMYXppbHkgaW5pdGlhbGl6ZWQuXG4gICAgICovXG4gICAgdGhpcy5za2V0Y2hDYW52YXMgPSBudWxsO1xuICAgIHRoaXMuc2tldGNoQ29udGV4dCA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBAbWVtYmVyIHtFbGVtZW50fSBlbGVtZW50XG4gICAgICogQG1lbWJlcm9mIE9wZW5TZWFkcmFnb24uRHJhd2VyI1xuICAgICAqIEBkZXByZWNhdGVkIEFsaWFzIGZvciB7QGxpbmsgT3BlblNlYWRyYWdvbi5EcmF3ZXIjY29udGFpbmVyfS5cbiAgICAgKi9cbiAgICB0aGlzLmVsZW1lbnQgICAgPSB0aGlzLmNvbnRhaW5lcjtcblxuICAgIC8vIFdlIGZvcmNlIG91ciBjb250YWluZXIgdG8gbHRyIGJlY2F1c2Ugb3VyIGRyYXdpbmcgbWF0aCBkb2Vzbid0IHdvcmsgaW4gcnRsLlxuICAgIC8vIFRoaXMgaXNzdWUgb25seSBhZmZlY3RzIG91ciBjYW52YXMgcmVuZGVyZXIsIGJ1dCB3ZSBkbyBpdCBhbHdheXMgZm9yIGNvbnNpc3RlbmN5LlxuICAgIC8vIE5vdGUgdGhhdCB0aGlzIG1lYW5zIG92ZXJsYXlzIHlvdSB3YW50IHRvIGJlIHJ0bCBuZWVkIHRvIGJlIGV4cGxpY2l0bHkgc2V0IHRvIHJ0bC5cbiAgICB0aGlzLmNvbnRhaW5lci5kaXIgPSAnbHRyJztcblxuICAgIC8vIGNoZWNrIGNhbnZhcyBhdmFpbGFibGUgd2lkdGggYW5kIGhlaWdodCwgc2V0IGNhbnZhcyB3aWR0aCBhbmQgaGVpZ2h0IHN1Y2ggdGhhdCB0aGUgY2FudmFzIGJhY2tpbmcgc3RvcmUgaXMgc2V0IHRvIHRoZSBwcm9wZXIgcGl4ZWwgZGVuc2l0eVxuICAgIGlmICh0aGlzLnVzZUNhbnZhcykge1xuICAgICAgICB2YXIgdmlld3BvcnRTaXplID0gdGhpcy5fY2FsY3VsYXRlQ2FudmFzU2l6ZSgpO1xuICAgICAgICB0aGlzLmNhbnZhcy53aWR0aCA9IHZpZXdwb3J0U2l6ZS54O1xuICAgICAgICB0aGlzLmNhbnZhcy5oZWlnaHQgPSB2aWV3cG9ydFNpemUueTtcbiAgICB9XG5cbiAgICB0aGlzLmNhbnZhcy5zdHlsZS53aWR0aCAgICAgPSBcIjEwMCVcIjtcbiAgICB0aGlzLmNhbnZhcy5zdHlsZS5oZWlnaHQgICAgPSBcIjEwMCVcIjtcbiAgICB0aGlzLmNhbnZhcy5zdHlsZS5wb3NpdGlvbiAgPSBcImFic29sdXRlXCI7XG4gICAgJC5zZXRFbGVtZW50T3BhY2l0eSggdGhpcy5jYW52YXMsIHRoaXMub3BhY2l0eSwgdHJ1ZSApO1xuXG4gICAgLy8gZXhwbGljaXQgbGVmdC1hbGlnblxuICAgIHRoaXMuY29udGFpbmVyLnN0eWxlLnRleHRBbGlnbiA9IFwibGVmdFwiO1xuICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKCB0aGlzLmNhbnZhcyApO1xufTtcblxuLyoqIEBsZW5kcyBPcGVuU2VhZHJhZ29uLkRyYXdlci5wcm90b3R5cGUgKi9cbiQuRHJhd2VyLnByb3RvdHlwZSA9IHtcbiAgICAvLyBkZXByZWNhdGVkXG4gICAgYWRkT3ZlcmxheTogZnVuY3Rpb24oIGVsZW1lbnQsIGxvY2F0aW9uLCBwbGFjZW1lbnQsIG9uRHJhdyApIHtcbiAgICAgICAgJC5jb25zb2xlLmVycm9yKFwiZHJhd2VyLmFkZE92ZXJsYXkgaXMgZGVwcmVjYXRlZC4gVXNlIHZpZXdlci5hZGRPdmVybGF5IGluc3RlYWQuXCIpO1xuICAgICAgICB0aGlzLnZpZXdlci5hZGRPdmVybGF5KCBlbGVtZW50LCBsb2NhdGlvbiwgcGxhY2VtZW50LCBvbkRyYXcgKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8vIGRlcHJlY2F0ZWRcbiAgICB1cGRhdGVPdmVybGF5OiBmdW5jdGlvbiggZWxlbWVudCwgbG9jYXRpb24sIHBsYWNlbWVudCApIHtcbiAgICAgICAgJC5jb25zb2xlLmVycm9yKFwiZHJhd2VyLnVwZGF0ZU92ZXJsYXkgaXMgZGVwcmVjYXRlZC4gVXNlIHZpZXdlci51cGRhdGVPdmVybGF5IGluc3RlYWQuXCIpO1xuICAgICAgICB0aGlzLnZpZXdlci51cGRhdGVPdmVybGF5KCBlbGVtZW50LCBsb2NhdGlvbiwgcGxhY2VtZW50ICk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvLyBkZXByZWNhdGVkXG4gICAgcmVtb3ZlT3ZlcmxheTogZnVuY3Rpb24oIGVsZW1lbnQgKSB7XG4gICAgICAgICQuY29uc29sZS5lcnJvcihcImRyYXdlci5yZW1vdmVPdmVybGF5IGlzIGRlcHJlY2F0ZWQuIFVzZSB2aWV3ZXIucmVtb3ZlT3ZlcmxheSBpbnN0ZWFkLlwiKTtcbiAgICAgICAgdGhpcy52aWV3ZXIucmVtb3ZlT3ZlcmxheSggZWxlbWVudCApO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLy8gZGVwcmVjYXRlZFxuICAgIGNsZWFyT3ZlcmxheXM6IGZ1bmN0aW9uKCkge1xuICAgICAgICAkLmNvbnNvbGUuZXJyb3IoXCJkcmF3ZXIuY2xlYXJPdmVybGF5cyBpcyBkZXByZWNhdGVkLiBVc2Ugdmlld2VyLmNsZWFyT3ZlcmxheXMgaW5zdGVhZC5cIik7XG4gICAgICAgIHRoaXMudmlld2VyLmNsZWFyT3ZlcmxheXMoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgb3BhY2l0eSBvZiB0aGUgZHJhd2VyLlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBvcGFjaXR5XG4gICAgICogQHJldHVybiB7T3BlblNlYWRyYWdvbi5EcmF3ZXJ9IENoYWluYWJsZS5cbiAgICAgKi9cbiAgICBzZXRPcGFjaXR5OiBmdW5jdGlvbiggb3BhY2l0eSApIHtcbiAgICAgICAgJC5jb25zb2xlLmVycm9yKFwiZHJhd2VyLnNldE9wYWNpdHkgaXMgZGVwcmVjYXRlZC4gVXNlIHRpbGVkSW1hZ2Uuc2V0T3BhY2l0eSBpbnN0ZWFkLlwiKTtcbiAgICAgICAgdmFyIHdvcmxkID0gdGhpcy52aWV3ZXIud29ybGQ7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgd29ybGQuZ2V0SXRlbUNvdW50KCk7IGkrKykge1xuICAgICAgICAgICAgd29ybGQuZ2V0SXRlbUF0KCBpICkuc2V0T3BhY2l0eSggb3BhY2l0eSApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIG9wYWNpdHkgb2YgdGhlIGRyYXdlci5cbiAgICAgKiBAcmV0dXJucyB7TnVtYmVyfVxuICAgICAqL1xuICAgIGdldE9wYWNpdHk6IGZ1bmN0aW9uKCkge1xuICAgICAgICAkLmNvbnNvbGUuZXJyb3IoXCJkcmF3ZXIuZ2V0T3BhY2l0eSBpcyBkZXByZWNhdGVkLiBVc2UgdGlsZWRJbWFnZS5nZXRPcGFjaXR5IGluc3RlYWQuXCIpO1xuICAgICAgICB2YXIgd29ybGQgPSB0aGlzLnZpZXdlci53b3JsZDtcbiAgICAgICAgdmFyIG1heE9wYWNpdHkgPSAwO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHdvcmxkLmdldEl0ZW1Db3VudCgpOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBvcGFjaXR5ID0gd29ybGQuZ2V0SXRlbUF0KCBpICkuZ2V0T3BhY2l0eSgpO1xuICAgICAgICAgICAgaWYgKCBvcGFjaXR5ID4gbWF4T3BhY2l0eSApIHtcbiAgICAgICAgICAgICAgICBtYXhPcGFjaXR5ID0gb3BhY2l0eTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWF4T3BhY2l0eTtcbiAgICB9LFxuXG4gICAgLy8gZGVwcmVjYXRlZFxuICAgIG5lZWRzVXBkYXRlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgJC5jb25zb2xlLmVycm9yKCBcIltEcmF3ZXIubmVlZHNVcGRhdGVdIHRoaXMgZnVuY3Rpb24gaXMgZGVwcmVjYXRlZC4gVXNlIFdvcmxkLm5lZWRzRHJhdyBpbnN0ZWFkLlwiICk7XG4gICAgICAgIHJldHVybiB0aGlzLnZpZXdlci53b3JsZC5uZWVkc0RyYXcoKTtcbiAgICB9LFxuXG4gICAgLy8gZGVwcmVjYXRlZFxuICAgIG51bVRpbGVzTG9hZGVkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgJC5jb25zb2xlLmVycm9yKCBcIltEcmF3ZXIubnVtVGlsZXNMb2FkZWRdIHRoaXMgZnVuY3Rpb24gaXMgZGVwcmVjYXRlZC4gVXNlIFRpbGVDYWNoZS5udW1UaWxlc0xvYWRlZCBpbnN0ZWFkLlwiICk7XG4gICAgICAgIHJldHVybiB0aGlzLnZpZXdlci50aWxlQ2FjaGUubnVtVGlsZXNMb2FkZWQoKTtcbiAgICB9LFxuXG4gICAgLy8gZGVwcmVjYXRlZFxuICAgIHJlc2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgJC5jb25zb2xlLmVycm9yKCBcIltEcmF3ZXIucmVzZXRdIHRoaXMgZnVuY3Rpb24gaXMgZGVwcmVjYXRlZC4gVXNlIFdvcmxkLnJlc2V0SXRlbXMgaW5zdGVhZC5cIiApO1xuICAgICAgICB0aGlzLnZpZXdlci53b3JsZC5yZXNldEl0ZW1zKCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvLyBkZXByZWNhdGVkXG4gICAgdXBkYXRlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgJC5jb25zb2xlLmVycm9yKCBcIltEcmF3ZXIudXBkYXRlXSB0aGlzIGZ1bmN0aW9uIGlzIGRlcHJlY2F0ZWQuIFVzZSBEcmF3ZXIuY2xlYXIgYW5kIFdvcmxkLmRyYXcgaW5zdGVhZC5cIiApO1xuICAgICAgICB0aGlzLmNsZWFyKCk7XG4gICAgICAgIHRoaXMudmlld2VyLndvcmxkLmRyYXcoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59IFRydWUgaWYgcm90YXRpb24gaXMgc3VwcG9ydGVkLlxuICAgICAqL1xuICAgIGNhblJvdGF0ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnVzZUNhbnZhcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogRGVzdHJveSB0aGUgZHJhd2VyICh1bmxvYWQgY3VycmVudCBsb2FkZWQgdGlsZXMpXG4gICAgICovXG4gICAgZGVzdHJveTogZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vZm9yY2UgdW5sb2FkaW5nIG9mIGN1cnJlbnQgY2FudmFzICgxeDEgd2lsbCBiZSBnYyBsYXRlciwgdHJpY2sgbm90IG5lY2Vzc2FyaWx5IG5lZWRlZClcbiAgICAgICAgdGhpcy5jYW52YXMud2lkdGggID0gMTtcbiAgICAgICAgdGhpcy5jYW52YXMuaGVpZ2h0ID0gMTtcbiAgICAgICAgdGhpcy5za2V0Y2hDYW52YXMgPSBudWxsO1xuICAgICAgICB0aGlzLnNrZXRjaENvbnRleHQgPSBudWxsO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDbGVhcnMgdGhlIERyYXdlciBzbyBpdCdzIHJlYWR5IHRvIGRyYXcgYW5vdGhlciBmcmFtZS5cbiAgICAgKi9cbiAgICBjbGVhcjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMuY2FudmFzLmlubmVySFRNTCA9IFwiXCI7XG4gICAgICAgIGlmICggdGhpcy51c2VDYW52YXMgKSB7XG4gICAgICAgICAgICB2YXIgdmlld3BvcnRTaXplID0gdGhpcy5fY2FsY3VsYXRlQ2FudmFzU2l6ZSgpO1xuICAgICAgICAgICAgaWYoIHRoaXMuY2FudmFzLndpZHRoICE9IHZpZXdwb3J0U2l6ZS54IHx8XG4gICAgICAgICAgICAgICAgdGhpcy5jYW52YXMuaGVpZ2h0ICE9IHZpZXdwb3J0U2l6ZS55ICkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzLndpZHRoID0gdmlld3BvcnRTaXplLng7XG4gICAgICAgICAgICAgICAgdGhpcy5jYW52YXMuaGVpZ2h0ID0gdmlld3BvcnRTaXplLnk7XG4gICAgICAgICAgICAgICAgaWYgKCB0aGlzLnNrZXRjaENhbnZhcyAhPT0gbnVsbCApIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHNrZXRjaENhbnZhc1NpemUgPSB0aGlzLl9jYWxjdWxhdGVTa2V0Y2hDYW52YXNTaXplKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2tldGNoQ2FudmFzLndpZHRoID0gc2tldGNoQ2FudmFzU2l6ZS54O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNrZXRjaENhbnZhcy5oZWlnaHQgPSBza2V0Y2hDYW52YXNTaXplLnk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fY2xlYXIoKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBfY2xlYXI6IGZ1bmN0aW9uICh1c2VTa2V0Y2gsIGJvdW5kcykge1xuICAgICAgICBpZiAoIXRoaXMudXNlQ2FudmFzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNvbnRleHQgPSB0aGlzLl9nZXRDb250ZXh0KHVzZVNrZXRjaCk7XG4gICAgICAgIGlmIChib3VuZHMpIHtcbiAgICAgICAgICAgIGNvbnRleHQuY2xlYXJSZWN0KGJvdW5kcy54LCBib3VuZHMueSwgYm91bmRzLndpZHRoLCBib3VuZHMuaGVpZ2h0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciBjYW52YXMgPSBjb250ZXh0LmNhbnZhcztcbiAgICAgICAgICAgIGNvbnRleHQuY2xlYXJSZWN0KDAsIDAsIGNhbnZhcy53aWR0aCwgY2FudmFzLmhlaWdodCk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU2NhbGUgZnJvbSBPcGVuU2VhZHJhZ29uIHZpZXdlciByZWN0YW5nbGUgdG8gZHJhd2VyIHJlY3RhbmdsZVxuICAgICAqIChpZ25vcmluZyByb3RhdGlvbilcbiAgICAgKiBAcGFyYW0ge09wZW5TZWFkcmFnb24uUmVjdH0gcmVjdGFuZ2xlIC0gVGhlIHJlY3RhbmdsZSBpbiB2aWV3cG9ydCBjb29yZGluYXRlIHN5c3RlbS5cbiAgICAgKiBAcmV0dXJuIHtPcGVuU2VhZHJhZ29uLlJlY3R9IFJlY3RhbmdsZSBpbiBkcmF3ZXIgY29vcmRpbmF0ZSBzeXN0ZW0uXG4gICAgICovXG4gICAgdmlld3BvcnRUb0RyYXdlclJlY3RhbmdsZTogZnVuY3Rpb24ocmVjdGFuZ2xlKSB7XG4gICAgICAgIHZhciB0b3BMZWZ0ID0gdGhpcy52aWV3cG9ydC5waXhlbEZyb21Qb2ludE5vUm90YXRlKHJlY3RhbmdsZS5nZXRUb3BMZWZ0KCksIHRydWUpO1xuICAgICAgICB2YXIgc2l6ZSA9IHRoaXMudmlld3BvcnQuZGVsdGFQaXhlbHNGcm9tUG9pbnRzTm9Sb3RhdGUocmVjdGFuZ2xlLmdldFNpemUoKSwgdHJ1ZSk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyAkLlJlY3QoXG4gICAgICAgICAgICB0b3BMZWZ0LnggKiAkLnBpeGVsRGVuc2l0eVJhdGlvLFxuICAgICAgICAgICAgdG9wTGVmdC55ICogJC5waXhlbERlbnNpdHlSYXRpbyxcbiAgICAgICAgICAgIHNpemUueCAgICAqICQucGl4ZWxEZW5zaXR5UmF0aW8sXG4gICAgICAgICAgICBzaXplLnkgICAgKiAkLnBpeGVsRGVuc2l0eVJhdGlvXG4gICAgICAgICk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIERyYXdzIHRoZSBnaXZlbiB0aWxlLlxuICAgICAqIEBwYXJhbSB7T3BlblNlYWRyYWdvbi5UaWxlfSB0aWxlIC0gVGhlIHRpbGUgdG8gZHJhdy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBkcmF3aW5nSGFuZGxlciAtIE1ldGhvZCBmb3IgZmlyaW5nIHRoZSBkcmF3aW5nIGV2ZW50IGlmIHVzaW5nIGNhbnZhcy5cbiAgICAgKiBkcmF3aW5nSGFuZGxlcih7Y29udGV4dCwgdGlsZSwgcmVuZGVyZWR9KVxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gdXNlU2tldGNoIC0gV2hldGhlciB0byB1c2UgdGhlIHNrZXRjaCBjYW52YXMgb3Igbm90LlxuICAgICAqIHdoZXJlIDxjb2RlPnJlbmRlcmVkPC9jb2RlPiBpcyB0aGUgY29udGV4dCB3aXRoIHRoZSBwcmUtZHJhd24gaW1hZ2UuXG4gICAgICogQHBhcmFtIHtGbG9hdH0gW3NjYWxlPTFdIC0gQXBwbHkgYSBzY2FsZSB0byB0aWxlIHBvc2l0aW9uIGFuZCBzaXplLiBEZWZhdWx0cyB0byAxLlxuICAgICAqIEBwYXJhbSB7T3BlblNlYWRyYWdvbi5Qb2ludH0gW3RyYW5zbGF0ZV0gQSB0cmFuc2xhdGlvbiB2ZWN0b3IgdG8gb2Zmc2V0IHRpbGUgcG9zaXRpb25cbiAgICAgKi9cbiAgICBkcmF3VGlsZTogZnVuY3Rpb24odGlsZSwgZHJhd2luZ0hhbmRsZXIsIHVzZVNrZXRjaCwgc2NhbGUsIHRyYW5zbGF0ZSkge1xuICAgICAgICAkLmNvbnNvbGUuYXNzZXJ0KHRpbGUsICdbRHJhd2VyLmRyYXdUaWxlXSB0aWxlIGlzIHJlcXVpcmVkJyk7XG4gICAgICAgICQuY29uc29sZS5hc3NlcnQoZHJhd2luZ0hhbmRsZXIsICdbRHJhd2VyLmRyYXdUaWxlXSBkcmF3aW5nSGFuZGxlciBpcyByZXF1aXJlZCcpO1xuXG4gICAgICAgIGlmICh0aGlzLnVzZUNhbnZhcykge1xuICAgICAgICAgICAgdmFyIGNvbnRleHQgPSB0aGlzLl9nZXRDb250ZXh0KHVzZVNrZXRjaCk7XG4gICAgICAgICAgICBzY2FsZSA9IHNjYWxlIHx8IDE7XG4gICAgICAgICAgICB0aWxlLmRyYXdDYW52YXMoY29udGV4dCwgZHJhd2luZ0hhbmRsZXIsIHNjYWxlLCB0cmFuc2xhdGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGlsZS5kcmF3SFRNTCggdGhpcy5jYW52YXMgKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBfZ2V0Q29udGV4dDogZnVuY3Rpb24oIHVzZVNrZXRjaCApIHtcbiAgICAgICAgdmFyIGNvbnRleHQgPSB0aGlzLmNvbnRleHQ7XG4gICAgICAgIGlmICggdXNlU2tldGNoICkge1xuICAgICAgICAgICAgaWYgKHRoaXMuc2tldGNoQ2FudmFzID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5za2V0Y2hDYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImNhbnZhc1wiICk7XG4gICAgICAgICAgICAgICAgdmFyIHNrZXRjaENhbnZhc1NpemUgPSB0aGlzLl9jYWxjdWxhdGVTa2V0Y2hDYW52YXNTaXplKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5za2V0Y2hDYW52YXMud2lkdGggPSBza2V0Y2hDYW52YXNTaXplLng7XG4gICAgICAgICAgICAgICAgdGhpcy5za2V0Y2hDYW52YXMuaGVpZ2h0ID0gc2tldGNoQ2FudmFzU2l6ZS55O1xuICAgICAgICAgICAgICAgIHRoaXMuc2tldGNoQ29udGV4dCA9IHRoaXMuc2tldGNoQ2FudmFzLmdldENvbnRleHQoIFwiMmRcIiApO1xuXG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlIHZpZXdwb3J0IGlzIG5vdCBjdXJyZW50bHkgcm90YXRlZCwgdGhlIHNrZXRjaENhbnZhc1xuICAgICAgICAgICAgICAgIC8vIHdpbGwgaGF2ZSB0aGUgc2FtZSBzaXplIGFzIHRoZSBtYWluIGNhbnZhcy4gSG93ZXZlciwgaWZcbiAgICAgICAgICAgICAgICAvLyB0aGUgdmlld3BvcnQgZ2V0IHJvdGF0ZWQgbGF0ZXIgb24sIHdlIHdpbGwgbmVlZCB0byByZXNpemUgaXQuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMudmlld3BvcnQuZ2V0Um90YXRpb24oKSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudmlld2VyLmFkZEhhbmRsZXIoJ3JvdGF0ZScsIGZ1bmN0aW9uIHJlc2l6ZVNrZXRjaENhbnZhcygpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudmlld2VyLnJlbW92ZUhhbmRsZXIoJ3JvdGF0ZScsIHJlc2l6ZVNrZXRjaENhbnZhcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2tldGNoQ2FudmFzU2l6ZSA9IHNlbGYuX2NhbGN1bGF0ZVNrZXRjaENhbnZhc1NpemUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2tldGNoQ2FudmFzLndpZHRoID0gc2tldGNoQ2FudmFzU2l6ZS54O1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5za2V0Y2hDYW52YXMuaGVpZ2h0ID0gc2tldGNoQ2FudmFzU2l6ZS55O1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb250ZXh0ID0gdGhpcy5za2V0Y2hDb250ZXh0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb250ZXh0O1xuICAgIH0sXG5cbiAgICAvLyBwcml2YXRlXG4gICAgc2F2ZUNvbnRleHQ6IGZ1bmN0aW9uKCB1c2VTa2V0Y2ggKSB7XG4gICAgICAgIGlmICghdGhpcy51c2VDYW52YXMpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2dldENvbnRleHQoIHVzZVNrZXRjaCApLnNhdmUoKTtcbiAgICB9LFxuXG4gICAgLy8gcHJpdmF0ZVxuICAgIHJlc3RvcmVDb250ZXh0OiBmdW5jdGlvbiggdXNlU2tldGNoICkge1xuICAgICAgICBpZiAoIXRoaXMudXNlQ2FudmFzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9nZXRDb250ZXh0KCB1c2VTa2V0Y2ggKS5yZXN0b3JlKCk7XG4gICAgfSxcblxuICAgIC8vIHByaXZhdGVcbiAgICBzZXRDbGlwOiBmdW5jdGlvbihyZWN0LCB1c2VTa2V0Y2gpIHtcbiAgICAgICAgaWYgKCF0aGlzLnVzZUNhbnZhcykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGNvbnRleHQgPSB0aGlzLl9nZXRDb250ZXh0KCB1c2VTa2V0Y2ggKTtcbiAgICAgICAgY29udGV4dC5iZWdpblBhdGgoKTtcbiAgICAgICAgY29udGV4dC5yZWN0KHJlY3QueCwgcmVjdC55LCByZWN0LndpZHRoLCByZWN0LmhlaWdodCk7XG4gICAgICAgIGNvbnRleHQuY2xpcCgpO1xuICAgIH0sXG5cbiAgICAvLyBwcml2YXRlXG4gICAgZHJhd1JlY3RhbmdsZTogZnVuY3Rpb24ocmVjdCwgZmlsbFN0eWxlLCB1c2VTa2V0Y2gpIHtcbiAgICAgICAgaWYgKCF0aGlzLnVzZUNhbnZhcykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGNvbnRleHQgPSB0aGlzLl9nZXRDb250ZXh0KCB1c2VTa2V0Y2ggKTtcbiAgICAgICAgY29udGV4dC5zYXZlKCk7XG4gICAgICAgIGNvbnRleHQuZmlsbFN0eWxlID0gZmlsbFN0eWxlO1xuICAgICAgICBjb250ZXh0LmZpbGxSZWN0KHJlY3QueCwgcmVjdC55LCByZWN0LndpZHRoLCByZWN0LmhlaWdodCk7XG4gICAgICAgIGNvbnRleHQucmVzdG9yZSgpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBCbGVuZHMgdGhlIHNrZXRjaCBjYW52YXMgaW4gdGhlIG1haW4gY2FudmFzLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIFRoZSBvcHRpb25zXG4gICAgICogQHBhcmFtIHtGbG9hdH0gb3B0aW9ucy5vcGFjaXR5IFRoZSBvcGFjaXR5IG9mIHRoZSBibGVuZGluZy5cbiAgICAgKiBAcGFyYW0ge0Zsb2F0fSBbb3B0aW9ucy5zY2FsZT0xXSBUaGUgc2NhbGUgYXQgd2hpY2ggdGlsZXMgd2VyZSBkcmF3biBvblxuICAgICAqIHRoZSBza2V0Y2guIERlZmF1bHQgaXMgMS5cbiAgICAgKiBVc2Ugc2NhbGUgdG8gZHJhdyBhdCBhIGxvd2VyIHNjYWxlIGFuZCB0aGVuIGVubGFyZ2Ugb250byB0aGUgbWFpbiBjYW52YXMuXG4gICAgICogQHBhcmFtIHtPcGVuU2VhZHJhZ29uLlBvaW50fSBbb3B0aW9ucy50cmFuc2xhdGVdIEEgdHJhbnNsYXRpb24gdmVjdG9yXG4gICAgICogdGhhdCB3YXMgdXNlZCB0byBkcmF3IHRoZSB0aWxlc1xuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5jb21wb3NpdGVPcGVyYXRpb25dIC0gSG93IHRoZSBpbWFnZSBpc1xuICAgICAqIGNvbXBvc2l0ZWQgb250byBvdGhlciBpbWFnZXM7IHNlZSBjb21wb3NpdGVPcGVyYXRpb24gaW5cbiAgICAgKiB7QGxpbmsgT3BlblNlYWRyYWdvbi5PcHRpb25zfSBmb3IgcG9zc2libGUgdmFsdWVzLlxuICAgICAqIEBwYXJhbSB7T3BlblNlYWRyYWdvbi5SZWN0fSBbb3B0aW9ucy5ib3VuZHNdIFRoZSBwYXJ0IG9mIHRoZSBza2V0Y2hcbiAgICAgKiBjYW52YXMgdG8gYmxlbmQgaW4gdGhlIG1haW4gY2FudmFzLiBJZiBzcGVjaWZpZWQsIG9wdGlvbnMuc2NhbGUgYW5kXG4gICAgICogb3B0aW9ucy50cmFuc2xhdGUgZ2V0IGlnbm9yZWQuXG4gICAgICovXG4gICAgYmxlbmRTa2V0Y2g6IGZ1bmN0aW9uKG9wYWNpdHksIHNjYWxlLCB0cmFuc2xhdGUsIGNvbXBvc2l0ZU9wZXJhdGlvbikge1xuICAgICAgICB2YXIgb3B0aW9ucyA9IG9wYWNpdHk7XG4gICAgICAgIGlmICghJC5pc1BsYWluT2JqZWN0KG9wdGlvbnMpKSB7XG4gICAgICAgICAgICBvcHRpb25zID0ge1xuICAgICAgICAgICAgICAgIG9wYWNpdHk6IG9wYWNpdHksXG4gICAgICAgICAgICAgICAgc2NhbGU6IHNjYWxlLFxuICAgICAgICAgICAgICAgIHRyYW5zbGF0ZTogdHJhbnNsYXRlLFxuICAgICAgICAgICAgICAgIGNvbXBvc2l0ZU9wZXJhdGlvbjogY29tcG9zaXRlT3BlcmF0aW9uXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy51c2VDYW52YXMgfHwgIXRoaXMuc2tldGNoQ2FudmFzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgb3BhY2l0eSA9IG9wdGlvbnMub3BhY2l0eTtcbiAgICAgICAgY29tcG9zaXRlT3BlcmF0aW9uID0gb3B0aW9ucy5jb21wb3NpdGVPcGVyYXRpb247XG4gICAgICAgIHZhciBib3VuZHMgPSBvcHRpb25zLmJvdW5kcztcblxuICAgICAgICB0aGlzLmNvbnRleHQuc2F2ZSgpO1xuICAgICAgICB0aGlzLmNvbnRleHQuZ2xvYmFsQWxwaGEgPSBvcGFjaXR5O1xuICAgICAgICBpZiAoY29tcG9zaXRlT3BlcmF0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHQuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gY29tcG9zaXRlT3BlcmF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGlmIChib3VuZHMpIHtcbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5kcmF3SW1hZ2UoXG4gICAgICAgICAgICAgICAgdGhpcy5za2V0Y2hDYW52YXMsXG4gICAgICAgICAgICAgICAgYm91bmRzLngsXG4gICAgICAgICAgICAgICAgYm91bmRzLnksXG4gICAgICAgICAgICAgICAgYm91bmRzLndpZHRoLFxuICAgICAgICAgICAgICAgIGJvdW5kcy5oZWlnaHQsXG4gICAgICAgICAgICAgICAgYm91bmRzLngsXG4gICAgICAgICAgICAgICAgYm91bmRzLnksXG4gICAgICAgICAgICAgICAgYm91bmRzLndpZHRoLFxuICAgICAgICAgICAgICAgIGJvdW5kcy5oZWlnaHRcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzY2FsZSA9IG9wdGlvbnMuc2NhbGUgfHwgMTtcbiAgICAgICAgICAgIHRyYW5zbGF0ZSA9IG9wdGlvbnMudHJhbnNsYXRlO1xuICAgICAgICAgICAgdmFyIHBvc2l0aW9uID0gdHJhbnNsYXRlIGluc3RhbmNlb2YgJC5Qb2ludCA/XG4gICAgICAgICAgICAgICAgdHJhbnNsYXRlIDogbmV3ICQuUG9pbnQoMCwgMCk7XG5cbiAgICAgICAgICAgIHZhciB3aWR0aEV4dCA9IDA7XG4gICAgICAgICAgICB2YXIgaGVpZ2h0RXh0ID0gMDtcbiAgICAgICAgICAgIGlmICh0cmFuc2xhdGUpIHtcbiAgICAgICAgICAgICAgICB2YXIgd2lkdGhEaWZmID0gdGhpcy5za2V0Y2hDYW52YXMud2lkdGggLSB0aGlzLmNhbnZhcy53aWR0aDtcbiAgICAgICAgICAgICAgICB2YXIgaGVpZ2h0RGlmZiA9IHRoaXMuc2tldGNoQ2FudmFzLmhlaWdodCAtIHRoaXMuY2FudmFzLmhlaWdodDtcbiAgICAgICAgICAgICAgICB3aWR0aEV4dCA9IE1hdGgucm91bmQod2lkdGhEaWZmIC8gMik7XG4gICAgICAgICAgICAgICAgaGVpZ2h0RXh0ID0gTWF0aC5yb3VuZChoZWlnaHREaWZmIC8gMik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmNvbnRleHQuZHJhd0ltYWdlKFxuICAgICAgICAgICAgICAgIHRoaXMuc2tldGNoQ2FudmFzLFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uLnggLSB3aWR0aEV4dCAqIHNjYWxlLFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uLnkgLSBoZWlnaHRFeHQgKiBzY2FsZSxcbiAgICAgICAgICAgICAgICAodGhpcy5jYW52YXMud2lkdGggKyAyICogd2lkdGhFeHQpICogc2NhbGUsXG4gICAgICAgICAgICAgICAgKHRoaXMuY2FudmFzLmhlaWdodCAgKyAyICogaGVpZ2h0RXh0KSAqIHNjYWxlLFxuICAgICAgICAgICAgICAgIC13aWR0aEV4dCxcbiAgICAgICAgICAgICAgICAtaGVpZ2h0RXh0LFxuICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzLndpZHRoICsgMiAqIHdpZHRoRXh0LFxuICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzLmhlaWdodCArIDIgKiBoZWlnaHRFeHRcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb250ZXh0LnJlc3RvcmUoKTtcbiAgICB9LFxuXG4gICAgLy8gcHJpdmF0ZVxuICAgIGRyYXdEZWJ1Z0luZm86IGZ1bmN0aW9uKCB0aWxlLCBjb3VudCwgaSApe1xuICAgICAgICBpZiAoICF0aGlzLnVzZUNhbnZhcyApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBjb250ZXh0ID0gdGhpcy5jb250ZXh0O1xuICAgICAgICBjb250ZXh0LnNhdmUoKTtcbiAgICAgICAgY29udGV4dC5saW5lV2lkdGggPSAyICogJC5waXhlbERlbnNpdHlSYXRpbztcbiAgICAgICAgY29udGV4dC5mb250ID0gJ3NtYWxsLWNhcHMgYm9sZCAnICsgKDEzICogJC5waXhlbERlbnNpdHlSYXRpbykgKyAncHggYXJpYWwnO1xuICAgICAgICBjb250ZXh0LnN0cm9rZVN0eWxlID0gdGhpcy5kZWJ1Z0dyaWRDb2xvcjtcbiAgICAgICAgY29udGV4dC5maWxsU3R5bGUgPSB0aGlzLmRlYnVnR3JpZENvbG9yO1xuXG4gICAgICAgIGlmICggdGhpcy52aWV3cG9ydC5kZWdyZWVzICE9PSAwICkge1xuICAgICAgICAgICAgdGhpcy5fb2Zmc2V0Rm9yUm90YXRpb24odGhpcy52aWV3cG9ydC5kZWdyZWVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRleHQuc3Ryb2tlUmVjdChcbiAgICAgICAgICAgIHRpbGUucG9zaXRpb24ueCAqICQucGl4ZWxEZW5zaXR5UmF0aW8sXG4gICAgICAgICAgICB0aWxlLnBvc2l0aW9uLnkgKiAkLnBpeGVsRGVuc2l0eVJhdGlvLFxuICAgICAgICAgICAgdGlsZS5zaXplLnggKiAkLnBpeGVsRGVuc2l0eVJhdGlvLFxuICAgICAgICAgICAgdGlsZS5zaXplLnkgKiAkLnBpeGVsRGVuc2l0eVJhdGlvXG4gICAgICAgICk7XG5cbiAgICAgICAgdmFyIHRpbGVDZW50ZXJYID0gKHRpbGUucG9zaXRpb24ueCArICh0aWxlLnNpemUueCAvIDIpKSAqICQucGl4ZWxEZW5zaXR5UmF0aW87XG4gICAgICAgIHZhciB0aWxlQ2VudGVyWSA9ICh0aWxlLnBvc2l0aW9uLnkgKyAodGlsZS5zaXplLnkgLyAyKSkgKiAkLnBpeGVsRGVuc2l0eVJhdGlvO1xuXG4gICAgICAgIC8vIFJvdGF0ZSB0aGUgdGV4dCB0aGUgcmlnaHQgd2F5IGFyb3VuZC5cbiAgICAgICAgY29udGV4dC50cmFuc2xhdGUoIHRpbGVDZW50ZXJYLCB0aWxlQ2VudGVyWSApO1xuICAgICAgICBjb250ZXh0LnJvdGF0ZSggTWF0aC5QSSAvIDE4MCAqIC10aGlzLnZpZXdwb3J0LmRlZ3JlZXMgKTtcbiAgICAgICAgY29udGV4dC50cmFuc2xhdGUoIC10aWxlQ2VudGVyWCwgLXRpbGVDZW50ZXJZICk7XG5cbiAgICAgICAgaWYoIHRpbGUueCA9PT0gMCAmJiB0aWxlLnkgPT09IDAgKXtcbiAgICAgICAgICAgIGNvbnRleHQuZmlsbFRleHQoXG4gICAgICAgICAgICAgICAgXCJab29tOiBcIiArIHRoaXMudmlld3BvcnQuZ2V0Wm9vbSgpLFxuICAgICAgICAgICAgICAgIHRpbGUucG9zaXRpb24ueCAqICQucGl4ZWxEZW5zaXR5UmF0aW8sXG4gICAgICAgICAgICAgICAgKHRpbGUucG9zaXRpb24ueSAtIDMwKSAqICQucGl4ZWxEZW5zaXR5UmF0aW9cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb250ZXh0LmZpbGxUZXh0KFxuICAgICAgICAgICAgICAgIFwiUGFuOiBcIiArIHRoaXMudmlld3BvcnQuZ2V0Qm91bmRzKCkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgICAgICB0aWxlLnBvc2l0aW9uLnggKiAkLnBpeGVsRGVuc2l0eVJhdGlvLFxuICAgICAgICAgICAgICAgICh0aWxlLnBvc2l0aW9uLnkgLSAyMCkgKiAkLnBpeGVsRGVuc2l0eVJhdGlvXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRleHQuZmlsbFRleHQoXG4gICAgICAgICAgICBcIkxldmVsOiBcIiArIHRpbGUubGV2ZWwsXG4gICAgICAgICAgICAodGlsZS5wb3NpdGlvbi54ICsgMTApICogJC5waXhlbERlbnNpdHlSYXRpbyxcbiAgICAgICAgICAgICh0aWxlLnBvc2l0aW9uLnkgKyAyMCkgKiAkLnBpeGVsRGVuc2l0eVJhdGlvXG4gICAgICAgICk7XG4gICAgICAgIGNvbnRleHQuZmlsbFRleHQoXG4gICAgICAgICAgICBcIkNvbHVtbjogXCIgKyB0aWxlLngsXG4gICAgICAgICAgICAodGlsZS5wb3NpdGlvbi54ICsgMTApICogJC5waXhlbERlbnNpdHlSYXRpbyxcbiAgICAgICAgICAgICh0aWxlLnBvc2l0aW9uLnkgKyAzMCkgKiAkLnBpeGVsRGVuc2l0eVJhdGlvXG4gICAgICAgICk7XG4gICAgICAgIGNvbnRleHQuZmlsbFRleHQoXG4gICAgICAgICAgICBcIlJvdzogXCIgKyB0aWxlLnksXG4gICAgICAgICAgICAodGlsZS5wb3NpdGlvbi54ICsgMTApICogJC5waXhlbERlbnNpdHlSYXRpbyxcbiAgICAgICAgICAgICh0aWxlLnBvc2l0aW9uLnkgKyA0MCkgKiAkLnBpeGVsRGVuc2l0eVJhdGlvXG4gICAgICAgICk7XG4gICAgICAgIGNvbnRleHQuZmlsbFRleHQoXG4gICAgICAgICAgICBcIk9yZGVyOiBcIiArIGkgKyBcIiBvZiBcIiArIGNvdW50LFxuICAgICAgICAgICAgKHRpbGUucG9zaXRpb24ueCArIDEwKSAqICQucGl4ZWxEZW5zaXR5UmF0aW8sXG4gICAgICAgICAgICAodGlsZS5wb3NpdGlvbi55ICsgNTApICogJC5waXhlbERlbnNpdHlSYXRpb1xuICAgICAgICApO1xuICAgICAgICBjb250ZXh0LmZpbGxUZXh0KFxuICAgICAgICAgICAgXCJTaXplOiBcIiArIHRpbGUuc2l6ZS50b1N0cmluZygpLFxuICAgICAgICAgICAgKHRpbGUucG9zaXRpb24ueCArIDEwKSAqICQucGl4ZWxEZW5zaXR5UmF0aW8sXG4gICAgICAgICAgICAodGlsZS5wb3NpdGlvbi55ICsgNjApICogJC5waXhlbERlbnNpdHlSYXRpb1xuICAgICAgICApO1xuICAgICAgICBjb250ZXh0LmZpbGxUZXh0KFxuICAgICAgICAgICAgXCJQb3NpdGlvbjogXCIgKyB0aWxlLnBvc2l0aW9uLnRvU3RyaW5nKCksXG4gICAgICAgICAgICAodGlsZS5wb3NpdGlvbi54ICsgMTApICogJC5waXhlbERlbnNpdHlSYXRpbyxcbiAgICAgICAgICAgICh0aWxlLnBvc2l0aW9uLnkgKyA3MCkgKiAkLnBpeGVsRGVuc2l0eVJhdGlvXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKCB0aGlzLnZpZXdwb3J0LmRlZ3JlZXMgIT09IDAgKSB7XG4gICAgICAgICAgICB0aGlzLl9yZXN0b3JlUm90YXRpb25DaGFuZ2VzKCk7XG4gICAgICAgIH1cbiAgICAgICAgY29udGV4dC5yZXN0b3JlKCk7XG4gICAgfSxcblxuICAgIC8vIHByaXZhdGVcbiAgICBkZWJ1Z1JlY3Q6IGZ1bmN0aW9uKHJlY3QpIHtcbiAgICAgICAgaWYgKCB0aGlzLnVzZUNhbnZhcyApIHtcbiAgICAgICAgICAgIHZhciBjb250ZXh0ID0gdGhpcy5jb250ZXh0O1xuICAgICAgICAgICAgY29udGV4dC5zYXZlKCk7XG4gICAgICAgICAgICBjb250ZXh0LmxpbmVXaWR0aCA9IDIgKiAkLnBpeGVsRGVuc2l0eVJhdGlvO1xuICAgICAgICAgICAgY29udGV4dC5zdHJva2VTdHlsZSA9IHRoaXMuZGVidWdHcmlkQ29sb3I7XG4gICAgICAgICAgICBjb250ZXh0LmZpbGxTdHlsZSA9IHRoaXMuZGVidWdHcmlkQ29sb3I7XG5cbiAgICAgICAgICAgIGNvbnRleHQuc3Ryb2tlUmVjdChcbiAgICAgICAgICAgICAgICByZWN0LnggKiAkLnBpeGVsRGVuc2l0eVJhdGlvLFxuICAgICAgICAgICAgICAgIHJlY3QueSAqICQucGl4ZWxEZW5zaXR5UmF0aW8sXG4gICAgICAgICAgICAgICAgcmVjdC53aWR0aCAqICQucGl4ZWxEZW5zaXR5UmF0aW8sXG4gICAgICAgICAgICAgICAgcmVjdC5oZWlnaHQgKiAkLnBpeGVsRGVuc2l0eVJhdGlvXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBjb250ZXh0LnJlc3RvcmUoKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGNhbnZhcyBzaXplXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBza2V0Y2ggSWYgc2V0IHRvIHRydWUgcmV0dXJuIHRoZSBzaXplIG9mIHRoZSBza2V0Y2ggY2FudmFzXG4gICAgICogQHJldHVybnMge09wZW5TZWFkcmFnb24uUG9pbnR9IFRoZSBzaXplIG9mIHRoZSBjYW52YXNcbiAgICAgKi9cbiAgICBnZXRDYW52YXNTaXplOiBmdW5jdGlvbihza2V0Y2gpIHtcbiAgICAgICAgdmFyIGNhbnZhcyA9IHRoaXMuX2dldENvbnRleHQoc2tldGNoKS5jYW52YXM7XG4gICAgICAgIHJldHVybiBuZXcgJC5Qb2ludChjYW52YXMud2lkdGgsIGNhbnZhcy5oZWlnaHQpO1xuICAgIH0sXG5cbiAgICAvLyBwcml2YXRlXG4gICAgX29mZnNldEZvclJvdGF0aW9uOiBmdW5jdGlvbihkZWdyZWVzLCB1c2VTa2V0Y2gpIHtcbiAgICAgICAgdmFyIGN4ID0gdGhpcy5jYW52YXMud2lkdGggLyAyO1xuICAgICAgICB2YXIgY3kgPSB0aGlzLmNhbnZhcy5oZWlnaHQgLyAyO1xuXG4gICAgICAgIHZhciBjb250ZXh0ID0gdGhpcy5fZ2V0Q29udGV4dCh1c2VTa2V0Y2gpO1xuICAgICAgICBjb250ZXh0LnNhdmUoKTtcblxuICAgICAgICBjb250ZXh0LnRyYW5zbGF0ZShjeCwgY3kpO1xuICAgICAgICBjb250ZXh0LnJvdGF0ZShNYXRoLlBJIC8gMTgwICogZGVncmVlcyk7XG4gICAgICAgIGNvbnRleHQudHJhbnNsYXRlKC1jeCwgLWN5KTtcbiAgICB9LFxuXG4gICAgLy8gcHJpdmF0ZVxuICAgIF9yZXN0b3JlUm90YXRpb25DaGFuZ2VzOiBmdW5jdGlvbih1c2VTa2V0Y2gpIHtcbiAgICAgICAgdmFyIGNvbnRleHQgPSB0aGlzLl9nZXRDb250ZXh0KHVzZVNrZXRjaCk7XG4gICAgICAgIGNvbnRleHQucmVzdG9yZSgpO1xuICAgIH0sXG5cbiAgICAvLyBwcml2YXRlXG4gICAgX2NhbGN1bGF0ZUNhbnZhc1NpemU6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgcGl4ZWxEZW5zaXR5UmF0aW8gPSAkLnBpeGVsRGVuc2l0eVJhdGlvO1xuICAgICAgICB2YXIgdmlld3BvcnRTaXplID0gdGhpcy52aWV3cG9ydC5nZXRDb250YWluZXJTaXplKCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB4OiB2aWV3cG9ydFNpemUueCAqIHBpeGVsRGVuc2l0eVJhdGlvLFxuICAgICAgICAgICAgeTogdmlld3BvcnRTaXplLnkgKiBwaXhlbERlbnNpdHlSYXRpb1xuICAgICAgICB9O1xuICAgIH0sXG5cbiAgICAvLyBwcml2YXRlXG4gICAgX2NhbGN1bGF0ZVNrZXRjaENhbnZhc1NpemU6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgY2FudmFzU2l6ZSA9IHRoaXMuX2NhbGN1bGF0ZUNhbnZhc1NpemUoKTtcbiAgICAgICAgaWYgKHRoaXMudmlld3BvcnQuZ2V0Um90YXRpb24oKSA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGNhbnZhc1NpemU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgdGhlIHZpZXdwb3J0IGlzIHJvdGF0ZWQsIHdlIG5lZWQgYSBsYXJnZXIgc2tldGNoIGNhbnZhcyBpbiBvcmRlclxuICAgICAgICAvLyB0byBzdXBwb3J0IGVkZ2Ugc21vb3RoaW5nLlxuICAgICAgICB2YXIgc2tldGNoQ2FudmFzU2l6ZSA9IE1hdGguY2VpbChNYXRoLnNxcnQoXG4gICAgICAgICAgICBjYW52YXNTaXplLnggKiBjYW52YXNTaXplLnggK1xuICAgICAgICAgICAgY2FudmFzU2l6ZS55ICogY2FudmFzU2l6ZS55KSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB4OiBza2V0Y2hDYW52YXNTaXplLFxuICAgICAgICAgICAgeTogc2tldGNoQ2FudmFzU2l6ZVxuICAgICAgICB9O1xuICAgIH1cbn07XG5cbn0oIE9wZW5TZWFkcmFnb24gKSk7XG5cbi8qXG4gKiBPcGVuU2VhZHJhZ29uIC0gVmlld3BvcnRcbiAqXG4gKiBDb3B5cmlnaHQgKEMpIDIwMDkgQ29kZVBsZXggRm91bmRhdGlvblxuICogQ29weXJpZ2h0IChDKSAyMDEwLTIwMTMgT3BlblNlYWRyYWdvbiBjb250cmlidXRvcnNcbiAqXG4gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmVcbiAqIG1ldDpcbiAqXG4gKiAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiAqICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAqXG4gKiAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0XG4gKiAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGVcbiAqICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cbiAqXG4gKiAtIE5laXRoZXIgdGhlIG5hbWUgb2YgQ29kZVBsZXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0c1xuICogICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbVxuICogICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuICpcbiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlNcbiAqIFwiQVMgSVNcIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1RcbiAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUlxuICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUXG4gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCxcbiAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRFxuICogVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUlxuICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkdcbiAqIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJU1xuICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4gKi9cblxuKGZ1bmN0aW9uKCAkICl7XG5cblxuLyoqXG4gKiBAY2xhc3MgVmlld3BvcnRcbiAqIEBtZW1iZXJvZiBPcGVuU2VhZHJhZ29uXG4gKiBAY2xhc3NkZXNjIEhhbmRsZXMgY29vcmRpbmF0ZS1yZWxhdGVkIGZ1bmN0aW9uYWxpdHkgKHpvb20sIHBhbiwgcm90YXRpb24sIGV0Yy4pXG4gKiBmb3IgYW4ge0BsaW5rIE9wZW5TZWFkcmFnb24uVmlld2VyfS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gT3B0aW9ucyBmb3IgdGhpcyBWaWV3cG9ydC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5tYXJnaW5zXSAtIFNlZSB2aWV3cG9ydE1hcmdpbnMgaW4ge0BsaW5rIE9wZW5TZWFkcmFnb24uT3B0aW9uc30uXG4gKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuc3ByaW5nU3RpZmZuZXNzXSAtIFNlZSBzcHJpbmdTdGlmZm5lc3MgaW4ge0BsaW5rIE9wZW5TZWFkcmFnb24uT3B0aW9uc30uXG4gKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuYW5pbWF0aW9uVGltZV0gLSBTZWUgYW5pbWF0aW9uVGltZSBpbiB7QGxpbmsgT3BlblNlYWRyYWdvbi5PcHRpb25zfS5cbiAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5taW5ab29tSW1hZ2VSYXRpb10gLSBTZWUgbWluWm9vbUltYWdlUmF0aW8gaW4ge0BsaW5rIE9wZW5TZWFkcmFnb24uT3B0aW9uc30uXG4gKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMubWF4Wm9vbVBpeGVsUmF0aW9dIC0gU2VlIG1heFpvb21QaXhlbFJhdGlvIGluIHtAbGluayBPcGVuU2VhZHJhZ29uLk9wdGlvbnN9LlxuICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLnZpc2liaWxpdHlSYXRpb10gLSBTZWUgdmlzaWJpbGl0eVJhdGlvIGluIHtAbGluayBPcGVuU2VhZHJhZ29uLk9wdGlvbnN9LlxuICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy53cmFwSG9yaXpvbnRhbF0gLSBTZWUgd3JhcEhvcml6b250YWwgaW4ge0BsaW5rIE9wZW5TZWFkcmFnb24uT3B0aW9uc30uXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLndyYXBWZXJ0aWNhbF0gLSBTZWUgd3JhcFZlcnRpY2FsIGluIHtAbGluayBPcGVuU2VhZHJhZ29uLk9wdGlvbnN9LlxuICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmRlZmF1bHRab29tTGV2ZWxdIC0gU2VlIGRlZmF1bHRab29tTGV2ZWwgaW4ge0BsaW5rIE9wZW5TZWFkcmFnb24uT3B0aW9uc30uXG4gKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMubWluWm9vbUxldmVsXSAtIFNlZSBtaW5ab29tTGV2ZWwgaW4ge0BsaW5rIE9wZW5TZWFkcmFnb24uT3B0aW9uc30uXG4gKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMubWF4Wm9vbUxldmVsXSAtIFNlZSBtYXhab29tTGV2ZWwgaW4ge0BsaW5rIE9wZW5TZWFkcmFnb24uT3B0aW9uc30uXG4gKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuZGVncmVlc10gLSBTZWUgZGVncmVlcyBpbiB7QGxpbmsgT3BlblNlYWRyYWdvbi5PcHRpb25zfS5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuaG9tZUZpbGxzVmlld2VyXSAtIFNlZSBob21lRmlsbHNWaWV3ZXIgaW4ge0BsaW5rIE9wZW5TZWFkcmFnb24uT3B0aW9uc30uXG4gKi9cbiQuVmlld3BvcnQgPSBmdW5jdGlvbiggb3B0aW9ucyApIHtcblxuICAgIC8vYmFja3dhcmQgY29tcGF0aWJpbGl0eSBmb3IgcG9zaXRpb25hbCBhcmdzIHdoaWxlIHByZWZlcmluZyBtb3JlXG4gICAgLy9pZGlvbWF0aWMgamF2YXNjcmlwdCBvcHRpb25zIG9iamVjdCBhcyB0aGUgb25seSBhcmd1bWVudFxuICAgIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICAgIGlmKCAgYXJncy5sZW5ndGggJiYgYXJnc1sgMCBdIGluc3RhbmNlb2YgJC5Qb2ludCApe1xuICAgICAgICBvcHRpb25zID0ge1xuICAgICAgICAgICAgY29udGFpbmVyU2l6ZTogIGFyZ3NbIDAgXSxcbiAgICAgICAgICAgIGNvbnRlbnRTaXplOiAgICBhcmdzWyAxIF0sXG4gICAgICAgICAgICBjb25maWc6ICAgICAgICAgYXJnc1sgMiBdXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLy9vcHRpb25zLmNvbmZpZyBhbmQgdGhlIGdlbmVyYWwgY29uZmlnIGFyZ3VtZW50IGFyZSBkZXByZWNhdGVkXG4gICAgLy9pbiBmYXZvciBvZiB0aGUgbW9yZSBkaXJlY3Qgc3BlY2lmaWNhdGlvbiBvZiBvcHRpb25hbCBzZXR0aW5nc1xuICAgIC8vYmVpbmcgcGFzc2VkIGRpcmVjdGx5IG9uIHRoZSBvcHRpb25zIG9iamVjdFxuICAgIGlmICggb3B0aW9ucy5jb25maWcgKXtcbiAgICAgICAgJC5leHRlbmQoIHRydWUsIG9wdGlvbnMsIG9wdGlvbnMuY29uZmlnICk7XG4gICAgICAgIGRlbGV0ZSBvcHRpb25zLmNvbmZpZztcbiAgICB9XG5cbiAgICB0aGlzLl9tYXJnaW5zID0gJC5leHRlbmQoe1xuICAgICAgICBsZWZ0OiAwLFxuICAgICAgICB0b3A6IDAsXG4gICAgICAgIHJpZ2h0OiAwLFxuICAgICAgICBib3R0b206IDBcbiAgICB9LCBvcHRpb25zLm1hcmdpbnMgfHwge30pO1xuXG4gICAgZGVsZXRlIG9wdGlvbnMubWFyZ2lucztcblxuICAgICQuZXh0ZW5kKCB0cnVlLCB0aGlzLCB7XG5cbiAgICAgICAgLy9yZXF1aXJlZCBzZXR0aW5nc1xuICAgICAgICBjb250YWluZXJTaXplOiAgICAgIG51bGwsXG4gICAgICAgIGNvbnRlbnRTaXplOiAgICAgICAgbnVsbCxcblxuICAgICAgICAvL2ludGVybmFsIHN0YXRlIHByb3BlcnRpZXNcbiAgICAgICAgem9vbVBvaW50OiAgICAgICAgICBudWxsLFxuICAgICAgICB2aWV3ZXI6ICAgICAgICAgICBudWxsLFxuXG4gICAgICAgIC8vY29uZmlndXJhYmxlIG9wdGlvbnNcbiAgICAgICAgc3ByaW5nU3RpZmZuZXNzOiAgICAkLkRFRkFVTFRfU0VUVElOR1Muc3ByaW5nU3RpZmZuZXNzLFxuICAgICAgICBhbmltYXRpb25UaW1lOiAgICAgICQuREVGQVVMVF9TRVRUSU5HUy5hbmltYXRpb25UaW1lLFxuICAgICAgICBtaW5ab29tSW1hZ2VSYXRpbzogICQuREVGQVVMVF9TRVRUSU5HUy5taW5ab29tSW1hZ2VSYXRpbyxcbiAgICAgICAgbWF4Wm9vbVBpeGVsUmF0aW86ICAkLkRFRkFVTFRfU0VUVElOR1MubWF4Wm9vbVBpeGVsUmF0aW8sXG4gICAgICAgIHZpc2liaWxpdHlSYXRpbzogICAgJC5ERUZBVUxUX1NFVFRJTkdTLnZpc2liaWxpdHlSYXRpbyxcbiAgICAgICAgd3JhcEhvcml6b250YWw6ICAgICAkLkRFRkFVTFRfU0VUVElOR1Mud3JhcEhvcml6b250YWwsXG4gICAgICAgIHdyYXBWZXJ0aWNhbDogICAgICAgJC5ERUZBVUxUX1NFVFRJTkdTLndyYXBWZXJ0aWNhbCxcbiAgICAgICAgZGVmYXVsdFpvb21MZXZlbDogICAkLkRFRkFVTFRfU0VUVElOR1MuZGVmYXVsdFpvb21MZXZlbCxcbiAgICAgICAgbWluWm9vbUxldmVsOiAgICAgICAkLkRFRkFVTFRfU0VUVElOR1MubWluWm9vbUxldmVsLFxuICAgICAgICBtYXhab29tTGV2ZWw6ICAgICAgICQuREVGQVVMVF9TRVRUSU5HUy5tYXhab29tTGV2ZWwsXG4gICAgICAgIGRlZ3JlZXM6ICAgICAgICAgICAgJC5ERUZBVUxUX1NFVFRJTkdTLmRlZ3JlZXMsXG4gICAgICAgIGhvbWVGaWxsc1ZpZXdlcjogICAgJC5ERUZBVUxUX1NFVFRJTkdTLmhvbWVGaWxsc1ZpZXdlclxuXG4gICAgfSwgb3B0aW9ucyApO1xuXG4gICAgdGhpcy5fdXBkYXRlQ29udGFpbmVySW5uZXJTaXplKCk7XG5cbiAgICB0aGlzLmNlbnRlclNwcmluZ1ggPSBuZXcgJC5TcHJpbmcoe1xuICAgICAgICBpbml0aWFsOiAwLFxuICAgICAgICBzcHJpbmdTdGlmZm5lc3M6IHRoaXMuc3ByaW5nU3RpZmZuZXNzLFxuICAgICAgICBhbmltYXRpb25UaW1lOiAgIHRoaXMuYW5pbWF0aW9uVGltZVxuICAgIH0pO1xuICAgIHRoaXMuY2VudGVyU3ByaW5nWSA9IG5ldyAkLlNwcmluZyh7XG4gICAgICAgIGluaXRpYWw6IDAsXG4gICAgICAgIHNwcmluZ1N0aWZmbmVzczogdGhpcy5zcHJpbmdTdGlmZm5lc3MsXG4gICAgICAgIGFuaW1hdGlvblRpbWU6ICAgdGhpcy5hbmltYXRpb25UaW1lXG4gICAgfSk7XG4gICAgdGhpcy56b29tU3ByaW5nICAgID0gbmV3ICQuU3ByaW5nKHtcbiAgICAgICAgZXhwb25lbnRpYWw6IHRydWUsXG4gICAgICAgIGluaXRpYWw6IDEsXG4gICAgICAgIHNwcmluZ1N0aWZmbmVzczogdGhpcy5zcHJpbmdTdGlmZm5lc3MsXG4gICAgICAgIGFuaW1hdGlvblRpbWU6ICAgdGhpcy5hbmltYXRpb25UaW1lXG4gICAgfSk7XG5cbiAgICB0aGlzLl9vbGRDZW50ZXJYID0gdGhpcy5jZW50ZXJTcHJpbmdYLmN1cnJlbnQudmFsdWU7XG4gICAgdGhpcy5fb2xkQ2VudGVyWSA9IHRoaXMuY2VudGVyU3ByaW5nWS5jdXJyZW50LnZhbHVlO1xuICAgIHRoaXMuX29sZFpvb20gICAgPSB0aGlzLnpvb21TcHJpbmcuY3VycmVudC52YWx1ZTtcblxuICAgIHRoaXMuX3NldENvbnRlbnRCb3VuZHMobmV3ICQuUmVjdCgwLCAwLCAxLCAxKSwgMSk7XG5cbiAgICB0aGlzLmdvSG9tZSh0cnVlKTtcbiAgICB0aGlzLnVwZGF0ZSgpO1xufTtcblxuLyoqIEBsZW5kcyBPcGVuU2VhZHJhZ29uLlZpZXdwb3J0LnByb3RvdHlwZSAqL1xuJC5WaWV3cG9ydC5wcm90b3R5cGUgPSB7XG4gICAgLyoqXG4gICAgICogVXBkYXRlcyB0aGUgdmlld3BvcnQncyBob21lIGJvdW5kcyBhbmQgY29uc3RyYWludHMgZm9yIHRoZSBnaXZlbiBjb250ZW50IHNpemUuXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtPcGVuU2VhZHJhZ29uLlBvaW50fSBjb250ZW50U2l6ZSAtIHNpemUgb2YgdGhlIGNvbnRlbnQgaW4gY29udGVudCB1bml0c1xuICAgICAqIEByZXR1cm4ge09wZW5TZWFkcmFnb24uVmlld3BvcnR9IENoYWluYWJsZS5cbiAgICAgKiBAZmlyZXMgT3BlblNlYWRyYWdvbi5WaWV3ZXIuZXZlbnQ6cmVzZXQtc2l6ZVxuICAgICAqL1xuICAgIHJlc2V0Q29udGVudFNpemU6IGZ1bmN0aW9uKGNvbnRlbnRTaXplKSB7XG4gICAgICAgICQuY29uc29sZS5hc3NlcnQoY29udGVudFNpemUsIFwiW1ZpZXdwb3J0LnJlc2V0Q29udGVudFNpemVdIGNvbnRlbnRTaXplIGlzIHJlcXVpcmVkXCIpO1xuICAgICAgICAkLmNvbnNvbGUuYXNzZXJ0KGNvbnRlbnRTaXplIGluc3RhbmNlb2YgJC5Qb2ludCwgXCJbVmlld3BvcnQucmVzZXRDb250ZW50U2l6ZV0gY29udGVudFNpemUgbXVzdCBiZSBhbiBPcGVuU2VhZHJhZ29uLlBvaW50XCIpO1xuICAgICAgICAkLmNvbnNvbGUuYXNzZXJ0KGNvbnRlbnRTaXplLnggPiAwLCBcIltWaWV3cG9ydC5yZXNldENvbnRlbnRTaXplXSBjb250ZW50U2l6ZS54IG11c3QgYmUgZ3JlYXRlciB0aGFuIDBcIik7XG4gICAgICAgICQuY29uc29sZS5hc3NlcnQoY29udGVudFNpemUueSA+IDAsIFwiW1ZpZXdwb3J0LnJlc2V0Q29udGVudFNpemVdIGNvbnRlbnRTaXplLnkgbXVzdCBiZSBncmVhdGVyIHRoYW4gMFwiKTtcblxuICAgICAgICB0aGlzLl9zZXRDb250ZW50Qm91bmRzKG5ldyAkLlJlY3QoMCwgMCwgMSwgY29udGVudFNpemUueSAvIGNvbnRlbnRTaXplLngpLCBjb250ZW50U2l6ZS54KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8vIGRlcHJlY2F0ZWRcbiAgICBzZXRIb21lQm91bmRzOiBmdW5jdGlvbihib3VuZHMsIGNvbnRlbnRGYWN0b3IpIHtcbiAgICAgICAgJC5jb25zb2xlLmVycm9yKFwiW1ZpZXdwb3J0LnNldEhvbWVCb3VuZHNdIHRoaXMgZnVuY3Rpb24gaXMgZGVwcmVjYXRlZDsgVGhlIGNvbnRlbnQgYm91bmRzIHNob3VsZCBub3QgYmUgc2V0IG1hbnVhbGx5LlwiKTtcbiAgICAgICAgdGhpcy5fc2V0Q29udGVudEJvdW5kcyhib3VuZHMsIGNvbnRlbnRGYWN0b3IpO1xuICAgIH0sXG5cbiAgICAvLyBTZXQgdGhlIHZpZXdwb3J0J3MgY29udGVudCBib3VuZHNcbiAgICAvLyBAcGFyYW0ge09wZW5TZWFkcmFnb24uUmVjdH0gYm91bmRzIC0gdGhlIG5ldyBib3VuZHMgaW4gdmlld3BvcnQgY29vcmRpbmF0ZXNcbiAgICAvLyB3aXRob3V0IHJvdGF0aW9uXG4gICAgLy8gQHBhcmFtIHtOdW1iZXJ9IGNvbnRlbnRGYWN0b3IgLSBob3cgbWFueSBjb250ZW50IHVuaXRzIHBlciB2aWV3cG9ydCB1bml0XG4gICAgLy8gQGZpcmVzIE9wZW5TZWFkcmFnb24uVmlld2VyLmV2ZW50OnJlc2V0LXNpemVcbiAgICAvLyBAcHJpdmF0ZVxuICAgIF9zZXRDb250ZW50Qm91bmRzOiBmdW5jdGlvbihib3VuZHMsIGNvbnRlbnRGYWN0b3IpIHtcbiAgICAgICAgJC5jb25zb2xlLmFzc2VydChib3VuZHMsIFwiW1ZpZXdwb3J0Ll9zZXRDb250ZW50Qm91bmRzXSBib3VuZHMgaXMgcmVxdWlyZWRcIik7XG4gICAgICAgICQuY29uc29sZS5hc3NlcnQoYm91bmRzIGluc3RhbmNlb2YgJC5SZWN0LCBcIltWaWV3cG9ydC5fc2V0Q29udGVudEJvdW5kc10gYm91bmRzIG11c3QgYmUgYW4gT3BlblNlYWRyYWdvbi5SZWN0XCIpO1xuICAgICAgICAkLmNvbnNvbGUuYXNzZXJ0KGJvdW5kcy53aWR0aCA+IDAsIFwiW1ZpZXdwb3J0Ll9zZXRDb250ZW50Qm91bmRzXSBib3VuZHMud2lkdGggbXVzdCBiZSBncmVhdGVyIHRoYW4gMFwiKTtcbiAgICAgICAgJC5jb25zb2xlLmFzc2VydChib3VuZHMuaGVpZ2h0ID4gMCwgXCJbVmlld3BvcnQuX3NldENvbnRlbnRCb3VuZHNdIGJvdW5kcy5oZWlnaHQgbXVzdCBiZSBncmVhdGVyIHRoYW4gMFwiKTtcblxuICAgICAgICB0aGlzLl9jb250ZW50Qm91bmRzTm9Sb3RhdGUgPSBib3VuZHMuY2xvbmUoKTtcbiAgICAgICAgdGhpcy5fY29udGVudFNpemVOb1JvdGF0ZSA9IHRoaXMuX2NvbnRlbnRCb3VuZHNOb1JvdGF0ZS5nZXRTaXplKCkudGltZXMoXG4gICAgICAgICAgICBjb250ZW50RmFjdG9yKTtcblxuICAgICAgICB0aGlzLl9jb250ZW50Qm91bmRzID0gYm91bmRzLnJvdGF0ZSh0aGlzLmRlZ3JlZXMpLmdldEJvdW5kaW5nQm94KCk7XG4gICAgICAgIHRoaXMuX2NvbnRlbnRTaXplID0gdGhpcy5fY29udGVudEJvdW5kcy5nZXRTaXplKCkudGltZXMoY29udGVudEZhY3Rvcik7XG4gICAgICAgIHRoaXMuX2NvbnRlbnRBc3BlY3RSYXRpbyA9IHRoaXMuX2NvbnRlbnRTaXplLnggLyB0aGlzLl9jb250ZW50U2l6ZS55O1xuXG4gICAgICAgIGlmICh0aGlzLnZpZXdlcikge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBSYWlzZWQgd2hlbiB0aGUgdmlld2VyJ3MgY29udGVudCBzaXplIG9yIGhvbWUgYm91bmRzIGFyZSByZXNldFxuICAgICAgICAgICAgICogKHNlZSB7QGxpbmsgT3BlblNlYWRyYWdvbi5WaWV3cG9ydCNyZXNldENvbnRlbnRTaXplfSkuXG4gICAgICAgICAgICAgKlxuICAgICAgICAgICAgICogQGV2ZW50IHJlc2V0LXNpemVcbiAgICAgICAgICAgICAqIEBtZW1iZXJvZiBPcGVuU2VhZHJhZ29uLlZpZXdlclxuICAgICAgICAgICAgICogQHR5cGUge29iamVjdH1cbiAgICAgICAgICAgICAqIEBwcm9wZXJ0eSB7T3BlblNlYWRyYWdvbi5WaWV3ZXJ9IGV2ZW50U291cmNlIC0gQSByZWZlcmVuY2UgdG8gdGhlIFZpZXdlciB3aGljaCByYWlzZWQgdGhpcyBldmVudC5cbiAgICAgICAgICAgICAqIEBwcm9wZXJ0eSB7T3BlblNlYWRyYWdvbi5Qb2ludH0gY29udGVudFNpemVcbiAgICAgICAgICAgICAqIEBwcm9wZXJ0eSB7T3BlblNlYWRyYWdvbi5SZWN0fSBjb250ZW50Qm91bmRzIC0gQ29udGVudCBib3VuZHMuXG4gICAgICAgICAgICAgKiBAcHJvcGVydHkge09wZW5TZWFkcmFnb24uUmVjdH0gaG9tZUJvdW5kcyAtIENvbnRlbnQgYm91bmRzLlxuICAgICAgICAgICAgICogRGVwcmVjYXRlZCB1c2UgY29udGVudEJvdW5kcyBpbnN0ZWFkLlxuICAgICAgICAgICAgICogQHByb3BlcnR5IHtOdW1iZXJ9IGNvbnRlbnRGYWN0b3JcbiAgICAgICAgICAgICAqIEBwcm9wZXJ0eSB7P09iamVjdH0gdXNlckRhdGEgLSBBcmJpdHJhcnkgc3Vic2NyaWJlci1kZWZpbmVkIG9iamVjdC5cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgdGhpcy52aWV3ZXIucmFpc2VFdmVudCgncmVzZXQtc2l6ZScsIHtcbiAgICAgICAgICAgICAgICBjb250ZW50U2l6ZTogdGhpcy5fY29udGVudFNpemVOb1JvdGF0ZS5jbG9uZSgpLFxuICAgICAgICAgICAgICAgIGNvbnRlbnRGYWN0b3I6IGNvbnRlbnRGYWN0b3IsXG4gICAgICAgICAgICAgICAgaG9tZUJvdW5kczogdGhpcy5fY29udGVudEJvdW5kc05vUm90YXRlLmNsb25lKCksXG4gICAgICAgICAgICAgICAgY29udGVudEJvdW5kczogdGhpcy5fY29udGVudEJvdW5kcy5jbG9uZSgpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBob21lIHpvb20gaW4gXCJ2aWV3cG9ydCB6b29tXCIgdmFsdWUuXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHJldHVybnMge051bWJlcn0gVGhlIGhvbWUgem9vbSBpbiBcInZpZXdwb3J0IHpvb21cIi5cbiAgICAgKi9cbiAgICBnZXRIb21lWm9vbTogZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICh0aGlzLmRlZmF1bHRab29tTGV2ZWwpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRlZmF1bHRab29tTGV2ZWw7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgYXNwZWN0RmFjdG9yID0gdGhpcy5fY29udGVudEFzcGVjdFJhdGlvIC8gdGhpcy5nZXRBc3BlY3RSYXRpbygpO1xuICAgICAgICB2YXIgb3V0cHV0O1xuICAgICAgICBpZiAodGhpcy5ob21lRmlsbHNWaWV3ZXIpIHsgLy8gZmlsbCB0aGUgdmlld2VyIGFuZCBjbGlwIHRoZSBpbWFnZVxuICAgICAgICAgICAgb3V0cHV0ID0gYXNwZWN0RmFjdG9yID49IDEgPyBhc3BlY3RGYWN0b3IgOiAxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb3V0cHV0ID0gYXNwZWN0RmFjdG9yID49IDEgPyAxIDogYXNwZWN0RmFjdG9yO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG91dHB1dCAvIHRoaXMuX2NvbnRlbnRCb3VuZHMud2lkdGg7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGhvbWUgYm91bmRzIGluIHZpZXdwb3J0IGNvb3JkaW5hdGVzLlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEByZXR1cm5zIHtPcGVuU2VhZHJhZ29uLlJlY3R9IFRoZSBob21lIGJvdW5kcyBpbiB2ZXdwb3J0IGNvb3JkaW5hdGVzLlxuICAgICAqL1xuICAgIGdldEhvbWVCb3VuZHM6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRIb21lQm91bmRzTm9Sb3RhdGUoKS5yb3RhdGUoLXRoaXMuZ2V0Um90YXRpb24oKSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGhvbWUgYm91bmRzIGluIHZpZXdwb3J0IGNvb3JkaW5hdGVzLlxuICAgICAqIFRoaXMgbWV0aG9kIGlnbm9yZXMgdGhlIHZpZXdwb3J0IHJvdGF0aW9uLiBVc2VcbiAgICAgKiB7QGxpbmsgT3BlblNlYWRyYWdvbi5WaWV3cG9ydCNnZXRIb21lQm91bmRzfSB0byB0YWtlIGl0IGludG8gYWNjb3VudC5cbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcmV0dXJucyB7T3BlblNlYWRyYWdvbi5SZWN0fSBUaGUgaG9tZSBib3VuZHMgaW4gdmV3cG9ydCBjb29yZGluYXRlcy5cbiAgICAgKi9cbiAgICBnZXRIb21lQm91bmRzTm9Sb3RhdGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgY2VudGVyID0gdGhpcy5fY29udGVudEJvdW5kcy5nZXRDZW50ZXIoKTtcbiAgICAgICAgdmFyIHdpZHRoICA9IDEuMCAvIHRoaXMuZ2V0SG9tZVpvb20oKTtcbiAgICAgICAgdmFyIGhlaWdodCA9IHdpZHRoIC8gdGhpcy5nZXRBc3BlY3RSYXRpbygpO1xuXG4gICAgICAgIHJldHVybiBuZXcgJC5SZWN0KFxuICAgICAgICAgICAgY2VudGVyLnggLSAod2lkdGggLyAyLjApLFxuICAgICAgICAgICAgY2VudGVyLnkgLSAoaGVpZ2h0IC8gMi4wKSxcbiAgICAgICAgICAgIHdpZHRoLFxuICAgICAgICAgICAgaGVpZ2h0XG4gICAgICAgICk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gaW1tZWRpYXRlbHlcbiAgICAgKiBAZmlyZXMgT3BlblNlYWRyYWdvbi5WaWV3ZXIuZXZlbnQ6aG9tZVxuICAgICAqL1xuICAgIGdvSG9tZTogZnVuY3Rpb24oaW1tZWRpYXRlbHkpIHtcbiAgICAgICAgaWYgKHRoaXMudmlld2VyKSB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIFJhaXNlZCB3aGVuIHRoZSBcImhvbWVcIiBvcGVyYXRpb24gb2NjdXJzIChzZWUge0BsaW5rIE9wZW5TZWFkcmFnb24uVmlld3BvcnQjZ29Ib21lfSkuXG4gICAgICAgICAgICAgKlxuICAgICAgICAgICAgICogQGV2ZW50IGhvbWVcbiAgICAgICAgICAgICAqIEBtZW1iZXJvZiBPcGVuU2VhZHJhZ29uLlZpZXdlclxuICAgICAgICAgICAgICogQHR5cGUge29iamVjdH1cbiAgICAgICAgICAgICAqIEBwcm9wZXJ0eSB7T3BlblNlYWRyYWdvbi5WaWV3ZXJ9IGV2ZW50U291cmNlIC0gQSByZWZlcmVuY2UgdG8gdGhlIFZpZXdlciB3aGljaCByYWlzZWQgdGhpcyBldmVudC5cbiAgICAgICAgICAgICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gaW1tZWRpYXRlbHlcbiAgICAgICAgICAgICAqIEBwcm9wZXJ0eSB7P09iamVjdH0gdXNlckRhdGEgLSBBcmJpdHJhcnkgc3Vic2NyaWJlci1kZWZpbmVkIG9iamVjdC5cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgdGhpcy52aWV3ZXIucmFpc2VFdmVudCgnaG9tZScsIHtcbiAgICAgICAgICAgICAgICBpbW1lZGlhdGVseTogaW1tZWRpYXRlbHlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmZpdEJvdW5kcyh0aGlzLmdldEhvbWVCb3VuZHMoKSwgaW1tZWRpYXRlbHkpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKi9cbiAgICBnZXRNaW5ab29tOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGhvbWVab29tID0gdGhpcy5nZXRIb21lWm9vbSgpLFxuICAgICAgICAgICAgem9vbSA9IHRoaXMubWluWm9vbUxldmVsID9cbiAgICAgICAgICAgIHRoaXMubWluWm9vbUxldmVsIDpcbiAgICAgICAgICAgICAgICB0aGlzLm1pblpvb21JbWFnZVJhdGlvICogaG9tZVpvb207XG5cbiAgICAgICAgcmV0dXJuIHpvb207XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqL1xuICAgIGdldE1heFpvb206IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgem9vbSA9IHRoaXMubWF4Wm9vbUxldmVsO1xuICAgICAgICBpZiAoIXpvb20pIHtcbiAgICAgICAgICAgIHpvb20gPSB0aGlzLl9jb250ZW50U2l6ZS54ICogdGhpcy5tYXhab29tUGl4ZWxSYXRpbyAvIHRoaXMuX2NvbnRhaW5lcklubmVyU2l6ZS54O1xuICAgICAgICAgICAgem9vbSAvPSB0aGlzLl9jb250ZW50Qm91bmRzLndpZHRoO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIE1hdGgubWF4KCB6b29tLCB0aGlzLmdldEhvbWVab29tKCkgKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICovXG4gICAgZ2V0QXNwZWN0UmF0aW86IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29udGFpbmVySW5uZXJTaXplLnggLyB0aGlzLl9jb250YWluZXJJbm5lclNpemUueTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHJldHVybnMge09wZW5TZWFkcmFnb24uUG9pbnR9IFRoZSBzaXplIG9mIHRoZSBjb250YWluZXIsIGluIHNjcmVlbiBjb29yZGluYXRlcy5cbiAgICAgKi9cbiAgICBnZXRDb250YWluZXJTaXplOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIG5ldyAkLlBvaW50KFxuICAgICAgICAgICAgdGhpcy5jb250YWluZXJTaXplLngsXG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lclNpemUueVxuICAgICAgICApO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBUaGUgbWFyZ2lucyBwdXNoIHRoZSBcImhvbWVcIiByZWdpb24gaW4gZnJvbSB0aGUgc2lkZXMgYnkgdGhlIHNwZWNpZmllZCBhbW91bnRzLlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFByb3BlcnRpZXMgKE51bWJlcnMsIGluIHNjcmVlbiBjb29yZGluYXRlcyk6IGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbS5cbiAgICAgKi9cbiAgICBnZXRNYXJnaW5zOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuICQuZXh0ZW5kKHt9LCB0aGlzLl9tYXJnaW5zKTsgLy8gTWFrZSBhIGNvcHkgc28gd2UgYXJlIG5vdCByZXR1cm5pbmcgb3VyIG9yaWdpbmFsXG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFRoZSBtYXJnaW5zIHB1c2ggdGhlIFwiaG9tZVwiIHJlZ2lvbiBpbiBmcm9tIHRoZSBzaWRlcyBieSB0aGUgc3BlY2lmaWVkIGFtb3VudHMuXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG1hcmdpbnMgLSBQcm9wZXJ0aWVzIChOdW1iZXJzLCBpbiBzY3JlZW4gY29vcmRpbmF0ZXMpOiBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20uXG4gICAgICovXG4gICAgc2V0TWFyZ2luczogZnVuY3Rpb24obWFyZ2lucykge1xuICAgICAgICAkLmNvbnNvbGUuYXNzZXJ0KCQudHlwZShtYXJnaW5zKSA9PT0gJ29iamVjdCcsICdbVmlld3BvcnQuc2V0TWFyZ2luc10gbWFyZ2lucyBtdXN0IGJlIGFuIG9iamVjdCcpO1xuXG4gICAgICAgIHRoaXMuX21hcmdpbnMgPSAkLmV4dGVuZCh7XG4gICAgICAgICAgICBsZWZ0OiAwLFxuICAgICAgICAgICAgdG9wOiAwLFxuICAgICAgICAgICAgcmlnaHQ6IDAsXG4gICAgICAgICAgICBib3R0b206IDBcbiAgICAgICAgfSwgbWFyZ2lucyk7XG5cbiAgICAgICAgdGhpcy5fdXBkYXRlQ29udGFpbmVySW5uZXJTaXplKCk7XG4gICAgICAgIGlmICh0aGlzLnZpZXdlcikge1xuICAgICAgICAgICAgdGhpcy52aWV3ZXIuZm9yY2VSZWRyYXcoKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBib3VuZHMgb2YgdGhlIHZpc2libGUgYXJlYSBpbiB2aWV3cG9ydCBjb29yZGluYXRlcy5cbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGN1cnJlbnQgLSBQYXNzIHRydWUgZm9yIHRoZSBjdXJyZW50IGxvY2F0aW9uOyBkZWZhdWx0cyB0byBmYWxzZSAodGFyZ2V0IGxvY2F0aW9uKS5cbiAgICAgKiBAcmV0dXJucyB7T3BlblNlYWRyYWdvbi5SZWN0fSBUaGUgbG9jYXRpb24geW91IGFyZSB6b29tZWQvcGFubmVkIHRvLCBpbiB2aWV3cG9ydCBjb29yZGluYXRlcy5cbiAgICAgKi9cbiAgICBnZXRCb3VuZHM6IGZ1bmN0aW9uKGN1cnJlbnQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Qm91bmRzTm9Sb3RhdGUoY3VycmVudCkucm90YXRlKC10aGlzLmdldFJvdGF0aW9uKCkpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBib3VuZHMgb2YgdGhlIHZpc2libGUgYXJlYSBpbiB2aWV3cG9ydCBjb29yZGluYXRlcy5cbiAgICAgKiBUaGlzIG1ldGhvZCBpZ25vcmVzIHRoZSB2aWV3cG9ydCByb3RhdGlvbi4gVXNlXG4gICAgICoge0BsaW5rIE9wZW5TZWFkcmFnb24uVmlld3BvcnQjZ2V0Qm91bmRzfSB0byB0YWtlIGl0IGludG8gYWNjb3VudC5cbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGN1cnJlbnQgLSBQYXNzIHRydWUgZm9yIHRoZSBjdXJyZW50IGxvY2F0aW9uOyBkZWZhdWx0cyB0byBmYWxzZSAodGFyZ2V0IGxvY2F0aW9uKS5cbiAgICAgKiBAcmV0dXJucyB7T3BlblNlYWRyYWdvbi5SZWN0fSBUaGUgbG9jYXRpb24geW91IGFyZSB6b29tZWQvcGFubmVkIHRvLCBpbiB2aWV3cG9ydCBjb29yZGluYXRlcy5cbiAgICAgKi9cbiAgICBnZXRCb3VuZHNOb1JvdGF0ZTogZnVuY3Rpb24oY3VycmVudCkge1xuICAgICAgICB2YXIgY2VudGVyID0gdGhpcy5nZXRDZW50ZXIoY3VycmVudCk7XG4gICAgICAgIHZhciB3aWR0aCAgPSAxLjAgLyB0aGlzLmdldFpvb20oY3VycmVudCk7XG4gICAgICAgIHZhciBoZWlnaHQgPSB3aWR0aCAvIHRoaXMuZ2V0QXNwZWN0UmF0aW8oKTtcblxuICAgICAgICByZXR1cm4gbmV3ICQuUmVjdChcbiAgICAgICAgICAgIGNlbnRlci54IC0gKHdpZHRoIC8gMi4wKSxcbiAgICAgICAgICAgIGNlbnRlci55IC0gKGhlaWdodCAvIDIuMCksXG4gICAgICAgICAgICB3aWR0aCxcbiAgICAgICAgICAgIGhlaWdodFxuICAgICAgICApO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGN1cnJlbnQgLSBQYXNzIHRydWUgZm9yIHRoZSBjdXJyZW50IGxvY2F0aW9uOyBkZWZhdWx0cyB0byBmYWxzZSAodGFyZ2V0IGxvY2F0aW9uKS5cbiAgICAgKiBAcmV0dXJucyB7T3BlblNlYWRyYWdvbi5SZWN0fSBUaGUgbG9jYXRpb24geW91IGFyZSB6b29tZWQvcGFubmVkIHRvLFxuICAgICAqIGluY2x1ZGluZyB0aGUgc3BhY2UgdGFrZW4gYnkgbWFyZ2lucywgaW4gdmlld3BvcnQgY29vcmRpbmF0ZXMuXG4gICAgICovXG4gICAgZ2V0Qm91bmRzV2l0aE1hcmdpbnM6IGZ1bmN0aW9uKGN1cnJlbnQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Qm91bmRzTm9Sb3RhdGVXaXRoTWFyZ2lucyhjdXJyZW50KS5yb3RhdGUoXG4gICAgICAgICAgICAtdGhpcy5nZXRSb3RhdGlvbigpLCB0aGlzLmdldENlbnRlcihjdXJyZW50KSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gY3VycmVudCAtIFBhc3MgdHJ1ZSBmb3IgdGhlIGN1cnJlbnQgbG9jYXRpb247IGRlZmF1bHRzIHRvIGZhbHNlICh0YXJnZXQgbG9jYXRpb24pLlxuICAgICAqIEByZXR1cm5zIHtPcGVuU2VhZHJhZ29uLlJlY3R9IFRoZSBsb2NhdGlvbiB5b3UgYXJlIHpvb21lZC9wYW5uZWQgdG8sXG4gICAgICogaW5jbHVkaW5nIHRoZSBzcGFjZSB0YWtlbiBieSBtYXJnaW5zLCBpbiB2aWV3cG9ydCBjb29yZGluYXRlcy5cbiAgICAgKi9cbiAgICBnZXRCb3VuZHNOb1JvdGF0ZVdpdGhNYXJnaW5zOiBmdW5jdGlvbihjdXJyZW50KSB7XG4gICAgICAgIHZhciBib3VuZHMgPSB0aGlzLmdldEJvdW5kc05vUm90YXRlKGN1cnJlbnQpO1xuICAgICAgICB2YXIgZmFjdG9yID0gdGhpcy5fY29udGFpbmVySW5uZXJTaXplLnggKiB0aGlzLmdldFpvb20oY3VycmVudCk7XG4gICAgICAgIGJvdW5kcy54IC09IHRoaXMuX21hcmdpbnMubGVmdCAvIGZhY3RvcjtcbiAgICAgICAgYm91bmRzLnkgLT0gdGhpcy5fbWFyZ2lucy50b3AgLyBmYWN0b3I7XG4gICAgICAgIGJvdW5kcy53aWR0aCArPSAodGhpcy5fbWFyZ2lucy5sZWZ0ICsgdGhpcy5fbWFyZ2lucy5yaWdodCkgLyBmYWN0b3I7XG4gICAgICAgIGJvdW5kcy5oZWlnaHQgKz0gKHRoaXMuX21hcmdpbnMudG9wICsgdGhpcy5fbWFyZ2lucy5ib3R0b20pIC8gZmFjdG9yO1xuICAgICAgICByZXR1cm4gYm91bmRzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGN1cnJlbnQgLSBQYXNzIHRydWUgZm9yIHRoZSBjdXJyZW50IGxvY2F0aW9uOyBkZWZhdWx0cyB0byBmYWxzZSAodGFyZ2V0IGxvY2F0aW9uKS5cbiAgICAgKi9cbiAgICBnZXRDZW50ZXI6IGZ1bmN0aW9uKCBjdXJyZW50ICkge1xuICAgICAgICB2YXIgY2VudGVyQ3VycmVudCA9IG5ldyAkLlBvaW50KFxuICAgICAgICAgICAgICAgIHRoaXMuY2VudGVyU3ByaW5nWC5jdXJyZW50LnZhbHVlLFxuICAgICAgICAgICAgICAgIHRoaXMuY2VudGVyU3ByaW5nWS5jdXJyZW50LnZhbHVlXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgY2VudGVyVGFyZ2V0ID0gbmV3ICQuUG9pbnQoXG4gICAgICAgICAgICAgICAgdGhpcy5jZW50ZXJTcHJpbmdYLnRhcmdldC52YWx1ZSxcbiAgICAgICAgICAgICAgICB0aGlzLmNlbnRlclNwcmluZ1kudGFyZ2V0LnZhbHVlXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgb2xkWm9vbVBpeGVsLFxuICAgICAgICAgICAgem9vbSxcbiAgICAgICAgICAgIHdpZHRoLFxuICAgICAgICAgICAgaGVpZ2h0LFxuICAgICAgICAgICAgYm91bmRzLFxuICAgICAgICAgICAgbmV3Wm9vbVBpeGVsLFxuICAgICAgICAgICAgZGVsdGFab29tUGl4ZWxzLFxuICAgICAgICAgICAgZGVsdGFab29tUG9pbnRzO1xuXG4gICAgICAgIGlmICggY3VycmVudCApIHtcbiAgICAgICAgICAgIHJldHVybiBjZW50ZXJDdXJyZW50O1xuICAgICAgICB9IGVsc2UgaWYgKCAhdGhpcy56b29tUG9pbnQgKSB7XG4gICAgICAgICAgICByZXR1cm4gY2VudGVyVGFyZ2V0O1xuICAgICAgICB9XG5cbiAgICAgICAgb2xkWm9vbVBpeGVsID0gdGhpcy5waXhlbEZyb21Qb2ludCh0aGlzLnpvb21Qb2ludCwgdHJ1ZSk7XG5cbiAgICAgICAgem9vbSAgICA9IHRoaXMuZ2V0Wm9vbSgpO1xuICAgICAgICB3aWR0aCAgID0gMS4wIC8gem9vbTtcbiAgICAgICAgaGVpZ2h0ICA9IHdpZHRoIC8gdGhpcy5nZXRBc3BlY3RSYXRpbygpO1xuICAgICAgICBib3VuZHMgID0gbmV3ICQuUmVjdChcbiAgICAgICAgICAgIGNlbnRlckN1cnJlbnQueCAtIHdpZHRoIC8gMi4wLFxuICAgICAgICAgICAgY2VudGVyQ3VycmVudC55IC0gaGVpZ2h0IC8gMi4wLFxuICAgICAgICAgICAgd2lkdGgsXG4gICAgICAgICAgICBoZWlnaHRcbiAgICAgICAgKTtcblxuICAgICAgICBuZXdab29tUGl4ZWwgPSB0aGlzLl9waXhlbEZyb21Qb2ludCh0aGlzLnpvb21Qb2ludCwgYm91bmRzKTtcbiAgICAgICAgZGVsdGFab29tUGl4ZWxzID0gbmV3Wm9vbVBpeGVsLm1pbnVzKCBvbGRab29tUGl4ZWwgKTtcbiAgICAgICAgZGVsdGFab29tUG9pbnRzID0gZGVsdGFab29tUGl4ZWxzLmRpdmlkZSggdGhpcy5fY29udGFpbmVySW5uZXJTaXplLnggKiB6b29tICk7XG5cbiAgICAgICAgcmV0dXJuIGNlbnRlclRhcmdldC5wbHVzKCBkZWx0YVpvb21Qb2ludHMgKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBjdXJyZW50IC0gUGFzcyB0cnVlIGZvciB0aGUgY3VycmVudCBsb2NhdGlvbjsgZGVmYXVsdHMgdG8gZmFsc2UgKHRhcmdldCBsb2NhdGlvbikuXG4gICAgICovXG4gICAgZ2V0Wm9vbTogZnVuY3Rpb24oIGN1cnJlbnQgKSB7XG4gICAgICAgIGlmICggY3VycmVudCApIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnpvb21TcHJpbmcuY3VycmVudC52YWx1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnpvb21TcHJpbmcudGFyZ2V0LnZhbHVlO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIHByaXZhdGVcbiAgICBfYXBwbHlab29tQ29uc3RyYWludHM6IGZ1bmN0aW9uKHpvb20pIHtcbiAgICAgICAgcmV0dXJuIE1hdGgubWF4KFxuICAgICAgICAgICAgTWF0aC5taW4oem9vbSwgdGhpcy5nZXRNYXhab29tKCkpLFxuICAgICAgICAgICAgdGhpcy5nZXRNaW5ab29tKCkpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T3BlblNlYWRyYWdvbi5SZWN0fSBib3VuZHNcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGltbWVkaWF0ZWx5XG4gICAgICogQHJldHVybiB7T3BlblNlYWRyYWdvbi5SZWN0fSBjb25zdHJhaW5lZCBib3VuZHMuXG4gICAgICovXG4gICAgX2FwcGx5Qm91bmRhcnlDb25zdHJhaW50czogZnVuY3Rpb24oYm91bmRzLCBpbW1lZGlhdGVseSkge1xuICAgICAgICB2YXIgbmV3Qm91bmRzID0gbmV3ICQuUmVjdChcbiAgICAgICAgICAgICAgICBib3VuZHMueCxcbiAgICAgICAgICAgICAgICBib3VuZHMueSxcbiAgICAgICAgICAgICAgICBib3VuZHMud2lkdGgsXG4gICAgICAgICAgICAgICAgYm91bmRzLmhlaWdodCk7XG5cbiAgICAgICAgaWYgKHRoaXMud3JhcEhvcml6b250YWwpIHtcbiAgICAgICAgICAgIC8vZG8gbm90aGluZ1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIGhvcml6b250YWxUaHJlc2hvbGQgPSB0aGlzLnZpc2liaWxpdHlSYXRpbyAqIG5ld0JvdW5kcy53aWR0aDtcbiAgICAgICAgICAgIHZhciBib3VuZHNSaWdodCA9IG5ld0JvdW5kcy54ICsgbmV3Qm91bmRzLndpZHRoO1xuICAgICAgICAgICAgdmFyIGNvbnRlbnRSaWdodCA9IHRoaXMuX2NvbnRlbnRCb3VuZHNOb1JvdGF0ZS54ICsgdGhpcy5fY29udGVudEJvdW5kc05vUm90YXRlLndpZHRoO1xuICAgICAgICAgICAgdmFyIGxlZnREeCA9IHRoaXMuX2NvbnRlbnRCb3VuZHNOb1JvdGF0ZS54IC0gYm91bmRzUmlnaHQgKyBob3Jpem9udGFsVGhyZXNob2xkO1xuICAgICAgICAgICAgdmFyIHJpZ2h0RHggPSBjb250ZW50UmlnaHQgLSBuZXdCb3VuZHMueCAtIGhvcml6b250YWxUaHJlc2hvbGQ7XG5cbiAgICAgICAgICAgIGlmIChob3Jpem9udGFsVGhyZXNob2xkID4gdGhpcy5fY29udGVudEJvdW5kc05vUm90YXRlLndpZHRoKSB7XG4gICAgICAgICAgICAgICAgbmV3Qm91bmRzLnggKz0gKGxlZnREeCArIHJpZ2h0RHgpIC8gMjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocmlnaHREeCA8IDApIHtcbiAgICAgICAgICAgICAgICBuZXdCb3VuZHMueCArPSByaWdodER4O1xuICAgICAgICAgICAgfSBlbHNlIGlmIChsZWZ0RHggPiAwKSB7XG4gICAgICAgICAgICAgICAgbmV3Qm91bmRzLnggKz0gbGVmdER4O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMud3JhcFZlcnRpY2FsKSB7XG4gICAgICAgICAgICAvL2RvIG5vdGhpbmdcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciB2ZXJ0aWNhbFRocmVzaG9sZCAgID0gdGhpcy52aXNpYmlsaXR5UmF0aW8gKiBuZXdCb3VuZHMuaGVpZ2h0O1xuICAgICAgICAgICAgdmFyIGJvdW5kc0JvdHRvbSA9IG5ld0JvdW5kcy55ICsgbmV3Qm91bmRzLmhlaWdodDtcbiAgICAgICAgICAgIHZhciBjb250ZW50Qm90dG9tID0gdGhpcy5fY29udGVudEJvdW5kc05vUm90YXRlLnkgKyB0aGlzLl9jb250ZW50Qm91bmRzTm9Sb3RhdGUuaGVpZ2h0O1xuICAgICAgICAgICAgdmFyIHRvcER5ID0gdGhpcy5fY29udGVudEJvdW5kc05vUm90YXRlLnkgLSBib3VuZHNCb3R0b20gKyB2ZXJ0aWNhbFRocmVzaG9sZDtcbiAgICAgICAgICAgIHZhciBib3R0b21EeSA9IGNvbnRlbnRCb3R0b20gLSBuZXdCb3VuZHMueSAtIHZlcnRpY2FsVGhyZXNob2xkO1xuXG4gICAgICAgICAgICBpZiAodmVydGljYWxUaHJlc2hvbGQgPiB0aGlzLl9jb250ZW50Qm91bmRzTm9Sb3RhdGUuaGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgbmV3Qm91bmRzLnkgKz0gKHRvcER5ICsgYm90dG9tRHkpIC8gMjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYm90dG9tRHkgPCAwKSB7XG4gICAgICAgICAgICAgICAgbmV3Qm91bmRzLnkgKz0gYm90dG9tRHk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRvcER5ID4gMCkge1xuICAgICAgICAgICAgICAgIG5ld0JvdW5kcy55ICs9IHRvcER5O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMudmlld2VyKSB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIFJhaXNlZCB3aGVuIHRoZSB2aWV3cG9ydCBjb25zdHJhaW50cyBhcmUgYXBwbGllZCAoc2VlIHtAbGluayBPcGVuU2VhZHJhZ29uLlZpZXdwb3J0I2FwcGx5Q29uc3RyYWludHN9KS5cbiAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgKiBAZXZlbnQgY29uc3RyYWluXG4gICAgICAgICAgICAgKiBAbWVtYmVyb2YgT3BlblNlYWRyYWdvbi5WaWV3ZXJcbiAgICAgICAgICAgICAqIEB0eXBlIHtvYmplY3R9XG4gICAgICAgICAgICAgKiBAcHJvcGVydHkge09wZW5TZWFkcmFnb24uVmlld2VyfSBldmVudFNvdXJjZSAtIEEgcmVmZXJlbmNlIHRvIHRoZSBWaWV3ZXIgd2hpY2ggcmFpc2VkIHRoaXMgZXZlbnQuXG4gICAgICAgICAgICAgKiBAcHJvcGVydHkge0Jvb2xlYW59IGltbWVkaWF0ZWx5XG4gICAgICAgICAgICAgKiBAcHJvcGVydHkgez9PYmplY3R9IHVzZXJEYXRhIC0gQXJiaXRyYXJ5IHN1YnNjcmliZXItZGVmaW5lZCBvYmplY3QuXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIHRoaXMudmlld2VyLnJhaXNlRXZlbnQoICdjb25zdHJhaW4nLCB7XG4gICAgICAgICAgICAgICAgaW1tZWRpYXRlbHk6IGltbWVkaWF0ZWx5XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXdCb3VuZHM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEVuZm9yY2VzIHRoZSBtaW5ab29tLCBtYXhab29tIGFuZCB2aXNpYmlsaXR5UmF0aW8gY29uc3RyYWludHMgYnlcbiAgICAgKiB6b29taW5nIGFuZCBwYW5uaW5nIHRvIHRoZSBjbG9zZXN0IGFjY2VwdGFibGUgem9vbSBhbmQgbG9jYXRpb24uXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBbaW1tZWRpYXRlbHk9ZmFsc2VdXG4gICAgICogQHJldHVybiB7T3BlblNlYWRyYWdvbi5WaWV3cG9ydH0gQ2hhaW5hYmxlLlxuICAgICAqIEBmaXJlcyBPcGVuU2VhZHJhZ29uLlZpZXdlci5ldmVudDpjb25zdHJhaW5cbiAgICAgKi9cbiAgICBhcHBseUNvbnN0cmFpbnRzOiBmdW5jdGlvbihpbW1lZGlhdGVseSkge1xuICAgICAgICB2YXIgYWN0dWFsWm9vbSA9IHRoaXMuZ2V0Wm9vbSgpO1xuICAgICAgICB2YXIgY29uc3RyYWluZWRab29tID0gdGhpcy5fYXBwbHlab29tQ29uc3RyYWludHMoYWN0dWFsWm9vbSk7XG5cbiAgICAgICAgaWYgKGFjdHVhbFpvb20gIT09IGNvbnN0cmFpbmVkWm9vbSkge1xuICAgICAgICAgICAgdGhpcy56b29tVG8oY29uc3RyYWluZWRab29tLCB0aGlzLnpvb21Qb2ludCwgaW1tZWRpYXRlbHkpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGJvdW5kcyA9IHRoaXMuZ2V0Qm91bmRzTm9Sb3RhdGUoKTtcbiAgICAgICAgdmFyIGNvbnN0cmFpbmVkQm91bmRzID0gdGhpcy5fYXBwbHlCb3VuZGFyeUNvbnN0cmFpbnRzKFxuICAgICAgICAgICAgYm91bmRzLCBpbW1lZGlhdGVseSk7XG5cbiAgICAgICAgaWYgKGJvdW5kcy54ICE9PSBjb25zdHJhaW5lZEJvdW5kcy54IHx8XG4gICAgICAgICAgICBib3VuZHMueSAhPT0gY29uc3RyYWluZWRCb3VuZHMueSB8fFxuICAgICAgICAgICAgaW1tZWRpYXRlbHkpIHtcbiAgICAgICAgICAgIHRoaXMuZml0Qm91bmRzKFxuICAgICAgICAgICAgICAgIGNvbnN0cmFpbmVkQm91bmRzLnJvdGF0ZSgtdGhpcy5nZXRSb3RhdGlvbigpKSxcbiAgICAgICAgICAgICAgICBpbW1lZGlhdGVseSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEVxdWl2YWxlbnQgdG8ge0BsaW5rIE9wZW5TZWFkcmFnb24uVmlld3BvcnQjYXBwbHlDb25zdHJhaW50c31cbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtpbW1lZGlhdGVseT1mYWxzZV1cbiAgICAgKiBAcmV0dXJuIHtPcGVuU2VhZHJhZ29uLlZpZXdwb3J0fSBDaGFpbmFibGUuXG4gICAgICogQGZpcmVzIE9wZW5TZWFkcmFnb24uVmlld2VyLmV2ZW50OmNvbnN0cmFpblxuICAgICAqL1xuICAgIGVuc3VyZVZpc2libGU6IGZ1bmN0aW9uKGltbWVkaWF0ZWx5KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFwcGx5Q29uc3RyYWludHMoaW1tZWRpYXRlbHkpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T3BlblNlYWRyYWdvbi5SZWN0fSBib3VuZHNcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAoaW1tZWRpYXRlbHk9ZmFsc2UsIGNvbnN0cmFpbnRzPWZhbHNlKVxuICAgICAqIEByZXR1cm4ge09wZW5TZWFkcmFnb24uVmlld3BvcnR9IENoYWluYWJsZS5cbiAgICAgKi9cbiAgICBfZml0Qm91bmRzOiBmdW5jdGlvbihib3VuZHMsIG9wdGlvbnMpIHtcbiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgICAgIHZhciBpbW1lZGlhdGVseSA9IG9wdGlvbnMuaW1tZWRpYXRlbHkgfHwgZmFsc2U7XG4gICAgICAgIHZhciBjb25zdHJhaW50cyA9IG9wdGlvbnMuY29uc3RyYWludHMgfHwgZmFsc2U7XG5cbiAgICAgICAgdmFyIGFzcGVjdCA9IHRoaXMuZ2V0QXNwZWN0UmF0aW8oKTtcbiAgICAgICAgdmFyIGNlbnRlciA9IGJvdW5kcy5nZXRDZW50ZXIoKTtcblxuICAgICAgICAvLyBDb21wdXRlIHdpZHRoIGFuZCBoZWlnaHQgb2YgYm91bmRpbmcgYm94LlxuICAgICAgICB2YXIgbmV3Qm91bmRzID0gbmV3ICQuUmVjdChcbiAgICAgICAgICAgIGJvdW5kcy54LFxuICAgICAgICAgICAgYm91bmRzLnksXG4gICAgICAgICAgICBib3VuZHMud2lkdGgsXG4gICAgICAgICAgICBib3VuZHMuaGVpZ2h0LFxuICAgICAgICAgICAgYm91bmRzLmRlZ3JlZXMgKyB0aGlzLmdldFJvdGF0aW9uKCkpXG4gICAgICAgICAgICAuZ2V0Qm91bmRpbmdCb3goKTtcblxuICAgICAgICBpZiAobmV3Qm91bmRzLmdldEFzcGVjdFJhdGlvKCkgPj0gYXNwZWN0KSB7XG4gICAgICAgICAgICBuZXdCb3VuZHMuaGVpZ2h0ID0gbmV3Qm91bmRzLndpZHRoIC8gYXNwZWN0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmV3Qm91bmRzLndpZHRoID0gbmV3Qm91bmRzLmhlaWdodCAqIGFzcGVjdDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbXB1dGUgeCBhbmQgeSBmcm9tIHdpZHRoLCBoZWlnaHQgYW5kIGNlbnRlciBwb3NpdGlvblxuICAgICAgICBuZXdCb3VuZHMueCA9IGNlbnRlci54IC0gbmV3Qm91bmRzLndpZHRoIC8gMjtcbiAgICAgICAgbmV3Qm91bmRzLnkgPSBjZW50ZXIueSAtIG5ld0JvdW5kcy5oZWlnaHQgLyAyO1xuICAgICAgICB2YXIgbmV3Wm9vbSA9IDEuMCAvIG5ld0JvdW5kcy53aWR0aDtcblxuICAgICAgICBpZiAoY29uc3RyYWludHMpIHtcbiAgICAgICAgICAgIHZhciBuZXdCb3VuZHNBc3BlY3RSYXRpbyA9IG5ld0JvdW5kcy5nZXRBc3BlY3RSYXRpbygpO1xuICAgICAgICAgICAgdmFyIG5ld0NvbnN0cmFpbmVkWm9vbSA9IHRoaXMuX2FwcGx5Wm9vbUNvbnN0cmFpbnRzKG5ld1pvb20pO1xuXG4gICAgICAgICAgICBpZiAobmV3Wm9vbSAhPT0gbmV3Q29uc3RyYWluZWRab29tKSB7XG4gICAgICAgICAgICAgICAgbmV3Wm9vbSA9IG5ld0NvbnN0cmFpbmVkWm9vbTtcbiAgICAgICAgICAgICAgICBuZXdCb3VuZHMud2lkdGggPSAxLjAgLyBuZXdab29tO1xuICAgICAgICAgICAgICAgIG5ld0JvdW5kcy54ID0gY2VudGVyLnggLSBuZXdCb3VuZHMud2lkdGggLyAyO1xuICAgICAgICAgICAgICAgIG5ld0JvdW5kcy5oZWlnaHQgPSBuZXdCb3VuZHMud2lkdGggLyBuZXdCb3VuZHNBc3BlY3RSYXRpbztcbiAgICAgICAgICAgICAgICBuZXdCb3VuZHMueSA9IGNlbnRlci55IC0gbmV3Qm91bmRzLmhlaWdodCAvIDI7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG5ld0JvdW5kcyA9IHRoaXMuX2FwcGx5Qm91bmRhcnlDb25zdHJhaW50cyhuZXdCb3VuZHMsIGltbWVkaWF0ZWx5KTtcbiAgICAgICAgICAgIGNlbnRlciA9IG5ld0JvdW5kcy5nZXRDZW50ZXIoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbW1lZGlhdGVseSkge1xuICAgICAgICAgICAgdGhpcy5wYW5UbyhjZW50ZXIsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuem9vbVRvKG5ld1pvb20sIG51bGwsIHRydWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5wYW5Ubyh0aGlzLmdldENlbnRlcih0cnVlKSwgdHJ1ZSk7XG4gICAgICAgIHRoaXMuem9vbVRvKHRoaXMuZ2V0Wm9vbSh0cnVlKSwgbnVsbCwgdHJ1ZSk7XG5cbiAgICAgICAgdmFyIG9sZEJvdW5kcyA9IHRoaXMuZ2V0Qm91bmRzKCk7XG4gICAgICAgIHZhciBvbGRab29tICAgPSB0aGlzLmdldFpvb20oKTtcblxuICAgICAgICBpZiAob2xkWm9vbSA9PT0gMCB8fCBNYXRoLmFicyhuZXdab29tIC8gb2xkWm9vbSAtIDEpIDwgMC4wMDAwMDAwMSkge1xuICAgICAgICAgICAgdGhpcy56b29tVG8obmV3Wm9vbSwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wYW5UbyhjZW50ZXIsIGltbWVkaWF0ZWx5KTtcbiAgICAgICAgfVxuXG4gICAgICAgIG5ld0JvdW5kcyA9IG5ld0JvdW5kcy5yb3RhdGUoLXRoaXMuZ2V0Um90YXRpb24oKSk7XG4gICAgICAgIHZhciByZWZlcmVuY2VQb2ludCA9IG5ld0JvdW5kcy5nZXRUb3BMZWZ0KCkudGltZXMobmV3Wm9vbSlcbiAgICAgICAgICAgIC5taW51cyhvbGRCb3VuZHMuZ2V0VG9wTGVmdCgpLnRpbWVzKG9sZFpvb20pKVxuICAgICAgICAgICAgLmRpdmlkZShuZXdab29tIC0gb2xkWm9vbSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuem9vbVRvKG5ld1pvb20sIHJlZmVyZW5jZVBvaW50LCBpbW1lZGlhdGVseSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIE1ha2VzIHRoZSB2aWV3cG9ydCB6b29tIGFuZCBwYW4gc28gdGhhdCB0aGUgc3BlY2lmaWVkIGJvdW5kcyB0YWtlXG4gICAgICogYXMgbXVjaCBzcGFjZSBhcyBwb3NzaWJsZSBpbiB0aGUgdmlld3BvcnQuXG4gICAgICogTm90ZTogdGhpcyBtZXRob2QgaWdub3JlcyB0aGUgY29uc3RyYWludHMgKG1pblpvb20sIG1heFpvb20gYW5kXG4gICAgICogdmlzaWJpbGl0eVJhdGlvKS5cbiAgICAgKiBVc2Uge0BsaW5rIE9wZW5TZWFkcmFnb24uVmlld3BvcnQjZml0Qm91bmRzV2l0aENvbnN0cmFpbnRzfSB0byBlbmZvcmNlXG4gICAgICogdGhlbS5cbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge09wZW5TZWFkcmFnb24uUmVjdH0gYm91bmRzXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBbaW1tZWRpYXRlbHk9ZmFsc2VdXG4gICAgICogQHJldHVybiB7T3BlblNlYWRyYWdvbi5WaWV3cG9ydH0gQ2hhaW5hYmxlLlxuICAgICAqL1xuICAgIGZpdEJvdW5kczogZnVuY3Rpb24oYm91bmRzLCBpbW1lZGlhdGVseSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZml0Qm91bmRzKGJvdW5kcywge1xuICAgICAgICAgICAgaW1tZWRpYXRlbHk6IGltbWVkaWF0ZWx5LFxuICAgICAgICAgICAgY29uc3RyYWludHM6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBNYWtlcyB0aGUgdmlld3BvcnQgem9vbSBhbmQgcGFuIHNvIHRoYXQgdGhlIHNwZWNpZmllZCBib3VuZHMgdGFrZVxuICAgICAqIGFzIG11Y2ggc3BhY2UgYXMgcG9zc2libGUgaW4gdGhlIHZpZXdwb3J0IHdoaWxlIGVuZm9yY2luZyB0aGUgY29uc3RyYWludHNcbiAgICAgKiAobWluWm9vbSwgbWF4Wm9vbSBhbmQgdmlzaWJpbGl0eVJhdGlvKS5cbiAgICAgKiBOb3RlOiBiZWNhdXNlIHRoaXMgbWV0aG9kIGVuZm9yY2VzIHRoZSBjb25zdHJhaW50cywgcGFydCBvZiB0aGVcbiAgICAgKiBwcm92aWRlZCBib3VuZHMgbWF5IGVuZCB1cCBvdXRzaWRlIG9mIHRoZSB2aWV3cG9ydC5cbiAgICAgKiBVc2Uge0BsaW5rIE9wZW5TZWFkcmFnb24uVmlld3BvcnQjZml0Qm91bmRzfSB0byBpZ25vcmUgdGhlbS5cbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge09wZW5TZWFkcmFnb24uUmVjdH0gYm91bmRzXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBbaW1tZWRpYXRlbHk9ZmFsc2VdXG4gICAgICogQHJldHVybiB7T3BlblNlYWRyYWdvbi5WaWV3cG9ydH0gQ2hhaW5hYmxlLlxuICAgICAqL1xuICAgIGZpdEJvdW5kc1dpdGhDb25zdHJhaW50czogZnVuY3Rpb24oYm91bmRzLCBpbW1lZGlhdGVseSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZml0Qm91bmRzKGJvdW5kcywge1xuICAgICAgICAgICAgaW1tZWRpYXRlbHk6IGltbWVkaWF0ZWx5LFxuICAgICAgICAgICAgY29uc3RyYWludHM6IHRydWVcbiAgICAgICAgfSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFpvb21zIHNvIHRoZSBpbWFnZSBqdXN0IGZpbGxzIHRoZSB2aWV3ZXIgdmVydGljYWxseS5cbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGltbWVkaWF0ZWx5XG4gICAgICogQHJldHVybiB7T3BlblNlYWRyYWdvbi5WaWV3cG9ydH0gQ2hhaW5hYmxlLlxuICAgICAqL1xuICAgIGZpdFZlcnRpY2FsbHk6IGZ1bmN0aW9uKGltbWVkaWF0ZWx5KSB7XG4gICAgICAgIHZhciBib3ggPSBuZXcgJC5SZWN0KFxuICAgICAgICAgICAgdGhpcy5fY29udGVudEJvdW5kcy54ICsgKHRoaXMuX2NvbnRlbnRCb3VuZHMud2lkdGggLyAyKSxcbiAgICAgICAgICAgIHRoaXMuX2NvbnRlbnRCb3VuZHMueSxcbiAgICAgICAgICAgIDAsXG4gICAgICAgICAgICB0aGlzLl9jb250ZW50Qm91bmRzLmhlaWdodCk7XG4gICAgICAgIHJldHVybiB0aGlzLmZpdEJvdW5kcyhib3gsIGltbWVkaWF0ZWx5KTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogWm9vbXMgc28gdGhlIGltYWdlIGp1c3QgZmlsbHMgdGhlIHZpZXdlciBob3Jpem9udGFsbHkuXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBpbW1lZGlhdGVseVxuICAgICAqIEByZXR1cm4ge09wZW5TZWFkcmFnb24uVmlld3BvcnR9IENoYWluYWJsZS5cbiAgICAgKi9cbiAgICBmaXRIb3Jpem9udGFsbHk6IGZ1bmN0aW9uKGltbWVkaWF0ZWx5KSB7XG4gICAgICAgIHZhciBib3ggPSBuZXcgJC5SZWN0KFxuICAgICAgICAgICAgdGhpcy5fY29udGVudEJvdW5kcy54LFxuICAgICAgICAgICAgdGhpcy5fY29udGVudEJvdW5kcy55ICsgKHRoaXMuX2NvbnRlbnRCb3VuZHMuaGVpZ2h0IC8gMiksXG4gICAgICAgICAgICB0aGlzLl9jb250ZW50Qm91bmRzLndpZHRoLFxuICAgICAgICAgICAgMCk7XG4gICAgICAgIHJldHVybiB0aGlzLmZpdEJvdW5kcyhib3gsIGltbWVkaWF0ZWx5KTtcbiAgICB9LFxuXG5cbiAgICAvKipcbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge09wZW5TZWFkcmFnb24uUG9pbnR9IGRlbHRhXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBpbW1lZGlhdGVseVxuICAgICAqIEByZXR1cm4ge09wZW5TZWFkcmFnb24uVmlld3BvcnR9IENoYWluYWJsZS5cbiAgICAgKiBAZmlyZXMgT3BlblNlYWRyYWdvbi5WaWV3ZXIuZXZlbnQ6cGFuXG4gICAgICovXG4gICAgcGFuQnk6IGZ1bmN0aW9uKCBkZWx0YSwgaW1tZWRpYXRlbHkgKSB7XG4gICAgICAgIHZhciBjZW50ZXIgPSBuZXcgJC5Qb2ludChcbiAgICAgICAgICAgIHRoaXMuY2VudGVyU3ByaW5nWC50YXJnZXQudmFsdWUsXG4gICAgICAgICAgICB0aGlzLmNlbnRlclNwcmluZ1kudGFyZ2V0LnZhbHVlXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB0aGlzLnBhblRvKCBjZW50ZXIucGx1cyggZGVsdGEgKSwgaW1tZWRpYXRlbHkgKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtPcGVuU2VhZHJhZ29uLlBvaW50fSBjZW50ZXJcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGltbWVkaWF0ZWx5XG4gICAgICogQHJldHVybiB7T3BlblNlYWRyYWdvbi5WaWV3cG9ydH0gQ2hhaW5hYmxlLlxuICAgICAqIEBmaXJlcyBPcGVuU2VhZHJhZ29uLlZpZXdlci5ldmVudDpwYW5cbiAgICAgKi9cbiAgICBwYW5UbzogZnVuY3Rpb24oIGNlbnRlciwgaW1tZWRpYXRlbHkgKSB7XG4gICAgICAgIGlmICggaW1tZWRpYXRlbHkgKSB7XG4gICAgICAgICAgICB0aGlzLmNlbnRlclNwcmluZ1gucmVzZXRUbyggY2VudGVyLnggKTtcbiAgICAgICAgICAgIHRoaXMuY2VudGVyU3ByaW5nWS5yZXNldFRvKCBjZW50ZXIueSApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jZW50ZXJTcHJpbmdYLnNwcmluZ1RvKCBjZW50ZXIueCApO1xuICAgICAgICAgICAgdGhpcy5jZW50ZXJTcHJpbmdZLnNwcmluZ1RvKCBjZW50ZXIueSApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYoIHRoaXMudmlld2VyICl7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIFJhaXNlZCB3aGVuIHRoZSB2aWV3cG9ydCBpcyBwYW5uZWQgKHNlZSB7QGxpbmsgT3BlblNlYWRyYWdvbi5WaWV3cG9ydCNwYW5CeX0gYW5kIHtAbGluayBPcGVuU2VhZHJhZ29uLlZpZXdwb3J0I3BhblRvfSkuXG4gICAgICAgICAgICAgKlxuICAgICAgICAgICAgICogQGV2ZW50IHBhblxuICAgICAgICAgICAgICogQG1lbWJlcm9mIE9wZW5TZWFkcmFnb24uVmlld2VyXG4gICAgICAgICAgICAgKiBAdHlwZSB7b2JqZWN0fVxuICAgICAgICAgICAgICogQHByb3BlcnR5IHtPcGVuU2VhZHJhZ29uLlZpZXdlcn0gZXZlbnRTb3VyY2UgLSBBIHJlZmVyZW5jZSB0byB0aGUgVmlld2VyIHdoaWNoIHJhaXNlZCB0aGlzIGV2ZW50LlxuICAgICAgICAgICAgICogQHByb3BlcnR5IHtPcGVuU2VhZHJhZ29uLlBvaW50fSBjZW50ZXJcbiAgICAgICAgICAgICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gaW1tZWRpYXRlbHlcbiAgICAgICAgICAgICAqIEBwcm9wZXJ0eSB7P09iamVjdH0gdXNlckRhdGEgLSBBcmJpdHJhcnkgc3Vic2NyaWJlci1kZWZpbmVkIG9iamVjdC5cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgdGhpcy52aWV3ZXIucmFpc2VFdmVudCggJ3BhbicsIHtcbiAgICAgICAgICAgICAgICBjZW50ZXI6IGNlbnRlcixcbiAgICAgICAgICAgICAgICBpbW1lZGlhdGVseTogaW1tZWRpYXRlbHlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEByZXR1cm4ge09wZW5TZWFkcmFnb24uVmlld3BvcnR9IENoYWluYWJsZS5cbiAgICAgKiBAZmlyZXMgT3BlblNlYWRyYWdvbi5WaWV3ZXIuZXZlbnQ6em9vbVxuICAgICAqL1xuICAgIHpvb21CeTogZnVuY3Rpb24oZmFjdG9yLCByZWZQb2ludCwgaW1tZWRpYXRlbHkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuem9vbVRvKFxuICAgICAgICAgICAgdGhpcy56b29tU3ByaW5nLnRhcmdldC52YWx1ZSAqIGZhY3RvciwgcmVmUG9pbnQsIGltbWVkaWF0ZWx5KTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogWm9vbXMgdG8gdGhlIHNwZWNpZmllZCB6b29tIGxldmVsXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHpvb20gVGhlIHpvb20gbGV2ZWwgdG8gem9vbSB0by5cbiAgICAgKiBAcGFyYW0ge09wZW5TZWFkcmFnb24uUG9pbnR9IFtyZWZQb2ludF0gVGhlIHBvaW50IHdoaWNoIHdpbGwgc3RheSBhdFxuICAgICAqIHRoZSBzYW1lIHNjcmVlbiBsb2NhdGlvbi4gRGVmYXVsdHMgdG8gdGhlIHZpZXdwb3J0IGNlbnRlci5cbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtpbW1lZGlhdGVseT1mYWxzZV1cbiAgICAgKiBAcmV0dXJuIHtPcGVuU2VhZHJhZ29uLlZpZXdwb3J0fSBDaGFpbmFibGUuXG4gICAgICogQGZpcmVzIE9wZW5TZWFkcmFnb24uVmlld2VyLmV2ZW50Onpvb21cbiAgICAgKi9cbiAgICB6b29tVG86IGZ1bmN0aW9uKCB6b29tLCByZWZQb2ludCwgaW1tZWRpYXRlbHkgKSB7XG5cbiAgICAgICAgdGhpcy56b29tUG9pbnQgPSByZWZQb2ludCBpbnN0YW5jZW9mICQuUG9pbnQgJiZcbiAgICAgICAgICAgICFpc05hTihyZWZQb2ludC54KSAmJlxuICAgICAgICAgICAgIWlzTmFOKHJlZlBvaW50LnkpID9cbiAgICAgICAgICAgIHJlZlBvaW50IDpcbiAgICAgICAgICAgIG51bGw7XG5cbiAgICAgICAgaWYgKCBpbW1lZGlhdGVseSApIHtcbiAgICAgICAgICAgIHRoaXMuem9vbVNwcmluZy5yZXNldFRvKCB6b29tICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnpvb21TcHJpbmcuc3ByaW5nVG8oIHpvb20gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKCB0aGlzLnZpZXdlciApe1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBSYWlzZWQgd2hlbiB0aGUgdmlld3BvcnQgem9vbSBsZXZlbCBjaGFuZ2VzIChzZWUge0BsaW5rIE9wZW5TZWFkcmFnb24uVmlld3BvcnQjem9vbUJ5fSBhbmQge0BsaW5rIE9wZW5TZWFkcmFnb24uVmlld3BvcnQjem9vbVRvfSkuXG4gICAgICAgICAgICAgKlxuICAgICAgICAgICAgICogQGV2ZW50IHpvb21cbiAgICAgICAgICAgICAqIEBtZW1iZXJvZiBPcGVuU2VhZHJhZ29uLlZpZXdlclxuICAgICAgICAgICAgICogQHR5cGUge29iamVjdH1cbiAgICAgICAgICAgICAqIEBwcm9wZXJ0eSB7T3BlblNlYWRyYWdvbi5WaWV3ZXJ9IGV2ZW50U291cmNlIC0gQSByZWZlcmVuY2UgdG8gdGhlIFZpZXdlciB3aGljaCByYWlzZWQgdGhpcyBldmVudC5cbiAgICAgICAgICAgICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSB6b29tXG4gICAgICAgICAgICAgKiBAcHJvcGVydHkge09wZW5TZWFkcmFnb24uUG9pbnR9IHJlZlBvaW50XG4gICAgICAgICAgICAgKiBAcHJvcGVydHkge0Jvb2xlYW59IGltbWVkaWF0ZWx5XG4gICAgICAgICAgICAgKiBAcHJvcGVydHkgez9PYmplY3R9IHVzZXJEYXRhIC0gQXJiaXRyYXJ5IHN1YnNjcmliZXItZGVmaW5lZCBvYmplY3QuXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIHRoaXMudmlld2VyLnJhaXNlRXZlbnQoICd6b29tJywge1xuICAgICAgICAgICAgICAgIHpvb206IHpvb20sXG4gICAgICAgICAgICAgICAgcmVmUG9pbnQ6IHJlZlBvaW50LFxuICAgICAgICAgICAgICAgIGltbWVkaWF0ZWx5OiBpbW1lZGlhdGVseVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUm90YXRlcyB0aGlzIHZpZXdwb3J0IHRvIHRoZSBhbmdsZSBzcGVjaWZpZWQuXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHJldHVybiB7T3BlblNlYWRyYWdvbi5WaWV3cG9ydH0gQ2hhaW5hYmxlLlxuICAgICAqL1xuICAgIHNldFJvdGF0aW9uOiBmdW5jdGlvbihkZWdyZWVzKSB7XG4gICAgICAgIGlmICghdGhpcy52aWV3ZXIgfHwgIXRoaXMudmlld2VyLmRyYXdlci5jYW5Sb3RhdGUoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cblxuICAgICAgICBkZWdyZWVzID0gZGVncmVlcyAlIDM2MDtcbiAgICAgICAgaWYgKGRlZ3JlZXMgPCAwKSB7XG4gICAgICAgICAgICBkZWdyZWVzICs9IDM2MDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRlZ3JlZXMgPSBkZWdyZWVzO1xuICAgICAgICB0aGlzLl9zZXRDb250ZW50Qm91bmRzKFxuICAgICAgICAgICAgdGhpcy52aWV3ZXIud29ybGQuZ2V0SG9tZUJvdW5kcygpLFxuICAgICAgICAgICAgdGhpcy52aWV3ZXIud29ybGQuZ2V0Q29udGVudEZhY3RvcigpKTtcbiAgICAgICAgdGhpcy52aWV3ZXIuZm9yY2VSZWRyYXcoKTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogUmFpc2VkIHdoZW4gcm90YXRpb24gaGFzIGJlZW4gY2hhbmdlZC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV2ZW50IHJvdGF0ZVxuICAgICAgICAgKiBAbWVtYmVyb2YgT3BlblNlYWRyYWdvbi5WaWV3ZXJcbiAgICAgICAgICogQHR5cGUge29iamVjdH1cbiAgICAgICAgICogQHByb3BlcnR5IHtPcGVuU2VhZHJhZ29uLlZpZXdlcn0gZXZlbnRTb3VyY2UgLSBBIHJlZmVyZW5jZSB0byB0aGUgVmlld2VyIHdoaWNoIHJhaXNlZCB0aGUgZXZlbnQuXG4gICAgICAgICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBkZWdyZWVzIC0gVGhlIG51bWJlciBvZiBkZWdyZWVzIHRoZSByb3RhdGlvbiB3YXMgc2V0IHRvLlxuICAgICAgICAgKiBAcHJvcGVydHkgez9PYmplY3R9IHVzZXJEYXRhIC0gQXJiaXRyYXJ5IHN1YnNjcmliZXItZGVmaW5lZCBvYmplY3QuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnZpZXdlci5yYWlzZUV2ZW50KCdyb3RhdGUnLCB7XCJkZWdyZWVzXCI6IGRlZ3JlZXN9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGN1cnJlbnQgcm90YXRpb24gaW4gZGVncmVlcy5cbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9IFRoZSBjdXJyZW50IHJvdGF0aW9uIGluIGRlZ3JlZXMuXG4gICAgICovXG4gICAgZ2V0Um90YXRpb246IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kZWdyZWVzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcmV0dXJuIHtPcGVuU2VhZHJhZ29uLlZpZXdwb3J0fSBDaGFpbmFibGUuXG4gICAgICogQGZpcmVzIE9wZW5TZWFkcmFnb24uVmlld2VyLmV2ZW50OnJlc2l6ZVxuICAgICAqL1xuICAgIHJlc2l6ZTogZnVuY3Rpb24oIG5ld0NvbnRhaW5lclNpemUsIG1haW50YWluICkge1xuICAgICAgICB2YXIgb2xkQm91bmRzID0gdGhpcy5nZXRCb3VuZHNOb1JvdGF0ZSgpLFxuICAgICAgICAgICAgbmV3Qm91bmRzID0gb2xkQm91bmRzLFxuICAgICAgICAgICAgd2lkdGhEZWx0YUZhY3RvcjtcblxuICAgICAgICB0aGlzLmNvbnRhaW5lclNpemUueCA9IG5ld0NvbnRhaW5lclNpemUueDtcbiAgICAgICAgdGhpcy5jb250YWluZXJTaXplLnkgPSBuZXdDb250YWluZXJTaXplLnk7XG5cbiAgICAgICAgdGhpcy5fdXBkYXRlQ29udGFpbmVySW5uZXJTaXplKCk7XG5cbiAgICAgICAgaWYgKCBtYWludGFpbiApIHtcbiAgICAgICAgICAgIC8vIFRPRE86IHdpZHRoRGVsdGFGYWN0b3Igd2lsbCBhbHdheXMgYmUgMTsgcHJvYmFibHkgbm90IHdoYXQncyBpbnRlbmRlZFxuICAgICAgICAgICAgd2lkdGhEZWx0YUZhY3RvciA9IG5ld0NvbnRhaW5lclNpemUueCAvIHRoaXMuY29udGFpbmVyU2l6ZS54O1xuICAgICAgICAgICAgbmV3Qm91bmRzLndpZHRoICA9IG9sZEJvdW5kcy53aWR0aCAqIHdpZHRoRGVsdGFGYWN0b3I7XG4gICAgICAgICAgICBuZXdCb3VuZHMuaGVpZ2h0ID0gbmV3Qm91bmRzLndpZHRoIC8gdGhpcy5nZXRBc3BlY3RSYXRpbygpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYoIHRoaXMudmlld2VyICl7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIFJhaXNlZCB3aGVuIHRoZSB2aWV3ZXIgaXMgcmVzaXplZCAoc2VlIHtAbGluayBPcGVuU2VhZHJhZ29uLlZpZXdwb3J0I3Jlc2l6ZX0pLlxuICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAqIEBldmVudCByZXNpemVcbiAgICAgICAgICAgICAqIEBtZW1iZXJvZiBPcGVuU2VhZHJhZ29uLlZpZXdlclxuICAgICAgICAgICAgICogQHR5cGUge29iamVjdH1cbiAgICAgICAgICAgICAqIEBwcm9wZXJ0eSB7T3BlblNlYWRyYWdvbi5WaWV3ZXJ9IGV2ZW50U291cmNlIC0gQSByZWZlcmVuY2UgdG8gdGhlIFZpZXdlciB3aGljaCByYWlzZWQgdGhpcyBldmVudC5cbiAgICAgICAgICAgICAqIEBwcm9wZXJ0eSB7T3BlblNlYWRyYWdvbi5Qb2ludH0gbmV3Q29udGFpbmVyU2l6ZVxuICAgICAgICAgICAgICogQHByb3BlcnR5IHtCb29sZWFufSBtYWludGFpblxuICAgICAgICAgICAgICogQHByb3BlcnR5IHs/T2JqZWN0fSB1c2VyRGF0YSAtIEFyYml0cmFyeSBzdWJzY3JpYmVyLWRlZmluZWQgb2JqZWN0LlxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICB0aGlzLnZpZXdlci5yYWlzZUV2ZW50KCAncmVzaXplJywge1xuICAgICAgICAgICAgICAgIG5ld0NvbnRhaW5lclNpemU6IG5ld0NvbnRhaW5lclNpemUsXG4gICAgICAgICAgICAgICAgbWFpbnRhaW46IG1haW50YWluXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmZpdEJvdW5kcyggbmV3Qm91bmRzLCB0cnVlICk7XG4gICAgfSxcblxuICAgIC8vIHByaXZhdGVcbiAgICBfdXBkYXRlQ29udGFpbmVySW5uZXJTaXplOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5fY29udGFpbmVySW5uZXJTaXplID0gbmV3ICQuUG9pbnQoXG4gICAgICAgICAgICBNYXRoLm1heCgxLCB0aGlzLmNvbnRhaW5lclNpemUueCAtICh0aGlzLl9tYXJnaW5zLmxlZnQgKyB0aGlzLl9tYXJnaW5zLnJpZ2h0KSksXG4gICAgICAgICAgICBNYXRoLm1heCgxLCB0aGlzLmNvbnRhaW5lclNpemUueSAtICh0aGlzLl9tYXJnaW5zLnRvcCArIHRoaXMuX21hcmdpbnMuYm90dG9tKSlcbiAgICAgICAgKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlIHRoZSB6b29tIGFuZCBjZW50ZXIgKFggYW5kIFkpIHNwcmluZ3MuXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgYW55IGNoYW5nZSBoYXMgYmVlbiBtYWRlLCBmYWxzZSBvdGhlcndpc2UuXG4gICAgICovXG4gICAgdXBkYXRlOiBmdW5jdGlvbigpIHtcblxuICAgICAgICBpZiAodGhpcy56b29tUG9pbnQpIHtcbiAgICAgICAgICAgIHZhciBvbGRab29tUGl4ZWwgPSB0aGlzLnBpeGVsRnJvbVBvaW50KHRoaXMuem9vbVBvaW50LCB0cnVlKTtcbiAgICAgICAgICAgIHRoaXMuem9vbVNwcmluZy51cGRhdGUoKTtcbiAgICAgICAgICAgIHZhciBuZXdab29tUGl4ZWwgPSB0aGlzLnBpeGVsRnJvbVBvaW50KHRoaXMuem9vbVBvaW50LCB0cnVlKTtcblxuICAgICAgICAgICAgdmFyIGRlbHRhWm9vbVBpeGVscyA9IG5ld1pvb21QaXhlbC5taW51cyhvbGRab29tUGl4ZWwpO1xuICAgICAgICAgICAgdmFyIGRlbHRhWm9vbVBvaW50cyA9IHRoaXMuZGVsdGFQb2ludHNGcm9tUGl4ZWxzKFxuICAgICAgICAgICAgICAgIGRlbHRhWm9vbVBpeGVscywgdHJ1ZSk7XG5cbiAgICAgICAgICAgIHRoaXMuY2VudGVyU3ByaW5nWC5zaGlmdEJ5KGRlbHRhWm9vbVBvaW50cy54KTtcbiAgICAgICAgICAgIHRoaXMuY2VudGVyU3ByaW5nWS5zaGlmdEJ5KGRlbHRhWm9vbVBvaW50cy55KTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuem9vbVNwcmluZy5pc0F0VGFyZ2V0VmFsdWUoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuem9vbVBvaW50ID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuem9vbVNwcmluZy51cGRhdGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2VudGVyU3ByaW5nWC51cGRhdGUoKTtcbiAgICAgICAgdGhpcy5jZW50ZXJTcHJpbmdZLnVwZGF0ZSgpO1xuXG4gICAgICAgIHZhciBjaGFuZ2VkID0gdGhpcy5jZW50ZXJTcHJpbmdYLmN1cnJlbnQudmFsdWUgIT09IHRoaXMuX29sZENlbnRlclggfHxcbiAgICAgICAgICAgIHRoaXMuY2VudGVyU3ByaW5nWS5jdXJyZW50LnZhbHVlICE9PSB0aGlzLl9vbGRDZW50ZXJZIHx8XG4gICAgICAgICAgICB0aGlzLnpvb21TcHJpbmcuY3VycmVudC52YWx1ZSAhPT0gdGhpcy5fb2xkWm9vbTtcblxuICAgICAgICB0aGlzLl9vbGRDZW50ZXJYID0gdGhpcy5jZW50ZXJTcHJpbmdYLmN1cnJlbnQudmFsdWU7XG4gICAgICAgIHRoaXMuX29sZENlbnRlclkgPSB0aGlzLmNlbnRlclNwcmluZ1kuY3VycmVudC52YWx1ZTtcbiAgICAgICAgdGhpcy5fb2xkWm9vbSAgICA9IHRoaXMuem9vbVNwcmluZy5jdXJyZW50LnZhbHVlO1xuXG4gICAgICAgIHJldHVybiBjaGFuZ2VkO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0IGEgZGVsdGEgKHRyYW5zbGF0aW9uIHZlY3RvcikgZnJvbSB2aWV3cG9ydCBjb29yZGluYXRlcyB0byBwaXhlbHNcbiAgICAgKiBjb29yZGluYXRlcy4gVGhpcyBtZXRob2QgZG9lcyBub3QgdGFrZSByb3RhdGlvbiBpbnRvIGFjY291bnQuXG4gICAgICogQ29uc2lkZXIgdXNpbmcgZGVsdGFQaXhlbHNGcm9tUG9pbnRzIGlmIHlvdSBuZWVkIHRvIGFjY291bnQgZm9yIHJvdGF0aW9uLlxuICAgICAqIEBwYXJhbSB7T3BlblNlYWRyYWdvbi5Qb2ludH0gZGVsdGFQb2ludHMgLSBUaGUgdHJhbnNsYXRpb24gdmVjdG9yIHRvIGNvbnZlcnQuXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBbY3VycmVudD1mYWxzZV0gLSBQYXNzIHRydWUgZm9yIHRoZSBjdXJyZW50IGxvY2F0aW9uO1xuICAgICAqIGRlZmF1bHRzIHRvIGZhbHNlICh0YXJnZXQgbG9jYXRpb24pLlxuICAgICAqIEByZXR1cm5zIHtPcGVuU2VhZHJhZ29uLlBvaW50fVxuICAgICAqL1xuICAgIGRlbHRhUGl4ZWxzRnJvbVBvaW50c05vUm90YXRlOiBmdW5jdGlvbihkZWx0YVBvaW50cywgY3VycmVudCkge1xuICAgICAgICByZXR1cm4gZGVsdGFQb2ludHMudGltZXMoXG4gICAgICAgICAgICB0aGlzLl9jb250YWluZXJJbm5lclNpemUueCAqIHRoaXMuZ2V0Wm9vbShjdXJyZW50KVxuICAgICAgICApO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0IGEgZGVsdGEgKHRyYW5zbGF0aW9uIHZlY3RvcikgZnJvbSB2aWV3cG9ydCBjb29yZGluYXRlcyB0byBwaXhlbHNcbiAgICAgKiBjb29yZGluYXRlcy5cbiAgICAgKiBAcGFyYW0ge09wZW5TZWFkcmFnb24uUG9pbnR9IGRlbHRhUG9pbnRzIC0gVGhlIHRyYW5zbGF0aW9uIHZlY3RvciB0byBjb252ZXJ0LlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gW2N1cnJlbnQ9ZmFsc2VdIC0gUGFzcyB0cnVlIGZvciB0aGUgY3VycmVudCBsb2NhdGlvbjtcbiAgICAgKiBkZWZhdWx0cyB0byBmYWxzZSAodGFyZ2V0IGxvY2F0aW9uKS5cbiAgICAgKiBAcmV0dXJucyB7T3BlblNlYWRyYWdvbi5Qb2ludH1cbiAgICAgKi9cbiAgICBkZWx0YVBpeGVsc0Zyb21Qb2ludHM6IGZ1bmN0aW9uKGRlbHRhUG9pbnRzLCBjdXJyZW50KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRlbHRhUGl4ZWxzRnJvbVBvaW50c05vUm90YXRlKFxuICAgICAgICAgICAgZGVsdGFQb2ludHMucm90YXRlKHRoaXMuZ2V0Um90YXRpb24oKSksXG4gICAgICAgICAgICBjdXJyZW50KTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ29udmVydCBhIGRlbHRhICh0cmFuc2xhdGlvbiB2ZWN0b3IpIGZyb20gcGl4ZWxzIGNvb3JkaW5hdGVzIHRvIHZpZXdwb3J0XG4gICAgICogY29vcmRpbmF0ZXMuIFRoaXMgbWV0aG9kIGRvZXMgbm90IHRha2Ugcm90YXRpb24gaW50byBhY2NvdW50LlxuICAgICAqIENvbnNpZGVyIHVzaW5nIGRlbHRhUG9pbnRzRnJvbVBpeGVscyBpZiB5b3UgbmVlZCB0byBhY2NvdW50IGZvciByb3RhdGlvbi5cbiAgICAgKiBAcGFyYW0ge09wZW5TZWFkcmFnb24uUG9pbnR9IGRlbHRhUGl4ZWxzIC0gVGhlIHRyYW5zbGF0aW9uIHZlY3RvciB0byBjb252ZXJ0LlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gW2N1cnJlbnQ9ZmFsc2VdIC0gUGFzcyB0cnVlIGZvciB0aGUgY3VycmVudCBsb2NhdGlvbjtcbiAgICAgKiBkZWZhdWx0cyB0byBmYWxzZSAodGFyZ2V0IGxvY2F0aW9uKS5cbiAgICAgKiBAcmV0dXJucyB7T3BlblNlYWRyYWdvbi5Qb2ludH1cbiAgICAgKi9cbiAgICBkZWx0YVBvaW50c0Zyb21QaXhlbHNOb1JvdGF0ZTogZnVuY3Rpb24oZGVsdGFQaXhlbHMsIGN1cnJlbnQpIHtcbiAgICAgICAgcmV0dXJuIGRlbHRhUGl4ZWxzLmRpdmlkZShcbiAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lcklubmVyU2l6ZS54ICogdGhpcy5nZXRab29tKGN1cnJlbnQpXG4gICAgICAgICk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENvbnZlcnQgYSBkZWx0YSAodHJhbnNsYXRpb24gdmVjdG9yKSBmcm9tIHBpeGVscyBjb29yZGluYXRlcyB0byB2aWV3cG9ydFxuICAgICAqIGNvb3JkaW5hdGVzLlxuICAgICAqIEBwYXJhbSB7T3BlblNlYWRyYWdvbi5Qb2ludH0gZGVsdGFQaXhlbHMgLSBUaGUgdHJhbnNsYXRpb24gdmVjdG9yIHRvIGNvbnZlcnQuXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBbY3VycmVudD1mYWxzZV0gLSBQYXNzIHRydWUgZm9yIHRoZSBjdXJyZW50IGxvY2F0aW9uO1xuICAgICAqIGRlZmF1bHRzIHRvIGZhbHNlICh0YXJnZXQgbG9jYXRpb24pLlxuICAgICAqIEByZXR1cm5zIHtPcGVuU2VhZHJhZ29uLlBvaW50fVxuICAgICAqL1xuICAgIGRlbHRhUG9pbnRzRnJvbVBpeGVsczogZnVuY3Rpb24oZGVsdGFQaXhlbHMsIGN1cnJlbnQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGVsdGFQb2ludHNGcm9tUGl4ZWxzTm9Sb3RhdGUoZGVsdGFQaXhlbHMsIGN1cnJlbnQpXG4gICAgICAgICAgICAucm90YXRlKC10aGlzLmdldFJvdGF0aW9uKCkpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0IHZpZXdwb3J0IGNvb3JkaW5hdGVzIHRvIHBpeGVscyBjb29yZGluYXRlcy5cbiAgICAgKiBUaGlzIG1ldGhvZCBkb2VzIG5vdCB0YWtlIHJvdGF0aW9uIGludG8gYWNjb3VudC5cbiAgICAgKiBDb25zaWRlciB1c2luZyBwaXhlbEZyb21Qb2ludCBpZiB5b3UgbmVlZCB0byBhY2NvdW50IGZvciByb3RhdGlvbi5cbiAgICAgKiBAcGFyYW0ge09wZW5TZWFkcmFnb24uUG9pbnR9IHBvaW50IHRoZSB2aWV3cG9ydCBjb29yZGluYXRlc1xuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gW2N1cnJlbnQ9ZmFsc2VdIC0gUGFzcyB0cnVlIGZvciB0aGUgY3VycmVudCBsb2NhdGlvbjtcbiAgICAgKiBkZWZhdWx0cyB0byBmYWxzZSAodGFyZ2V0IGxvY2F0aW9uKS5cbiAgICAgKiBAcmV0dXJucyB7T3BlblNlYWRyYWdvbi5Qb2ludH1cbiAgICAgKi9cbiAgICBwaXhlbEZyb21Qb2ludE5vUm90YXRlOiBmdW5jdGlvbihwb2ludCwgY3VycmVudCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGl4ZWxGcm9tUG9pbnROb1JvdGF0ZShcbiAgICAgICAgICAgIHBvaW50LCB0aGlzLmdldEJvdW5kc05vUm90YXRlKGN1cnJlbnQpKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ29udmVydCB2aWV3cG9ydCBjb29yZGluYXRlcyB0byBwaXhlbCBjb29yZGluYXRlcy5cbiAgICAgKiBAcGFyYW0ge09wZW5TZWFkcmFnb24uUG9pbnR9IHBvaW50IHRoZSB2aWV3cG9ydCBjb29yZGluYXRlc1xuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gW2N1cnJlbnQ9ZmFsc2VdIC0gUGFzcyB0cnVlIGZvciB0aGUgY3VycmVudCBsb2NhdGlvbjtcbiAgICAgKiBkZWZhdWx0cyB0byBmYWxzZSAodGFyZ2V0IGxvY2F0aW9uKS5cbiAgICAgKiBAcmV0dXJucyB7T3BlblNlYWRyYWdvbi5Qb2ludH1cbiAgICAgKi9cbiAgICBwaXhlbEZyb21Qb2ludDogZnVuY3Rpb24ocG9pbnQsIGN1cnJlbnQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BpeGVsRnJvbVBvaW50KHBvaW50LCB0aGlzLmdldEJvdW5kc05vUm90YXRlKGN1cnJlbnQpKTtcbiAgICB9LFxuXG4gICAgLy8gcHJpdmF0ZVxuICAgIF9waXhlbEZyb21Qb2ludE5vUm90YXRlOiBmdW5jdGlvbihwb2ludCwgYm91bmRzKSB7XG4gICAgICAgIHJldHVybiBwb2ludC5taW51cyhcbiAgICAgICAgICAgIGJvdW5kcy5nZXRUb3BMZWZ0KClcbiAgICAgICAgKS50aW1lcyhcbiAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lcklubmVyU2l6ZS54IC8gYm91bmRzLndpZHRoXG4gICAgICAgICkucGx1cyhcbiAgICAgICAgICAgIG5ldyAkLlBvaW50KHRoaXMuX21hcmdpbnMubGVmdCwgdGhpcy5fbWFyZ2lucy50b3ApXG4gICAgICAgICk7XG4gICAgfSxcblxuICAgIC8vIHByaXZhdGVcbiAgICBfcGl4ZWxGcm9tUG9pbnQ6IGZ1bmN0aW9uKHBvaW50LCBib3VuZHMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BpeGVsRnJvbVBvaW50Tm9Sb3RhdGUoXG4gICAgICAgICAgICBwb2ludC5yb3RhdGUodGhpcy5nZXRSb3RhdGlvbigpLCB0aGlzLmdldENlbnRlcih0cnVlKSksXG4gICAgICAgICAgICBib3VuZHMpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0IHBpeGVsIGNvb3JkaW5hdGVzIHRvIHZpZXdwb3J0IGNvb3JkaW5hdGVzLlxuICAgICAqIFRoaXMgbWV0aG9kIGRvZXMgbm90IHRha2Ugcm90YXRpb24gaW50byBhY2NvdW50LlxuICAgICAqIENvbnNpZGVyIHVzaW5nIHBvaW50RnJvbVBpeGVsIGlmIHlvdSBuZWVkIHRvIGFjY291bnQgZm9yIHJvdGF0aW9uLlxuICAgICAqIEBwYXJhbSB7T3BlblNlYWRyYWdvbi5Qb2ludH0gcGl4ZWwgUGl4ZWwgY29vcmRpbmF0ZXNcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtjdXJyZW50PWZhbHNlXSAtIFBhc3MgdHJ1ZSBmb3IgdGhlIGN1cnJlbnQgbG9jYXRpb247XG4gICAgICogZGVmYXVsdHMgdG8gZmFsc2UgKHRhcmdldCBsb2NhdGlvbikuXG4gICAgICogQHJldHVybnMge09wZW5TZWFkcmFnb24uUG9pbnR9XG4gICAgICovXG4gICAgcG9pbnRGcm9tUGl4ZWxOb1JvdGF0ZTogZnVuY3Rpb24ocGl4ZWwsIGN1cnJlbnQpIHtcbiAgICAgICAgdmFyIGJvdW5kcyA9IHRoaXMuZ2V0Qm91bmRzTm9Sb3RhdGUoY3VycmVudCk7XG4gICAgICAgIHJldHVybiBwaXhlbC5taW51cyhcbiAgICAgICAgICAgIG5ldyAkLlBvaW50KHRoaXMuX21hcmdpbnMubGVmdCwgdGhpcy5fbWFyZ2lucy50b3ApXG4gICAgICAgICkuZGl2aWRlKFxuICAgICAgICAgICAgdGhpcy5fY29udGFpbmVySW5uZXJTaXplLnggLyBib3VuZHMud2lkdGhcbiAgICAgICAgKS5wbHVzKFxuICAgICAgICAgICAgYm91bmRzLmdldFRvcExlZnQoKVxuICAgICAgICApO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0IHBpeGVsIGNvb3JkaW5hdGVzIHRvIHZpZXdwb3J0IGNvb3JkaW5hdGVzLlxuICAgICAqIEBwYXJhbSB7T3BlblNlYWRyYWdvbi5Qb2ludH0gcGl4ZWwgUGl4ZWwgY29vcmRpbmF0ZXNcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtjdXJyZW50PWZhbHNlXSAtIFBhc3MgdHJ1ZSBmb3IgdGhlIGN1cnJlbnQgbG9jYXRpb247XG4gICAgICogZGVmYXVsdHMgdG8gZmFsc2UgKHRhcmdldCBsb2NhdGlvbikuXG4gICAgICogQHJldHVybnMge09wZW5TZWFkcmFnb24uUG9pbnR9XG4gICAgICovXG4gICAgcG9pbnRGcm9tUGl4ZWw6IGZ1bmN0aW9uKHBpeGVsLCBjdXJyZW50KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBvaW50RnJvbVBpeGVsTm9Sb3RhdGUocGl4ZWwsIGN1cnJlbnQpLnJvdGF0ZShcbiAgICAgICAgICAgIC10aGlzLmdldFJvdGF0aW9uKCksXG4gICAgICAgICAgICB0aGlzLmdldENlbnRlcih0cnVlKVxuICAgICAgICApO1xuICAgIH0sXG5cbiAgICAvLyBwcml2YXRlXG4gICAgX3ZpZXdwb3J0VG9JbWFnZURlbHRhOiBmdW5jdGlvbiggdmlld2VyWCwgdmlld2VyWSApIHtcbiAgICAgICAgdmFyIHNjYWxlID0gdGhpcy5fY29udGVudEJvdW5kc05vUm90YXRlLndpZHRoO1xuICAgICAgICByZXR1cm4gbmV3ICQuUG9pbnQoXG4gICAgICAgICAgICB2aWV3ZXJYICogdGhpcy5fY29udGVudFNpemVOb1JvdGF0ZS54IC8gc2NhbGUsXG4gICAgICAgICAgICB2aWV3ZXJZICogdGhpcy5fY29udGVudFNpemVOb1JvdGF0ZS54IC8gc2NhbGUpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBUcmFuc2xhdGVzIGZyb20gT3BlblNlYWRyYWdvbiB2aWV3ZXIgY29vcmRpbmF0ZSBzeXN0ZW0gdG8gaW1hZ2UgY29vcmRpbmF0ZSBzeXN0ZW0uXG4gICAgICogVGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCBlaXRoZXIgYnkgcGFzc2luZyBYLFkgY29vcmRpbmF0ZXMgb3IgYW5cbiAgICAgKiBPcGVuU2VhZHJhZ29uLlBvaW50XG4gICAgICogTm90ZTogbm90IGFjY3VyYXRlIHdpdGggbXVsdGktaW1hZ2U7IHVzZSBUaWxlZEltYWdlLnZpZXdwb3J0VG9JbWFnZUNvb3JkaW5hdGVzIGluc3RlYWQuXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHsoT3BlblNlYWRyYWdvbi5Qb2ludHxOdW1iZXIpfSB2aWV3ZXJYIGVpdGhlciBhIHBvaW50IG9yIHRoZSBYXG4gICAgICogY29vcmRpbmF0ZSBpbiB2aWV3cG9ydCBjb29yZGluYXRlIHN5c3RlbS5cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gW3ZpZXdlclldIFkgY29vcmRpbmF0ZSBpbiB2aWV3cG9ydCBjb29yZGluYXRlIHN5c3RlbS5cbiAgICAgKiBAcmV0dXJuIHtPcGVuU2VhZHJhZ29uLlBvaW50fSBhIHBvaW50IHJlcHJlc2VudGluZyB0aGUgY29vcmRpbmF0ZXMgaW4gdGhlIGltYWdlLlxuICAgICAqL1xuICAgIHZpZXdwb3J0VG9JbWFnZUNvb3JkaW5hdGVzOiBmdW5jdGlvbih2aWV3ZXJYLCB2aWV3ZXJZKSB7XG4gICAgICAgIGlmICh2aWV3ZXJYIGluc3RhbmNlb2YgJC5Qb2ludCkge1xuICAgICAgICAgICAgLy90aGV5IHBhc3NlZCBhIHBvaW50IGluc3RlYWQgb2YgaW5kaXZpZHVhbCBjb21wb25lbnRzXG4gICAgICAgICAgICByZXR1cm4gdGhpcy52aWV3cG9ydFRvSW1hZ2VDb29yZGluYXRlcyh2aWV3ZXJYLngsIHZpZXdlclgueSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy52aWV3ZXIpIHtcbiAgICAgICAgICAgIHZhciBjb3VudCA9IHRoaXMudmlld2VyLndvcmxkLmdldEl0ZW1Db3VudCgpO1xuICAgICAgICAgICAgaWYgKGNvdW50ID4gMSkge1xuICAgICAgICAgICAgICAgICQuY29uc29sZS5lcnJvcignW1ZpZXdwb3J0LnZpZXdwb3J0VG9JbWFnZUNvb3JkaW5hdGVzXSBpcyBub3QgYWNjdXJhdGUgJyArXG4gICAgICAgICAgICAgICAgICAgICd3aXRoIG11bHRpLWltYWdlOyB1c2UgVGlsZWRJbWFnZS52aWV3cG9ydFRvSW1hZ2VDb29yZGluYXRlcyBpbnN0ZWFkLicpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjb3VudCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIC8vIEl0IGlzIGJldHRlciB0byB1c2UgVGlsZWRJbWFnZS52aWV3cG9ydFRvSW1hZ2VDb29yZGluYXRlc1xuICAgICAgICAgICAgICAgIC8vIGJlY2F1c2UgdGhpcy5fY29udGVudEJvdW5kc05vUm90YXRlIGNhbiBub3QgYmUgcmVsaWVkIG9uXG4gICAgICAgICAgICAgICAgLy8gd2l0aCBjbGlwcGluZy5cbiAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IHRoaXMudmlld2VyLndvcmxkLmdldEl0ZW1BdCgwKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS52aWV3cG9ydFRvSW1hZ2VDb29yZGluYXRlcyh2aWV3ZXJYLCB2aWV3ZXJZLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLl92aWV3cG9ydFRvSW1hZ2VEZWx0YShcbiAgICAgICAgICAgIHZpZXdlclggLSB0aGlzLl9jb250ZW50Qm91bmRzTm9Sb3RhdGUueCxcbiAgICAgICAgICAgIHZpZXdlclkgLSB0aGlzLl9jb250ZW50Qm91bmRzTm9Sb3RhdGUueSk7XG4gICAgfSxcblxuICAgIC8vIHByaXZhdGVcbiAgICBfaW1hZ2VUb1ZpZXdwb3J0RGVsdGE6IGZ1bmN0aW9uKCBpbWFnZVgsIGltYWdlWSApIHtcbiAgICAgICAgdmFyIHNjYWxlID0gdGhpcy5fY29udGVudEJvdW5kc05vUm90YXRlLndpZHRoO1xuICAgICAgICByZXR1cm4gbmV3ICQuUG9pbnQoXG4gICAgICAgICAgICBpbWFnZVggLyB0aGlzLl9jb250ZW50U2l6ZU5vUm90YXRlLnggKiBzY2FsZSxcbiAgICAgICAgICAgIGltYWdlWSAvIHRoaXMuX2NvbnRlbnRTaXplTm9Sb3RhdGUueCAqIHNjYWxlKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogVHJhbnNsYXRlcyBmcm9tIGltYWdlIGNvb3JkaW5hdGUgc3lzdGVtIHRvIE9wZW5TZWFkcmFnb24gdmlld2VyIGNvb3JkaW5hdGUgc3lzdGVtXG4gICAgICogVGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCBlaXRoZXIgYnkgcGFzc2luZyBYLFkgY29vcmRpbmF0ZXMgb3IgYW5cbiAgICAgKiBPcGVuU2VhZHJhZ29uLlBvaW50XG4gICAgICogTm90ZTogbm90IGFjY3VyYXRlIHdpdGggbXVsdGktaW1hZ2U7IHVzZSBUaWxlZEltYWdlLmltYWdlVG9WaWV3cG9ydENvb3JkaW5hdGVzIGluc3RlYWQuXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHsoT3BlblNlYWRyYWdvbi5Qb2ludCB8IE51bWJlcil9IGltYWdlWCB0aGUgcG9pbnQgb3IgdGhlXG4gICAgICogWCBjb29yZGluYXRlIGluIGltYWdlIGNvb3JkaW5hdGUgc3lzdGVtLlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBbaW1hZ2VZXSBZIGNvb3JkaW5hdGUgaW4gaW1hZ2UgY29vcmRpbmF0ZSBzeXN0ZW0uXG4gICAgICogQHJldHVybiB7T3BlblNlYWRyYWdvbi5Qb2ludH0gYSBwb2ludCByZXByZXNlbnRpbmcgdGhlIGNvb3JkaW5hdGVzIGluIHRoZSB2aWV3cG9ydC5cbiAgICAgKi9cbiAgICBpbWFnZVRvVmlld3BvcnRDb29yZGluYXRlczogZnVuY3Rpb24oaW1hZ2VYLCBpbWFnZVkpIHtcbiAgICAgICAgaWYgKGltYWdlWCBpbnN0YW5jZW9mICQuUG9pbnQpIHtcbiAgICAgICAgICAgIC8vdGhleSBwYXNzZWQgYSBwb2ludCBpbnN0ZWFkIG9mIGluZGl2aWR1YWwgY29tcG9uZW50c1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW1hZ2VUb1ZpZXdwb3J0Q29vcmRpbmF0ZXMoaW1hZ2VYLngsIGltYWdlWC55KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnZpZXdlcikge1xuICAgICAgICAgICAgdmFyIGNvdW50ID0gdGhpcy52aWV3ZXIud29ybGQuZ2V0SXRlbUNvdW50KCk7XG4gICAgICAgICAgICBpZiAoY291bnQgPiAxKSB7XG4gICAgICAgICAgICAgICAgJC5jb25zb2xlLmVycm9yKCdbVmlld3BvcnQuaW1hZ2VUb1ZpZXdwb3J0Q29vcmRpbmF0ZXNdIGlzIG5vdCBhY2N1cmF0ZSAnICtcbiAgICAgICAgICAgICAgICAgICAgJ3dpdGggbXVsdGktaW1hZ2U7IHVzZSBUaWxlZEltYWdlLmltYWdlVG9WaWV3cG9ydENvb3JkaW5hdGVzIGluc3RlYWQuJyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNvdW50ID09PSAxKSB7XG4gICAgICAgICAgICAgICAgLy8gSXQgaXMgYmV0dGVyIHRvIHVzZSBUaWxlZEltYWdlLnZpZXdwb3J0VG9JbWFnZUNvb3JkaW5hdGVzXG4gICAgICAgICAgICAgICAgLy8gYmVjYXVzZSB0aGlzLl9jb250ZW50Qm91bmRzTm9Sb3RhdGUgY2FuIG5vdCBiZSByZWxpZWQgb25cbiAgICAgICAgICAgICAgICAvLyB3aXRoIGNsaXBwaW5nLlxuICAgICAgICAgICAgICAgIHZhciBpdGVtID0gdGhpcy52aWV3ZXIud29ybGQuZ2V0SXRlbUF0KDApO1xuICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLmltYWdlVG9WaWV3cG9ydENvb3JkaW5hdGVzKGltYWdlWCwgaW1hZ2VZLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBwb2ludCA9IHRoaXMuX2ltYWdlVG9WaWV3cG9ydERlbHRhKGltYWdlWCwgaW1hZ2VZKTtcbiAgICAgICAgcG9pbnQueCArPSB0aGlzLl9jb250ZW50Qm91bmRzTm9Sb3RhdGUueDtcbiAgICAgICAgcG9pbnQueSArPSB0aGlzLl9jb250ZW50Qm91bmRzTm9Sb3RhdGUueTtcbiAgICAgICAgcmV0dXJuIHBvaW50O1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBUcmFuc2xhdGVzIGZyb20gYSByZWN0YW5nbGUgd2hpY2ggZGVzY3JpYmVzIGEgcG9ydGlvbiBvZiB0aGUgaW1hZ2UgaW5cbiAgICAgKiBwaXhlbCBjb29yZGluYXRlcyB0byBPcGVuU2VhZHJhZ29uIHZpZXdwb3J0IHJlY3RhbmdsZSBjb29yZGluYXRlcy5cbiAgICAgKiBUaGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIGVpdGhlciBieSBwYXNzaW5nIFgsWSx3aWR0aCxoZWlnaHQgb3IgYW5cbiAgICAgKiBPcGVuU2VhZHJhZ29uLlJlY3RcbiAgICAgKiBOb3RlOiBub3QgYWNjdXJhdGUgd2l0aCBtdWx0aS1pbWFnZTsgdXNlIFRpbGVkSW1hZ2UuaW1hZ2VUb1ZpZXdwb3J0UmVjdGFuZ2xlIGluc3RlYWQuXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHsoT3BlblNlYWRyYWdvbi5SZWN0IHwgTnVtYmVyKX0gaW1hZ2VYIHRoZSByZWN0YW5nbGUgb3IgdGhlIFhcbiAgICAgKiBjb29yZGluYXRlIG9mIHRoZSB0b3AgbGVmdCBjb3JuZXIgb2YgdGhlIHJlY3RhbmdsZSBpbiBpbWFnZSBjb29yZGluYXRlIHN5c3RlbS5cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gW2ltYWdlWV0gdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgdG9wIGxlZnQgY29ybmVyIG9mIHRoZSByZWN0YW5nbGVcbiAgICAgKiBpbiBpbWFnZSBjb29yZGluYXRlIHN5c3RlbS5cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gW3BpeGVsV2lkdGhdIHRoZSB3aWR0aCBpbiBwaXhlbCBvZiB0aGUgcmVjdGFuZ2xlLlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBbcGl4ZWxIZWlnaHRdIHRoZSBoZWlnaHQgaW4gcGl4ZWwgb2YgdGhlIHJlY3RhbmdsZS5cbiAgICAgKi9cbiAgICBpbWFnZVRvVmlld3BvcnRSZWN0YW5nbGU6IGZ1bmN0aW9uKGltYWdlWCwgaW1hZ2VZLCBwaXhlbFdpZHRoLCBwaXhlbEhlaWdodCkge1xuICAgICAgICB2YXIgcmVjdCA9IGltYWdlWDtcbiAgICAgICAgaWYgKCEocmVjdCBpbnN0YW5jZW9mICQuUmVjdCkpIHtcbiAgICAgICAgICAgIC8vdGhleSBwYXNzZWQgaW5kaXZpZHVhbCBjb21wb25lbnRzIGluc3RlYWQgb2YgYSByZWN0YW5nbGVcbiAgICAgICAgICAgIHJlY3QgPSBuZXcgJC5SZWN0KGltYWdlWCwgaW1hZ2VZLCBwaXhlbFdpZHRoLCBwaXhlbEhlaWdodCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy52aWV3ZXIpIHtcbiAgICAgICAgICAgIHZhciBjb3VudCA9IHRoaXMudmlld2VyLndvcmxkLmdldEl0ZW1Db3VudCgpO1xuICAgICAgICAgICAgaWYgKGNvdW50ID4gMSkge1xuICAgICAgICAgICAgICAgICQuY29uc29sZS5lcnJvcignW1ZpZXdwb3J0LmltYWdlVG9WaWV3cG9ydFJlY3RhbmdsZV0gaXMgbm90IGFjY3VyYXRlICcgK1xuICAgICAgICAgICAgICAgICAgICAnd2l0aCBtdWx0aS1pbWFnZTsgdXNlIFRpbGVkSW1hZ2UuaW1hZ2VUb1ZpZXdwb3J0UmVjdGFuZ2xlIGluc3RlYWQuJyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNvdW50ID09PSAxKSB7XG4gICAgICAgICAgICAgICAgLy8gSXQgaXMgYmV0dGVyIHRvIHVzZSBUaWxlZEltYWdlLmltYWdlVG9WaWV3cG9ydFJlY3RhbmdsZVxuICAgICAgICAgICAgICAgIC8vIGJlY2F1c2UgdGhpcy5fY29udGVudEJvdW5kc05vUm90YXRlIGNhbiBub3QgYmUgcmVsaWVkIG9uXG4gICAgICAgICAgICAgICAgLy8gd2l0aCBjbGlwcGluZy5cbiAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IHRoaXMudmlld2VyLndvcmxkLmdldEl0ZW1BdCgwKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS5pbWFnZVRvVmlld3BvcnRSZWN0YW5nbGUoXG4gICAgICAgICAgICAgICAgICAgIGltYWdlWCwgaW1hZ2VZLCBwaXhlbFdpZHRoLCBwaXhlbEhlaWdodCwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgY29vcmRBID0gdGhpcy5pbWFnZVRvVmlld3BvcnRDb29yZGluYXRlcyhyZWN0LngsIHJlY3QueSk7XG4gICAgICAgIHZhciBjb29yZEIgPSB0aGlzLl9pbWFnZVRvVmlld3BvcnREZWx0YShyZWN0LndpZHRoLCByZWN0LmhlaWdodCk7XG4gICAgICAgIHJldHVybiBuZXcgJC5SZWN0KFxuICAgICAgICAgICAgY29vcmRBLngsXG4gICAgICAgICAgICBjb29yZEEueSxcbiAgICAgICAgICAgIGNvb3JkQi54LFxuICAgICAgICAgICAgY29vcmRCLnksXG4gICAgICAgICAgICByZWN0LmRlZ3JlZXNcbiAgICAgICAgKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogVHJhbnNsYXRlcyBmcm9tIGEgcmVjdGFuZ2xlIHdoaWNoIGRlc2NyaWJlcyBhIHBvcnRpb24gb2ZcbiAgICAgKiB0aGUgdmlld3BvcnQgaW4gcG9pbnQgY29vcmRpbmF0ZXMgdG8gaW1hZ2UgcmVjdGFuZ2xlIGNvb3JkaW5hdGVzLlxuICAgICAqIFRoaXMgbWV0aG9kIGNhbiBiZSBjYWxsZWQgZWl0aGVyIGJ5IHBhc3NpbmcgWCxZLHdpZHRoLGhlaWdodCBvciBhblxuICAgICAqIE9wZW5TZWFkcmFnb24uUmVjdFxuICAgICAqIE5vdGU6IG5vdCBhY2N1cmF0ZSB3aXRoIG11bHRpLWltYWdlOyB1c2UgVGlsZWRJbWFnZS52aWV3cG9ydFRvSW1hZ2VSZWN0YW5nbGUgaW5zdGVhZC5cbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0geyhPcGVuU2VhZHJhZ29uLlJlY3QgfCBOdW1iZXIpfSB2aWV3ZXJYIGVpdGhlciBhIHJlY3RhbmdsZSBvclxuICAgICAqIHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHRvcCBsZWZ0IGNvcm5lciBvZiB0aGUgcmVjdGFuZ2xlIGluIHZpZXdwb3J0XG4gICAgICogY29vcmRpbmF0ZSBzeXN0ZW0uXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IFt2aWV3ZXJZXSB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSB0b3AgbGVmdCBjb3JuZXIgb2YgdGhlIHJlY3RhbmdsZVxuICAgICAqIGluIHZpZXdwb3J0IGNvb3JkaW5hdGUgc3lzdGVtLlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBbcG9pbnRXaWR0aF0gdGhlIHdpZHRoIG9mIHRoZSByZWN0YW5nbGUgaW4gdmlld3BvcnQgY29vcmRpbmF0ZSBzeXN0ZW0uXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IFtwb2ludEhlaWdodF0gdGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlIGluIHZpZXdwb3J0IGNvb3JkaW5hdGUgc3lzdGVtLlxuICAgICAqL1xuICAgIHZpZXdwb3J0VG9JbWFnZVJlY3RhbmdsZTogZnVuY3Rpb24odmlld2VyWCwgdmlld2VyWSwgcG9pbnRXaWR0aCwgcG9pbnRIZWlnaHQpIHtcbiAgICAgICAgdmFyIHJlY3QgPSB2aWV3ZXJYO1xuICAgICAgICBpZiAoIShyZWN0IGluc3RhbmNlb2YgJC5SZWN0KSkge1xuICAgICAgICAgICAgLy90aGV5IHBhc3NlZCBpbmRpdmlkdWFsIGNvbXBvbmVudHMgaW5zdGVhZCBvZiBhIHJlY3RhbmdsZVxuICAgICAgICAgICAgcmVjdCA9IG5ldyAkLlJlY3Qodmlld2VyWCwgdmlld2VyWSwgcG9pbnRXaWR0aCwgcG9pbnRIZWlnaHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMudmlld2VyKSB7XG4gICAgICAgICAgICB2YXIgY291bnQgPSB0aGlzLnZpZXdlci53b3JsZC5nZXRJdGVtQ291bnQoKTtcbiAgICAgICAgICAgIGlmIChjb3VudCA+IDEpIHtcbiAgICAgICAgICAgICAgICAkLmNvbnNvbGUuZXJyb3IoJ1tWaWV3cG9ydC52aWV3cG9ydFRvSW1hZ2VSZWN0YW5nbGVdIGlzIG5vdCBhY2N1cmF0ZSAnICtcbiAgICAgICAgICAgICAgICAgICAgJ3dpdGggbXVsdGktaW1hZ2U7IHVzZSBUaWxlZEltYWdlLnZpZXdwb3J0VG9JbWFnZVJlY3RhbmdsZSBpbnN0ZWFkLicpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjb3VudCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIC8vIEl0IGlzIGJldHRlciB0byB1c2UgVGlsZWRJbWFnZS52aWV3cG9ydFRvSW1hZ2VDb29yZGluYXRlc1xuICAgICAgICAgICAgICAgIC8vIGJlY2F1c2UgdGhpcy5fY29udGVudEJvdW5kc05vUm90YXRlIGNhbiBub3QgYmUgcmVsaWVkIG9uXG4gICAgICAgICAgICAgICAgLy8gd2l0aCBjbGlwcGluZy5cbiAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IHRoaXMudmlld2VyLndvcmxkLmdldEl0ZW1BdCgwKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS52aWV3cG9ydFRvSW1hZ2VSZWN0YW5nbGUoXG4gICAgICAgICAgICAgICAgICAgIHZpZXdlclgsIHZpZXdlclksIHBvaW50V2lkdGgsIHBvaW50SGVpZ2h0LCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBjb29yZEEgPSB0aGlzLnZpZXdwb3J0VG9JbWFnZUNvb3JkaW5hdGVzKHJlY3QueCwgcmVjdC55KTtcbiAgICAgICAgdmFyIGNvb3JkQiA9IHRoaXMuX3ZpZXdwb3J0VG9JbWFnZURlbHRhKHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0KTtcbiAgICAgICAgcmV0dXJuIG5ldyAkLlJlY3QoXG4gICAgICAgICAgICBjb29yZEEueCxcbiAgICAgICAgICAgIGNvb3JkQS55LFxuICAgICAgICAgICAgY29vcmRCLngsXG4gICAgICAgICAgICBjb29yZEIueSxcbiAgICAgICAgICAgIHJlY3QuZGVncmVlc1xuICAgICAgICApO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0IHBpeGVsIGNvb3JkaW5hdGVzIHJlbGF0aXZlIHRvIHRoZSB2aWV3ZXIgZWxlbWVudCB0byBpbWFnZVxuICAgICAqIGNvb3JkaW5hdGVzLlxuICAgICAqIE5vdGU6IG5vdCBhY2N1cmF0ZSB3aXRoIG11bHRpLWltYWdlLlxuICAgICAqIEBwYXJhbSB7T3BlblNlYWRyYWdvbi5Qb2ludH0gcGl4ZWxcbiAgICAgKiBAcmV0dXJucyB7T3BlblNlYWRyYWdvbi5Qb2ludH1cbiAgICAgKi9cbiAgICB2aWV3ZXJFbGVtZW50VG9JbWFnZUNvb3JkaW5hdGVzOiBmdW5jdGlvbiggcGl4ZWwgKSB7XG4gICAgICAgIHZhciBwb2ludCA9IHRoaXMucG9pbnRGcm9tUGl4ZWwoIHBpeGVsLCB0cnVlICk7XG4gICAgICAgIHJldHVybiB0aGlzLnZpZXdwb3J0VG9JbWFnZUNvb3JkaW5hdGVzKCBwb2ludCApO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0IHBpeGVsIGNvb3JkaW5hdGVzIHJlbGF0aXZlIHRvIHRoZSBpbWFnZSB0b1xuICAgICAqIHZpZXdlciBlbGVtZW50IGNvb3JkaW5hdGVzLlxuICAgICAqIE5vdGU6IG5vdCBhY2N1cmF0ZSB3aXRoIG11bHRpLWltYWdlLlxuICAgICAqIEBwYXJhbSB7T3BlblNlYWRyYWdvbi5Qb2ludH0gcGl4ZWxcbiAgICAgKiBAcmV0dXJucyB7T3BlblNlYWRyYWdvbi5Qb2ludH1cbiAgICAgKi9cbiAgICBpbWFnZVRvVmlld2VyRWxlbWVudENvb3JkaW5hdGVzOiBmdW5jdGlvbiggcGl4ZWwgKSB7XG4gICAgICAgIHZhciBwb2ludCA9IHRoaXMuaW1hZ2VUb1ZpZXdwb3J0Q29vcmRpbmF0ZXMoIHBpeGVsICk7XG4gICAgICAgIHJldHVybiB0aGlzLnBpeGVsRnJvbVBvaW50KCBwb2ludCwgdHJ1ZSApO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0IHBpeGVsIGNvb3JkaW5hdGVzIHJlbGF0aXZlIHRvIHRoZSB3aW5kb3cgdG8gaW1hZ2UgY29vcmRpbmF0ZXMuXG4gICAgICogTm90ZTogbm90IGFjY3VyYXRlIHdpdGggbXVsdGktaW1hZ2UuXG4gICAgICogQHBhcmFtIHtPcGVuU2VhZHJhZ29uLlBvaW50fSBwaXhlbFxuICAgICAqIEByZXR1cm5zIHtPcGVuU2VhZHJhZ29uLlBvaW50fVxuICAgICAqL1xuICAgIHdpbmRvd1RvSW1hZ2VDb29yZGluYXRlczogZnVuY3Rpb24ocGl4ZWwpIHtcbiAgICAgICAgJC5jb25zb2xlLmFzc2VydCh0aGlzLnZpZXdlcixcbiAgICAgICAgICAgIFwiW1ZpZXdwb3J0LndpbmRvd1RvSW1hZ2VDb29yZGluYXRlc10gdGhlIHZpZXdwb3J0IG11c3QgaGF2ZSBhIHZpZXdlci5cIik7XG4gICAgICAgIHZhciB2aWV3ZXJDb29yZGluYXRlcyA9IHBpeGVsLm1pbnVzKFxuICAgICAgICAgICAgICAgICQuZ2V0RWxlbWVudFBvc2l0aW9uKHRoaXMudmlld2VyLmVsZW1lbnQpKTtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlld2VyRWxlbWVudFRvSW1hZ2VDb29yZGluYXRlcyh2aWV3ZXJDb29yZGluYXRlcyk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENvbnZlcnQgaW1hZ2UgY29vcmRpbmF0ZXMgdG8gcGl4ZWwgY29vcmRpbmF0ZXMgcmVsYXRpdmUgdG8gdGhlIHdpbmRvdy5cbiAgICAgKiBOb3RlOiBub3QgYWNjdXJhdGUgd2l0aCBtdWx0aS1pbWFnZS5cbiAgICAgKiBAcGFyYW0ge09wZW5TZWFkcmFnb24uUG9pbnR9IHBpeGVsXG4gICAgICogQHJldHVybnMge09wZW5TZWFkcmFnb24uUG9pbnR9XG4gICAgICovXG4gICAgaW1hZ2VUb1dpbmRvd0Nvb3JkaW5hdGVzOiBmdW5jdGlvbihwaXhlbCkge1xuICAgICAgICAkLmNvbnNvbGUuYXNzZXJ0KHRoaXMudmlld2VyLFxuICAgICAgICAgICAgXCJbVmlld3BvcnQuaW1hZ2VUb1dpbmRvd0Nvb3JkaW5hdGVzXSB0aGUgdmlld3BvcnQgbXVzdCBoYXZlIGEgdmlld2VyLlwiKTtcbiAgICAgICAgdmFyIHZpZXdlckNvb3JkaW5hdGVzID0gdGhpcy5pbWFnZVRvVmlld2VyRWxlbWVudENvb3JkaW5hdGVzKHBpeGVsKTtcbiAgICAgICAgcmV0dXJuIHZpZXdlckNvb3JkaW5hdGVzLnBsdXMoXG4gICAgICAgICAgICAgICAgJC5nZXRFbGVtZW50UG9zaXRpb24odGhpcy52aWV3ZXIuZWxlbWVudCkpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0IHBpeGVsIGNvb3JkaW5hdGVzIHJlbGF0aXZlIHRvIHRoZSB2aWV3ZXIgZWxlbWVudCB0byB2aWV3cG9ydFxuICAgICAqIGNvb3JkaW5hdGVzLlxuICAgICAqIEBwYXJhbSB7T3BlblNlYWRyYWdvbi5Qb2ludH0gcGl4ZWxcbiAgICAgKiBAcmV0dXJucyB7T3BlblNlYWRyYWdvbi5Qb2ludH1cbiAgICAgKi9cbiAgICB2aWV3ZXJFbGVtZW50VG9WaWV3cG9ydENvb3JkaW5hdGVzOiBmdW5jdGlvbiggcGl4ZWwgKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBvaW50RnJvbVBpeGVsKCBwaXhlbCwgdHJ1ZSApO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0IHZpZXdwb3J0IGNvb3JkaW5hdGVzIHRvIHBpeGVsIGNvb3JkaW5hdGVzIHJlbGF0aXZlIHRvIHRoZVxuICAgICAqIHZpZXdlciBlbGVtZW50LlxuICAgICAqIEBwYXJhbSB7T3BlblNlYWRyYWdvbi5Qb2ludH0gcG9pbnRcbiAgICAgKiBAcmV0dXJucyB7T3BlblNlYWRyYWdvbi5Qb2ludH1cbiAgICAgKi9cbiAgICB2aWV3cG9ydFRvVmlld2VyRWxlbWVudENvb3JkaW5hdGVzOiBmdW5jdGlvbiggcG9pbnQgKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBpeGVsRnJvbVBvaW50KCBwb2ludCwgdHJ1ZSApO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0IGEgcmVjdGFuZ2xlIGluIHBpeGVsIGNvb3JkaW5hdGVzIHJlbGF0aXZlIHRvIHRoZSB2aWV3ZXIgZWxlbWVudFxuICAgICAqIHRvIHZpZXdwb3J0IGNvb3JkaW5hdGVzLlxuICAgICAqIEBwYXJhbSB7T3BlblNlYWRyYWdvbi5SZWN0fSByZWN0YW5nbGUgdGhlIHJlY3RhbmdsZSB0byBjb252ZXJ0XG4gICAgICogQHJldHVybnMge09wZW5TZWFkcmFnb24uUmVjdH0gdGhlIGNvbnZlcnRlZCByZWN0YW5nbGVcbiAgICAgKi9cbiAgICB2aWV3ZXJFbGVtZW50VG9WaWV3cG9ydFJlY3RhbmdsZTogZnVuY3Rpb24ocmVjdGFuZ2xlKSB7XG4gICAgICAgIHJldHVybiAkLlJlY3QuZnJvbVN1bW1pdHMoXG4gICAgICAgICAgICB0aGlzLnBvaW50RnJvbVBpeGVsKHJlY3RhbmdsZS5nZXRUb3BMZWZ0KCksIHRydWUpLFxuICAgICAgICAgICAgdGhpcy5wb2ludEZyb21QaXhlbChyZWN0YW5nbGUuZ2V0VG9wUmlnaHQoKSwgdHJ1ZSksXG4gICAgICAgICAgICB0aGlzLnBvaW50RnJvbVBpeGVsKHJlY3RhbmdsZS5nZXRCb3R0b21MZWZ0KCksIHRydWUpXG4gICAgICAgICk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENvbnZlcnQgYSByZWN0YW5nbGUgaW4gdmlld3BvcnQgY29vcmRpbmF0ZXMgdG8gcGl4ZWwgY29vcmRpbmF0ZXMgcmVsYXRpdmVcbiAgICAgKiB0byB0aGUgdmlld2VyIGVsZW1lbnQuXG4gICAgICogQHBhcmFtIHtPcGVuU2VhZHJhZ29uLlJlY3R9IHJlY3RhbmdsZSB0aGUgcmVjdGFuZ2xlIHRvIGNvbnZlcnRcbiAgICAgKiBAcmV0dXJucyB7T3BlblNlYWRyYWdvbi5SZWN0fSB0aGUgY29udmVydGVkIHJlY3RhbmdsZVxuICAgICAqL1xuICAgIHZpZXdwb3J0VG9WaWV3ZXJFbGVtZW50UmVjdGFuZ2xlOiBmdW5jdGlvbihyZWN0YW5nbGUpIHtcbiAgICAgICAgcmV0dXJuICQuUmVjdC5mcm9tU3VtbWl0cyhcbiAgICAgICAgICAgIHRoaXMucGl4ZWxGcm9tUG9pbnQocmVjdGFuZ2xlLmdldFRvcExlZnQoKSwgdHJ1ZSksXG4gICAgICAgICAgICB0aGlzLnBpeGVsRnJvbVBvaW50KHJlY3RhbmdsZS5nZXRUb3BSaWdodCgpLCB0cnVlKSxcbiAgICAgICAgICAgIHRoaXMucGl4ZWxGcm9tUG9pbnQocmVjdGFuZ2xlLmdldEJvdHRvbUxlZnQoKSwgdHJ1ZSlcbiAgICAgICAgKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ29udmVydCBwaXhlbCBjb29yZGluYXRlcyByZWxhdGl2ZSB0byB0aGUgd2luZG93IHRvIHZpZXdwb3J0IGNvb3JkaW5hdGVzLlxuICAgICAqIEBwYXJhbSB7T3BlblNlYWRyYWdvbi5Qb2ludH0gcGl4ZWxcbiAgICAgKiBAcmV0dXJucyB7T3BlblNlYWRyYWdvbi5Qb2ludH1cbiAgICAgKi9cbiAgICB3aW5kb3dUb1ZpZXdwb3J0Q29vcmRpbmF0ZXM6IGZ1bmN0aW9uKHBpeGVsKSB7XG4gICAgICAgICQuY29uc29sZS5hc3NlcnQodGhpcy52aWV3ZXIsXG4gICAgICAgICAgICBcIltWaWV3cG9ydC53aW5kb3dUb1ZpZXdwb3J0Q29vcmRpbmF0ZXNdIHRoZSB2aWV3cG9ydCBtdXN0IGhhdmUgYSB2aWV3ZXIuXCIpO1xuICAgICAgICB2YXIgdmlld2VyQ29vcmRpbmF0ZXMgPSBwaXhlbC5taW51cyhcbiAgICAgICAgICAgICAgICAkLmdldEVsZW1lbnRQb3NpdGlvbih0aGlzLnZpZXdlci5lbGVtZW50KSk7XG4gICAgICAgIHJldHVybiB0aGlzLnZpZXdlckVsZW1lbnRUb1ZpZXdwb3J0Q29vcmRpbmF0ZXModmlld2VyQ29vcmRpbmF0ZXMpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0IHZpZXdwb3J0IGNvb3JkaW5hdGVzIHRvIHBpeGVsIGNvb3JkaW5hdGVzIHJlbGF0aXZlIHRvIHRoZSB3aW5kb3cuXG4gICAgICogQHBhcmFtIHtPcGVuU2VhZHJhZ29uLlBvaW50fSBwb2ludFxuICAgICAqIEByZXR1cm5zIHtPcGVuU2VhZHJhZ29uLlBvaW50fVxuICAgICAqL1xuICAgIHZpZXdwb3J0VG9XaW5kb3dDb29yZGluYXRlczogZnVuY3Rpb24ocG9pbnQpIHtcbiAgICAgICAgJC5jb25zb2xlLmFzc2VydCh0aGlzLnZpZXdlcixcbiAgICAgICAgICAgIFwiW1ZpZXdwb3J0LnZpZXdwb3J0VG9XaW5kb3dDb29yZGluYXRlc10gdGhlIHZpZXdwb3J0IG11c3QgaGF2ZSBhIHZpZXdlci5cIik7XG4gICAgICAgIHZhciB2aWV3ZXJDb29yZGluYXRlcyA9IHRoaXMudmlld3BvcnRUb1ZpZXdlckVsZW1lbnRDb29yZGluYXRlcyhwb2ludCk7XG4gICAgICAgIHJldHVybiB2aWV3ZXJDb29yZGluYXRlcy5wbHVzKFxuICAgICAgICAgICAgICAgICQuZ2V0RWxlbWVudFBvc2l0aW9uKHRoaXMudmlld2VyLmVsZW1lbnQpKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ29udmVydCBhIHZpZXdwb3J0IHpvb20gdG8gYW4gaW1hZ2Ugem9vbS5cbiAgICAgKiBJbWFnZSB6b29tOiByYXRpbyBvZiB0aGUgb3JpZ2luYWwgaW1hZ2Ugc2l6ZSB0byBkaXNwbGF5ZWQgaW1hZ2Ugc2l6ZS5cbiAgICAgKiAxIG1lYW5zIG9yaWdpbmFsIGltYWdlIHNpemUsIDAuNSBoYWxmIHNpemUuLi5cbiAgICAgKiBWaWV3cG9ydCB6b29tOiByYXRpbyBvZiB0aGUgZGlzcGxheWVkIGltYWdlJ3Mgd2lkdGggdG8gdmlld3BvcnQncyB3aWR0aC5cbiAgICAgKiAxIG1lYW5zIGlkZW50aWNhbCB3aWR0aCwgMiBtZWFucyBpbWFnZSdzIHdpZHRoIGlzIHR3aWNlIHRoZSB2aWV3cG9ydCdzIHdpZHRoLi4uXG4gICAgICogTm90ZTogbm90IGFjY3VyYXRlIHdpdGggbXVsdGktaW1hZ2UuXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHZpZXdwb3J0Wm9vbSBUaGUgdmlld3BvcnQgem9vbVxuICAgICAqIHRhcmdldCB6b29tLlxuICAgICAqIEByZXR1cm5zIHtOdW1iZXJ9IGltYWdlWm9vbSBUaGUgaW1hZ2Ugem9vbVxuICAgICAqL1xuICAgIHZpZXdwb3J0VG9JbWFnZVpvb206IGZ1bmN0aW9uKHZpZXdwb3J0Wm9vbSkge1xuICAgICAgICBpZiAodGhpcy52aWV3ZXIpIHtcbiAgICAgICAgICAgIHZhciBjb3VudCA9IHRoaXMudmlld2VyLndvcmxkLmdldEl0ZW1Db3VudCgpO1xuICAgICAgICAgICAgaWYgKGNvdW50ID4gMSkge1xuICAgICAgICAgICAgICAgICQuY29uc29sZS5lcnJvcignW1ZpZXdwb3J0LnZpZXdwb3J0VG9JbWFnZVpvb21dIGlzIG5vdCAnICtcbiAgICAgICAgICAgICAgICAgICAgJ2FjY3VyYXRlIHdpdGggbXVsdGktaW1hZ2UuJyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNvdW50ID09PSAxKSB7XG4gICAgICAgICAgICAgICAgLy8gSXQgaXMgYmV0dGVyIHRvIHVzZSBUaWxlZEltYWdlLnZpZXdwb3J0VG9JbWFnZVpvb21cbiAgICAgICAgICAgICAgICAvLyBiZWNhdXNlIHRoaXMuX2NvbnRlbnRCb3VuZHNOb1JvdGF0ZSBjYW4gbm90IGJlIHJlbGllZCBvblxuICAgICAgICAgICAgICAgIC8vIHdpdGggY2xpcHBpbmcuXG4gICAgICAgICAgICAgICAgdmFyIGl0ZW0gPSB0aGlzLnZpZXdlci53b3JsZC5nZXRJdGVtQXQoMCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0udmlld3BvcnRUb0ltYWdlWm9vbSh2aWV3cG9ydFpvb20pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGltYWdlV2lkdGggPSB0aGlzLl9jb250ZW50U2l6ZU5vUm90YXRlLng7XG4gICAgICAgIHZhciBjb250YWluZXJXaWR0aCA9IHRoaXMuX2NvbnRhaW5lcklubmVyU2l6ZS54O1xuICAgICAgICB2YXIgc2NhbGUgPSB0aGlzLl9jb250ZW50Qm91bmRzTm9Sb3RhdGUud2lkdGg7XG4gICAgICAgIHZhciB2aWV3cG9ydFRvSW1hZ2Vab29tUmF0aW8gPSAoY29udGFpbmVyV2lkdGggLyBpbWFnZVdpZHRoKSAqIHNjYWxlO1xuICAgICAgICByZXR1cm4gdmlld3BvcnRab29tICogdmlld3BvcnRUb0ltYWdlWm9vbVJhdGlvO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0IGFuIGltYWdlIHpvb20gdG8gYSB2aWV3cG9ydCB6b29tLlxuICAgICAqIEltYWdlIHpvb206IHJhdGlvIG9mIHRoZSBvcmlnaW5hbCBpbWFnZSBzaXplIHRvIGRpc3BsYXllZCBpbWFnZSBzaXplLlxuICAgICAqIDEgbWVhbnMgb3JpZ2luYWwgaW1hZ2Ugc2l6ZSwgMC41IGhhbGYgc2l6ZS4uLlxuICAgICAqIFZpZXdwb3J0IHpvb206IHJhdGlvIG9mIHRoZSBkaXNwbGF5ZWQgaW1hZ2UncyB3aWR0aCB0byB2aWV3cG9ydCdzIHdpZHRoLlxuICAgICAqIDEgbWVhbnMgaWRlbnRpY2FsIHdpZHRoLCAyIG1lYW5zIGltYWdlJ3Mgd2lkdGggaXMgdHdpY2UgdGhlIHZpZXdwb3J0J3Mgd2lkdGguLi5cbiAgICAgKiBOb3RlOiBub3QgYWNjdXJhdGUgd2l0aCBtdWx0aS1pbWFnZS5cbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gaW1hZ2Vab29tIFRoZSBpbWFnZSB6b29tXG4gICAgICogdGFyZ2V0IHpvb20uXG4gICAgICogQHJldHVybnMge051bWJlcn0gdmlld3BvcnRab29tIFRoZSB2aWV3cG9ydCB6b29tXG4gICAgICovXG4gICAgaW1hZ2VUb1ZpZXdwb3J0Wm9vbTogZnVuY3Rpb24oaW1hZ2Vab29tKSB7XG4gICAgICAgIGlmICh0aGlzLnZpZXdlcikge1xuICAgICAgICAgICAgdmFyIGNvdW50ID0gdGhpcy52aWV3ZXIud29ybGQuZ2V0SXRlbUNvdW50KCk7XG4gICAgICAgICAgICBpZiAoY291bnQgPiAxKSB7XG4gICAgICAgICAgICAgICAgJC5jb25zb2xlLmVycm9yKCdbVmlld3BvcnQuaW1hZ2VUb1ZpZXdwb3J0Wm9vbV0gaXMgbm90IGFjY3VyYXRlICcgK1xuICAgICAgICAgICAgICAgICAgICAnd2l0aCBtdWx0aS1pbWFnZS4nKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY291bnQgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAvLyBJdCBpcyBiZXR0ZXIgdG8gdXNlIFRpbGVkSW1hZ2UuaW1hZ2VUb1ZpZXdwb3J0Wm9vbVxuICAgICAgICAgICAgICAgIC8vIGJlY2F1c2UgdGhpcy5fY29udGVudEJvdW5kc05vUm90YXRlIGNhbiBub3QgYmUgcmVsaWVkIG9uXG4gICAgICAgICAgICAgICAgLy8gd2l0aCBjbGlwcGluZy5cbiAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IHRoaXMudmlld2VyLndvcmxkLmdldEl0ZW1BdCgwKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS5pbWFnZVRvVmlld3BvcnRab29tKGltYWdlWm9vbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgaW1hZ2VXaWR0aCA9IHRoaXMuX2NvbnRlbnRTaXplTm9Sb3RhdGUueDtcbiAgICAgICAgdmFyIGNvbnRhaW5lcldpZHRoID0gdGhpcy5fY29udGFpbmVySW5uZXJTaXplLng7XG4gICAgICAgIHZhciBzY2FsZSA9IHRoaXMuX2NvbnRlbnRCb3VuZHNOb1JvdGF0ZS53aWR0aDtcbiAgICAgICAgdmFyIHZpZXdwb3J0VG9JbWFnZVpvb21SYXRpbyA9IChpbWFnZVdpZHRoIC8gY29udGFpbmVyV2lkdGgpIC8gc2NhbGU7XG4gICAgICAgIHJldHVybiBpbWFnZVpvb20gKiB2aWV3cG9ydFRvSW1hZ2Vab29tUmF0aW87XG4gICAgfVxufTtcblxufSggT3BlblNlYWRyYWdvbiApKTtcblxuLypcbiAqIE9wZW5TZWFkcmFnb24gLSBUaWxlZEltYWdlXG4gKlxuICogQ29weXJpZ2h0IChDKSAyMDA5IENvZGVQbGV4IEZvdW5kYXRpb25cbiAqIENvcHlyaWdodCAoQykgMjAxMC0yMDEzIE9wZW5TZWFkcmFnb24gY29udHJpYnV0b3JzXG4gKlxuICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlXG4gKiBtZXQ6XG4gKlxuICogLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4gKiAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4gKlxuICogLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodFxuICogICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlXG4gKiAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uXG4gKlxuICogLSBOZWl0aGVyIHRoZSBuYW1lIG9mIENvZGVQbGV4IEZvdW5kYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHNcbiAqICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb21cbiAqICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbiAqXG4gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTXG4gKiBcIkFTIElTXCIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UXG4gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1JcbiAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVFxuICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsXG4gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURURcbiAqIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1JcbiAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0ZcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HXG4gKiBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVNcbiAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICovXG5cbihmdW5jdGlvbiggJCApe1xuXG4vKipcbiAqIFlvdSBzaG91bGRuJ3QgaGF2ZSB0byBjcmVhdGUgYSBUaWxlZEltYWdlIGRpcmVjdGx5OyB1c2Uge0BsaW5rIE9wZW5TZWFkcmFnb24uVmlld2VyI29wZW59XG4gKiBvciB7QGxpbmsgT3BlblNlYWRyYWdvbi5WaWV3ZXIjYWRkVGlsZWRJbWFnZX0gaW5zdGVhZC5cbiAqIEBjbGFzcyBUaWxlZEltYWdlXG4gKiBAbWVtYmVyb2YgT3BlblNlYWRyYWdvblxuICogQGV4dGVuZHMgT3BlblNlYWRyYWdvbi5FdmVudFNvdXJjZVxuICogQGNsYXNzZGVzYyBIYW5kbGVzIHJlbmRlcmluZyBvZiB0aWxlcyBmb3IgYW4ge0BsaW5rIE9wZW5TZWFkcmFnb24uVmlld2VyfS5cbiAqIEEgbmV3IGluc3RhbmNlIGlzIGNyZWF0ZWQgZm9yIGVhY2ggVGlsZVNvdXJjZSBvcGVuZWQuXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIENvbmZpZ3VyYXRpb24gZm9yIHRoaXMgVGlsZWRJbWFnZS5cbiAqIEBwYXJhbSB7T3BlblNlYWRyYWdvbi5UaWxlU291cmNlfSBvcHRpb25zLnNvdXJjZSAtIFRoZSBUaWxlU291cmNlIHRoYXQgZGVmaW5lcyB0aGlzIFRpbGVkSW1hZ2UuXG4gKiBAcGFyYW0ge09wZW5TZWFkcmFnb24uVmlld2VyfSBvcHRpb25zLnZpZXdlciAtIFRoZSBWaWV3ZXIgdGhhdCBvd25zIHRoaXMgVGlsZWRJbWFnZS5cbiAqIEBwYXJhbSB7T3BlblNlYWRyYWdvbi5UaWxlQ2FjaGV9IG9wdGlvbnMudGlsZUNhY2hlIC0gVGhlIFRpbGVDYWNoZSBmb3IgdGhpcyBUaWxlZEltYWdlIHRvIHVzZS5cbiAqIEBwYXJhbSB7T3BlblNlYWRyYWdvbi5EcmF3ZXJ9IG9wdGlvbnMuZHJhd2VyIC0gVGhlIERyYXdlciBmb3IgdGhpcyBUaWxlZEltYWdlIHRvIGRyYXcgb250by5cbiAqIEBwYXJhbSB7T3BlblNlYWRyYWdvbi5JbWFnZUxvYWRlcn0gb3B0aW9ucy5pbWFnZUxvYWRlciAtIFRoZSBJbWFnZUxvYWRlciBmb3IgdGhpcyBUaWxlZEltYWdlIHRvIHVzZS5cbiAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy54PTBdIC0gTGVmdCBwb3NpdGlvbiwgaW4gdmlld3BvcnQgY29vcmRpbmF0ZXMuXG4gKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMueT0wXSAtIFRvcCBwb3NpdGlvbiwgaW4gdmlld3BvcnQgY29vcmRpbmF0ZXMuXG4gKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMud2lkdGg9MV0gLSBXaWR0aCwgaW4gdmlld3BvcnQgY29vcmRpbmF0ZXMuXG4gKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuaGVpZ2h0XSAtIEhlaWdodCwgaW4gdmlld3BvcnQgY29vcmRpbmF0ZXMuXG4gKiBAcGFyYW0ge09wZW5TZWFkcmFnb24uUmVjdH0gW29wdGlvbnMuZml0Qm91bmRzXSBUaGUgYm91bmRzIGluIHZpZXdwb3J0IGNvb3JkaW5hdGVzXG4gKiB0byBmaXQgdGhlIGltYWdlIGludG8uIElmIHNwZWNpZmllZCwgeCwgeSwgd2lkdGggYW5kIGhlaWdodCBnZXQgaWdub3JlZC5cbiAqIEBwYXJhbSB7T3BlblNlYWRyYWdvbi5QbGFjZW1lbnR9IFtvcHRpb25zLmZpdEJvdW5kc1BsYWNlbWVudD1PcGVuU2VhZHJhZ29uLlBsYWNlbWVudC5DRU5URVJdXG4gKiBIb3cgdG8gYW5jaG9yIHRoZSBpbWFnZSBpbiB0aGUgYm91bmRzIGlmIG9wdGlvbnMuZml0Qm91bmRzIGlzIHNldC5cbiAqIEBwYXJhbSB7T3BlblNlYWRyYWdvbi5SZWN0fSBbb3B0aW9ucy5jbGlwXSAtIEFuIGFyZWEsIGluIGltYWdlIHBpeGVscywgdG8gY2xpcCB0b1xuICogKHBvcnRpb25zIG9mIHRoZSBpbWFnZSBvdXRzaWRlIG9mIHRoaXMgYXJlYSB3aWxsIG5vdCBiZSB2aXNpYmxlKS4gT25seSB3b3JrcyBvblxuICogYnJvd3NlcnMgdGhhdCBzdXBwb3J0IHRoZSBIVE1MNSBjYW52YXMuXG4gKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuc3ByaW5nU3RpZmZuZXNzXSAtIFNlZSB7QGxpbmsgT3BlblNlYWRyYWdvbi5PcHRpb25zfS5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuYW5pbWF0aW9uVGltZV0gLSBTZWUge0BsaW5rIE9wZW5TZWFkcmFnb24uT3B0aW9uc30uXG4gKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMubWluWm9vbUltYWdlUmF0aW9dIC0gU2VlIHtAbGluayBPcGVuU2VhZHJhZ29uLk9wdGlvbnN9LlxuICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy53cmFwSG9yaXpvbnRhbF0gLSBTZWUge0BsaW5rIE9wZW5TZWFkcmFnb24uT3B0aW9uc30uXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLndyYXBWZXJ0aWNhbF0gLSBTZWUge0BsaW5rIE9wZW5TZWFkcmFnb24uT3B0aW9uc30uXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmltbWVkaWF0ZVJlbmRlcl0gLSBTZWUge0BsaW5rIE9wZW5TZWFkcmFnb24uT3B0aW9uc30uXG4gKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuYmxlbmRUaW1lXSAtIFNlZSB7QGxpbmsgT3BlblNlYWRyYWdvbi5PcHRpb25zfS5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuYWx3YXlzQmxlbmRdIC0gU2VlIHtAbGluayBPcGVuU2VhZHJhZ29uLk9wdGlvbnN9LlxuICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLm1pblBpeGVsUmF0aW9dIC0gU2VlIHtAbGluayBPcGVuU2VhZHJhZ29uLk9wdGlvbnN9LlxuICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLnNtb290aFRpbGVFZGdlc01pblpvb21dIC0gU2VlIHtAbGluayBPcGVuU2VhZHJhZ29uLk9wdGlvbnN9LlxuICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5pT1NEZXZpY2VdIC0gU2VlIHtAbGluayBPcGVuU2VhZHJhZ29uLk9wdGlvbnN9LlxuICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLm9wYWNpdHk9MV0gLSBPcGFjaXR5IHRoZSB0aWxlZCBpbWFnZSBzaG91bGQgYmUgZHJhd24gYXQuXG4gKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuY29tcG9zaXRlT3BlcmF0aW9uXSAtIEhvdyB0aGUgaW1hZ2UgaXMgY29tcG9zaXRlZCBvbnRvIG90aGVyIGltYWdlczsgc2VlIGNvbXBvc2l0ZU9wZXJhdGlvbiBpbiB7QGxpbmsgT3BlblNlYWRyYWdvbi5PcHRpb25zfSBmb3IgcG9zc2libGUgdmFsdWVzLlxuICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5kZWJ1Z01vZGVdIC0gU2VlIHtAbGluayBPcGVuU2VhZHJhZ29uLk9wdGlvbnN9LlxuICogQHBhcmFtIHtTdHJpbmd8Q2FudmFzR3JhZGllbnR8Q2FudmFzUGF0dGVybnxGdW5jdGlvbn0gW29wdGlvbnMucGxhY2Vob2xkZXJGaWxsU3R5bGVdIC0gU2VlIHtAbGluayBPcGVuU2VhZHJhZ29uLk9wdGlvbnN9LlxuICogQHBhcmFtIHtTdHJpbmd8Qm9vbGVhbn0gW29wdGlvbnMuY3Jvc3NPcmlnaW5Qb2xpY3ldIC0gU2VlIHtAbGluayBPcGVuU2VhZHJhZ29uLk9wdGlvbnN9LlxuICovXG4kLlRpbGVkSW1hZ2UgPSBmdW5jdGlvbiggb3B0aW9ucyApIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgJC5jb25zb2xlLmFzc2VydCggb3B0aW9ucy50aWxlQ2FjaGUsIFwiW1RpbGVkSW1hZ2VdIG9wdGlvbnMudGlsZUNhY2hlIGlzIHJlcXVpcmVkXCIgKTtcbiAgICAkLmNvbnNvbGUuYXNzZXJ0KCBvcHRpb25zLmRyYXdlciwgXCJbVGlsZWRJbWFnZV0gb3B0aW9ucy5kcmF3ZXIgaXMgcmVxdWlyZWRcIiApO1xuICAgICQuY29uc29sZS5hc3NlcnQoIG9wdGlvbnMudmlld2VyLCBcIltUaWxlZEltYWdlXSBvcHRpb25zLnZpZXdlciBpcyByZXF1aXJlZFwiICk7XG4gICAgJC5jb25zb2xlLmFzc2VydCggb3B0aW9ucy5pbWFnZUxvYWRlciwgXCJbVGlsZWRJbWFnZV0gb3B0aW9ucy5pbWFnZUxvYWRlciBpcyByZXF1aXJlZFwiICk7XG4gICAgJC5jb25zb2xlLmFzc2VydCggb3B0aW9ucy5zb3VyY2UsIFwiW1RpbGVkSW1hZ2VdIG9wdGlvbnMuc291cmNlIGlzIHJlcXVpcmVkXCIgKTtcbiAgICAkLmNvbnNvbGUuYXNzZXJ0KCFvcHRpb25zLmNsaXAgfHwgb3B0aW9ucy5jbGlwIGluc3RhbmNlb2YgJC5SZWN0LFxuICAgICAgICBcIltUaWxlZEltYWdlXSBvcHRpb25zLmNsaXAgbXVzdCBiZSBhbiBPcGVuU2VhZHJhZ29uLlJlY3QgaWYgcHJlc2VudFwiKTtcblxuICAgICQuRXZlbnRTb3VyY2UuY2FsbCggdGhpcyApO1xuXG4gICAgdGhpcy5fdGlsZUNhY2hlID0gb3B0aW9ucy50aWxlQ2FjaGU7XG4gICAgZGVsZXRlIG9wdGlvbnMudGlsZUNhY2hlO1xuXG4gICAgdGhpcy5fZHJhd2VyID0gb3B0aW9ucy5kcmF3ZXI7XG4gICAgZGVsZXRlIG9wdGlvbnMuZHJhd2VyO1xuXG4gICAgdGhpcy5faW1hZ2VMb2FkZXIgPSBvcHRpb25zLmltYWdlTG9hZGVyO1xuICAgIGRlbGV0ZSBvcHRpb25zLmltYWdlTG9hZGVyO1xuXG4gICAgaWYgKG9wdGlvbnMuY2xpcCBpbnN0YW5jZW9mICQuUmVjdCkge1xuICAgICAgICB0aGlzLl9jbGlwID0gb3B0aW9ucy5jbGlwLmNsb25lKCk7XG4gICAgfVxuXG4gICAgZGVsZXRlIG9wdGlvbnMuY2xpcDtcblxuICAgIHZhciB4ID0gb3B0aW9ucy54IHx8IDA7XG4gICAgZGVsZXRlIG9wdGlvbnMueDtcbiAgICB2YXIgeSA9IG9wdGlvbnMueSB8fCAwO1xuICAgIGRlbGV0ZSBvcHRpb25zLnk7XG5cbiAgICAvLyBSYXRpbyBvZiB6b29tYWJsZSBpbWFnZSBoZWlnaHQgdG8gd2lkdGguXG4gICAgdGhpcy5ub3JtSGVpZ2h0ID0gb3B0aW9ucy5zb3VyY2UuZGltZW5zaW9ucy55IC8gb3B0aW9ucy5zb3VyY2UuZGltZW5zaW9ucy54O1xuICAgIHRoaXMuY29udGVudEFzcGVjdFggPSBvcHRpb25zLnNvdXJjZS5kaW1lbnNpb25zLnggLyBvcHRpb25zLnNvdXJjZS5kaW1lbnNpb25zLnk7XG5cbiAgICB2YXIgc2NhbGUgPSAxO1xuICAgIGlmICggb3B0aW9ucy53aWR0aCApIHtcbiAgICAgICAgc2NhbGUgPSBvcHRpb25zLndpZHRoO1xuICAgICAgICBkZWxldGUgb3B0aW9ucy53aWR0aDtcblxuICAgICAgICBpZiAoIG9wdGlvbnMuaGVpZ2h0ICkge1xuICAgICAgICAgICAgJC5jb25zb2xlLmVycm9yKCBcInNwZWNpZnlpbmcgYm90aCB3aWR0aCBhbmQgaGVpZ2h0IHRvIGEgdGlsZWRJbWFnZSBpcyBub3Qgc3VwcG9ydGVkXCIgKTtcbiAgICAgICAgICAgIGRlbGV0ZSBvcHRpb25zLmhlaWdodDtcbiAgICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIG9wdGlvbnMuaGVpZ2h0ICkge1xuICAgICAgICBzY2FsZSA9IG9wdGlvbnMuaGVpZ2h0IC8gdGhpcy5ub3JtSGVpZ2h0O1xuICAgICAgICBkZWxldGUgb3B0aW9ucy5oZWlnaHQ7XG4gICAgfVxuXG4gICAgdmFyIGZpdEJvdW5kcyA9IG9wdGlvbnMuZml0Qm91bmRzO1xuICAgIGRlbGV0ZSBvcHRpb25zLmZpdEJvdW5kcztcbiAgICB2YXIgZml0Qm91bmRzUGxhY2VtZW50ID0gb3B0aW9ucy5maXRCb3VuZHNQbGFjZW1lbnQgfHwgT3BlblNlYWRyYWdvbi5QbGFjZW1lbnQuQ0VOVEVSO1xuICAgIGRlbGV0ZSBvcHRpb25zLmZpdEJvdW5kc1BsYWNlbWVudDtcblxuICAgICQuZXh0ZW5kKCB0cnVlLCB0aGlzLCB7XG5cbiAgICAgICAgLy9pbnRlcm5hbCBzdGF0ZSBwcm9wZXJ0aWVzXG4gICAgICAgIHZpZXdlcjogICAgICAgICBudWxsLFxuICAgICAgICB0aWxlc01hdHJpeDogICAge30sICAgIC8vIEEgJzNkJyBkaWN0aW9uYXJ5IFtsZXZlbF1beF1beV0gLS0+IFRpbGUuXG4gICAgICAgIGNvdmVyYWdlOiAgICAgICB7fSwgICAgLy8gQSAnM2QnIGRpY3Rpb25hcnkgW2xldmVsXVt4XVt5XSAtLT4gQm9vbGVhbi5cbiAgICAgICAgbGFzdERyYXduOiAgICAgIFtdLCAgICAvLyBBbiB1bm9yZGVyZWQgbGlzdCBvZiBUaWxlcyBkcmF3biBsYXN0IGZyYW1lLlxuICAgICAgICBsYXN0UmVzZXRUaW1lOiAgMCwgICAgIC8vIExhc3QgdGltZSBmb3Igd2hpY2ggdGhlIHRpbGVkSW1hZ2Ugd2FzIHJlc2V0LlxuICAgICAgICBfbWlkRHJhdzogICAgICAgZmFsc2UsIC8vIElzIHRoZSB0aWxlZEltYWdlIGN1cnJlbnRseSB1cGRhdGluZyB0aGUgdmlld3BvcnQ/XG4gICAgICAgIF9uZWVkc0RyYXc6ICAgICB0cnVlLCAgLy8gRG9lcyB0aGUgdGlsZWRJbWFnZSBuZWVkIHRvIHVwZGF0ZSB0aGUgdmlld3BvcnQgYWdhaW4/XG4gICAgICAgIF9oYXNPcGFxdWVUaWxlOiBmYWxzZSwgIC8vIERvIHdlIGhhdmUgZXZlbiBvbmUgZnVsbHkgb3BhcXVlIHRpbGU/XG4gICAgICAgIC8vY29uZmlndXJhYmxlIHNldHRpbmdzXG4gICAgICAgIHNwcmluZ1N0aWZmbmVzczogICAgICAgICQuREVGQVVMVF9TRVRUSU5HUy5zcHJpbmdTdGlmZm5lc3MsXG4gICAgICAgIGFuaW1hdGlvblRpbWU6ICAgICAgICAgICQuREVGQVVMVF9TRVRUSU5HUy5hbmltYXRpb25UaW1lLFxuICAgICAgICBtaW5ab29tSW1hZ2VSYXRpbzogICAgICAkLkRFRkFVTFRfU0VUVElOR1MubWluWm9vbUltYWdlUmF0aW8sXG4gICAgICAgIHdyYXBIb3Jpem9udGFsOiAgICAgICAgICQuREVGQVVMVF9TRVRUSU5HUy53cmFwSG9yaXpvbnRhbCxcbiAgICAgICAgd3JhcFZlcnRpY2FsOiAgICAgICAgICAgJC5ERUZBVUxUX1NFVFRJTkdTLndyYXBWZXJ0aWNhbCxcbiAgICAgICAgaW1tZWRpYXRlUmVuZGVyOiAgICAgICAgJC5ERUZBVUxUX1NFVFRJTkdTLmltbWVkaWF0ZVJlbmRlcixcbiAgICAgICAgYmxlbmRUaW1lOiAgICAgICAgICAgICAgJC5ERUZBVUxUX1NFVFRJTkdTLmJsZW5kVGltZSxcbiAgICAgICAgYWx3YXlzQmxlbmQ6ICAgICAgICAgICAgJC5ERUZBVUxUX1NFVFRJTkdTLmFsd2F5c0JsZW5kLFxuICAgICAgICBtaW5QaXhlbFJhdGlvOiAgICAgICAgICAkLkRFRkFVTFRfU0VUVElOR1MubWluUGl4ZWxSYXRpbyxcbiAgICAgICAgc21vb3RoVGlsZUVkZ2VzTWluWm9vbTogJC5ERUZBVUxUX1NFVFRJTkdTLnNtb290aFRpbGVFZGdlc01pblpvb20sXG4gICAgICAgIGlPU0RldmljZTogICAgICAgICAgICAgICQuREVGQVVMVF9TRVRUSU5HUy5pT1NEZXZpY2UsXG4gICAgICAgIGRlYnVnTW9kZTogICAgICAgICAgICAgICQuREVGQVVMVF9TRVRUSU5HUy5kZWJ1Z01vZGUsXG4gICAgICAgIGNyb3NzT3JpZ2luUG9saWN5OiAgICAgICQuREVGQVVMVF9TRVRUSU5HUy5jcm9zc09yaWdpblBvbGljeSxcbiAgICAgICAgcGxhY2Vob2xkZXJGaWxsU3R5bGU6ICAgJC5ERUZBVUxUX1NFVFRJTkdTLnBsYWNlaG9sZGVyRmlsbFN0eWxlLFxuICAgICAgICBvcGFjaXR5OiAgICAgICAgICAgICAgICAkLkRFRkFVTFRfU0VUVElOR1Mub3BhY2l0eSxcbiAgICAgICAgY29tcG9zaXRlT3BlcmF0aW9uOiAgICAgJC5ERUZBVUxUX1NFVFRJTkdTLmNvbXBvc2l0ZU9wZXJhdGlvblxuXG4gICAgfSwgb3B0aW9ucyApO1xuXG4gICAgdGhpcy5feFNwcmluZyA9IG5ldyAkLlNwcmluZyh7XG4gICAgICAgIGluaXRpYWw6IHgsXG4gICAgICAgIHNwcmluZ1N0aWZmbmVzczogdGhpcy5zcHJpbmdTdGlmZm5lc3MsXG4gICAgICAgIGFuaW1hdGlvblRpbWU6IHRoaXMuYW5pbWF0aW9uVGltZVxuICAgIH0pO1xuXG4gICAgdGhpcy5feVNwcmluZyA9IG5ldyAkLlNwcmluZyh7XG4gICAgICAgIGluaXRpYWw6IHksXG4gICAgICAgIHNwcmluZ1N0aWZmbmVzczogdGhpcy5zcHJpbmdTdGlmZm5lc3MsXG4gICAgICAgIGFuaW1hdGlvblRpbWU6IHRoaXMuYW5pbWF0aW9uVGltZVxuICAgIH0pO1xuXG4gICAgdGhpcy5fc2NhbGVTcHJpbmcgPSBuZXcgJC5TcHJpbmcoe1xuICAgICAgICBpbml0aWFsOiBzY2FsZSxcbiAgICAgICAgc3ByaW5nU3RpZmZuZXNzOiB0aGlzLnNwcmluZ1N0aWZmbmVzcyxcbiAgICAgICAgYW5pbWF0aW9uVGltZTogdGhpcy5hbmltYXRpb25UaW1lXG4gICAgfSk7XG5cbiAgICB0aGlzLl91cGRhdGVGb3JTY2FsZSgpO1xuXG4gICAgaWYgKGZpdEJvdW5kcykge1xuICAgICAgICB0aGlzLmZpdEJvdW5kcyhmaXRCb3VuZHMsIGZpdEJvdW5kc1BsYWNlbWVudCwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgLy8gV2UgbmVlZCBhIGNhbGxiYWNrIHRvIGdpdmUgaW1hZ2UgbWFuaXB1bGF0aW9uIGEgY2hhbmNlIHRvIGhhcHBlblxuICAgIHRoaXMuX2RyYXdpbmdIYW5kbGVyID0gZnVuY3Rpb24oYXJncykge1xuICAgICAgLyoqXG4gICAgICAgKiBUaGlzIGV2ZW50IGlzIGZpcmVkIGp1c3QgYmVmb3JlIHRoZSB0aWxlIGlzIGRyYXduIGdpdmluZyB0aGUgYXBwbGljYXRpb24gYSBjaGFuY2UgdG8gYWx0ZXIgdGhlIGltYWdlLlxuICAgICAgICpcbiAgICAgICAqIE5PVEU6IFRoaXMgZXZlbnQgaXMgb25seSBmaXJlZCB3aGVuIHRoZSBkcmF3ZXIgaXMgdXNpbmcgYSAmbHQ7Y2FudmFzJmd0Oy5cbiAgICAgICAqXG4gICAgICAgKiBAZXZlbnQgdGlsZS1kcmF3aW5nXG4gICAgICAgKiBAbWVtYmVyb2YgT3BlblNlYWRyYWdvbi5WaWV3ZXJcbiAgICAgICAqIEB0eXBlIHtvYmplY3R9XG4gICAgICAgKiBAcHJvcGVydHkge09wZW5TZWFkcmFnb24uVmlld2VyfSBldmVudFNvdXJjZSAtIEEgcmVmZXJlbmNlIHRvIHRoZSBWaWV3ZXIgd2hpY2ggcmFpc2VkIHRoZSBldmVudC5cbiAgICAgICAqIEBwcm9wZXJ0eSB7T3BlblNlYWRyYWdvbi5UaWxlfSB0aWxlIC0gVGhlIFRpbGUgYmVpbmcgZHJhd24uXG4gICAgICAgKiBAcHJvcGVydHkge09wZW5TZWFkcmFnb24uVGlsZWRJbWFnZX0gdGlsZWRJbWFnZSAtIFdoaWNoIFRpbGVkSW1hZ2UgaXMgYmVpbmcgZHJhd24uXG4gICAgICAgKiBAcHJvcGVydHkge09wZW5TZWFkcmFnb24uVGlsZX0gY29udGV4dCAtIFRoZSBIVE1MIGNhbnZhcyBjb250ZXh0IGJlaW5nIGRyYXduIGludG8uXG4gICAgICAgKiBAcHJvcGVydHkge09wZW5TZWFkcmFnb24uVGlsZX0gcmVuZGVyZWQgLSBUaGUgSFRNTCBjYW52YXMgY29udGV4dCBjb250YWluaW5nIHRoZSB0aWxlIGltYWdlcnkuXG4gICAgICAgKiBAcHJvcGVydHkgez9PYmplY3R9IHVzZXJEYXRhIC0gQXJiaXRyYXJ5IHN1YnNjcmliZXItZGVmaW5lZCBvYmplY3QuXG4gICAgICAgKi9cbiAgICAgICAgX3RoaXMudmlld2VyLnJhaXNlRXZlbnQoJ3RpbGUtZHJhd2luZycsICQuZXh0ZW5kKHtcbiAgICAgICAgICAgIHRpbGVkSW1hZ2U6IF90aGlzXG4gICAgICAgIH0sIGFyZ3MpKTtcbiAgICB9O1xufTtcblxuJC5leHRlbmQoJC5UaWxlZEltYWdlLnByb3RvdHlwZSwgJC5FdmVudFNvdXJjZS5wcm90b3R5cGUsIC8qKiBAbGVuZHMgT3BlblNlYWRyYWdvbi5UaWxlZEltYWdlLnByb3RvdHlwZSAqL3tcbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gV2hldGhlciB0aGUgVGlsZWRJbWFnZSBuZWVkcyB0byBiZSBkcmF3bi5cbiAgICAgKi9cbiAgICBuZWVkc0RyYXc6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbmVlZHNEcmF3O1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDbGVhcnMgYWxsIHRpbGVzIGFuZCB0cmlnZ2VycyBhbiB1cGRhdGUgb24gdGhlIG5leHQgY2FsbCB0b1xuICAgICAqIHtAbGluayBPcGVuU2VhZHJhZ29uLlRpbGVkSW1hZ2UjdXBkYXRlfS5cbiAgICAgKi9cbiAgICByZXNldDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMuX3RpbGVDYWNoZS5jbGVhclRpbGVzRm9yKHRoaXMpO1xuICAgICAgICB0aGlzLmxhc3RSZXNldFRpbWUgPSAkLm5vdygpO1xuICAgICAgICB0aGlzLl9uZWVkc0RyYXcgPSB0cnVlO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIHRoZSBUaWxlZEltYWdlJ3MgYm91bmRzLCBhbmltYXRpbmcgaWYgbmVlZGVkLlxuICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBXaGV0aGVyIHRoZSBUaWxlZEltYWdlIGFuaW1hdGVkLlxuICAgICAqL1xuICAgIHVwZGF0ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBvbGRYID0gdGhpcy5feFNwcmluZy5jdXJyZW50LnZhbHVlO1xuICAgICAgICB2YXIgb2xkWSA9IHRoaXMuX3lTcHJpbmcuY3VycmVudC52YWx1ZTtcbiAgICAgICAgdmFyIG9sZFNjYWxlID0gdGhpcy5fc2NhbGVTcHJpbmcuY3VycmVudC52YWx1ZTtcblxuICAgICAgICB0aGlzLl94U3ByaW5nLnVwZGF0ZSgpO1xuICAgICAgICB0aGlzLl95U3ByaW5nLnVwZGF0ZSgpO1xuICAgICAgICB0aGlzLl9zY2FsZVNwcmluZy51cGRhdGUoKTtcblxuICAgICAgICBpZiAodGhpcy5feFNwcmluZy5jdXJyZW50LnZhbHVlICE9PSBvbGRYIHx8IHRoaXMuX3lTcHJpbmcuY3VycmVudC52YWx1ZSAhPT0gb2xkWSB8fFxuICAgICAgICAgICAgICAgIHRoaXMuX3NjYWxlU3ByaW5nLmN1cnJlbnQudmFsdWUgIT09IG9sZFNjYWxlKSB7XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVGb3JTY2FsZSgpO1xuICAgICAgICAgICAgdGhpcy5fbmVlZHNEcmF3ID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBEcmF3cyB0aGUgVGlsZWRJbWFnZSB0byBpdHMgRHJhd2VyLlxuICAgICAqL1xuICAgIGRyYXc6IGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAodGhpcy5vcGFjaXR5ICE9PSAwKSB7XG4gICAgICAgICAgICB0aGlzLl9taWREcmF3ID0gdHJ1ZTtcbiAgICAgICAgICAgIHVwZGF0ZVZpZXdwb3J0KHRoaXMpO1xuICAgICAgICAgICAgdGhpcy5fbWlkRHJhdyA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIERlc3Ryb3kgdGhlIFRpbGVkSW1hZ2UgKHVubG9hZCBjdXJyZW50IGxvYWRlZCB0aWxlcykuXG4gICAgICovXG4gICAgZGVzdHJveTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQHJldHVybnMge09wZW5TZWFkcmFnb24uUmVjdH0gVGhpcyBUaWxlZEltYWdlJ3MgYm91bmRzIGluIHZpZXdwb3J0IGNvb3JkaW5hdGVzLlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gW2N1cnJlbnQ9ZmFsc2VdIC0gUGFzcyB0cnVlIGZvciB0aGUgY3VycmVudCBsb2NhdGlvbjsgZmFsc2UgZm9yIHRhcmdldCBsb2NhdGlvbi5cbiAgICAgKi9cbiAgICBnZXRCb3VuZHM6IGZ1bmN0aW9uKGN1cnJlbnQpIHtcbiAgICAgICAgaWYgKGN1cnJlbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgJC5SZWN0KCB0aGlzLl94U3ByaW5nLmN1cnJlbnQudmFsdWUsIHRoaXMuX3lTcHJpbmcuY3VycmVudC52YWx1ZSxcbiAgICAgICAgICAgICAgICB0aGlzLl93b3JsZFdpZHRoQ3VycmVudCwgdGhpcy5fd29ybGRIZWlnaHRDdXJyZW50ICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3ICQuUmVjdCggdGhpcy5feFNwcmluZy50YXJnZXQudmFsdWUsIHRoaXMuX3lTcHJpbmcudGFyZ2V0LnZhbHVlLFxuICAgICAgICAgICAgdGhpcy5fd29ybGRXaWR0aFRhcmdldCwgdGhpcy5fd29ybGRIZWlnaHRUYXJnZXQgKTtcbiAgICB9LFxuXG4gICAgLy8gZGVwcmVjYXRlZFxuICAgIGdldFdvcmxkQm91bmRzOiBmdW5jdGlvbigpIHtcbiAgICAgICAgJC5jb25zb2xlLmVycm9yKCdbVGlsZWRJbWFnZS5nZXRXb3JsZEJvdW5kc10gaXMgZGVwcmVjYXRlZDsgdXNlIFRpbGVkSW1hZ2UuZ2V0Qm91bmRzIGluc3RlYWQnKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Qm91bmRzKCk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgYm91bmRzIG9mIHRoZSBkaXNwbGF5ZWQgcGFydCBvZiB0aGUgdGlsZWQgaW1hZ2UuXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBbY3VycmVudD1mYWxzZV0gUGFzcyB0cnVlIGZvciB0aGUgY3VycmVudCBsb2NhdGlvbixcbiAgICAgKiBmYWxzZSBmb3IgdGhlIHRhcmdldCBsb2NhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7JC5SZWN0fSBUaGUgY2xpcHBlZCBib3VuZHMgaW4gdmlld3BvcnQgY29vcmRpbmF0ZXMuXG4gICAgICovXG4gICAgZ2V0Q2xpcHBlZEJvdW5kczogZnVuY3Rpb24oY3VycmVudCkge1xuICAgICAgICB2YXIgYm91bmRzID0gdGhpcy5nZXRCb3VuZHMoY3VycmVudCk7XG4gICAgICAgIGlmICh0aGlzLl9jbGlwKSB7XG4gICAgICAgICAgICB2YXIgcmF0aW8gPSB0aGlzLl93b3JsZFdpZHRoQ3VycmVudCAvIHRoaXMuc291cmNlLmRpbWVuc2lvbnMueDtcbiAgICAgICAgICAgIHZhciBjbGlwID0gdGhpcy5fY2xpcC50aW1lcyhyYXRpbyk7XG4gICAgICAgICAgICBib3VuZHMgPSBuZXcgJC5SZWN0KFxuICAgICAgICAgICAgICAgIGJvdW5kcy54ICsgY2xpcC54LFxuICAgICAgICAgICAgICAgIGJvdW5kcy55ICsgY2xpcC55LFxuICAgICAgICAgICAgICAgIGNsaXAud2lkdGgsXG4gICAgICAgICAgICAgICAgY2xpcC5oZWlnaHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBib3VuZHM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIHtPcGVuU2VhZHJhZ29uLlBvaW50fSBUaGlzIFRpbGVkSW1hZ2UncyBjb250ZW50IHNpemUsIGluIG9yaWdpbmFsIHBpeGVscy5cbiAgICAgKi9cbiAgICBnZXRDb250ZW50U2l6ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBuZXcgJC5Qb2ludCh0aGlzLnNvdXJjZS5kaW1lbnNpb25zLngsIHRoaXMuc291cmNlLmRpbWVuc2lvbnMueSk7XG4gICAgfSxcblxuICAgIC8vIHByaXZhdGVcbiAgICBfdmlld3BvcnRUb0ltYWdlRGVsdGE6IGZ1bmN0aW9uKCB2aWV3ZXJYLCB2aWV3ZXJZLCBjdXJyZW50ICkge1xuICAgICAgICB2YXIgc2NhbGUgPSAoY3VycmVudCA/IHRoaXMuX3NjYWxlU3ByaW5nLmN1cnJlbnQudmFsdWUgOiB0aGlzLl9zY2FsZVNwcmluZy50YXJnZXQudmFsdWUpO1xuICAgICAgICByZXR1cm4gbmV3ICQuUG9pbnQodmlld2VyWCAqICh0aGlzLnNvdXJjZS5kaW1lbnNpb25zLnggLyBzY2FsZSksXG4gICAgICAgICAgICB2aWV3ZXJZICogKCh0aGlzLnNvdXJjZS5kaW1lbnNpb25zLnkgKiB0aGlzLmNvbnRlbnRBc3BlY3RYKSAvIHNjYWxlKSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFRyYW5zbGF0ZXMgZnJvbSBPcGVuU2VhZHJhZ29uIHZpZXdlciBjb29yZGluYXRlIHN5c3RlbSB0byBpbWFnZSBjb29yZGluYXRlIHN5c3RlbS5cbiAgICAgKiBUaGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIGVpdGhlciBieSBwYXNzaW5nIFgsWSBjb29yZGluYXRlcyBvciBhbiB7QGxpbmsgT3BlblNlYWRyYWdvbi5Qb2ludH0uXG4gICAgICogQHBhcmFtIHtOdW1iZXJ8T3BlblNlYWRyYWdvbi5Qb2ludH0gdmlld2VyWCAtIFRoZSBYIGNvb3JkaW5hdGUgb3IgcG9pbnQgaW4gdmlld3BvcnQgY29vcmRpbmF0ZSBzeXN0ZW0uXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IFt2aWV3ZXJZXSAtIFRoZSBZIGNvb3JkaW5hdGUgaW4gdmlld3BvcnQgY29vcmRpbmF0ZSBzeXN0ZW0uXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBbY3VycmVudD1mYWxzZV0gLSBQYXNzIHRydWUgdG8gdXNlIHRoZSBjdXJyZW50IGxvY2F0aW9uOyBmYWxzZSBmb3IgdGFyZ2V0IGxvY2F0aW9uLlxuICAgICAqIEByZXR1cm4ge09wZW5TZWFkcmFnb24uUG9pbnR9IEEgcG9pbnQgcmVwcmVzZW50aW5nIHRoZSBjb29yZGluYXRlcyBpbiB0aGUgaW1hZ2UuXG4gICAgICovXG4gICAgdmlld3BvcnRUb0ltYWdlQ29vcmRpbmF0ZXM6IGZ1bmN0aW9uKCB2aWV3ZXJYLCB2aWV3ZXJZLCBjdXJyZW50ICkge1xuICAgICAgICBpZiAodmlld2VyWCBpbnN0YW5jZW9mICQuUG9pbnQpIHtcbiAgICAgICAgICAgIC8vdGhleSBwYXNzZWQgYSBwb2ludCBpbnN0ZWFkIG9mIGluZGl2aWR1YWwgY29tcG9uZW50c1xuICAgICAgICAgICAgY3VycmVudCA9IHZpZXdlclk7XG4gICAgICAgICAgICB2aWV3ZXJZID0gdmlld2VyWC55O1xuICAgICAgICAgICAgdmlld2VyWCA9IHZpZXdlclgueDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjdXJyZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdmlld3BvcnRUb0ltYWdlRGVsdGEodmlld2VyWCAtIHRoaXMuX3hTcHJpbmcuY3VycmVudC52YWx1ZSxcbiAgICAgICAgICAgICAgICB2aWV3ZXJZIC0gdGhpcy5feVNwcmluZy5jdXJyZW50LnZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLl92aWV3cG9ydFRvSW1hZ2VEZWx0YSh2aWV3ZXJYIC0gdGhpcy5feFNwcmluZy50YXJnZXQudmFsdWUsXG4gICAgICAgICAgICB2aWV3ZXJZIC0gdGhpcy5feVNwcmluZy50YXJnZXQudmFsdWUpO1xuICAgIH0sXG5cbiAgICAvLyBwcml2YXRlXG4gICAgX2ltYWdlVG9WaWV3cG9ydERlbHRhOiBmdW5jdGlvbiggaW1hZ2VYLCBpbWFnZVksIGN1cnJlbnQgKSB7XG4gICAgICAgIHZhciBzY2FsZSA9IChjdXJyZW50ID8gdGhpcy5fc2NhbGVTcHJpbmcuY3VycmVudC52YWx1ZSA6IHRoaXMuX3NjYWxlU3ByaW5nLnRhcmdldC52YWx1ZSk7XG4gICAgICAgIHJldHVybiBuZXcgJC5Qb2ludCgoaW1hZ2VYIC8gdGhpcy5zb3VyY2UuZGltZW5zaW9ucy54KSAqIHNjYWxlLFxuICAgICAgICAgICAgKGltYWdlWSAvIHRoaXMuc291cmNlLmRpbWVuc2lvbnMueSAvIHRoaXMuY29udGVudEFzcGVjdFgpICogc2NhbGUpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBUcmFuc2xhdGVzIGZyb20gaW1hZ2UgY29vcmRpbmF0ZSBzeXN0ZW0gdG8gT3BlblNlYWRyYWdvbiB2aWV3ZXIgY29vcmRpbmF0ZSBzeXN0ZW1cbiAgICAgKiBUaGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIGVpdGhlciBieSBwYXNzaW5nIFgsWSBjb29yZGluYXRlcyBvciBhbiB7QGxpbmsgT3BlblNlYWRyYWdvbi5Qb2ludH0uXG4gICAgICogQHBhcmFtIHtOdW1iZXJ8T3BlblNlYWRyYWdvbi5Qb2ludH0gaW1hZ2VYIC0gVGhlIFggY29vcmRpbmF0ZSBvciBwb2ludCBpbiBpbWFnZSBjb29yZGluYXRlIHN5c3RlbS5cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gW2ltYWdlWV0gLSBUaGUgWSBjb29yZGluYXRlIGluIGltYWdlIGNvb3JkaW5hdGUgc3lzdGVtLlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gW2N1cnJlbnQ9ZmFsc2VdIC0gUGFzcyB0cnVlIHRvIHVzZSB0aGUgY3VycmVudCBsb2NhdGlvbjsgZmFsc2UgZm9yIHRhcmdldCBsb2NhdGlvbi5cbiAgICAgKiBAcmV0dXJuIHtPcGVuU2VhZHJhZ29uLlBvaW50fSBBIHBvaW50IHJlcHJlc2VudGluZyB0aGUgY29vcmRpbmF0ZXMgaW4gdGhlIHZpZXdwb3J0LlxuICAgICAqL1xuICAgIGltYWdlVG9WaWV3cG9ydENvb3JkaW5hdGVzOiBmdW5jdGlvbiggaW1hZ2VYLCBpbWFnZVksIGN1cnJlbnQgKSB7XG4gICAgICAgIGlmIChpbWFnZVggaW5zdGFuY2VvZiAkLlBvaW50KSB7XG4gICAgICAgICAgICAvL3RoZXkgcGFzc2VkIGEgcG9pbnQgaW5zdGVhZCBvZiBpbmRpdmlkdWFsIGNvbXBvbmVudHNcbiAgICAgICAgICAgIGN1cnJlbnQgPSBpbWFnZVk7XG4gICAgICAgICAgICBpbWFnZVkgPSBpbWFnZVgueTtcbiAgICAgICAgICAgIGltYWdlWCA9IGltYWdlWC54O1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHBvaW50ID0gdGhpcy5faW1hZ2VUb1ZpZXdwb3J0RGVsdGEoaW1hZ2VYLCBpbWFnZVkpO1xuICAgICAgICBpZiAoY3VycmVudCkge1xuICAgICAgICAgICAgcG9pbnQueCArPSB0aGlzLl94U3ByaW5nLmN1cnJlbnQudmFsdWU7XG4gICAgICAgICAgICBwb2ludC55ICs9IHRoaXMuX3lTcHJpbmcuY3VycmVudC52YWx1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBvaW50LnggKz0gdGhpcy5feFNwcmluZy50YXJnZXQudmFsdWU7XG4gICAgICAgICAgICBwb2ludC55ICs9IHRoaXMuX3lTcHJpbmcudGFyZ2V0LnZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHBvaW50O1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBUcmFuc2xhdGVzIGZyb20gYSByZWN0YW5nbGUgd2hpY2ggZGVzY3JpYmVzIGEgcG9ydGlvbiBvZiB0aGUgaW1hZ2UgaW5cbiAgICAgKiBwaXhlbCBjb29yZGluYXRlcyB0byBPcGVuU2VhZHJhZ29uIHZpZXdwb3J0IHJlY3RhbmdsZSBjb29yZGluYXRlcy5cbiAgICAgKiBUaGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIGVpdGhlciBieSBwYXNzaW5nIFgsWSx3aWR0aCxoZWlnaHQgb3IgYW4ge0BsaW5rIE9wZW5TZWFkcmFnb24uUmVjdH0uXG4gICAgICogQHBhcmFtIHtOdW1iZXJ8T3BlblNlYWRyYWdvbi5SZWN0fSBpbWFnZVggLSBUaGUgbGVmdCBjb29yZGluYXRlIG9yIHJlY3RhbmdsZSBpbiBpbWFnZSBjb29yZGluYXRlIHN5c3RlbS5cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gW2ltYWdlWV0gLSBUaGUgdG9wIGNvb3JkaW5hdGUgaW4gaW1hZ2UgY29vcmRpbmF0ZSBzeXN0ZW0uXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IFtwaXhlbFdpZHRoXSAtIFRoZSB3aWR0aCBpbiBwaXhlbCBvZiB0aGUgcmVjdGFuZ2xlLlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBbcGl4ZWxIZWlnaHRdIC0gVGhlIGhlaWdodCBpbiBwaXhlbCBvZiB0aGUgcmVjdGFuZ2xlLlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gW2N1cnJlbnQ9ZmFsc2VdIC0gUGFzcyB0cnVlIHRvIHVzZSB0aGUgY3VycmVudCBsb2NhdGlvbjsgZmFsc2UgZm9yIHRhcmdldCBsb2NhdGlvbi5cbiAgICAgKiBAcmV0dXJuIHtPcGVuU2VhZHJhZ29uLlJlY3R9IEEgcmVjdCByZXByZXNlbnRpbmcgdGhlIGNvb3JkaW5hdGVzIGluIHRoZSB2aWV3cG9ydC5cbiAgICAgKi9cbiAgICBpbWFnZVRvVmlld3BvcnRSZWN0YW5nbGU6IGZ1bmN0aW9uKCBpbWFnZVgsIGltYWdlWSwgcGl4ZWxXaWR0aCwgcGl4ZWxIZWlnaHQsIGN1cnJlbnQgKSB7XG4gICAgICAgIHZhciByZWN0ID0gaW1hZ2VYO1xuICAgICAgICBpZiAocmVjdCBpbnN0YW5jZW9mICQuUmVjdCkge1xuICAgICAgICAgICAgLy90aGV5IHBhc3NlZCBhIHJlY3QgaW5zdGVhZCBvZiBpbmRpdmlkdWFsIGNvbXBvbmVudHNcbiAgICAgICAgICAgIGN1cnJlbnQgPSBpbWFnZVk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZWN0ID0gbmV3ICQuUmVjdChpbWFnZVgsIGltYWdlWSwgcGl4ZWxXaWR0aCwgcGl4ZWxIZWlnaHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGNvb3JkQSA9IHRoaXMuaW1hZ2VUb1ZpZXdwb3J0Q29vcmRpbmF0ZXMocmVjdC5nZXRUb3BMZWZ0KCksIGN1cnJlbnQpO1xuICAgICAgICB2YXIgY29vcmRCID0gdGhpcy5faW1hZ2VUb1ZpZXdwb3J0RGVsdGEocmVjdC53aWR0aCwgcmVjdC5oZWlnaHQsIGN1cnJlbnQpO1xuXG4gICAgICAgIHJldHVybiBuZXcgJC5SZWN0KFxuICAgICAgICAgICAgY29vcmRBLngsXG4gICAgICAgICAgICBjb29yZEEueSxcbiAgICAgICAgICAgIGNvb3JkQi54LFxuICAgICAgICAgICAgY29vcmRCLnksXG4gICAgICAgICAgICByZWN0LmRlZ3JlZXNcbiAgICAgICAgKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogVHJhbnNsYXRlcyBmcm9tIGEgcmVjdGFuZ2xlIHdoaWNoIGRlc2NyaWJlcyBhIHBvcnRpb24gb2ZcbiAgICAgKiB0aGUgdmlld3BvcnQgaW4gcG9pbnQgY29vcmRpbmF0ZXMgdG8gaW1hZ2UgcmVjdGFuZ2xlIGNvb3JkaW5hdGVzLlxuICAgICAqIFRoaXMgbWV0aG9kIGNhbiBiZSBjYWxsZWQgZWl0aGVyIGJ5IHBhc3NpbmcgWCxZLHdpZHRoLGhlaWdodCBvciBhbiB7QGxpbmsgT3BlblNlYWRyYWdvbi5SZWN0fS5cbiAgICAgKiBAcGFyYW0ge051bWJlcnxPcGVuU2VhZHJhZ29uLlJlY3R9IHZpZXdlclggLSBUaGUgbGVmdCBjb29yZGluYXRlIG9yIHJlY3RhbmdsZSBpbiB2aWV3cG9ydCBjb29yZGluYXRlIHN5c3RlbS5cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gW3ZpZXdlclldIC0gVGhlIHRvcCBjb29yZGluYXRlIGluIHZpZXdwb3J0IGNvb3JkaW5hdGUgc3lzdGVtLlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBbcG9pbnRXaWR0aF0gLSBUaGUgd2lkdGggaW4gdmlld3BvcnQgY29vcmRpbmF0ZSBzeXN0ZW0uXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IFtwb2ludEhlaWdodF0gLSBUaGUgaGVpZ2h0IGluIHZpZXdwb3J0IGNvb3JkaW5hdGUgc3lzdGVtLlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gW2N1cnJlbnQ9ZmFsc2VdIC0gUGFzcyB0cnVlIHRvIHVzZSB0aGUgY3VycmVudCBsb2NhdGlvbjsgZmFsc2UgZm9yIHRhcmdldCBsb2NhdGlvbi5cbiAgICAgKiBAcmV0dXJuIHtPcGVuU2VhZHJhZ29uLlJlY3R9IEEgcmVjdCByZXByZXNlbnRpbmcgdGhlIGNvb3JkaW5hdGVzIGluIHRoZSBpbWFnZS5cbiAgICAgKi9cbiAgICB2aWV3cG9ydFRvSW1hZ2VSZWN0YW5nbGU6IGZ1bmN0aW9uKCB2aWV3ZXJYLCB2aWV3ZXJZLCBwb2ludFdpZHRoLCBwb2ludEhlaWdodCwgY3VycmVudCApIHtcbiAgICAgICAgdmFyIHJlY3QgPSB2aWV3ZXJYO1xuICAgICAgICBpZiAodmlld2VyWCBpbnN0YW5jZW9mICQuUmVjdCkge1xuICAgICAgICAgICAgLy90aGV5IHBhc3NlZCBhIHJlY3QgaW5zdGVhZCBvZiBpbmRpdmlkdWFsIGNvbXBvbmVudHNcbiAgICAgICAgICAgIGN1cnJlbnQgPSB2aWV3ZXJZO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVjdCA9IG5ldyAkLlJlY3Qodmlld2VyWCwgdmlld2VyWSwgcG9pbnRXaWR0aCwgcG9pbnRIZWlnaHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGNvb3JkQSA9IHRoaXMudmlld3BvcnRUb0ltYWdlQ29vcmRpbmF0ZXMocmVjdC5nZXRUb3BMZWZ0KCksIGN1cnJlbnQpO1xuICAgICAgICB2YXIgY29vcmRCID0gdGhpcy5fdmlld3BvcnRUb0ltYWdlRGVsdGEocmVjdC53aWR0aCwgcmVjdC5oZWlnaHQsIGN1cnJlbnQpO1xuXG4gICAgICAgIHJldHVybiBuZXcgJC5SZWN0KFxuICAgICAgICAgICAgY29vcmRBLngsXG4gICAgICAgICAgICBjb29yZEEueSxcbiAgICAgICAgICAgIGNvb3JkQi54LFxuICAgICAgICAgICAgY29vcmRCLnksXG4gICAgICAgICAgICByZWN0LmRlZ3JlZXNcbiAgICAgICAgKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ29udmVydCBwaXhlbCBjb29yZGluYXRlcyByZWxhdGl2ZSB0byB0aGUgdmlld2VyIGVsZW1lbnQgdG8gaW1hZ2VcbiAgICAgKiBjb29yZGluYXRlcy5cbiAgICAgKiBAcGFyYW0ge09wZW5TZWFkcmFnb24uUG9pbnR9IHBpeGVsXG4gICAgICogQHJldHVybnMge09wZW5TZWFkcmFnb24uUG9pbnR9XG4gICAgICovXG4gICAgdmlld2VyRWxlbWVudFRvSW1hZ2VDb29yZGluYXRlczogZnVuY3Rpb24oIHBpeGVsICkge1xuICAgICAgICB2YXIgcG9pbnQgPSB0aGlzLnZpZXdwb3J0LnBvaW50RnJvbVBpeGVsKCBwaXhlbCwgdHJ1ZSApO1xuICAgICAgICByZXR1cm4gdGhpcy52aWV3cG9ydFRvSW1hZ2VDb29yZGluYXRlcyggcG9pbnQgKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ29udmVydCBwaXhlbCBjb29yZGluYXRlcyByZWxhdGl2ZSB0byB0aGUgaW1hZ2UgdG9cbiAgICAgKiB2aWV3ZXIgZWxlbWVudCBjb29yZGluYXRlcy5cbiAgICAgKiBAcGFyYW0ge09wZW5TZWFkcmFnb24uUG9pbnR9IHBpeGVsXG4gICAgICogQHJldHVybnMge09wZW5TZWFkcmFnb24uUG9pbnR9XG4gICAgICovXG4gICAgaW1hZ2VUb1ZpZXdlckVsZW1lbnRDb29yZGluYXRlczogZnVuY3Rpb24oIHBpeGVsICkge1xuICAgICAgICB2YXIgcG9pbnQgPSB0aGlzLmltYWdlVG9WaWV3cG9ydENvb3JkaW5hdGVzKCBwaXhlbCApO1xuICAgICAgICByZXR1cm4gdGhpcy52aWV3cG9ydC5waXhlbEZyb21Qb2ludCggcG9pbnQsIHRydWUgKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ29udmVydCBwaXhlbCBjb29yZGluYXRlcyByZWxhdGl2ZSB0byB0aGUgd2luZG93IHRvIGltYWdlIGNvb3JkaW5hdGVzLlxuICAgICAqIEBwYXJhbSB7T3BlblNlYWRyYWdvbi5Qb2ludH0gcGl4ZWxcbiAgICAgKiBAcmV0dXJucyB7T3BlblNlYWRyYWdvbi5Qb2ludH1cbiAgICAgKi9cbiAgICB3aW5kb3dUb0ltYWdlQ29vcmRpbmF0ZXM6IGZ1bmN0aW9uKCBwaXhlbCApIHtcbiAgICAgICAgdmFyIHZpZXdlckNvb3JkaW5hdGVzID0gcGl4ZWwubWludXMoXG4gICAgICAgICAgICAgICAgT3BlblNlYWRyYWdvbi5nZXRFbGVtZW50UG9zaXRpb24oIHRoaXMudmlld2VyLmVsZW1lbnQgKSk7XG4gICAgICAgIHJldHVybiB0aGlzLnZpZXdlckVsZW1lbnRUb0ltYWdlQ29vcmRpbmF0ZXMoIHZpZXdlckNvb3JkaW5hdGVzICk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENvbnZlcnQgaW1hZ2UgY29vcmRpbmF0ZXMgdG8gcGl4ZWwgY29vcmRpbmF0ZXMgcmVsYXRpdmUgdG8gdGhlIHdpbmRvdy5cbiAgICAgKiBAcGFyYW0ge09wZW5TZWFkcmFnb24uUG9pbnR9IHBpeGVsXG4gICAgICogQHJldHVybnMge09wZW5TZWFkcmFnb24uUG9pbnR9XG4gICAgICovXG4gICAgaW1hZ2VUb1dpbmRvd0Nvb3JkaW5hdGVzOiBmdW5jdGlvbiggcGl4ZWwgKSB7XG4gICAgICAgIHZhciB2aWV3ZXJDb29yZGluYXRlcyA9IHRoaXMuaW1hZ2VUb1ZpZXdlckVsZW1lbnRDb29yZGluYXRlcyggcGl4ZWwgKTtcbiAgICAgICAgcmV0dXJuIHZpZXdlckNvb3JkaW5hdGVzLnBsdXMoXG4gICAgICAgICAgICAgICAgT3BlblNlYWRyYWdvbi5nZXRFbGVtZW50UG9zaXRpb24oIHRoaXMudmlld2VyLmVsZW1lbnQgKSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENvbnZlcnQgYSB2aWV3cG9ydCB6b29tIHRvIGFuIGltYWdlIHpvb20uXG4gICAgICogSW1hZ2Ugem9vbTogcmF0aW8gb2YgdGhlIG9yaWdpbmFsIGltYWdlIHNpemUgdG8gZGlzcGxheWVkIGltYWdlIHNpemUuXG4gICAgICogMSBtZWFucyBvcmlnaW5hbCBpbWFnZSBzaXplLCAwLjUgaGFsZiBzaXplLi4uXG4gICAgICogVmlld3BvcnQgem9vbTogcmF0aW8gb2YgdGhlIGRpc3BsYXllZCBpbWFnZSdzIHdpZHRoIHRvIHZpZXdwb3J0J3Mgd2lkdGguXG4gICAgICogMSBtZWFucyBpZGVudGljYWwgd2lkdGgsIDIgbWVhbnMgaW1hZ2UncyB3aWR0aCBpcyB0d2ljZSB0aGUgdmlld3BvcnQncyB3aWR0aC4uLlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSB2aWV3cG9ydFpvb20gVGhlIHZpZXdwb3J0IHpvb21cbiAgICAgKiBAcmV0dXJucyB7TnVtYmVyfSBpbWFnZVpvb20gVGhlIGltYWdlIHpvb21cbiAgICAgKi9cbiAgICB2aWV3cG9ydFRvSW1hZ2Vab29tOiBmdW5jdGlvbiggdmlld3BvcnRab29tICkge1xuICAgICAgICB2YXIgcmF0aW8gPSB0aGlzLl9zY2FsZVNwcmluZy5jdXJyZW50LnZhbHVlICpcbiAgICAgICAgICAgICAgICB0aGlzLnZpZXdwb3J0Ll9jb250YWluZXJJbm5lclNpemUueCAvIHRoaXMuc291cmNlLmRpbWVuc2lvbnMueDtcbiAgICAgICAgcmV0dXJuIHJhdGlvICogdmlld3BvcnRab29tIDtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ29udmVydCBhbiBpbWFnZSB6b29tIHRvIGEgdmlld3BvcnQgem9vbS5cbiAgICAgKiBJbWFnZSB6b29tOiByYXRpbyBvZiB0aGUgb3JpZ2luYWwgaW1hZ2Ugc2l6ZSB0byBkaXNwbGF5ZWQgaW1hZ2Ugc2l6ZS5cbiAgICAgKiAxIG1lYW5zIG9yaWdpbmFsIGltYWdlIHNpemUsIDAuNSBoYWxmIHNpemUuLi5cbiAgICAgKiBWaWV3cG9ydCB6b29tOiByYXRpbyBvZiB0aGUgZGlzcGxheWVkIGltYWdlJ3Mgd2lkdGggdG8gdmlld3BvcnQncyB3aWR0aC5cbiAgICAgKiAxIG1lYW5zIGlkZW50aWNhbCB3aWR0aCwgMiBtZWFucyBpbWFnZSdzIHdpZHRoIGlzIHR3aWNlIHRoZSB2aWV3cG9ydCdzIHdpZHRoLi4uXG4gICAgICogTm90ZTogbm90IGFjY3VyYXRlIHdpdGggbXVsdGktaW1hZ2UuXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGltYWdlWm9vbSBUaGUgaW1hZ2Ugem9vbVxuICAgICAqIEByZXR1cm5zIHtOdW1iZXJ9IHZpZXdwb3J0Wm9vbSBUaGUgdmlld3BvcnQgem9vbVxuICAgICAqL1xuICAgIGltYWdlVG9WaWV3cG9ydFpvb206IGZ1bmN0aW9uKCBpbWFnZVpvb20gKSB7XG4gICAgICAgIHZhciByYXRpbyA9IHRoaXMuX3NjYWxlU3ByaW5nLmN1cnJlbnQudmFsdWUgKlxuICAgICAgICAgICAgICAgIHRoaXMudmlld3BvcnQuX2NvbnRhaW5lcklubmVyU2l6ZS54IC8gdGhpcy5zb3VyY2UuZGltZW5zaW9ucy54O1xuICAgICAgICByZXR1cm4gaW1hZ2Vab29tIC8gcmF0aW87XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIFRpbGVkSW1hZ2UncyBwb3NpdGlvbiBpbiB0aGUgd29ybGQuXG4gICAgICogQHBhcmFtIHtPcGVuU2VhZHJhZ29uLlBvaW50fSBwb3NpdGlvbiAtIFRoZSBuZXcgcG9zaXRpb24sIGluIHZpZXdwb3J0IGNvb3JkaW5hdGVzLlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gW2ltbWVkaWF0ZWx5PWZhbHNlXSAtIFdoZXRoZXIgdG8gYW5pbWF0ZSB0byB0aGUgbmV3IHBvc2l0aW9uIG9yIHNuYXAgaW1tZWRpYXRlbHkuXG4gICAgICogQGZpcmVzIE9wZW5TZWFkcmFnb24uVGlsZWRJbWFnZS5ldmVudDpib3VuZHMtY2hhbmdlXG4gICAgICovXG4gICAgc2V0UG9zaXRpb246IGZ1bmN0aW9uKHBvc2l0aW9uLCBpbW1lZGlhdGVseSkge1xuICAgICAgICB2YXIgc2FtZVRhcmdldCA9ICh0aGlzLl94U3ByaW5nLnRhcmdldC52YWx1ZSA9PT0gcG9zaXRpb24ueCAmJlxuICAgICAgICAgICAgdGhpcy5feVNwcmluZy50YXJnZXQudmFsdWUgPT09IHBvc2l0aW9uLnkpO1xuXG4gICAgICAgIGlmIChpbW1lZGlhdGVseSkge1xuICAgICAgICAgICAgaWYgKHNhbWVUYXJnZXQgJiYgdGhpcy5feFNwcmluZy5jdXJyZW50LnZhbHVlID09PSBwb3NpdGlvbi54ICYmXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3lTcHJpbmcuY3VycmVudC52YWx1ZSA9PT0gcG9zaXRpb24ueSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5feFNwcmluZy5yZXNldFRvKHBvc2l0aW9uLngpO1xuICAgICAgICAgICAgdGhpcy5feVNwcmluZy5yZXNldFRvKHBvc2l0aW9uLnkpO1xuICAgICAgICAgICAgdGhpcy5fbmVlZHNEcmF3ID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChzYW1lVGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLl94U3ByaW5nLnNwcmluZ1RvKHBvc2l0aW9uLngpO1xuICAgICAgICAgICAgdGhpcy5feVNwcmluZy5zcHJpbmdUbyhwb3NpdGlvbi55KTtcbiAgICAgICAgICAgIHRoaXMuX25lZWRzRHJhdyA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXNhbWVUYXJnZXQpIHtcbiAgICAgICAgICAgIHRoaXMuX3JhaXNlQm91bmRzQ2hhbmdlKCk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgVGlsZWRJbWFnZSdzIHdpZHRoIGluIHRoZSB3b3JsZCwgYWRqdXN0aW5nIHRoZSBoZWlnaHQgdG8gbWF0Y2ggYmFzZWQgb24gYXNwZWN0IHJhdGlvLlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSB3aWR0aCAtIFRoZSBuZXcgd2lkdGgsIGluIHZpZXdwb3J0IGNvb3JkaW5hdGVzLlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gW2ltbWVkaWF0ZWx5PWZhbHNlXSAtIFdoZXRoZXIgdG8gYW5pbWF0ZSB0byB0aGUgbmV3IHNpemUgb3Igc25hcCBpbW1lZGlhdGVseS5cbiAgICAgKiBAZmlyZXMgT3BlblNlYWRyYWdvbi5UaWxlZEltYWdlLmV2ZW50OmJvdW5kcy1jaGFuZ2VcbiAgICAgKi9cbiAgICBzZXRXaWR0aDogZnVuY3Rpb24od2lkdGgsIGltbWVkaWF0ZWx5KSB7XG4gICAgICAgIHRoaXMuX3NldFNjYWxlKHdpZHRoLCBpbW1lZGlhdGVseSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIFRpbGVkSW1hZ2UncyBoZWlnaHQgaW4gdGhlIHdvcmxkLCBhZGp1c3RpbmcgdGhlIHdpZHRoIHRvIG1hdGNoIGJhc2VkIG9uIGFzcGVjdCByYXRpby5cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gaGVpZ2h0IC0gVGhlIG5ldyBoZWlnaHQsIGluIHZpZXdwb3J0IGNvb3JkaW5hdGVzLlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gW2ltbWVkaWF0ZWx5PWZhbHNlXSAtIFdoZXRoZXIgdG8gYW5pbWF0ZSB0byB0aGUgbmV3IHNpemUgb3Igc25hcCBpbW1lZGlhdGVseS5cbiAgICAgKiBAZmlyZXMgT3BlblNlYWRyYWdvbi5UaWxlZEltYWdlLmV2ZW50OmJvdW5kcy1jaGFuZ2VcbiAgICAgKi9cbiAgICBzZXRIZWlnaHQ6IGZ1bmN0aW9uKGhlaWdodCwgaW1tZWRpYXRlbHkpIHtcbiAgICAgICAgdGhpcy5fc2V0U2NhbGUoaGVpZ2h0IC8gdGhpcy5ub3JtSGVpZ2h0LCBpbW1lZGlhdGVseSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFBvc2l0aW9ucyBhbmQgc2NhbGVzIHRoZSBUaWxlZEltYWdlIHRvIGZpdCBpbiB0aGUgc3BlY2lmaWVkIGJvdW5kcy5cbiAgICAgKiBOb3RlOiB0aGlzIG1ldGhvZCBmaXJlcyBPcGVuU2VhZHJhZ29uLlRpbGVkSW1hZ2UuZXZlbnQ6Ym91bmRzLWNoYW5nZVxuICAgICAqIHR3aWNlXG4gICAgICogQHBhcmFtIHtPcGVuU2VhZHJhZ29uLlJlY3R9IGJvdW5kcyBUaGUgYm91bmRzIHRvIGZpdCB0aGUgaW1hZ2UgaW50by5cbiAgICAgKiBAcGFyYW0ge09wZW5TZWFkcmFnb24uUGxhY2VtZW50fSBbYW5jaG9yPU9wZW5TZWFkcmFnb24uUGxhY2VtZW50LkNFTlRFUl1cbiAgICAgKiBIb3cgdG8gYW5jaG9yIHRoZSBpbWFnZSBpbiB0aGUgYm91bmRzLlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gW2ltbWVkaWF0ZWx5PWZhbHNlXSBXaGV0aGVyIHRvIGFuaW1hdGUgdG8gdGhlIG5ldyBzaXplXG4gICAgICogb3Igc25hcCBpbW1lZGlhdGVseS5cbiAgICAgKiBAZmlyZXMgT3BlblNlYWRyYWdvbi5UaWxlZEltYWdlLmV2ZW50OmJvdW5kcy1jaGFuZ2VcbiAgICAgKi9cbiAgICBmaXRCb3VuZHM6IGZ1bmN0aW9uKGJvdW5kcywgYW5jaG9yLCBpbW1lZGlhdGVseSkge1xuICAgICAgICBhbmNob3IgPSBhbmNob3IgfHwgJC5QbGFjZW1lbnQuQ0VOVEVSO1xuICAgICAgICB2YXIgYW5jaG9yUHJvcGVydGllcyA9ICQuUGxhY2VtZW50LnByb3BlcnRpZXNbYW5jaG9yXTtcbiAgICAgICAgdmFyIGFzcGVjdFJhdGlvID0gdGhpcy5jb250ZW50QXNwZWN0WDtcbiAgICAgICAgdmFyIHhPZmZzZXQgPSAwO1xuICAgICAgICB2YXIgeU9mZnNldCA9IDA7XG4gICAgICAgIHZhciBkaXNwbGF5ZWRXaWR0aFJhdGlvID0gMTtcbiAgICAgICAgdmFyIGRpc3BsYXllZEhlaWdodFJhdGlvID0gMTtcbiAgICAgICAgaWYgKHRoaXMuX2NsaXApIHtcbiAgICAgICAgICAgIGFzcGVjdFJhdGlvID0gdGhpcy5fY2xpcC5nZXRBc3BlY3RSYXRpbygpO1xuICAgICAgICAgICAgZGlzcGxheWVkV2lkdGhSYXRpbyA9IHRoaXMuX2NsaXAud2lkdGggLyB0aGlzLnNvdXJjZS5kaW1lbnNpb25zLng7XG4gICAgICAgICAgICBkaXNwbGF5ZWRIZWlnaHRSYXRpbyA9IHRoaXMuX2NsaXAuaGVpZ2h0IC8gdGhpcy5zb3VyY2UuZGltZW5zaW9ucy55O1xuICAgICAgICAgICAgaWYgKGJvdW5kcy5nZXRBc3BlY3RSYXRpbygpID4gYXNwZWN0UmF0aW8pIHtcbiAgICAgICAgICAgICAgICB4T2Zmc2V0ID0gdGhpcy5fY2xpcC54IC8gdGhpcy5fY2xpcC5oZWlnaHQgKiBib3VuZHMuaGVpZ2h0O1xuICAgICAgICAgICAgICAgIHlPZmZzZXQgPSB0aGlzLl9jbGlwLnkgLyB0aGlzLl9jbGlwLmhlaWdodCAqIGJvdW5kcy5oZWlnaHQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHhPZmZzZXQgPSB0aGlzLl9jbGlwLnggLyB0aGlzLl9jbGlwLndpZHRoICogYm91bmRzLndpZHRoO1xuICAgICAgICAgICAgICAgIHlPZmZzZXQgPSB0aGlzLl9jbGlwLnkgLyB0aGlzLl9jbGlwLndpZHRoICogYm91bmRzLndpZHRoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGJvdW5kcy5nZXRBc3BlY3RSYXRpbygpID4gYXNwZWN0UmF0aW8pIHtcbiAgICAgICAgICAgIC8vIFdlIHdpbGwgaGF2ZSBtYXJnaW5zIG9uIHRoZSBYIGF4aXNcbiAgICAgICAgICAgIHZhciBoZWlnaHQgPSBib3VuZHMuaGVpZ2h0IC8gZGlzcGxheWVkSGVpZ2h0UmF0aW87XG4gICAgICAgICAgICB2YXIgbWFyZ2luTGVmdCA9IDA7XG4gICAgICAgICAgICBpZiAoYW5jaG9yUHJvcGVydGllcy5pc0hvcml6b250YWxseUNlbnRlcmVkKSB7XG4gICAgICAgICAgICAgICAgbWFyZ2luTGVmdCA9IChib3VuZHMud2lkdGggLSBib3VuZHMuaGVpZ2h0ICogYXNwZWN0UmF0aW8pIC8gMjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYW5jaG9yUHJvcGVydGllcy5pc1JpZ2h0KSB7XG4gICAgICAgICAgICAgICAgbWFyZ2luTGVmdCA9IGJvdW5kcy53aWR0aCAtIGJvdW5kcy5oZWlnaHQgKiBhc3BlY3RSYXRpbztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc2V0UG9zaXRpb24oXG4gICAgICAgICAgICAgICAgbmV3ICQuUG9pbnQoYm91bmRzLnggLSB4T2Zmc2V0ICsgbWFyZ2luTGVmdCwgYm91bmRzLnkgLSB5T2Zmc2V0KSxcbiAgICAgICAgICAgICAgICBpbW1lZGlhdGVseSk7XG4gICAgICAgICAgICB0aGlzLnNldEhlaWdodChoZWlnaHQsIGltbWVkaWF0ZWx5KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFdlIHdpbGwgaGF2ZSBtYXJnaW5zIG9uIHRoZSBZIGF4aXNcbiAgICAgICAgICAgIHZhciB3aWR0aCA9IGJvdW5kcy53aWR0aCAvIGRpc3BsYXllZFdpZHRoUmF0aW87XG4gICAgICAgICAgICB2YXIgbWFyZ2luVG9wID0gMDtcbiAgICAgICAgICAgIGlmIChhbmNob3JQcm9wZXJ0aWVzLmlzVmVydGljYWxseUNlbnRlcmVkKSB7XG4gICAgICAgICAgICAgICAgbWFyZ2luVG9wID0gKGJvdW5kcy5oZWlnaHQgLSBib3VuZHMud2lkdGggLyBhc3BlY3RSYXRpbykgLyAyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChhbmNob3JQcm9wZXJ0aWVzLmlzQm90dG9tKSB7XG4gICAgICAgICAgICAgICAgbWFyZ2luVG9wID0gYm91bmRzLmhlaWdodCAtIGJvdW5kcy53aWR0aCAvIGFzcGVjdFJhdGlvO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zZXRQb3NpdGlvbihcbiAgICAgICAgICAgICAgICBuZXcgJC5Qb2ludChib3VuZHMueCAtIHhPZmZzZXQsIGJvdW5kcy55IC0geU9mZnNldCArIG1hcmdpblRvcCksXG4gICAgICAgICAgICAgICAgaW1tZWRpYXRlbHkpO1xuICAgICAgICAgICAgdGhpcy5zZXRXaWR0aCh3aWR0aCwgaW1tZWRpYXRlbHkpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIHtPcGVuU2VhZHJhZ29uLlJlY3R8bnVsbH0gVGhlIFRpbGVkSW1hZ2UncyBjdXJyZW50IGNsaXAgcmVjdGFuZ2xlLFxuICAgICAqIGluIGltYWdlIHBpeGVscywgb3IgbnVsbCBpZiBub25lLlxuICAgICAqL1xuICAgIGdldENsaXA6IGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAodGhpcy5fY2xpcCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NsaXAuY2xvbmUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge09wZW5TZWFkcmFnb24uUmVjdHxudWxsfSBuZXdDbGlwIC0gQW4gYXJlYSwgaW4gaW1hZ2UgcGl4ZWxzLCB0byBjbGlwIHRvXG4gICAgICogKHBvcnRpb25zIG9mIHRoZSBpbWFnZSBvdXRzaWRlIG9mIHRoaXMgYXJlYSB3aWxsIG5vdCBiZSB2aXNpYmxlKS4gT25seSB3b3JrcyBvblxuICAgICAqIGJyb3dzZXJzIHRoYXQgc3VwcG9ydCB0aGUgSFRNTDUgY2FudmFzLlxuICAgICAqL1xuICAgIHNldENsaXA6IGZ1bmN0aW9uKG5ld0NsaXApIHtcbiAgICAgICAgJC5jb25zb2xlLmFzc2VydCghbmV3Q2xpcCB8fCBuZXdDbGlwIGluc3RhbmNlb2YgJC5SZWN0LFxuICAgICAgICAgICAgXCJbVGlsZWRJbWFnZS5zZXRDbGlwXSBuZXdDbGlwIG11c3QgYmUgYW4gT3BlblNlYWRyYWdvbi5SZWN0IG9yIG51bGxcIik7XG5cbiAgICAgICAgaWYgKG5ld0NsaXAgaW5zdGFuY2VvZiAkLlJlY3QpIHtcbiAgICAgICAgICAgIHRoaXMuX2NsaXAgPSBuZXdDbGlwLmNsb25lKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9jbGlwID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX25lZWRzRHJhdyA9IHRydWU7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIHtOdW1iZXJ9IFRoZSBUaWxlZEltYWdlJ3MgY3VycmVudCBvcGFjaXR5LlxuICAgICAqL1xuICAgIGdldE9wYWNpdHk6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcGFjaXR5O1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gb3BhY2l0eSBPcGFjaXR5IHRoZSB0aWxlZCBpbWFnZSBzaG91bGQgYmUgZHJhd24gYXQuXG4gICAgICovXG4gICAgc2V0T3BhY2l0eTogZnVuY3Rpb24ob3BhY2l0eSkge1xuICAgICAgICB0aGlzLm9wYWNpdHkgPSBvcGFjaXR5O1xuICAgICAgICB0aGlzLl9uZWVkc0RyYXcgPSB0cnVlO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBUaGUgVGlsZWRJbWFnZSdzIGN1cnJlbnQgY29tcG9zaXRlT3BlcmF0aW9uLlxuICAgICAqL1xuICAgIGdldENvbXBvc2l0ZU9wZXJhdGlvbjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbXBvc2l0ZU9wZXJhdGlvbjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGNvbXBvc2l0ZU9wZXJhdGlvbiB0aGUgdGlsZWQgaW1hZ2Ugc2hvdWxkIGJlIGRyYXduIHdpdGggdGhpcyBnbG9iYWxDb21wb3NpdGVPcGVyYXRpb24uXG4gICAgICovXG4gICAgc2V0Q29tcG9zaXRlT3BlcmF0aW9uOiBmdW5jdGlvbihjb21wb3NpdGVPcGVyYXRpb24pIHtcbiAgICAgICAgdGhpcy5jb21wb3NpdGVPcGVyYXRpb24gPSBjb21wb3NpdGVPcGVyYXRpb247XG4gICAgICAgIHRoaXMuX25lZWRzRHJhdyA9IHRydWU7XG4gICAgfSxcblxuICAgIC8vIHByaXZhdGVcbiAgICBfc2V0U2NhbGU6IGZ1bmN0aW9uKHNjYWxlLCBpbW1lZGlhdGVseSkge1xuICAgICAgICB2YXIgc2FtZVRhcmdldCA9ICh0aGlzLl9zY2FsZVNwcmluZy50YXJnZXQudmFsdWUgPT09IHNjYWxlKTtcbiAgICAgICAgaWYgKGltbWVkaWF0ZWx5KSB7XG4gICAgICAgICAgICBpZiAoc2FtZVRhcmdldCAmJiB0aGlzLl9zY2FsZVNwcmluZy5jdXJyZW50LnZhbHVlID09PSBzY2FsZSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5fc2NhbGVTcHJpbmcucmVzZXRUbyhzY2FsZSk7XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVGb3JTY2FsZSgpO1xuICAgICAgICAgICAgdGhpcy5fbmVlZHNEcmF3ID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChzYW1lVGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLl9zY2FsZVNwcmluZy5zcHJpbmdUbyhzY2FsZSk7XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVGb3JTY2FsZSgpO1xuICAgICAgICAgICAgdGhpcy5fbmVlZHNEcmF3ID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghc2FtZVRhcmdldCkge1xuICAgICAgICAgICAgdGhpcy5fcmFpc2VCb3VuZHNDaGFuZ2UoKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyBwcml2YXRlXG4gICAgX3VwZGF0ZUZvclNjYWxlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5fd29ybGRXaWR0aFRhcmdldCA9IHRoaXMuX3NjYWxlU3ByaW5nLnRhcmdldC52YWx1ZTtcbiAgICAgICAgdGhpcy5fd29ybGRIZWlnaHRUYXJnZXQgPSB0aGlzLm5vcm1IZWlnaHQgKiB0aGlzLl9zY2FsZVNwcmluZy50YXJnZXQudmFsdWU7XG4gICAgICAgIHRoaXMuX3dvcmxkV2lkdGhDdXJyZW50ID0gdGhpcy5fc2NhbGVTcHJpbmcuY3VycmVudC52YWx1ZTtcbiAgICAgICAgdGhpcy5fd29ybGRIZWlnaHRDdXJyZW50ID0gdGhpcy5ub3JtSGVpZ2h0ICogdGhpcy5fc2NhbGVTcHJpbmcuY3VycmVudC52YWx1ZTtcbiAgICB9LFxuXG4gICAgLy8gcHJpdmF0ZVxuICAgIF9yYWlzZUJvdW5kc0NoYW5nZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSYWlzZWQgd2hlbiB0aGUgVGlsZWRJbWFnZSdzIGJvdW5kcyBhcmUgY2hhbmdlZC5cbiAgICAgICAgICogTm90ZSB0aGF0IHRoaXMgZXZlbnQgaXMgdHJpZ2dlcmVkIG9ubHkgd2hlbiB0aGUgYW5pbWF0aW9uIHRhcmdldCBpcyBjaGFuZ2VkO1xuICAgICAgICAgKiBub3QgZm9yIGV2ZXJ5IGZyYW1lIG9mIGFuaW1hdGlvbi5cbiAgICAgICAgICogQGV2ZW50IGJvdW5kcy1jaGFuZ2VcbiAgICAgICAgICogQG1lbWJlck9mIE9wZW5TZWFkcmFnb24uVGlsZWRJbWFnZVxuICAgICAgICAgKiBAdHlwZSB7b2JqZWN0fVxuICAgICAgICAgKiBAcHJvcGVydHkge09wZW5TZWFkcmFnb24uV29ybGR9IGV2ZW50U291cmNlIC0gQSByZWZlcmVuY2UgdG8gdGhlIFRpbGVkSW1hZ2Ugd2hpY2ggcmFpc2VkIHRoZSBldmVudC5cbiAgICAgICAgICogQHByb3BlcnR5IHs/T2JqZWN0fSB1c2VyRGF0YSAtIEFyYml0cmFyeSBzdWJzY3JpYmVyLWRlZmluZWQgb2JqZWN0LlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5yYWlzZUV2ZW50KCdib3VuZHMtY2hhbmdlJyk7XG4gICAgfSxcblxuICAgIC8vIHByaXZhdGVcbiAgICBfaXNCb3R0b21JdGVtOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlld2VyLndvcmxkLmdldEl0ZW1BdCgwKSA9PT0gdGhpcztcbiAgICB9XG59KTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQGlubmVyXG4gKiBQcmV0dHkgbXVjaCBldmVyeSBvdGhlciBsaW5lIGluIHRoaXMgbmVlZHMgdG8gYmUgZG9jdW1lbnRlZCBzbyBpdCdzIGNsZWFyXG4gKiBob3cgZWFjaCBwaWVjZSBvZiB0aGlzIHJvdXRpbmUgY29udHJpYnV0ZXMgdG8gdGhlIGRyYXdpbmcgcHJvY2Vzcy4gIFRoYXQnc1xuICogd2h5IHRoZXJlIGFyZSBzbyBtYW55IFRPRE8ncyBpbnNpZGUgdGhpcyBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gdXBkYXRlVmlld3BvcnQoIHRpbGVkSW1hZ2UgKSB7XG5cbiAgICB0aWxlZEltYWdlLl9uZWVkc0RyYXcgPSBmYWxzZTtcblxuICAgIHZhciB0aWxlLFxuICAgICAgICBsZXZlbCxcbiAgICAgICAgYmVzdCAgICAgICAgICAgID0gbnVsbCxcbiAgICAgICAgaGF2ZURyYXduICAgICAgID0gZmFsc2UsXG4gICAgICAgIGN1cnJlbnRUaW1lICAgICA9ICQubm93KCksXG4gICAgICAgIHZpZXdwb3J0Qm91bmRzICA9IHRpbGVkSW1hZ2Uudmlld3BvcnQuZ2V0Qm91bmRzV2l0aE1hcmdpbnMoIHRydWUgKSxcbiAgICAgICAgemVyb1JhdGlvQyAgICAgID0gdGlsZWRJbWFnZS52aWV3cG9ydC5kZWx0YVBpeGVsc0Zyb21Qb2ludHNOb1JvdGF0ZShcbiAgICAgICAgICAgIHRpbGVkSW1hZ2Uuc291cmNlLmdldFBpeGVsUmF0aW8oIDAgKSxcbiAgICAgICAgICAgIHRydWVcbiAgICAgICAgKS54ICogdGlsZWRJbWFnZS5fc2NhbGVTcHJpbmcuY3VycmVudC52YWx1ZSxcbiAgICAgICAgbG93ZXN0TGV2ZWwgICAgID0gTWF0aC5tYXgoXG4gICAgICAgICAgICB0aWxlZEltYWdlLnNvdXJjZS5taW5MZXZlbCxcbiAgICAgICAgICAgIE1hdGguZmxvb3IoXG4gICAgICAgICAgICAgICAgTWF0aC5sb2coIHRpbGVkSW1hZ2UubWluWm9vbUltYWdlUmF0aW8gKSAvXG4gICAgICAgICAgICAgICAgTWF0aC5sb2coIDIgKVxuICAgICAgICAgICAgKVxuICAgICAgICApLFxuICAgICAgICBoaWdoZXN0TGV2ZWwgICAgPSBNYXRoLm1pbihcbiAgICAgICAgICAgIE1hdGguYWJzKHRpbGVkSW1hZ2Uuc291cmNlLm1heExldmVsKSxcbiAgICAgICAgICAgIE1hdGguYWJzKE1hdGguZmxvb3IoXG4gICAgICAgICAgICAgICAgTWF0aC5sb2coIHplcm9SYXRpb0MgLyB0aWxlZEltYWdlLm1pblBpeGVsUmF0aW8gKSAvXG4gICAgICAgICAgICAgICAgTWF0aC5sb2coIDIgKVxuICAgICAgICAgICAgKSlcbiAgICAgICAgKSxcbiAgICAgICAgcmVuZGVyUGl4ZWxSYXRpb0MsXG4gICAgICAgIHJlbmRlclBpeGVsUmF0aW9ULFxuICAgICAgICB6ZXJvUmF0aW9ULFxuICAgICAgICBvcHRpbWFsUmF0aW8sXG4gICAgICAgIGxldmVsT3BhY2l0eSxcbiAgICAgICAgbGV2ZWxWaXNpYmlsaXR5O1xuXG4gICAgLy8gUmVzZXQgdGlsZSdzIGludGVybmFsIGRyYXduIHN0YXRlXG4gICAgd2hpbGUgKHRpbGVkSW1hZ2UubGFzdERyYXduLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGlsZSA9IHRpbGVkSW1hZ2UubGFzdERyYXduLnBvcCgpO1xuICAgICAgICB0aWxlLmJlaW5nRHJhd24gPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoIXRpbGVkSW1hZ2Uud3JhcEhvcml6b250YWwgJiYgIXRpbGVkSW1hZ2Uud3JhcFZlcnRpY2FsKSB7XG4gICAgICAgIHZhciB0aWxlZEltYWdlQm91bmRzID0gdGlsZWRJbWFnZS5nZXRDbGlwcGVkQm91bmRzKHRydWUpO1xuICAgICAgICB2YXIgaW50ZXJzZWN0aW9uID0gdmlld3BvcnRCb3VuZHMuaW50ZXJzZWN0aW9uKHRpbGVkSW1hZ2VCb3VuZHMpO1xuICAgICAgICBpZiAoaW50ZXJzZWN0aW9uID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmlld3BvcnRCb3VuZHMgPSBpbnRlcnNlY3Rpb247XG4gICAgfVxuICAgIHZpZXdwb3J0Qm91bmRzID0gdmlld3BvcnRCb3VuZHMuZ2V0Qm91bmRpbmdCb3goKTtcbiAgICB2aWV3cG9ydEJvdW5kcy54IC09IHRpbGVkSW1hZ2UuX3hTcHJpbmcuY3VycmVudC52YWx1ZTtcbiAgICB2aWV3cG9ydEJvdW5kcy55IC09IHRpbGVkSW1hZ2UuX3lTcHJpbmcuY3VycmVudC52YWx1ZTtcblxuICAgIHZhciB2aWV3cG9ydFRMID0gdmlld3BvcnRCb3VuZHMuZ2V0VG9wTGVmdCgpO1xuICAgIHZhciB2aWV3cG9ydEJSID0gdmlld3BvcnRCb3VuZHMuZ2V0Qm90dG9tUmlnaHQoKTtcblxuICAgIC8vRG9uJ3QgZHJhdyBpZiBjb21wbGV0ZWx5IG91dHNpZGUgb2YgdGhlIHZpZXdwb3J0XG4gICAgaWYgICggIXRpbGVkSW1hZ2Uud3JhcEhvcml6b250YWwgJiYgKHZpZXdwb3J0QlIueCA8IDAgfHwgdmlld3BvcnRUTC54ID4gdGlsZWRJbWFnZS5fd29ybGRXaWR0aEN1cnJlbnQgKSApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICggIXRpbGVkSW1hZ2Uud3JhcFZlcnRpY2FsICYmICggdmlld3BvcnRCUi55IDwgMCB8fCB2aWV3cG9ydFRMLnkgPiB0aWxlZEltYWdlLl93b3JsZEhlaWdodEN1cnJlbnQgKSApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENhbGN1bGF0ZSB2aWV3cG9ydCByZWN0IC8gYm91bmRzXG4gICAgaWYgKCAhdGlsZWRJbWFnZS53cmFwSG9yaXpvbnRhbCApIHtcbiAgICAgICAgdmlld3BvcnRUTC54ID0gTWF0aC5tYXgoIHZpZXdwb3J0VEwueCwgMCApO1xuICAgICAgICB2aWV3cG9ydEJSLnggPSBNYXRoLm1pbiggdmlld3BvcnRCUi54LCB0aWxlZEltYWdlLl93b3JsZFdpZHRoQ3VycmVudCApO1xuICAgIH1cblxuICAgIGlmICggIXRpbGVkSW1hZ2Uud3JhcFZlcnRpY2FsICkge1xuICAgICAgICB2aWV3cG9ydFRMLnkgPSBNYXRoLm1heCggdmlld3BvcnRUTC55LCAwICk7XG4gICAgICAgIHZpZXdwb3J0QlIueSA9IE1hdGgubWluKCB2aWV3cG9ydEJSLnksIHRpbGVkSW1hZ2UuX3dvcmxkSGVpZ2h0Q3VycmVudCApO1xuICAgIH1cblxuICAgIC8vIENhbGN1bGF0aW9ucyBmb3IgdGhlIGludGVydmFsIG9mIGxldmVscyB0byBkcmF3XG4gICAgLy8gKGFib3ZlIGluIGluaXRpYWwgdmFyIHN0YXRlbWVudClcbiAgICAvLyBjYW4gcmV0dXJuIGludmFsaWQgaW50ZXJ2YWxzOyBmaXggdGhhdCBoZXJlIGlmIG5lY2Vzc2FyeVxuICAgIGxvd2VzdExldmVsID0gTWF0aC5taW4oIGxvd2VzdExldmVsLCBoaWdoZXN0TGV2ZWwgKTtcblxuICAgIC8vIFVwZGF0ZSBhbnkgbGV2ZWwgdGhhdCB3aWxsIGJlIGRyYXduXG4gICAgdmFyIGRyYXdMZXZlbDsgLy8gRklYTUU6IGRyYXdMZXZlbCBzaG91bGQgaGF2ZSBhIG1vcmUgZXhwbGFuYXRvcnkgbmFtZVxuICAgIGZvciAoIGxldmVsID0gaGlnaGVzdExldmVsOyBsZXZlbCA+PSBsb3dlc3RMZXZlbDsgbGV2ZWwtLSApIHtcbiAgICAgICAgZHJhd0xldmVsID0gZmFsc2U7XG5cbiAgICAgICAgLy9Bdm9pZCBjYWxjdWxhdGlvbnMgZm9yIGRyYXcgaWYgd2UgaGF2ZSBhbHJlYWR5IGRyYXduIHRoaXNcbiAgICAgICAgcmVuZGVyUGl4ZWxSYXRpb0MgPSB0aWxlZEltYWdlLnZpZXdwb3J0LmRlbHRhUGl4ZWxzRnJvbVBvaW50c05vUm90YXRlKFxuICAgICAgICAgICAgdGlsZWRJbWFnZS5zb3VyY2UuZ2V0UGl4ZWxSYXRpbyggbGV2ZWwgKSxcbiAgICAgICAgICAgIHRydWVcbiAgICAgICAgKS54ICogdGlsZWRJbWFnZS5fc2NhbGVTcHJpbmcuY3VycmVudC52YWx1ZTtcblxuICAgICAgICBpZiAoICggIWhhdmVEcmF3biAmJiByZW5kZXJQaXhlbFJhdGlvQyA+PSB0aWxlZEltYWdlLm1pblBpeGVsUmF0aW8gKSB8fFxuICAgICAgICAgICAgICggbGV2ZWwgPT0gbG93ZXN0TGV2ZWwgKSApIHtcbiAgICAgICAgICAgIGRyYXdMZXZlbCA9IHRydWU7XG4gICAgICAgICAgICBoYXZlRHJhd24gPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKCAhaGF2ZURyYXduICkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvL1BlcmZvcm0gY2FsY3VsYXRpb25zIGZvciBkcmF3IGlmIHdlIGhhdmVuJ3QgZHJhd24gdGhpc1xuICAgICAgICByZW5kZXJQaXhlbFJhdGlvVCA9IHRpbGVkSW1hZ2Uudmlld3BvcnQuZGVsdGFQaXhlbHNGcm9tUG9pbnRzTm9Sb3RhdGUoXG4gICAgICAgICAgICB0aWxlZEltYWdlLnNvdXJjZS5nZXRQaXhlbFJhdGlvKCBsZXZlbCApLFxuICAgICAgICAgICAgZmFsc2VcbiAgICAgICAgKS54ICogdGlsZWRJbWFnZS5fc2NhbGVTcHJpbmcuY3VycmVudC52YWx1ZTtcblxuICAgICAgICB6ZXJvUmF0aW9UICAgICAgPSB0aWxlZEltYWdlLnZpZXdwb3J0LmRlbHRhUGl4ZWxzRnJvbVBvaW50c05vUm90YXRlKFxuICAgICAgICAgICAgdGlsZWRJbWFnZS5zb3VyY2UuZ2V0UGl4ZWxSYXRpbyhcbiAgICAgICAgICAgICAgICBNYXRoLm1heChcbiAgICAgICAgICAgICAgICAgICAgdGlsZWRJbWFnZS5zb3VyY2UuZ2V0Q2xvc2VzdExldmVsKCB0aWxlZEltYWdlLnZpZXdwb3J0LmNvbnRhaW5lclNpemUgKSAtIDEsXG4gICAgICAgICAgICAgICAgICAgIDBcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgZmFsc2VcbiAgICAgICAgKS54ICogdGlsZWRJbWFnZS5fc2NhbGVTcHJpbmcuY3VycmVudC52YWx1ZTtcblxuICAgICAgICBvcHRpbWFsUmF0aW8gICAgPSB0aWxlZEltYWdlLmltbWVkaWF0ZVJlbmRlciA/XG4gICAgICAgICAgICAxIDpcbiAgICAgICAgICAgIHplcm9SYXRpb1Q7XG5cbiAgICAgICAgbGV2ZWxPcGFjaXR5ICAgID0gTWF0aC5taW4oIDEsICggcmVuZGVyUGl4ZWxSYXRpb0MgLSAwLjUgKSAvIDAuNSApO1xuXG4gICAgICAgIGxldmVsVmlzaWJpbGl0eSA9IG9wdGltYWxSYXRpbyAvIE1hdGguYWJzKFxuICAgICAgICAgICAgb3B0aW1hbFJhdGlvIC0gcmVuZGVyUGl4ZWxSYXRpb1RcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBVcGRhdGUgdGhlIGxldmVsIGFuZCBrZWVwIHRyYWNrIG9mICdiZXN0JyB0aWxlIHRvIGxvYWRcbiAgICAgICAgYmVzdCA9IHVwZGF0ZUxldmVsKFxuICAgICAgICAgICAgdGlsZWRJbWFnZSxcbiAgICAgICAgICAgIGhhdmVEcmF3bixcbiAgICAgICAgICAgIGRyYXdMZXZlbCxcbiAgICAgICAgICAgIGxldmVsLFxuICAgICAgICAgICAgbGV2ZWxPcGFjaXR5LFxuICAgICAgICAgICAgbGV2ZWxWaXNpYmlsaXR5LFxuICAgICAgICAgICAgdmlld3BvcnRUTCxcbiAgICAgICAgICAgIHZpZXdwb3J0QlIsXG4gICAgICAgICAgICBjdXJyZW50VGltZSxcbiAgICAgICAgICAgIGJlc3RcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBTdG9wIHRoZSBsb29wIGlmIGxvd2VyLXJlcyB0aWxlcyB3b3VsZCBhbGwgYmUgY292ZXJlZCBieVxuICAgICAgICAvLyBhbHJlYWR5IGRyYXduIHRpbGVzXG4gICAgICAgIGlmICggIHByb3ZpZGVzQ292ZXJhZ2UoIHRpbGVkSW1hZ2UuY292ZXJhZ2UsIGxldmVsICkgKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFBlcmZvcm0gdGhlIGFjdHVhbCBkcmF3aW5nXG4gICAgZHJhd1RpbGVzKCB0aWxlZEltYWdlLCB0aWxlZEltYWdlLmxhc3REcmF3biApO1xuXG4gICAgLy8gTG9hZCB0aGUgbmV3ICdiZXN0JyB0aWxlXG4gICAgaWYgKGJlc3QgJiYgIWJlc3QuY29udGV4dDJEKSB7XG4gICAgICAgIGxvYWRUaWxlKCB0aWxlZEltYWdlLCBiZXN0LCBjdXJyZW50VGltZSApO1xuICAgIH1cblxufVxuXG5cbmZ1bmN0aW9uIHVwZGF0ZUxldmVsKCB0aWxlZEltYWdlLCBoYXZlRHJhd24sIGRyYXdMZXZlbCwgbGV2ZWwsIGxldmVsT3BhY2l0eSwgbGV2ZWxWaXNpYmlsaXR5LCB2aWV3cG9ydFRMLCB2aWV3cG9ydEJSLCBjdXJyZW50VGltZSwgYmVzdCApe1xuXG4gICAgdmFyIHgsIHksXG4gICAgICAgIHRpbGVUTCxcbiAgICAgICAgdGlsZUJSLFxuICAgICAgICBudW1iZXJPZlRpbGVzLFxuICAgICAgICB2aWV3cG9ydENlbnRlciAgPSB0aWxlZEltYWdlLnZpZXdwb3J0LnBpeGVsRnJvbVBvaW50KCB0aWxlZEltYWdlLnZpZXdwb3J0LmdldENlbnRlcigpICk7XG5cblxuICAgIGlmKCB0aWxlZEltYWdlLnZpZXdlciApe1xuICAgICAgICAvKipcbiAgICAgICAgICogPGVtPi0gTmVlZHMgZG9jdW1lbnRhdGlvbiAtPC9lbT5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV2ZW50IHVwZGF0ZS1sZXZlbFxuICAgICAgICAgKiBAbWVtYmVyb2YgT3BlblNlYWRyYWdvbi5WaWV3ZXJcbiAgICAgICAgICogQHR5cGUge29iamVjdH1cbiAgICAgICAgICogQHByb3BlcnR5IHtPcGVuU2VhZHJhZ29uLlZpZXdlcn0gZXZlbnRTb3VyY2UgLSBBIHJlZmVyZW5jZSB0byB0aGUgVmlld2VyIHdoaWNoIHJhaXNlZCB0aGUgZXZlbnQuXG4gICAgICAgICAqIEBwcm9wZXJ0eSB7T3BlblNlYWRyYWdvbi5UaWxlZEltYWdlfSB0aWxlZEltYWdlIC0gV2hpY2ggVGlsZWRJbWFnZSBpcyBiZWluZyBkcmF3bi5cbiAgICAgICAgICogQHByb3BlcnR5IHtPYmplY3R9IGhhdmVkcmF3blxuICAgICAgICAgKiBAcHJvcGVydHkge09iamVjdH0gbGV2ZWxcbiAgICAgICAgICogQHByb3BlcnR5IHtPYmplY3R9IG9wYWNpdHlcbiAgICAgICAgICogQHByb3BlcnR5IHtPYmplY3R9IHZpc2liaWxpdHlcbiAgICAgICAgICogQHByb3BlcnR5IHtPYmplY3R9IHRvcGxlZnRcbiAgICAgICAgICogQHByb3BlcnR5IHtPYmplY3R9IGJvdHRvbXJpZ2h0XG4gICAgICAgICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBjdXJyZW50dGltZVxuICAgICAgICAgKiBAcHJvcGVydHkge09iamVjdH0gYmVzdFxuICAgICAgICAgKiBAcHJvcGVydHkgez9PYmplY3R9IHVzZXJEYXRhIC0gQXJiaXRyYXJ5IHN1YnNjcmliZXItZGVmaW5lZCBvYmplY3QuXG4gICAgICAgICAqL1xuICAgICAgICB0aWxlZEltYWdlLnZpZXdlci5yYWlzZUV2ZW50KCAndXBkYXRlLWxldmVsJywge1xuICAgICAgICAgICAgdGlsZWRJbWFnZTogdGlsZWRJbWFnZSxcbiAgICAgICAgICAgIGhhdmVkcmF3bjogaGF2ZURyYXduLFxuICAgICAgICAgICAgbGV2ZWw6IGxldmVsLFxuICAgICAgICAgICAgb3BhY2l0eTogbGV2ZWxPcGFjaXR5LFxuICAgICAgICAgICAgdmlzaWJpbGl0eTogbGV2ZWxWaXNpYmlsaXR5LFxuICAgICAgICAgICAgdG9wbGVmdDogdmlld3BvcnRUTCxcbiAgICAgICAgICAgIGJvdHRvbXJpZ2h0OiB2aWV3cG9ydEJSLFxuICAgICAgICAgICAgY3VycmVudHRpbWU6IGN1cnJlbnRUaW1lLFxuICAgICAgICAgICAgYmVzdDogYmVzdFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvL09LLCBhIG5ldyBkcmF3aW5nIHNvIGRvIHlvdXIgY2FsY3VsYXRpb25zXG4gICAgdGlsZVRMICAgID0gdGlsZWRJbWFnZS5zb3VyY2UuZ2V0VGlsZUF0UG9pbnQoIGxldmVsLCB2aWV3cG9ydFRMLmRpdmlkZSggdGlsZWRJbWFnZS5fc2NhbGVTcHJpbmcuY3VycmVudC52YWx1ZSApKTtcbiAgICB0aWxlQlIgICAgPSB0aWxlZEltYWdlLnNvdXJjZS5nZXRUaWxlQXRQb2ludCggbGV2ZWwsIHZpZXdwb3J0QlIuZGl2aWRlKCB0aWxlZEltYWdlLl9zY2FsZVNwcmluZy5jdXJyZW50LnZhbHVlICkpO1xuICAgIG51bWJlck9mVGlsZXMgID0gdGlsZWRJbWFnZS5zb3VyY2UuZ2V0TnVtVGlsZXMoIGxldmVsICk7XG5cbiAgICByZXNldENvdmVyYWdlKCB0aWxlZEltYWdlLmNvdmVyYWdlLCBsZXZlbCApO1xuXG4gICAgaWYgKCAhdGlsZWRJbWFnZS53cmFwSG9yaXpvbnRhbCApIHtcbiAgICAgICAgdGlsZUJSLnggPSBNYXRoLm1pbiggdGlsZUJSLngsIG51bWJlck9mVGlsZXMueCAtIDEgKTtcbiAgICB9XG4gICAgaWYgKCAhdGlsZWRJbWFnZS53cmFwVmVydGljYWwgKSB7XG4gICAgICAgIHRpbGVCUi55ID0gTWF0aC5taW4oIHRpbGVCUi55LCBudW1iZXJPZlRpbGVzLnkgLSAxICk7XG4gICAgfVxuXG4gICAgZm9yICggeCA9IHRpbGVUTC54OyB4IDw9IHRpbGVCUi54OyB4KysgKSB7XG4gICAgICAgIGZvciAoIHkgPSB0aWxlVEwueTsgeSA8PSB0aWxlQlIueTsgeSsrICkge1xuXG4gICAgICAgICAgICBiZXN0ID0gdXBkYXRlVGlsZShcbiAgICAgICAgICAgICAgICB0aWxlZEltYWdlLFxuICAgICAgICAgICAgICAgIGRyYXdMZXZlbCxcbiAgICAgICAgICAgICAgICBoYXZlRHJhd24sXG4gICAgICAgICAgICAgICAgeCwgeSxcbiAgICAgICAgICAgICAgICBsZXZlbCxcbiAgICAgICAgICAgICAgICBsZXZlbE9wYWNpdHksXG4gICAgICAgICAgICAgICAgbGV2ZWxWaXNpYmlsaXR5LFxuICAgICAgICAgICAgICAgIHZpZXdwb3J0Q2VudGVyLFxuICAgICAgICAgICAgICAgIG51bWJlck9mVGlsZXMsXG4gICAgICAgICAgICAgICAgY3VycmVudFRpbWUsXG4gICAgICAgICAgICAgICAgYmVzdFxuICAgICAgICAgICAgKTtcblxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGJlc3Q7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVRpbGUoIHRpbGVkSW1hZ2UsIGRyYXdMZXZlbCwgaGF2ZURyYXduLCB4LCB5LCBsZXZlbCwgbGV2ZWxPcGFjaXR5LCBsZXZlbFZpc2liaWxpdHksIHZpZXdwb3J0Q2VudGVyLCBudW1iZXJPZlRpbGVzLCBjdXJyZW50VGltZSwgYmVzdCl7XG5cbiAgICB2YXIgdGlsZSA9IGdldFRpbGUoXG4gICAgICAgICAgICB4LCB5LFxuICAgICAgICAgICAgbGV2ZWwsXG4gICAgICAgICAgICB0aWxlZEltYWdlLnNvdXJjZSxcbiAgICAgICAgICAgIHRpbGVkSW1hZ2UudGlsZXNNYXRyaXgsXG4gICAgICAgICAgICBjdXJyZW50VGltZSxcbiAgICAgICAgICAgIG51bWJlck9mVGlsZXMsXG4gICAgICAgICAgICB0aWxlZEltYWdlLl93b3JsZFdpZHRoQ3VycmVudCxcbiAgICAgICAgICAgIHRpbGVkSW1hZ2UuX3dvcmxkSGVpZ2h0Q3VycmVudFxuICAgICAgICApLFxuICAgICAgICBkcmF3VGlsZSA9IGRyYXdMZXZlbDtcblxuICAgIGlmKCB0aWxlZEltYWdlLnZpZXdlciApe1xuICAgICAgICAvKipcbiAgICAgICAgICogPGVtPi0gTmVlZHMgZG9jdW1lbnRhdGlvbiAtPC9lbT5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV2ZW50IHVwZGF0ZS10aWxlXG4gICAgICAgICAqIEBtZW1iZXJvZiBPcGVuU2VhZHJhZ29uLlZpZXdlclxuICAgICAgICAgKiBAdHlwZSB7b2JqZWN0fVxuICAgICAgICAgKiBAcHJvcGVydHkge09wZW5TZWFkcmFnb24uVmlld2VyfSBldmVudFNvdXJjZSAtIEEgcmVmZXJlbmNlIHRvIHRoZSBWaWV3ZXIgd2hpY2ggcmFpc2VkIHRoZSBldmVudC5cbiAgICAgICAgICogQHByb3BlcnR5IHtPcGVuU2VhZHJhZ29uLlRpbGVkSW1hZ2V9IHRpbGVkSW1hZ2UgLSBXaGljaCBUaWxlZEltYWdlIGlzIGJlaW5nIGRyYXduLlxuICAgICAgICAgKiBAcHJvcGVydHkge09wZW5TZWFkcmFnb24uVGlsZX0gdGlsZVxuICAgICAgICAgKiBAcHJvcGVydHkgez9PYmplY3R9IHVzZXJEYXRhIC0gQXJiaXRyYXJ5IHN1YnNjcmliZXItZGVmaW5lZCBvYmplY3QuXG4gICAgICAgICAqL1xuICAgICAgICB0aWxlZEltYWdlLnZpZXdlci5yYWlzZUV2ZW50KCAndXBkYXRlLXRpbGUnLCB7XG4gICAgICAgICAgICB0aWxlZEltYWdlOiB0aWxlZEltYWdlLFxuICAgICAgICAgICAgdGlsZTogdGlsZVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzZXRDb3ZlcmFnZSggdGlsZWRJbWFnZS5jb3ZlcmFnZSwgbGV2ZWwsIHgsIHksIGZhbHNlICk7XG5cbiAgICBpZiAoICF0aWxlLmV4aXN0cyApIHtcbiAgICAgICAgcmV0dXJuIGJlc3Q7XG4gICAgfVxuXG4gICAgaWYgKCBoYXZlRHJhd24gJiYgIWRyYXdUaWxlICkge1xuICAgICAgICBpZiAoIGlzQ292ZXJlZCggdGlsZWRJbWFnZS5jb3ZlcmFnZSwgbGV2ZWwsIHgsIHkgKSApIHtcbiAgICAgICAgICAgIHNldENvdmVyYWdlKCB0aWxlZEltYWdlLmNvdmVyYWdlLCBsZXZlbCwgeCwgeSwgdHJ1ZSApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZHJhd1RpbGUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCAhZHJhd1RpbGUgKSB7XG4gICAgICAgIHJldHVybiBiZXN0O1xuICAgIH1cblxuICAgIHBvc2l0aW9uVGlsZShcbiAgICAgICAgdGlsZSxcbiAgICAgICAgdGlsZWRJbWFnZS5zb3VyY2UudGlsZU92ZXJsYXAsXG4gICAgICAgIHRpbGVkSW1hZ2Uudmlld3BvcnQsXG4gICAgICAgIHZpZXdwb3J0Q2VudGVyLFxuICAgICAgICBsZXZlbFZpc2liaWxpdHksXG4gICAgICAgIHRpbGVkSW1hZ2VcbiAgICApO1xuXG4gICAgaWYgKCF0aWxlLmxvYWRlZCkge1xuICAgICAgICBpZiAodGlsZS5jb250ZXh0MkQpIHtcbiAgICAgICAgICAgIHNldFRpbGVMb2FkZWQodGlsZWRJbWFnZSwgdGlsZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgaW1hZ2VSZWNvcmQgPSB0aWxlZEltYWdlLl90aWxlQ2FjaGUuZ2V0SW1hZ2VSZWNvcmQodGlsZS51cmwpO1xuICAgICAgICAgICAgaWYgKGltYWdlUmVjb3JkKSB7XG4gICAgICAgICAgICAgICAgdmFyIGltYWdlID0gaW1hZ2VSZWNvcmQuZ2V0SW1hZ2UoKTtcbiAgICAgICAgICAgICAgICBzZXRUaWxlTG9hZGVkKHRpbGVkSW1hZ2UsIHRpbGUsIGltYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmICggdGlsZS5sb2FkZWQgKSB7XG4gICAgICAgIHZhciBuZWVkc0RyYXcgPSBibGVuZFRpbGUoXG4gICAgICAgICAgICB0aWxlZEltYWdlLFxuICAgICAgICAgICAgdGlsZSxcbiAgICAgICAgICAgIHgsIHksXG4gICAgICAgICAgICBsZXZlbCxcbiAgICAgICAgICAgIGxldmVsT3BhY2l0eSxcbiAgICAgICAgICAgIGN1cnJlbnRUaW1lXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKCBuZWVkc0RyYXcgKSB7XG4gICAgICAgICAgICB0aWxlZEltYWdlLl9uZWVkc0RyYXcgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfSBlbHNlIGlmICggdGlsZS5sb2FkaW5nICkge1xuICAgICAgICAvLyB0aGUgdGlsZSBpcyBhbHJlYWR5IGluIHRoZSBkb3dubG9hZCBxdWV1ZVxuICAgICAgICAvLyB0aGFua3Mgam9zaDEwOTMgZm9yIGZpbmFsbHkgdHJhbnNsYXRpbmcgdGhpcyB0eXBvXG4gICAgfSBlbHNlIHtcbiAgICAgICAgYmVzdCA9IGNvbXBhcmVUaWxlcyggYmVzdCwgdGlsZSApO1xuICAgIH1cblxuICAgIHJldHVybiBiZXN0O1xufVxuXG5mdW5jdGlvbiBnZXRUaWxlKCB4LCB5LCBsZXZlbCwgdGlsZVNvdXJjZSwgdGlsZXNNYXRyaXgsIHRpbWUsIG51bVRpbGVzLCB3b3JsZFdpZHRoLCB3b3JsZEhlaWdodCApIHtcbiAgICB2YXIgeE1vZCxcbiAgICAgICAgeU1vZCxcbiAgICAgICAgYm91bmRzLFxuICAgICAgICBleGlzdHMsXG4gICAgICAgIHVybCxcbiAgICAgICAgY29udGV4dDJELFxuICAgICAgICB0aWxlO1xuXG4gICAgaWYgKCAhdGlsZXNNYXRyaXhbIGxldmVsIF0gKSB7XG4gICAgICAgIHRpbGVzTWF0cml4WyBsZXZlbCBdID0ge307XG4gICAgfVxuICAgIGlmICggIXRpbGVzTWF0cml4WyBsZXZlbCBdWyB4IF0gKSB7XG4gICAgICAgIHRpbGVzTWF0cml4WyBsZXZlbCBdWyB4IF0gPSB7fTtcbiAgICB9XG5cbiAgICBpZiAoICF0aWxlc01hdHJpeFsgbGV2ZWwgXVsgeCBdWyB5IF0gKSB7XG4gICAgICAgIHhNb2QgICAgPSAoIG51bVRpbGVzLnggKyAoIHggJSBudW1UaWxlcy54ICkgKSAlIG51bVRpbGVzLng7XG4gICAgICAgIHlNb2QgICAgPSAoIG51bVRpbGVzLnkgKyAoIHkgJSBudW1UaWxlcy55ICkgKSAlIG51bVRpbGVzLnk7XG4gICAgICAgIGJvdW5kcyAgPSB0aWxlU291cmNlLmdldFRpbGVCb3VuZHMoIGxldmVsLCB4TW9kLCB5TW9kICk7XG4gICAgICAgIGV4aXN0cyAgPSB0aWxlU291cmNlLnRpbGVFeGlzdHMoIGxldmVsLCB4TW9kLCB5TW9kICk7XG4gICAgICAgIHVybCAgICAgPSB0aWxlU291cmNlLmdldFRpbGVVcmwoIGxldmVsLCB4TW9kLCB5TW9kICk7XG4gICAgICAgIGNvbnRleHQyRCA9IHRpbGVTb3VyY2UuZ2V0Q29udGV4dDJEID9cbiAgICAgICAgICAgIHRpbGVTb3VyY2UuZ2V0Q29udGV4dDJEKGxldmVsLCB4TW9kLCB5TW9kKSA6IHVuZGVmaW5lZDtcblxuICAgICAgICBib3VuZHMueCArPSAoIHggLSB4TW9kICkgLyBudW1UaWxlcy54O1xuICAgICAgICBib3VuZHMueSArPSAod29ybGRIZWlnaHQgLyB3b3JsZFdpZHRoKSAqICgoIHkgLSB5TW9kICkgLyBudW1UaWxlcy55KTtcblxuICAgICAgICB0aWxlc01hdHJpeFsgbGV2ZWwgXVsgeCBdWyB5IF0gPSBuZXcgJC5UaWxlKFxuICAgICAgICAgICAgbGV2ZWwsXG4gICAgICAgICAgICB4LFxuICAgICAgICAgICAgeSxcbiAgICAgICAgICAgIGJvdW5kcyxcbiAgICAgICAgICAgIGV4aXN0cyxcbiAgICAgICAgICAgIHVybCxcbiAgICAgICAgICAgIGNvbnRleHQyRFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHRpbGUgPSB0aWxlc01hdHJpeFsgbGV2ZWwgXVsgeCBdWyB5IF07XG4gICAgdGlsZS5sYXN0VG91Y2hUaW1lID0gdGltZTtcblxuICAgIHJldHVybiB0aWxlO1xufVxuXG5mdW5jdGlvbiBsb2FkVGlsZSggdGlsZWRJbWFnZSwgdGlsZSwgdGltZSApIHtcbiAgICB0aWxlLmxvYWRpbmcgPSB0cnVlO1xuICAgIHRpbGVkSW1hZ2UuX2ltYWdlTG9hZGVyLmFkZEpvYih7XG4gICAgICAgIHNyYzogdGlsZS51cmwsXG4gICAgICAgIGNyb3NzT3JpZ2luUG9saWN5OiB0aWxlZEltYWdlLmNyb3NzT3JpZ2luUG9saWN5LFxuICAgICAgICBjYWxsYmFjazogZnVuY3Rpb24oIGltYWdlLCBlcnJvck1zZyApe1xuICAgICAgICAgICAgb25UaWxlTG9hZCggdGlsZWRJbWFnZSwgdGlsZSwgdGltZSwgaW1hZ2UsIGVycm9yTXNnICk7XG4gICAgICAgIH0sXG4gICAgICAgIGFib3J0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHRpbGUubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIG9uVGlsZUxvYWQoIHRpbGVkSW1hZ2UsIHRpbGUsIHRpbWUsIGltYWdlLCBlcnJvck1zZyApIHtcbiAgICBpZiAoICFpbWFnZSApIHtcbiAgICAgICAgJC5jb25zb2xlLmxvZyggXCJUaWxlICVzIGZhaWxlZCB0byBsb2FkOiAlcyAtIGVycm9yOiAlc1wiLCB0aWxlLCB0aWxlLnVybCwgZXJyb3JNc2cgKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRyaWdnZXJlZCB3aGVuIGEgdGlsZSBmYWlscyB0byBsb2FkLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXZlbnQgdGlsZS1sb2FkLWZhaWxlZFxuICAgICAgICAgKiBAbWVtYmVyb2YgT3BlblNlYWRyYWdvbi5WaWV3ZXJcbiAgICAgICAgICogQHR5cGUge29iamVjdH1cbiAgICAgICAgICogQHByb3BlcnR5IHtPcGVuU2VhZHJhZ29uLlRpbGV9IHRpbGUgLSBUaGUgdGlsZSB0aGF0IGZhaWxlZCB0byBsb2FkLlxuICAgICAgICAgKiBAcHJvcGVydHkge09wZW5TZWFkcmFnb24uVGlsZWRJbWFnZX0gdGlsZWRJbWFnZSAtIFRoZSB0aWxlZCBpbWFnZSB0aGUgdGlsZSBiZWxvbmdzIHRvLlxuICAgICAgICAgKiBAcHJvcGVydHkge251bWJlcn0gdGltZSAtIFRoZSB0aW1lIGluIG1pbGxpc2Vjb25kcyB3aGVuIHRoZSB0aWxlIGxvYWQgYmVnYW4uXG4gICAgICAgICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBtZXNzYWdlIC0gVGhlIGVycm9yIG1lc3NhZ2UuXG4gICAgICAgICAqL1xuICAgICAgICB0aWxlZEltYWdlLnZpZXdlci5yYWlzZUV2ZW50KFwidGlsZS1sb2FkLWZhaWxlZFwiLCB7dGlsZTogdGlsZSwgdGlsZWRJbWFnZTogdGlsZWRJbWFnZSwgdGltZTogdGltZSwgbWVzc2FnZTogZXJyb3JNc2d9KTtcbiAgICAgICAgdGlsZS5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIHRpbGUuZXhpc3RzID0gZmFsc2U7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIHRpbWUgPCB0aWxlZEltYWdlLmxhc3RSZXNldFRpbWUgKSB7XG4gICAgICAgICQuY29uc29sZS5sb2coIFwiSWdub3JpbmcgdGlsZSAlcyBsb2FkZWQgYmVmb3JlIHJlc2V0OiAlc1wiLCB0aWxlLCB0aWxlLnVybCApO1xuICAgICAgICB0aWxlLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBmaW5pc2ggPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGN1dG9mZiA9IE1hdGguY2VpbCggTWF0aC5sb2coXG4gICAgICAgICAgICB0aWxlZEltYWdlLnNvdXJjZS5nZXRUaWxlV2lkdGgodGlsZS5sZXZlbCkgKSAvIE1hdGgubG9nKCAyICkgKTtcbiAgICAgICAgc2V0VGlsZUxvYWRlZCh0aWxlZEltYWdlLCB0aWxlLCBpbWFnZSwgY3V0b2ZmKTtcbiAgICB9O1xuXG4gICAgLy8gQ2hlY2sgaWYgd2UncmUgbWlkLXVwZGF0ZTsgdGhpcyBjYW4gaGFwcGVuIG9uIElFOCBiZWNhdXNlIGltYWdlIGxvYWQgZXZlbnRzIGZvclxuICAgIC8vIGNhY2hlZCBpbWFnZXMgaGFwcGVuIGltbWVkaWF0ZWx5IHRoZXJlXG4gICAgaWYgKCAhdGlsZWRJbWFnZS5fbWlkRHJhdyApIHtcbiAgICAgICAgZmluaXNoKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gV2FpdCB1bnRpbCBhZnRlciB0aGUgdXBkYXRlLCBpbiBjYXNlIGNhY2hpbmcgdW5sb2FkcyBhbnkgdGlsZXNcbiAgICAgICAgd2luZG93LnNldFRpbWVvdXQoIGZpbmlzaCwgMSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBzZXRUaWxlTG9hZGVkKHRpbGVkSW1hZ2UsIHRpbGUsIGltYWdlLCBjdXRvZmYpIHtcbiAgICB2YXIgaW5jcmVtZW50ID0gMDtcblxuICAgIGZ1bmN0aW9uIGdldENvbXBsZXRpb25DYWxsYmFjaygpIHtcbiAgICAgICAgaW5jcmVtZW50Kys7XG4gICAgICAgIHJldHVybiBjb21wbGV0aW9uQ2FsbGJhY2s7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY29tcGxldGlvbkNhbGxiYWNrKCkge1xuICAgICAgICBpbmNyZW1lbnQtLTtcbiAgICAgICAgaWYgKGluY3JlbWVudCA9PT0gMCkge1xuICAgICAgICAgICAgdGlsZS5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICB0aWxlLmxvYWRlZCA9IHRydWU7XG4gICAgICAgICAgICBpZiAoIXRpbGUuY29udGV4dDJEKSB7XG4gICAgICAgICAgICAgICAgdGlsZWRJbWFnZS5fdGlsZUNhY2hlLmNhY2hlVGlsZSh7XG4gICAgICAgICAgICAgICAgICAgIGltYWdlOiBpbWFnZSxcbiAgICAgICAgICAgICAgICAgICAgdGlsZTogdGlsZSxcbiAgICAgICAgICAgICAgICAgICAgY3V0b2ZmOiBjdXRvZmYsXG4gICAgICAgICAgICAgICAgICAgIHRpbGVkSW1hZ2U6IHRpbGVkSW1hZ2VcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRpbGVkSW1hZ2UuX25lZWRzRHJhdyA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUcmlnZ2VyZWQgd2hlbiBhIHRpbGUgaGFzIGp1c3QgYmVlbiBsb2FkZWQgaW4gbWVtb3J5LiBUaGF0IG1lYW5zIHRoYXQgdGhlXG4gICAgICogaW1hZ2UgaGFzIGJlZW4gZG93bmxvYWRlZCBhbmQgY2FuIGJlIG1vZGlmaWVkIGJlZm9yZSBiZWluZyBkcmF3biB0byB0aGUgY2FudmFzLlxuICAgICAqXG4gICAgICogQGV2ZW50IHRpbGUtbG9hZGVkXG4gICAgICogQG1lbWJlcm9mIE9wZW5TZWFkcmFnb24uVmlld2VyXG4gICAgICogQHR5cGUge29iamVjdH1cbiAgICAgKiBAcHJvcGVydHkge0ltYWdlfSBpbWFnZSAtIFRoZSBpbWFnZSBvZiB0aGUgdGlsZS5cbiAgICAgKiBAcHJvcGVydHkge09wZW5TZWFkcmFnb24uVGlsZWRJbWFnZX0gdGlsZWRJbWFnZSAtIFRoZSB0aWxlZCBpbWFnZSBvZiB0aGUgbG9hZGVkIHRpbGUuXG4gICAgICogQHByb3BlcnR5IHtPcGVuU2VhZHJhZ29uLlRpbGV9IHRpbGUgLSBUaGUgdGlsZSB3aGljaCBoYXMgYmVlbiBsb2FkZWQuXG4gICAgICogQHByb3BlcnR5IHtmdW5jdGlvbn0gZ2V0Q29tcGxldGlvbkNhbGxiYWNrIC0gQSBmdW5jdGlvbiBnaXZpbmcgYSBjYWxsYmFjayB0byBjYWxsXG4gICAgICogd2hlbiB0aGUgYXN5bmNocm9ub3VzIHByb2Nlc3Npbmcgb2YgdGhlIGltYWdlIGlzIGRvbmUuIFRoZSBpbWFnZSB3aWxsIGJlXG4gICAgICogbWFya2VkIGFzIGVudGlyZWx5IGxvYWRlZCB3aGVuIHRoZSBjYWxsYmFjayBoYXMgYmVlbiBjYWxsZWQgb25jZSBmb3IgZWFjaFxuICAgICAqIGNhbGwgdG8gZ2V0Q29tcGxldGlvbkNhbGxiYWNrLlxuICAgICAqL1xuICAgIHRpbGVkSW1hZ2Uudmlld2VyLnJhaXNlRXZlbnQoXCJ0aWxlLWxvYWRlZFwiLCB7XG4gICAgICAgIHRpbGU6IHRpbGUsXG4gICAgICAgIHRpbGVkSW1hZ2U6IHRpbGVkSW1hZ2UsXG4gICAgICAgIGltYWdlOiBpbWFnZSxcbiAgICAgICAgZ2V0Q29tcGxldGlvbkNhbGxiYWNrOiBnZXRDb21wbGV0aW9uQ2FsbGJhY2tcbiAgICB9KTtcbiAgICAvLyBJbiBjYXNlIHRoZSBjb21wbGV0aW9uIGNhbGxiYWNrIGlzIG5ldmVyIGNhbGxlZCwgd2UgYXQgbGVhc3QgZm9yY2UgaXQgb25jZS5cbiAgICBnZXRDb21wbGV0aW9uQ2FsbGJhY2soKSgpO1xufVxuXG5mdW5jdGlvbiBwb3NpdGlvblRpbGUoIHRpbGUsIG92ZXJsYXAsIHZpZXdwb3J0LCB2aWV3cG9ydENlbnRlciwgbGV2ZWxWaXNpYmlsaXR5LCB0aWxlZEltYWdlICl7XG4gICAgdmFyIGJvdW5kc1RMICAgICA9IHRpbGUuYm91bmRzLmdldFRvcExlZnQoKTtcblxuICAgIGJvdW5kc1RMLnggKj0gdGlsZWRJbWFnZS5fc2NhbGVTcHJpbmcuY3VycmVudC52YWx1ZTtcbiAgICBib3VuZHNUTC55ICo9IHRpbGVkSW1hZ2UuX3NjYWxlU3ByaW5nLmN1cnJlbnQudmFsdWU7XG4gICAgYm91bmRzVEwueCArPSB0aWxlZEltYWdlLl94U3ByaW5nLmN1cnJlbnQudmFsdWU7XG4gICAgYm91bmRzVEwueSArPSB0aWxlZEltYWdlLl95U3ByaW5nLmN1cnJlbnQudmFsdWU7XG5cbiAgICB2YXIgYm91bmRzU2l6ZSAgID0gdGlsZS5ib3VuZHMuZ2V0U2l6ZSgpO1xuXG4gICAgYm91bmRzU2l6ZS54ICo9IHRpbGVkSW1hZ2UuX3NjYWxlU3ByaW5nLmN1cnJlbnQudmFsdWU7XG4gICAgYm91bmRzU2l6ZS55ICo9IHRpbGVkSW1hZ2UuX3NjYWxlU3ByaW5nLmN1cnJlbnQudmFsdWU7XG5cbiAgICB2YXIgcG9zaXRpb25DICAgID0gdmlld3BvcnQucGl4ZWxGcm9tUG9pbnROb1JvdGF0ZShib3VuZHNUTCwgdHJ1ZSksXG4gICAgICAgIHBvc2l0aW9uVCAgICA9IHZpZXdwb3J0LnBpeGVsRnJvbVBvaW50Tm9Sb3RhdGUoYm91bmRzVEwsIGZhbHNlKSxcbiAgICAgICAgc2l6ZUMgICAgICAgID0gdmlld3BvcnQuZGVsdGFQaXhlbHNGcm9tUG9pbnRzTm9Sb3RhdGUoYm91bmRzU2l6ZSwgdHJ1ZSksXG4gICAgICAgIHNpemVUICAgICAgICA9IHZpZXdwb3J0LmRlbHRhUGl4ZWxzRnJvbVBvaW50c05vUm90YXRlKGJvdW5kc1NpemUsIGZhbHNlKSxcbiAgICAgICAgdGlsZUNlbnRlciAgID0gcG9zaXRpb25ULnBsdXMoIHNpemVULmRpdmlkZSggMiApICksXG4gICAgICAgIHRpbGVEaXN0YW5jZSA9IHZpZXdwb3J0Q2VudGVyLmRpc3RhbmNlVG8oIHRpbGVDZW50ZXIgKTtcblxuICAgIGlmICggIW92ZXJsYXAgKSB7XG4gICAgICAgIHNpemVDID0gc2l6ZUMucGx1cyggbmV3ICQuUG9pbnQoIDEsIDEgKSApO1xuICAgIH1cblxuICAgIHRpbGUucG9zaXRpb24gICA9IHBvc2l0aW9uQztcbiAgICB0aWxlLnNpemUgICAgICAgPSBzaXplQztcbiAgICB0aWxlLmRpc3RhbmNlICAgPSB0aWxlRGlzdGFuY2U7XG4gICAgdGlsZS52aXNpYmlsaXR5ID0gbGV2ZWxWaXNpYmlsaXR5O1xufVxuXG5cbmZ1bmN0aW9uIGJsZW5kVGlsZSggdGlsZWRJbWFnZSwgdGlsZSwgeCwgeSwgbGV2ZWwsIGxldmVsT3BhY2l0eSwgY3VycmVudFRpbWUgKXtcbiAgICB2YXIgYmxlbmRUaW1lTWlsbGlzID0gMTAwMCAqIHRpbGVkSW1hZ2UuYmxlbmRUaW1lLFxuICAgICAgICBkZWx0YVRpbWUsXG4gICAgICAgIG9wYWNpdHk7XG5cbiAgICBpZiAoICF0aWxlLmJsZW5kU3RhcnQgKSB7XG4gICAgICAgIHRpbGUuYmxlbmRTdGFydCA9IGN1cnJlbnRUaW1lO1xuICAgIH1cblxuICAgIGRlbHRhVGltZSAgID0gY3VycmVudFRpbWUgLSB0aWxlLmJsZW5kU3RhcnQ7XG4gICAgb3BhY2l0eSAgICAgPSBibGVuZFRpbWVNaWxsaXMgPyBNYXRoLm1pbiggMSwgZGVsdGFUaW1lIC8gKCBibGVuZFRpbWVNaWxsaXMgKSApIDogMTtcblxuICAgIGlmICggdGlsZWRJbWFnZS5hbHdheXNCbGVuZCApIHtcbiAgICAgICAgb3BhY2l0eSAqPSBsZXZlbE9wYWNpdHk7XG4gICAgfVxuXG4gICAgdGlsZS5vcGFjaXR5ID0gb3BhY2l0eTtcblxuICAgIHRpbGVkSW1hZ2UubGFzdERyYXduLnB1c2goIHRpbGUgKTtcblxuICAgIGlmICggb3BhY2l0eSA9PSAxICkge1xuICAgICAgICBzZXRDb3ZlcmFnZSggdGlsZWRJbWFnZS5jb3ZlcmFnZSwgbGV2ZWwsIHgsIHksIHRydWUgKTtcbiAgICAgICAgdGlsZWRJbWFnZS5faGFzT3BhcXVlVGlsZSA9IHRydWU7XG4gICAgfSBlbHNlIGlmICggZGVsdGFUaW1lIDwgYmxlbmRUaW1lTWlsbGlzICkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEBpbm5lclxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiB0aWxlIHByb3ZpZGVzIGNvdmVyYWdlIHRvIGxvd2VyLWxldmVsIHRpbGVzIG9mXG4gKiBsb3dlciByZXNvbHV0aW9uIHJlcHJlc2VudGluZyB0aGUgc2FtZSBjb250ZW50LiBJZiBuZWl0aGVyIHggbm9yIHkgaXNcbiAqIGdpdmVuLCByZXR1cm5zIHRydWUgaWYgdGhlIGVudGlyZSB2aXNpYmxlIGxldmVsIHByb3ZpZGVzIGNvdmVyYWdlLlxuICpcbiAqIE5vdGUgdGhhdCBvdXQtb2YtYm91bmRzIHRpbGVzIHByb3ZpZGUgY292ZXJhZ2UgaW4gdGhpcyBzZW5zZSwgc2luY2VcbiAqIHRoZXJlJ3Mgbm8gY29udGVudCB0aGF0IHRoZXkgd291bGQgbmVlZCB0byBjb3Zlci4gVGlsZXMgYXQgbm9uLWV4aXN0ZW50XG4gKiBsZXZlbHMgdGhhdCBhcmUgd2l0aGluIHRoZSBpbWFnZSBib3VuZHMsIGhvd2V2ZXIsIGRvIG5vdC5cbiAqL1xuZnVuY3Rpb24gcHJvdmlkZXNDb3ZlcmFnZSggY292ZXJhZ2UsIGxldmVsLCB4LCB5ICkge1xuICAgIHZhciByb3dzLFxuICAgICAgICBjb2xzLFxuICAgICAgICBpLCBqO1xuXG4gICAgaWYgKCAhY292ZXJhZ2VbIGxldmVsIF0gKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoIHggPT09IHVuZGVmaW5lZCB8fCB5ID09PSB1bmRlZmluZWQgKSB7XG4gICAgICAgIHJvd3MgPSBjb3ZlcmFnZVsgbGV2ZWwgXTtcbiAgICAgICAgZm9yICggaSBpbiByb3dzICkge1xuICAgICAgICAgICAgaWYgKCByb3dzLmhhc093blByb3BlcnR5KCBpICkgKSB7XG4gICAgICAgICAgICAgICAgY29scyA9IHJvd3NbIGkgXTtcbiAgICAgICAgICAgICAgICBmb3IgKCBqIGluIGNvbHMgKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICggY29scy5oYXNPd25Qcm9wZXJ0eSggaiApICYmICFjb2xzWyBqIF0gKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gKFxuICAgICAgICBjb3ZlcmFnZVsgbGV2ZWwgXVsgeF0gPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICBjb3ZlcmFnZVsgbGV2ZWwgXVsgeCBdWyB5IF0gPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICBjb3ZlcmFnZVsgbGV2ZWwgXVsgeCBdWyB5IF0gPT09IHRydWVcbiAgICApO1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAaW5uZXJcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gdGlsZSBpcyBjb21wbGV0ZWx5IGNvdmVyZWQgYnkgaGlnaGVyLWxldmVsXG4gKiB0aWxlcyBvZiBoaWdoZXIgcmVzb2x1dGlvbiByZXByZXNlbnRpbmcgdGhlIHNhbWUgY29udGVudC4gSWYgbmVpdGhlciB4XG4gKiBub3IgeSBpcyBnaXZlbiwgcmV0dXJucyB0cnVlIGlmIHRoZSBlbnRpcmUgdmlzaWJsZSBsZXZlbCBpcyBjb3ZlcmVkLlxuICovXG5mdW5jdGlvbiBpc0NvdmVyZWQoIGNvdmVyYWdlLCBsZXZlbCwgeCwgeSApIHtcbiAgICBpZiAoIHggPT09IHVuZGVmaW5lZCB8fCB5ID09PSB1bmRlZmluZWQgKSB7XG4gICAgICAgIHJldHVybiBwcm92aWRlc0NvdmVyYWdlKCBjb3ZlcmFnZSwgbGV2ZWwgKyAxICk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICBwcm92aWRlc0NvdmVyYWdlKCBjb3ZlcmFnZSwgbGV2ZWwgKyAxLCAyICogeCwgMiAqIHkgKSAmJlxuICAgICAgICAgICAgIHByb3ZpZGVzQ292ZXJhZ2UoIGNvdmVyYWdlLCBsZXZlbCArIDEsIDIgKiB4LCAyICogeSArIDEgKSAmJlxuICAgICAgICAgICAgIHByb3ZpZGVzQ292ZXJhZ2UoIGNvdmVyYWdlLCBsZXZlbCArIDEsIDIgKiB4ICsgMSwgMiAqIHkgKSAmJlxuICAgICAgICAgICAgIHByb3ZpZGVzQ292ZXJhZ2UoIGNvdmVyYWdlLCBsZXZlbCArIDEsIDIgKiB4ICsgMSwgMiAqIHkgKyAxIClcbiAgICAgICAgKTtcbiAgICB9XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEBpbm5lclxuICogU2V0cyB3aGV0aGVyIHRoZSBnaXZlbiB0aWxlIHByb3ZpZGVzIGNvdmVyYWdlIG9yIG5vdC5cbiAqL1xuZnVuY3Rpb24gc2V0Q292ZXJhZ2UoIGNvdmVyYWdlLCBsZXZlbCwgeCwgeSwgY292ZXJzICkge1xuICAgIGlmICggIWNvdmVyYWdlWyBsZXZlbCBdICkge1xuICAgICAgICAkLmNvbnNvbGUud2FybihcbiAgICAgICAgICAgIFwiU2V0dGluZyBjb3ZlcmFnZSBmb3IgYSB0aWxlIGJlZm9yZSBpdHMgbGV2ZWwncyBjb3ZlcmFnZSBoYXMgYmVlbiByZXNldDogJXNcIixcbiAgICAgICAgICAgIGxldmVsXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoICFjb3ZlcmFnZVsgbGV2ZWwgXVsgeCBdICkge1xuICAgICAgICBjb3ZlcmFnZVsgbGV2ZWwgXVsgeCBdID0ge307XG4gICAgfVxuXG4gICAgY292ZXJhZ2VbIGxldmVsIF1bIHggXVsgeSBdID0gY292ZXJzO1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAaW5uZXJcbiAqIFJlc2V0cyBjb3ZlcmFnZSBpbmZvcm1hdGlvbiBmb3IgdGhlIGdpdmVuIGxldmVsLiBUaGlzIHNob3VsZCBiZSBjYWxsZWRcbiAqIGFmdGVyIGV2ZXJ5IGRyYXcgcm91dGluZS4gTm90ZSB0aGF0IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIG5leHQgZHJhd1xuICogcm91dGluZSwgY292ZXJhZ2UgZm9yIGV2ZXJ5IHZpc2libGUgdGlsZSBzaG91bGQgYmUgZXhwbGljaXRseSBzZXQuXG4gKi9cbmZ1bmN0aW9uIHJlc2V0Q292ZXJhZ2UoIGNvdmVyYWdlLCBsZXZlbCApIHtcbiAgICBjb3ZlcmFnZVsgbGV2ZWwgXSA9IHt9O1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAaW5uZXJcbiAqIERldGVybWluZXMgd2hldGhlciB0aGUgJ2xhc3QgYmVzdCcgdGlsZSBmb3IgdGhlIGFyZWEgaXMgYmV0dGVyIHRoYW4gdGhlXG4gKiB0aWxlIGluIHF1ZXN0aW9uLlxuICovXG5mdW5jdGlvbiBjb21wYXJlVGlsZXMoIHByZXZpb3VzQmVzdCwgdGlsZSApIHtcbiAgICBpZiAoICFwcmV2aW91c0Jlc3QgKSB7XG4gICAgICAgIHJldHVybiB0aWxlO1xuICAgIH1cblxuICAgIGlmICggdGlsZS52aXNpYmlsaXR5ID4gcHJldmlvdXNCZXN0LnZpc2liaWxpdHkgKSB7XG4gICAgICAgIHJldHVybiB0aWxlO1xuICAgIH0gZWxzZSBpZiAoIHRpbGUudmlzaWJpbGl0eSA9PSBwcmV2aW91c0Jlc3QudmlzaWJpbGl0eSApIHtcbiAgICAgICAgaWYgKCB0aWxlLmRpc3RhbmNlIDwgcHJldmlvdXNCZXN0LmRpc3RhbmNlICkge1xuICAgICAgICAgICAgcmV0dXJuIHRpbGU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcHJldmlvdXNCZXN0O1xufVxuXG5mdW5jdGlvbiBkcmF3VGlsZXMoIHRpbGVkSW1hZ2UsIGxhc3REcmF3biApIHtcbiAgICBpZiAobGFzdERyYXduLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciB0aWxlID0gbGFzdERyYXduWzBdO1xuXG4gICAgdmFyIHVzZVNrZXRjaCA9IHRpbGVkSW1hZ2Uub3BhY2l0eSA8IDEgfHxcbiAgICAgICAgKHRpbGVkSW1hZ2UuY29tcG9zaXRlT3BlcmF0aW9uICYmXG4gICAgICAgICAgICB0aWxlZEltYWdlLmNvbXBvc2l0ZU9wZXJhdGlvbiAhPT0gJ3NvdXJjZS1vdmVyJykgfHxcbiAgICAgICAgKCF0aWxlZEltYWdlLl9pc0JvdHRvbUl0ZW0oKSAmJiB0aWxlLl9oYXNUcmFuc3BhcmVuY3lDaGFubmVsKCkpO1xuXG4gICAgdmFyIHNrZXRjaFNjYWxlO1xuICAgIHZhciBza2V0Y2hUcmFuc2xhdGU7XG5cbiAgICB2YXIgem9vbSA9IHRpbGVkSW1hZ2Uudmlld3BvcnQuZ2V0Wm9vbSh0cnVlKTtcbiAgICB2YXIgaW1hZ2Vab29tID0gdGlsZWRJbWFnZS52aWV3cG9ydFRvSW1hZ2Vab29tKHpvb20pO1xuICAgIGlmIChpbWFnZVpvb20gPiB0aWxlZEltYWdlLnNtb290aFRpbGVFZGdlc01pblpvb20gJiYgIXRpbGVkSW1hZ2UuaU9TRGV2aWNlKSB7XG4gICAgICAgIC8vIFdoZW4gem9vbWVkIGluIGEgbG90ICg+MTAwJSkgdGhlIHRpbGUgZWRnZXMgYXJlIHZpc2libGUuXG4gICAgICAgIC8vIFNvIHdlIGhhdmUgdG8gY29tcG9zaXRlIHRoZW0gYXQgfjEwMCUgYW5kIHNjYWxlIHRoZW0gdXAgdG9nZXRoZXIuXG4gICAgICAgIC8vIE5vdGU6IERpc2FibGVkIG9uIGlPUyBkZXZpY2VzIHBlciBkZWZhdWx0IGFzIGl0IGNhdXNlcyBhIG5hdGl2ZSBjcmFzaFxuICAgICAgICB1c2VTa2V0Y2ggPSB0cnVlO1xuICAgICAgICBza2V0Y2hTY2FsZSA9IHRpbGUuZ2V0U2NhbGVGb3JFZGdlU21vb3RoaW5nKCk7XG4gICAgICAgIHNrZXRjaFRyYW5zbGF0ZSA9IHRpbGUuZ2V0VHJhbnNsYXRpb25Gb3JFZGdlU21vb3RoaW5nKHNrZXRjaFNjYWxlLFxuICAgICAgICAgICAgdGlsZWRJbWFnZS5fZHJhd2VyLmdldENhbnZhc1NpemUoZmFsc2UpLFxuICAgICAgICAgICAgdGlsZWRJbWFnZS5fZHJhd2VyLmdldENhbnZhc1NpemUodHJ1ZSkpO1xuICAgIH1cblxuICAgIHZhciBib3VuZHM7XG4gICAgaWYgKHVzZVNrZXRjaCkge1xuICAgICAgICBpZiAoIXNrZXRjaFNjYWxlKSB7XG4gICAgICAgICAgICAvLyBFeGNlcHQgd2hlbiBlZGdlIHNtb290aGluZywgd2Ugb25seSBjbGVhbiB0aGUgcGFydCBvZiB0aGVcbiAgICAgICAgICAgIC8vIHNrZXRjaCBjYW52YXMgd2UgYXJlIGdvaW5nIHRvIHVzZSBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy5cbiAgICAgICAgICAgIGJvdW5kcyA9IHRpbGVkSW1hZ2Uudmlld3BvcnQudmlld3BvcnRUb1ZpZXdlckVsZW1lbnRSZWN0YW5nbGUoXG4gICAgICAgICAgICAgICAgdGlsZWRJbWFnZS5nZXRDbGlwcGVkQm91bmRzKHRydWUpKVxuICAgICAgICAgICAgICAgIC5nZXRJbnRlZ2VyQm91bmRpbmdCb3goKVxuICAgICAgICAgICAgICAgIC50aW1lcygkLnBpeGVsRGVuc2l0eVJhdGlvKTtcbiAgICAgICAgfVxuICAgICAgICB0aWxlZEltYWdlLl9kcmF3ZXIuX2NsZWFyKHRydWUsIGJvdW5kcyk7XG4gICAgfVxuXG4gICAgLy8gV2hlbiBzY2FsaW5nLCB3ZSBtdXN0IHJvdGF0ZSBvbmx5IHdoZW4gYmxlbmRpbmcgdGhlIHNrZXRjaCBjYW52YXMgdG8gYXZvaWRcbiAgICAvLyBpbnRlcnBvbGF0aW9uXG4gICAgaWYgKHRpbGVkSW1hZ2Uudmlld3BvcnQuZGVncmVlcyAhPT0gMCAmJiAhc2tldGNoU2NhbGUpIHtcbiAgICAgICAgdGlsZWRJbWFnZS5fZHJhd2VyLl9vZmZzZXRGb3JSb3RhdGlvbih0aWxlZEltYWdlLnZpZXdwb3J0LmRlZ3JlZXMsIHVzZVNrZXRjaCk7XG4gICAgfVxuXG4gICAgdmFyIHVzZWRDbGlwID0gZmFsc2U7XG4gICAgaWYgKCB0aWxlZEltYWdlLl9jbGlwICkge1xuICAgICAgICB0aWxlZEltYWdlLl9kcmF3ZXIuc2F2ZUNvbnRleHQodXNlU2tldGNoKTtcblxuICAgICAgICB2YXIgYm94ID0gdGlsZWRJbWFnZS5pbWFnZVRvVmlld3BvcnRSZWN0YW5nbGUodGlsZWRJbWFnZS5fY2xpcCwgdHJ1ZSk7XG4gICAgICAgIHZhciBjbGlwUmVjdCA9IHRpbGVkSW1hZ2UuX2RyYXdlci52aWV3cG9ydFRvRHJhd2VyUmVjdGFuZ2xlKGJveCk7XG4gICAgICAgIGlmIChza2V0Y2hTY2FsZSkge1xuICAgICAgICAgICAgY2xpcFJlY3QgPSBjbGlwUmVjdC50aW1lcyhza2V0Y2hTY2FsZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNrZXRjaFRyYW5zbGF0ZSkge1xuICAgICAgICAgICAgY2xpcFJlY3QgPSBjbGlwUmVjdC50cmFuc2xhdGUoc2tldGNoVHJhbnNsYXRlKTtcbiAgICAgICAgfVxuICAgICAgICB0aWxlZEltYWdlLl9kcmF3ZXIuc2V0Q2xpcChjbGlwUmVjdCwgdXNlU2tldGNoKTtcblxuICAgICAgICB1c2VkQ2xpcCA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKCB0aWxlZEltYWdlLnBsYWNlaG9sZGVyRmlsbFN0eWxlICYmIHRpbGVkSW1hZ2UuX2hhc09wYXF1ZVRpbGUgPT09IGZhbHNlICkge1xuICAgICAgICB2YXIgcGxhY2Vob2xkZXJSZWN0ID0gdGlsZWRJbWFnZS5fZHJhd2VyLnZpZXdwb3J0VG9EcmF3ZXJSZWN0YW5nbGUodGlsZWRJbWFnZS5nZXRCb3VuZHModHJ1ZSkpO1xuICAgICAgICBpZiAoc2tldGNoU2NhbGUpIHtcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyUmVjdCA9IHBsYWNlaG9sZGVyUmVjdC50aW1lcyhza2V0Y2hTY2FsZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNrZXRjaFRyYW5zbGF0ZSkge1xuICAgICAgICAgICAgcGxhY2Vob2xkZXJSZWN0ID0gcGxhY2Vob2xkZXJSZWN0LnRyYW5zbGF0ZShza2V0Y2hUcmFuc2xhdGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGZpbGxTdHlsZSA9IG51bGw7XG4gICAgICAgIGlmICggdHlwZW9mIHRpbGVkSW1hZ2UucGxhY2Vob2xkZXJGaWxsU3R5bGUgPT09IFwiZnVuY3Rpb25cIiApIHtcbiAgICAgICAgICAgIGZpbGxTdHlsZSA9IHRpbGVkSW1hZ2UucGxhY2Vob2xkZXJGaWxsU3R5bGUodGlsZWRJbWFnZSwgdGlsZWRJbWFnZS5fZHJhd2VyLmNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZmlsbFN0eWxlID0gdGlsZWRJbWFnZS5wbGFjZWhvbGRlckZpbGxTdHlsZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRpbGVkSW1hZ2UuX2RyYXdlci5kcmF3UmVjdGFuZ2xlKHBsYWNlaG9sZGVyUmVjdCwgZmlsbFN0eWxlLCB1c2VTa2V0Y2gpO1xuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSBsYXN0RHJhd24ubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgdGlsZSA9IGxhc3REcmF3blsgaSBdO1xuICAgICAgICB0aWxlZEltYWdlLl9kcmF3ZXIuZHJhd1RpbGUoIHRpbGUsIHRpbGVkSW1hZ2UuX2RyYXdpbmdIYW5kbGVyLCB1c2VTa2V0Y2gsIHNrZXRjaFNjYWxlLCBza2V0Y2hUcmFuc2xhdGUgKTtcbiAgICAgICAgdGlsZS5iZWluZ0RyYXduID0gdHJ1ZTtcblxuICAgICAgICBpZiggdGlsZWRJbWFnZS52aWV3ZXIgKXtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogPGVtPi0gTmVlZHMgZG9jdW1lbnRhdGlvbiAtPC9lbT5cbiAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgKiBAZXZlbnQgdGlsZS1kcmF3blxuICAgICAgICAgICAgICogQG1lbWJlcm9mIE9wZW5TZWFkcmFnb24uVmlld2VyXG4gICAgICAgICAgICAgKiBAdHlwZSB7b2JqZWN0fVxuICAgICAgICAgICAgICogQHByb3BlcnR5IHtPcGVuU2VhZHJhZ29uLlZpZXdlcn0gZXZlbnRTb3VyY2UgLSBBIHJlZmVyZW5jZSB0byB0aGUgVmlld2VyIHdoaWNoIHJhaXNlZCB0aGUgZXZlbnQuXG4gICAgICAgICAgICAgKiBAcHJvcGVydHkge09wZW5TZWFkcmFnb24uVGlsZWRJbWFnZX0gdGlsZWRJbWFnZSAtIFdoaWNoIFRpbGVkSW1hZ2UgaXMgYmVpbmcgZHJhd24uXG4gICAgICAgICAgICAgKiBAcHJvcGVydHkge09wZW5TZWFkcmFnb24uVGlsZX0gdGlsZVxuICAgICAgICAgICAgICogQHByb3BlcnR5IHs/T2JqZWN0fSB1c2VyRGF0YSAtIEFyYml0cmFyeSBzdWJzY3JpYmVyLWRlZmluZWQgb2JqZWN0LlxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICB0aWxlZEltYWdlLnZpZXdlci5yYWlzZUV2ZW50KCAndGlsZS1kcmF3bicsIHtcbiAgICAgICAgICAgICAgICB0aWxlZEltYWdlOiB0aWxlZEltYWdlLFxuICAgICAgICAgICAgICAgIHRpbGU6IHRpbGVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCB1c2VkQ2xpcCApIHtcbiAgICAgICAgdGlsZWRJbWFnZS5fZHJhd2VyLnJlc3RvcmVDb250ZXh0KCB1c2VTa2V0Y2ggKTtcbiAgICB9XG5cbiAgICBpZiAodGlsZWRJbWFnZS52aWV3cG9ydC5kZWdyZWVzICE9PSAwICYmICFza2V0Y2hTY2FsZSkge1xuICAgICAgICB0aWxlZEltYWdlLl9kcmF3ZXIuX3Jlc3RvcmVSb3RhdGlvbkNoYW5nZXModXNlU2tldGNoKTtcbiAgICB9XG5cbiAgICBpZiAodXNlU2tldGNoKSB7XG4gICAgICAgIHZhciBvZmZzZXRGb3JSb3RhdGlvbiA9IHRpbGVkSW1hZ2Uudmlld3BvcnQuZGVncmVlcyAhPT0gMCAmJiBza2V0Y2hTY2FsZTtcbiAgICAgICAgaWYgKG9mZnNldEZvclJvdGF0aW9uKSB7XG4gICAgICAgICAgICB0aWxlZEltYWdlLl9kcmF3ZXIuX29mZnNldEZvclJvdGF0aW9uKHRpbGVkSW1hZ2Uudmlld3BvcnQuZGVncmVlcywgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIHRpbGVkSW1hZ2UuX2RyYXdlci5ibGVuZFNrZXRjaCh7XG4gICAgICAgICAgICBvcGFjaXR5OiB0aWxlZEltYWdlLm9wYWNpdHksXG4gICAgICAgICAgICBzY2FsZTogc2tldGNoU2NhbGUsXG4gICAgICAgICAgICB0cmFuc2xhdGU6IHNrZXRjaFRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGNvbXBvc2l0ZU9wZXJhdGlvbjogdGlsZWRJbWFnZS5jb21wb3NpdGVPcGVyYXRpb24sXG4gICAgICAgICAgICBib3VuZHM6IGJvdW5kc1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKG9mZnNldEZvclJvdGF0aW9uKSB7XG4gICAgICAgICAgICB0aWxlZEltYWdlLl9kcmF3ZXIuX3Jlc3RvcmVSb3RhdGlvbkNoYW5nZXMoZmFsc2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRyYXdEZWJ1Z0luZm8oIHRpbGVkSW1hZ2UsIGxhc3REcmF3biApO1xufVxuXG5mdW5jdGlvbiBkcmF3RGVidWdJbmZvKCB0aWxlZEltYWdlLCBsYXN0RHJhd24gKSB7XG4gICAgaWYoIHRpbGVkSW1hZ2UuZGVidWdNb2RlICkge1xuICAgICAgICBmb3IgKCB2YXIgaSA9IGxhc3REcmF3bi5sZW5ndGggLSAxOyBpID49IDA7IGktLSApIHtcbiAgICAgICAgICAgIHZhciB0aWxlID0gbGFzdERyYXduWyBpIF07XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRpbGVkSW1hZ2UuX2RyYXdlci5kcmF3RGVidWdJbmZvKCB0aWxlLCBsYXN0RHJhd24ubGVuZ3RoLCBpICk7XG4gICAgICAgICAgICB9IGNhdGNoKGUpIHtcbiAgICAgICAgICAgICAgICAkLmNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbn0oIE9wZW5TZWFkcmFnb24gKSk7XG5cbi8qXG4gKiBPcGVuU2VhZHJhZ29uIC0gVGlsZUNhY2hlXG4gKlxuICogQ29weXJpZ2h0IChDKSAyMDA5IENvZGVQbGV4IEZvdW5kYXRpb25cbiAqIENvcHlyaWdodCAoQykgMjAxMC0yMDEzIE9wZW5TZWFkcmFnb24gY29udHJpYnV0b3JzXG4gKlxuICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlXG4gKiBtZXQ6XG4gKlxuICogLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4gKiAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4gKlxuICogLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodFxuICogICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlXG4gKiAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uXG4gKlxuICogLSBOZWl0aGVyIHRoZSBuYW1lIG9mIENvZGVQbGV4IEZvdW5kYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHNcbiAqICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb21cbiAqICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbiAqXG4gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTXG4gKiBcIkFTIElTXCIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UXG4gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1JcbiAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVFxuICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsXG4gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURURcbiAqIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1JcbiAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0ZcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HXG4gKiBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVNcbiAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICovXG5cbihmdW5jdGlvbiggJCApe1xuXG4vLyBwcml2YXRlIGNsYXNzXG52YXIgVGlsZVJlY29yZCA9IGZ1bmN0aW9uKCBvcHRpb25zICkge1xuICAgICQuY29uc29sZS5hc3NlcnQoIG9wdGlvbnMsIFwiW1RpbGVDYWNoZS5jYWNoZVRpbGVdIG9wdGlvbnMgaXMgcmVxdWlyZWRcIiApO1xuICAgICQuY29uc29sZS5hc3NlcnQoIG9wdGlvbnMudGlsZSwgXCJbVGlsZUNhY2hlLmNhY2hlVGlsZV0gb3B0aW9ucy50aWxlIGlzIHJlcXVpcmVkXCIgKTtcbiAgICAkLmNvbnNvbGUuYXNzZXJ0KCBvcHRpb25zLnRpbGVkSW1hZ2UsIFwiW1RpbGVDYWNoZS5jYWNoZVRpbGVdIG9wdGlvbnMudGlsZWRJbWFnZSBpcyByZXF1aXJlZFwiICk7XG4gICAgdGhpcy50aWxlID0gb3B0aW9ucy50aWxlO1xuICAgIHRoaXMudGlsZWRJbWFnZSA9IG9wdGlvbnMudGlsZWRJbWFnZTtcbn07XG5cbi8vIHByaXZhdGUgY2xhc3NcbnZhciBJbWFnZVJlY29yZCA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICAkLmNvbnNvbGUuYXNzZXJ0KCBvcHRpb25zLCBcIltJbWFnZVJlY29yZF0gb3B0aW9ucyBpcyByZXF1aXJlZFwiICk7XG4gICAgJC5jb25zb2xlLmFzc2VydCggb3B0aW9ucy5pbWFnZSwgXCJbSW1hZ2VSZWNvcmRdIG9wdGlvbnMuaW1hZ2UgaXMgcmVxdWlyZWRcIiApO1xuICAgIHRoaXMuX2ltYWdlID0gb3B0aW9ucy5pbWFnZTtcbiAgICB0aGlzLl90aWxlcyA9IFtdO1xufTtcblxuSW1hZ2VSZWNvcmQucHJvdG90eXBlID0ge1xuICAgIGRlc3Ryb3k6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLl9pbWFnZSA9IG51bGw7XG4gICAgICAgIHRoaXMuX3JlbmRlcmVkQ29udGV4dCA9IG51bGw7XG4gICAgICAgIHRoaXMuX3RpbGVzID0gbnVsbDtcbiAgICB9LFxuXG4gICAgZ2V0SW1hZ2U6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faW1hZ2U7XG4gICAgfSxcblxuICAgIGdldFJlbmRlcmVkQ29udGV4dDogZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICghdGhpcy5fcmVuZGVyZWRDb250ZXh0KSB7XG4gICAgICAgICAgICB2YXIgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggJ2NhbnZhcycgKTtcbiAgICAgICAgICAgIGNhbnZhcy53aWR0aCA9IHRoaXMuX2ltYWdlLndpZHRoO1xuICAgICAgICAgICAgY2FudmFzLmhlaWdodCA9IHRoaXMuX2ltYWdlLmhlaWdodDtcbiAgICAgICAgICAgIHRoaXMuX3JlbmRlcmVkQ29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgICAgICAgICAgdGhpcy5fcmVuZGVyZWRDb250ZXh0LmRyYXdJbWFnZSggdGhpcy5faW1hZ2UsIDAsIDAgKTtcbiAgICAgICAgICAgIC8vc2luY2Ugd2UgYXJlIGNhY2hpbmcgdGhlIHByZXJlbmRlcmVkIGltYWdlIG9uIGEgY2FudmFzXG4gICAgICAgICAgICAvL2FsbG93IHRoZSBpbWFnZSB0byBub3QgYmUgaGVsZCBpbiBtZW1vcnlcbiAgICAgICAgICAgIHRoaXMuX2ltYWdlID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fcmVuZGVyZWRDb250ZXh0O1xuICAgIH0sXG5cbiAgICBzZXRSZW5kZXJlZENvbnRleHQ6IGZ1bmN0aW9uKHJlbmRlcmVkQ29udGV4dCkge1xuICAgICAgICAkLmNvbnNvbGUuZXJyb3IoXCJJbWFnZVJlY29yZC5zZXRSZW5kZXJlZENvbnRleHQgaXMgZGVwcmVjYXRlZC4gXCIgK1xuICAgICAgICAgICAgICAgIFwiVGhlIHJlbmRlcmVkIGNvbnRleHQgc2hvdWxkIGJlIGNyZWF0ZWQgYnkgdGhlIEltYWdlUmVjb3JkIFwiICtcbiAgICAgICAgICAgICAgICBcIml0c2VsZiB3aGVuIGNhbGxpbmcgSW1hZ2VSZWNvcmQuZ2V0UmVuZGVyZWRDb250ZXh0LlwiKTtcbiAgICAgICAgdGhpcy5fcmVuZGVyZWRDb250ZXh0ID0gcmVuZGVyZWRDb250ZXh0O1xuICAgIH0sXG5cbiAgICBhZGRUaWxlOiBmdW5jdGlvbih0aWxlKSB7XG4gICAgICAgICQuY29uc29sZS5hc3NlcnQodGlsZSwgJ1tJbWFnZVJlY29yZC5hZGRUaWxlXSB0aWxlIGlzIHJlcXVpcmVkJyk7XG4gICAgICAgIHRoaXMuX3RpbGVzLnB1c2godGlsZSk7XG4gICAgfSxcblxuICAgIHJlbW92ZVRpbGU6IGZ1bmN0aW9uKHRpbGUpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl90aWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3RpbGVzW2ldID09PSB0aWxlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdGlsZXMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgICQuY29uc29sZS53YXJuKCdbSW1hZ2VSZWNvcmQucmVtb3ZlVGlsZV0gdHJ5aW5nIHRvIHJlbW92ZSB1bmtub3duIHRpbGUnLCB0aWxlKTtcbiAgICB9LFxuXG4gICAgZ2V0VGlsZUNvdW50OiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RpbGVzLmxlbmd0aDtcbiAgICB9XG59O1xuXG4vKipcbiAqIEBjbGFzcyBUaWxlQ2FjaGVcbiAqIEBtZW1iZXJvZiBPcGVuU2VhZHJhZ29uXG4gKiBAY2xhc3NkZXNjIFN0b3JlcyBhbGwgdGhlIHRpbGVzIGRpc3BsYXllZCBpbiBhIHtAbGluayBPcGVuU2VhZHJhZ29uLlZpZXdlcn0uXG4gKiBZb3UgZ2VuZXJhbGx5IHdvbid0IGhhdmUgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgVGlsZUNhY2hlIGRpcmVjdGx5LlxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBDb25maWd1cmF0aW9uIGZvciB0aGlzIFRpbGVDYWNoZS5cbiAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5tYXhJbWFnZUNhY2hlQ291bnRdIC0gU2VlIG1heEltYWdlQ2FjaGVDb3VudCBpblxuICoge0BsaW5rIE9wZW5TZWFkcmFnb24uT3B0aW9uc30gZm9yIGRldGFpbHMuXG4gKi9cbiQuVGlsZUNhY2hlID0gZnVuY3Rpb24oIG9wdGlvbnMgKSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICB0aGlzLl9tYXhJbWFnZUNhY2hlQ291bnQgPSBvcHRpb25zLm1heEltYWdlQ2FjaGVDb3VudCB8fCAkLkRFRkFVTFRfU0VUVElOR1MubWF4SW1hZ2VDYWNoZUNvdW50O1xuICAgIHRoaXMuX3RpbGVzTG9hZGVkID0gW107XG4gICAgdGhpcy5faW1hZ2VzTG9hZGVkID0gW107XG4gICAgdGhpcy5faW1hZ2VzTG9hZGVkQ291bnQgPSAwO1xufTtcblxuLyoqIEBsZW5kcyBPcGVuU2VhZHJhZ29uLlRpbGVDYWNoZS5wcm90b3R5cGUgKi9cbiQuVGlsZUNhY2hlLnByb3RvdHlwZSA9IHtcbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyB7TnVtYmVyfSBUaGUgdG90YWwgbnVtYmVyIG9mIHRpbGVzIHRoYXQgaGF2ZSBiZWVuIGxvYWRlZCBieVxuICAgICAqIHRoaXMgVGlsZUNhY2hlLlxuICAgICAqL1xuICAgIG51bVRpbGVzTG9hZGVkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RpbGVzTG9hZGVkLmxlbmd0aDtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ2FjaGVzIHRoZSBzcGVjaWZpZWQgdGlsZSwgcmVtb3ZpbmcgYW4gb2xkIHRpbGUgaWYgbmVjZXNzYXJ5IHRvIHN0YXkgdW5kZXIgdGhlXG4gICAgICogbWF4SW1hZ2VDYWNoZUNvdW50IHNwZWNpZmllZCBvbiBjb25zdHJ1Y3Rpb24uIE5vdGUgdGhhdCBpZiBtdWx0aXBsZSB0aWxlcyByZWZlcmVuY2VcbiAgICAgKiB0aGUgc2FtZSBpbWFnZSwgdGhlcmUgbWF5IGJlIG1vcmUgdGlsZXMgdGhhbiBtYXhJbWFnZUNhY2hlQ291bnQ7IHRoZSBnb2FsIGlzIHRvIGtlZXBcbiAgICAgKiB0aGUgbnVtYmVyIG9mIGltYWdlcyBiZWxvdyB0aGF0IG51bWJlci4gTm90ZSwgYXMgd2VsbCwgdGhhdCBldmVuIHRoZSBudW1iZXIgb2YgaW1hZ2VzXG4gICAgICogbWF5IHRlbXBvcmFyaWx5IHN1cnBhc3MgdGhhdCBudW1iZXIsIGJ1dCBzaG91bGQgZXZlbnR1YWxseSBjb21lIGJhY2sgZG93biB0byB0aGUgbWF4IHNwZWNpZmllZC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIFRpbGUgaW5mby5cbiAgICAgKiBAcGFyYW0ge09wZW5TZWFkcmFnb24uVGlsZX0gb3B0aW9ucy50aWxlIC0gVGhlIHRpbGUgdG8gY2FjaGUuXG4gICAgICogQHBhcmFtIHtJbWFnZX0gb3B0aW9ucy5pbWFnZSAtIFRoZSBpbWFnZSBvZiB0aGUgdGlsZSB0byBjYWNoZS5cbiAgICAgKiBAcGFyYW0ge09wZW5TZWFkcmFnb24uVGlsZWRJbWFnZX0gb3B0aW9ucy50aWxlZEltYWdlIC0gVGhlIFRpbGVkSW1hZ2UgdGhhdCBvd25zIHRoYXQgdGlsZS5cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuY3V0b2ZmPTBdIC0gSWYgYWRkaW5nIHRoaXMgdGlsZSBnb2VzIG92ZXIgdGhlIGNhY2hlIG1heCBjb3VudCwgdGhpc1xuICAgICAqIGZ1bmN0aW9uIHdpbGwgcmVsZWFzZSBhbiBvbGQgdGlsZS4gVGhlIGN1dG9mZiBvcHRpb24gc3BlY2lmaWVzIGEgdGlsZSBsZXZlbCBhdCBvciBiZWxvdyB3aGljaFxuICAgICAqIHRpbGVzIHdpbGwgbm90IGJlIHJlbGVhc2VkLlxuICAgICAqL1xuICAgIGNhY2hlVGlsZTogZnVuY3Rpb24oIG9wdGlvbnMgKSB7XG4gICAgICAgICQuY29uc29sZS5hc3NlcnQoIG9wdGlvbnMsIFwiW1RpbGVDYWNoZS5jYWNoZVRpbGVdIG9wdGlvbnMgaXMgcmVxdWlyZWRcIiApO1xuICAgICAgICAkLmNvbnNvbGUuYXNzZXJ0KCBvcHRpb25zLnRpbGUsIFwiW1RpbGVDYWNoZS5jYWNoZVRpbGVdIG9wdGlvbnMudGlsZSBpcyByZXF1aXJlZFwiICk7XG4gICAgICAgICQuY29uc29sZS5hc3NlcnQoIG9wdGlvbnMudGlsZS51cmwsIFwiW1RpbGVDYWNoZS5jYWNoZVRpbGVdIG9wdGlvbnMudGlsZS51cmwgaXMgcmVxdWlyZWRcIiApO1xuICAgICAgICAkLmNvbnNvbGUuYXNzZXJ0KCBvcHRpb25zLnRpbGVkSW1hZ2UsIFwiW1RpbGVDYWNoZS5jYWNoZVRpbGVdIG9wdGlvbnMudGlsZWRJbWFnZSBpcyByZXF1aXJlZFwiICk7XG5cbiAgICAgICAgdmFyIGN1dG9mZiA9IG9wdGlvbnMuY3V0b2ZmIHx8IDA7XG4gICAgICAgIHZhciBpbnNlcnRpb25JbmRleCA9IHRoaXMuX3RpbGVzTG9hZGVkLmxlbmd0aDtcblxuICAgICAgICB2YXIgaW1hZ2VSZWNvcmQgPSB0aGlzLl9pbWFnZXNMb2FkZWRbb3B0aW9ucy50aWxlLnVybF07XG4gICAgICAgIGlmICghaW1hZ2VSZWNvcmQpIHtcbiAgICAgICAgICAgICQuY29uc29sZS5hc3NlcnQoIG9wdGlvbnMuaW1hZ2UsIFwiW1RpbGVDYWNoZS5jYWNoZVRpbGVdIG9wdGlvbnMuaW1hZ2UgaXMgcmVxdWlyZWQgdG8gY3JlYXRlIGFuIEltYWdlUmVjb3JkXCIgKTtcbiAgICAgICAgICAgIGltYWdlUmVjb3JkID0gdGhpcy5faW1hZ2VzTG9hZGVkW29wdGlvbnMudGlsZS51cmxdID0gbmV3IEltYWdlUmVjb3JkKHtcbiAgICAgICAgICAgICAgICBpbWFnZTogb3B0aW9ucy5pbWFnZVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMuX2ltYWdlc0xvYWRlZENvdW50Kys7XG4gICAgICAgIH1cblxuICAgICAgICBpbWFnZVJlY29yZC5hZGRUaWxlKG9wdGlvbnMudGlsZSk7XG4gICAgICAgIG9wdGlvbnMudGlsZS5jYWNoZUltYWdlUmVjb3JkID0gaW1hZ2VSZWNvcmQ7XG5cbiAgICAgICAgLy8gTm90ZSB0aGF0IGp1c3QgYmVjYXVzZSB3ZSdyZSB1bmxvYWRpbmcgYSB0aWxlIGRvZXNuJ3QgbmVjZXNzYXJpbHkgbWVhblxuICAgICAgICAvLyB3ZSdyZSB1bmxvYWRpbmcgYW4gaW1hZ2UuIFdpdGggcmVwZWF0ZWQgY2FsbHMgaXQgc2hvdWxkIHNvcnQgaXRzZWxmIG91dCwgdGhvdWdoLlxuICAgICAgICBpZiAoIHRoaXMuX2ltYWdlc0xvYWRlZENvdW50ID4gdGhpcy5fbWF4SW1hZ2VDYWNoZUNvdW50ICkge1xuICAgICAgICAgICAgdmFyIHdvcnN0VGlsZSAgICAgICA9IG51bGw7XG4gICAgICAgICAgICB2YXIgd29yc3RUaWxlSW5kZXggID0gLTE7XG4gICAgICAgICAgICB2YXIgd29yc3RUaWxlUmVjb3JkID0gbnVsbDtcbiAgICAgICAgICAgIHZhciBwcmV2VGlsZSwgd29yc3RUaW1lLCB3b3JzdExldmVsLCBwcmV2VGltZSwgcHJldkxldmVsLCBwcmV2VGlsZVJlY29yZDtcblxuICAgICAgICAgICAgZm9yICggdmFyIGkgPSB0aGlzLl90aWxlc0xvYWRlZC5sZW5ndGggLSAxOyBpID49IDA7IGktLSApIHtcbiAgICAgICAgICAgICAgICBwcmV2VGlsZVJlY29yZCA9IHRoaXMuX3RpbGVzTG9hZGVkWyBpIF07XG4gICAgICAgICAgICAgICAgcHJldlRpbGUgPSBwcmV2VGlsZVJlY29yZC50aWxlO1xuXG4gICAgICAgICAgICAgICAgaWYgKCBwcmV2VGlsZS5sZXZlbCA8PSBjdXRvZmYgfHwgcHJldlRpbGUuYmVpbmdEcmF3biApIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICggIXdvcnN0VGlsZSApIHtcbiAgICAgICAgICAgICAgICAgICAgd29yc3RUaWxlICAgICAgID0gcHJldlRpbGU7XG4gICAgICAgICAgICAgICAgICAgIHdvcnN0VGlsZUluZGV4ICA9IGk7XG4gICAgICAgICAgICAgICAgICAgIHdvcnN0VGlsZVJlY29yZCA9IHByZXZUaWxlUmVjb3JkO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBwcmV2VGltZSAgICA9IHByZXZUaWxlLmxhc3RUb3VjaFRpbWU7XG4gICAgICAgICAgICAgICAgd29yc3RUaW1lICAgPSB3b3JzdFRpbGUubGFzdFRvdWNoVGltZTtcbiAgICAgICAgICAgICAgICBwcmV2TGV2ZWwgICA9IHByZXZUaWxlLmxldmVsO1xuICAgICAgICAgICAgICAgIHdvcnN0TGV2ZWwgID0gd29yc3RUaWxlLmxldmVsO1xuXG4gICAgICAgICAgICAgICAgaWYgKCBwcmV2VGltZSA8IHdvcnN0VGltZSB8fFxuICAgICAgICAgICAgICAgICAgICggcHJldlRpbWUgPT0gd29yc3RUaW1lICYmIHByZXZMZXZlbCA+IHdvcnN0TGV2ZWwgKSApIHtcbiAgICAgICAgICAgICAgICAgICAgd29yc3RUaWxlICAgICAgID0gcHJldlRpbGU7XG4gICAgICAgICAgICAgICAgICAgIHdvcnN0VGlsZUluZGV4ICA9IGk7XG4gICAgICAgICAgICAgICAgICAgIHdvcnN0VGlsZVJlY29yZCA9IHByZXZUaWxlUmVjb3JkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCB3b3JzdFRpbGUgJiYgd29yc3RUaWxlSW5kZXggPj0gMCApIHtcbiAgICAgICAgICAgICAgICB0aGlzLl91bmxvYWRUaWxlKHdvcnN0VGlsZVJlY29yZCk7XG4gICAgICAgICAgICAgICAgaW5zZXJ0aW9uSW5kZXggPSB3b3JzdFRpbGVJbmRleDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3RpbGVzTG9hZGVkWyBpbnNlcnRpb25JbmRleCBdID0gbmV3IFRpbGVSZWNvcmQoe1xuICAgICAgICAgICAgdGlsZTogb3B0aW9ucy50aWxlLFxuICAgICAgICAgICAgdGlsZWRJbWFnZTogb3B0aW9ucy50aWxlZEltYWdlXG4gICAgICAgIH0pO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDbGVhcnMgYWxsIHRpbGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIHRpbGVkSW1hZ2UuXG4gICAgICogQHBhcmFtIHtPcGVuU2VhZHJhZ29uLlRpbGVkSW1hZ2V9IHRpbGVkSW1hZ2VcbiAgICAgKi9cbiAgICBjbGVhclRpbGVzRm9yOiBmdW5jdGlvbiggdGlsZWRJbWFnZSApIHtcbiAgICAgICAgJC5jb25zb2xlLmFzc2VydCh0aWxlZEltYWdlLCAnW1RpbGVDYWNoZS5jbGVhclRpbGVzRm9yXSB0aWxlZEltYWdlIGlzIHJlcXVpcmVkJyk7XG4gICAgICAgIHZhciB0aWxlUmVjb3JkO1xuICAgICAgICBmb3IgKCB2YXIgaSA9IDA7IGkgPCB0aGlzLl90aWxlc0xvYWRlZC5sZW5ndGg7ICsraSApIHtcbiAgICAgICAgICAgIHRpbGVSZWNvcmQgPSB0aGlzLl90aWxlc0xvYWRlZFsgaSBdO1xuICAgICAgICAgICAgaWYgKCB0aWxlUmVjb3JkLnRpbGVkSW1hZ2UgPT09IHRpbGVkSW1hZ2UgKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdW5sb2FkVGlsZSh0aWxlUmVjb3JkKTtcbiAgICAgICAgICAgICAgICB0aGlzLl90aWxlc0xvYWRlZC5zcGxpY2UoIGksIDEgKTtcbiAgICAgICAgICAgICAgICBpLS07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8gcHJpdmF0ZVxuICAgIGdldEltYWdlUmVjb3JkOiBmdW5jdGlvbih1cmwpIHtcbiAgICAgICAgJC5jb25zb2xlLmFzc2VydCh1cmwsICdbVGlsZUNhY2hlLmdldEltYWdlUmVjb3JkXSB1cmwgaXMgcmVxdWlyZWQnKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ltYWdlc0xvYWRlZFt1cmxdO1xuICAgIH0sXG5cbiAgICAvLyBwcml2YXRlXG4gICAgX3VubG9hZFRpbGU6IGZ1bmN0aW9uKHRpbGVSZWNvcmQpIHtcbiAgICAgICAgJC5jb25zb2xlLmFzc2VydCh0aWxlUmVjb3JkLCAnW1RpbGVDYWNoZS5fdW5sb2FkVGlsZV0gdGlsZVJlY29yZCBpcyByZXF1aXJlZCcpO1xuICAgICAgICB2YXIgdGlsZSA9IHRpbGVSZWNvcmQudGlsZTtcbiAgICAgICAgdmFyIHRpbGVkSW1hZ2UgPSB0aWxlUmVjb3JkLnRpbGVkSW1hZ2U7XG5cbiAgICAgICAgdGlsZS51bmxvYWQoKTtcbiAgICAgICAgdGlsZS5jYWNoZUltYWdlUmVjb3JkID0gbnVsbDtcblxuICAgICAgICB2YXIgaW1hZ2VSZWNvcmQgPSB0aGlzLl9pbWFnZXNMb2FkZWRbdGlsZS51cmxdO1xuICAgICAgICBpbWFnZVJlY29yZC5yZW1vdmVUaWxlKHRpbGUpO1xuICAgICAgICBpZiAoIWltYWdlUmVjb3JkLmdldFRpbGVDb3VudCgpKSB7XG4gICAgICAgICAgICBpbWFnZVJlY29yZC5kZXN0cm95KCk7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5faW1hZ2VzTG9hZGVkW3RpbGUudXJsXTtcbiAgICAgICAgICAgIHRoaXMuX2ltYWdlc0xvYWRlZENvdW50LS07XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogVHJpZ2dlcmVkIHdoZW4gYSB0aWxlIGhhcyBqdXN0IGJlZW4gdW5sb2FkZWQgZnJvbSBtZW1vcnkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBldmVudCB0aWxlLXVubG9hZGVkXG4gICAgICAgICAqIEBtZW1iZXJvZiBPcGVuU2VhZHJhZ29uLlZpZXdlclxuICAgICAgICAgKiBAdHlwZSB7b2JqZWN0fVxuICAgICAgICAgKiBAcHJvcGVydHkge09wZW5TZWFkcmFnb24uVGlsZWRJbWFnZX0gdGlsZWRJbWFnZSAtIFRoZSB0aWxlZCBpbWFnZSBvZiB0aGUgdW5sb2FkZWQgdGlsZS5cbiAgICAgICAgICogQHByb3BlcnR5IHtPcGVuU2VhZHJhZ29uLlRpbGV9IHRpbGUgLSBUaGUgdGlsZSB3aGljaCBoYXMgYmVlbiB1bmxvYWRlZC5cbiAgICAgICAgICovXG4gICAgICAgIHRpbGVkSW1hZ2Uudmlld2VyLnJhaXNlRXZlbnQoXCJ0aWxlLXVubG9hZGVkXCIsIHtcbiAgICAgICAgICAgIHRpbGU6IHRpbGUsXG4gICAgICAgICAgICB0aWxlZEltYWdlOiB0aWxlZEltYWdlXG4gICAgICAgIH0pO1xuICAgIH1cbn07XG5cbn0oIE9wZW5TZWFkcmFnb24gKSk7XG5cbi8qXG4gKiBPcGVuU2VhZHJhZ29uIC0gV29ybGRcbiAqXG4gKiBDb3B5cmlnaHQgKEMpIDIwMDkgQ29kZVBsZXggRm91bmRhdGlvblxuICogQ29weXJpZ2h0IChDKSAyMDEwLTIwMTMgT3BlblNlYWRyYWdvbiBjb250cmlidXRvcnNcbiAqXG4gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmVcbiAqIG1ldDpcbiAqXG4gKiAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiAqICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAqXG4gKiAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0XG4gKiAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGVcbiAqICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cbiAqXG4gKiAtIE5laXRoZXIgdGhlIG5hbWUgb2YgQ29kZVBsZXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0c1xuICogICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbVxuICogICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuICpcbiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlNcbiAqIFwiQVMgSVNcIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1RcbiAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUlxuICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUXG4gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCxcbiAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRFxuICogVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUlxuICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkdcbiAqIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJU1xuICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4gKi9cblxuKGZ1bmN0aW9uKCAkICl7XG5cbi8qKlxuICogQGNsYXNzIFdvcmxkXG4gKiBAbWVtYmVyb2YgT3BlblNlYWRyYWdvblxuICogQGV4dGVuZHMgT3BlblNlYWRyYWdvbi5FdmVudFNvdXJjZVxuICogQGNsYXNzZGVzYyBLZWVwcyB0cmFjayBvZiBhbGwgb2YgdGhlIHRpbGVkIGltYWdlcyBpbiB0aGUgc2NlbmUuXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIFdvcmxkIG9wdGlvbnMuXG4gKiBAcGFyYW0ge09wZW5TZWFkcmFnb24uVmlld2VyfSBvcHRpb25zLnZpZXdlciAtIFRoZSBWaWV3ZXIgdGhhdCBvd25zIHRoaXMgV29ybGQuXG4gKiovXG4kLldvcmxkID0gZnVuY3Rpb24oIG9wdGlvbnMgKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICQuY29uc29sZS5hc3NlcnQoIG9wdGlvbnMudmlld2VyLCBcIltXb3JsZF0gb3B0aW9ucy52aWV3ZXIgaXMgcmVxdWlyZWRcIiApO1xuXG4gICAgJC5FdmVudFNvdXJjZS5jYWxsKCB0aGlzICk7XG5cbiAgICB0aGlzLnZpZXdlciA9IG9wdGlvbnMudmlld2VyO1xuICAgIHRoaXMuX2l0ZW1zID0gW107XG4gICAgdGhpcy5fbmVlZHNEcmF3ID0gZmFsc2U7XG4gICAgdGhpcy5fYXV0b1JlZmlndXJlU2l6ZXMgPSB0cnVlO1xuICAgIHRoaXMuX25lZWRzU2l6ZXNGaWd1cmVkID0gZmFsc2U7XG4gICAgdGhpcy5fZGVsZWdhdGVkRmlndXJlU2l6ZXMgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICBpZiAoX3RoaXMuX2F1dG9SZWZpZ3VyZVNpemVzKSB7XG4gICAgICAgICAgICBfdGhpcy5fZmlndXJlU2l6ZXMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIF90aGlzLl9uZWVkc1NpemVzRmlndXJlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhpcy5fZmlndXJlU2l6ZXMoKTtcbn07XG5cbiQuZXh0ZW5kKCAkLldvcmxkLnByb3RvdHlwZSwgJC5FdmVudFNvdXJjZS5wcm90b3R5cGUsIC8qKiBAbGVuZHMgT3BlblNlYWRyYWdvbi5Xb3JsZC5wcm90b3R5cGUgKi97XG4gICAgLyoqXG4gICAgICogQWRkIHRoZSBzcGVjaWZpZWQgaXRlbS5cbiAgICAgKiBAcGFyYW0ge09wZW5TZWFkcmFnb24uVGlsZWRJbWFnZX0gaXRlbSAtIFRoZSBpdGVtIHRvIGFkZC5cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuaW5kZXhdIC0gSW5kZXggZm9yIHRoZSBpdGVtLiBJZiBub3Qgc3BlY2lmaWVkLCBnb2VzIGF0IHRoZSB0b3AuXG4gICAgICogQGZpcmVzIE9wZW5TZWFkcmFnb24uV29ybGQuZXZlbnQ6YWRkLWl0ZW1cbiAgICAgKiBAZmlyZXMgT3BlblNlYWRyYWdvbi5Xb3JsZC5ldmVudDptZXRyaWNzLWNoYW5nZVxuICAgICAqL1xuICAgIGFkZEl0ZW06IGZ1bmN0aW9uKCBpdGVtLCBvcHRpb25zICkge1xuICAgICAgICAkLmNvbnNvbGUuYXNzZXJ0KGl0ZW0sIFwiW1dvcmxkLmFkZEl0ZW1dIGl0ZW0gaXMgcmVxdWlyZWRcIik7XG4gICAgICAgICQuY29uc29sZS5hc3NlcnQoaXRlbSBpbnN0YW5jZW9mICQuVGlsZWRJbWFnZSwgXCJbV29ybGQuYWRkSXRlbV0gb25seSBUaWxlZEltYWdlcyBzdXBwb3J0ZWQgYXQgdGhpcyB0aW1lXCIpO1xuXG4gICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgICAgICBpZiAob3B0aW9ucy5pbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB2YXIgaW5kZXggPSBNYXRoLm1heCgwLCBNYXRoLm1pbih0aGlzLl9pdGVtcy5sZW5ndGgsIG9wdGlvbnMuaW5kZXgpKTtcbiAgICAgICAgICAgIHRoaXMuX2l0ZW1zLnNwbGljZShpbmRleCwgMCwgaXRlbSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9pdGVtcy5wdXNoKCBpdGVtICk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fYXV0b1JlZmlndXJlU2l6ZXMpIHtcbiAgICAgICAgICAgIHRoaXMuX2ZpZ3VyZVNpemVzKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9uZWVkc1NpemVzRmlndXJlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9uZWVkc0RyYXcgPSB0cnVlO1xuXG4gICAgICAgIGl0ZW0uYWRkSGFuZGxlcignYm91bmRzLWNoYW5nZScsIHRoaXMuX2RlbGVnYXRlZEZpZ3VyZVNpemVzKTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogUmFpc2VkIHdoZW4gYW4gaXRlbSBpcyBhZGRlZCB0byB0aGUgV29ybGQuXG4gICAgICAgICAqIEBldmVudCBhZGQtaXRlbVxuICAgICAgICAgKiBAbWVtYmVyT2YgT3BlblNlYWRyYWdvbi5Xb3JsZFxuICAgICAgICAgKiBAdHlwZSB7b2JqZWN0fVxuICAgICAgICAgKiBAcHJvcGVydHkge09wZW5TZWFkcmFnb24uVmlld2VyfSBldmVudFNvdXJjZSAtIEEgcmVmZXJlbmNlIHRvIHRoZSBXb3JsZCB3aGljaCByYWlzZWQgdGhlIGV2ZW50LlxuICAgICAgICAgKiBAcHJvcGVydHkge09wZW5TZWFkcmFnb24uVGlsZWRJbWFnZX0gaXRlbSAtIFRoZSBpdGVtIHRoYXQgaGFzIGJlZW4gYWRkZWQuXG4gICAgICAgICAqIEBwcm9wZXJ0eSB7P09iamVjdH0gdXNlckRhdGEgLSBBcmJpdHJhcnkgc3Vic2NyaWJlci1kZWZpbmVkIG9iamVjdC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMucmFpc2VFdmVudCggJ2FkZC1pdGVtJywge1xuICAgICAgICAgICAgaXRlbTogaXRlbVxuICAgICAgICB9ICk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgaXRlbSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBpbmRleCAtIFRoZSBpdGVtJ3MgaW5kZXguXG4gICAgICogQHJldHVybnMge09wZW5TZWFkcmFnb24uVGlsZWRJbWFnZX0gVGhlIGl0ZW0gYXQgdGhlIHNwZWNpZmllZCBpbmRleC5cbiAgICAgKi9cbiAgICBnZXRJdGVtQXQ6IGZ1bmN0aW9uKCBpbmRleCApIHtcbiAgICAgICAgJC5jb25zb2xlLmFzc2VydChpbmRleCAhPT0gdW5kZWZpbmVkLCBcIltXb3JsZC5nZXRJdGVtQXRdIGluZGV4IGlzIHJlcXVpcmVkXCIpO1xuICAgICAgICByZXR1cm4gdGhpcy5faXRlbXNbIGluZGV4IF07XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgaW5kZXggb2YgdGhlIGdpdmVuIGl0ZW0gb3IgLTEgaWYgbm90IHByZXNlbnQuXG4gICAgICogQHBhcmFtIHtPcGVuU2VhZHJhZ29uLlRpbGVkSW1hZ2V9IGl0ZW0gLSBUaGUgaXRlbS5cbiAgICAgKiBAcmV0dXJucyB7TnVtYmVyfSBUaGUgaW5kZXggb2YgdGhlIGl0ZW0gb3IgLTEgaWYgbm90IHByZXNlbnQuXG4gICAgICovXG4gICAgZ2V0SW5kZXhPZkl0ZW06IGZ1bmN0aW9uKCBpdGVtICkge1xuICAgICAgICAkLmNvbnNvbGUuYXNzZXJ0KGl0ZW0sIFwiW1dvcmxkLmdldEluZGV4T2ZJdGVtXSBpdGVtIGlzIHJlcXVpcmVkXCIpO1xuICAgICAgICByZXR1cm4gJC5pbmRleE9mKCB0aGlzLl9pdGVtcywgaXRlbSApO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyB7TnVtYmVyfSBUaGUgbnVtYmVyIG9mIGl0ZW1zIHVzZWQuXG4gICAgICovXG4gICAgZ2V0SXRlbUNvdW50OiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2l0ZW1zLmxlbmd0aDtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ2hhbmdlIHRoZSBpbmRleCBvZiBhIGl0ZW0gc28gdGhhdCBpdCBhcHBlYXJzIG92ZXIgb3IgdW5kZXIgb3RoZXJzLlxuICAgICAqIEBwYXJhbSB7T3BlblNlYWRyYWdvbi5UaWxlZEltYWdlfSBpdGVtIC0gVGhlIGl0ZW0gdG8gbW92ZS5cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gaW5kZXggLSBUaGUgbmV3IGluZGV4LlxuICAgICAqIEBmaXJlcyBPcGVuU2VhZHJhZ29uLldvcmxkLmV2ZW50Oml0ZW0taW5kZXgtY2hhbmdlXG4gICAgICovXG4gICAgc2V0SXRlbUluZGV4OiBmdW5jdGlvbiggaXRlbSwgaW5kZXggKSB7XG4gICAgICAgICQuY29uc29sZS5hc3NlcnQoaXRlbSwgXCJbV29ybGQuc2V0SXRlbUluZGV4XSBpdGVtIGlzIHJlcXVpcmVkXCIpO1xuICAgICAgICAkLmNvbnNvbGUuYXNzZXJ0KGluZGV4ICE9PSB1bmRlZmluZWQsIFwiW1dvcmxkLnNldEl0ZW1JbmRleF0gaW5kZXggaXMgcmVxdWlyZWRcIik7XG5cbiAgICAgICAgdmFyIG9sZEluZGV4ID0gdGhpcy5nZXRJbmRleE9mSXRlbSggaXRlbSApO1xuXG4gICAgICAgIGlmICggaW5kZXggPj0gdGhpcy5faXRlbXMubGVuZ3RoICkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCBcIkluZGV4IGJpZ2dlciB0aGFuIG51bWJlciBvZiBsYXllcnMuXCIgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICggaW5kZXggPT09IG9sZEluZGV4IHx8IG9sZEluZGV4ID09PSAtMSApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2l0ZW1zLnNwbGljZSggb2xkSW5kZXgsIDEgKTtcbiAgICAgICAgdGhpcy5faXRlbXMuc3BsaWNlKCBpbmRleCwgMCwgaXRlbSApO1xuICAgICAgICB0aGlzLl9uZWVkc0RyYXcgPSB0cnVlO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSYWlzZWQgd2hlbiB0aGUgb3JkZXIgb2YgdGhlIGluZGV4ZXMgaGFzIGJlZW4gY2hhbmdlZC5cbiAgICAgICAgICogQGV2ZW50IGl0ZW0taW5kZXgtY2hhbmdlXG4gICAgICAgICAqIEBtZW1iZXJPZiBPcGVuU2VhZHJhZ29uLldvcmxkXG4gICAgICAgICAqIEB0eXBlIHtvYmplY3R9XG4gICAgICAgICAqIEBwcm9wZXJ0eSB7T3BlblNlYWRyYWdvbi5Xb3JsZH0gZXZlbnRTb3VyY2UgLSBBIHJlZmVyZW5jZSB0byB0aGUgV29ybGQgd2hpY2ggcmFpc2VkIHRoZSBldmVudC5cbiAgICAgICAgICogQHByb3BlcnR5IHtPcGVuU2VhZHJhZ29uLlRpbGVkSW1hZ2V9IGl0ZW0gLSBUaGUgaXRlbSB3aG9zZSBpbmRleCBoYXNcbiAgICAgICAgICogYmVlbiBjaGFuZ2VkXG4gICAgICAgICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBwcmV2aW91c0luZGV4IC0gVGhlIHByZXZpb3VzIGluZGV4IG9mIHRoZSBpdGVtXG4gICAgICAgICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBuZXdJbmRleCAtIFRoZSBuZXcgaW5kZXggb2YgdGhlIGl0ZW1cbiAgICAgICAgICogQHByb3BlcnR5IHs/T2JqZWN0fSB1c2VyRGF0YSAtIEFyYml0cmFyeSBzdWJzY3JpYmVyLWRlZmluZWQgb2JqZWN0LlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5yYWlzZUV2ZW50KCAnaXRlbS1pbmRleC1jaGFuZ2UnLCB7XG4gICAgICAgICAgICBpdGVtOiBpdGVtLFxuICAgICAgICAgICAgcHJldmlvdXNJbmRleDogb2xkSW5kZXgsXG4gICAgICAgICAgICBuZXdJbmRleDogaW5kZXhcbiAgICAgICAgfSApO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgYW4gaXRlbS5cbiAgICAgKiBAcGFyYW0ge09wZW5TZWFkcmFnb24uVGlsZWRJbWFnZX0gaXRlbSAtIFRoZSBpdGVtIHRvIHJlbW92ZS5cbiAgICAgKiBAZmlyZXMgT3BlblNlYWRyYWdvbi5Xb3JsZC5ldmVudDpyZW1vdmUtaXRlbVxuICAgICAqIEBmaXJlcyBPcGVuU2VhZHJhZ29uLldvcmxkLmV2ZW50Om1ldHJpY3MtY2hhbmdlXG4gICAgICovXG4gICAgcmVtb3ZlSXRlbTogZnVuY3Rpb24oIGl0ZW0gKSB7XG4gICAgICAgICQuY29uc29sZS5hc3NlcnQoaXRlbSwgXCJbV29ybGQucmVtb3ZlSXRlbV0gaXRlbSBpcyByZXF1aXJlZFwiKTtcblxuICAgICAgICB2YXIgaW5kZXggPSAkLmluZGV4T2YodGhpcy5faXRlbXMsIGl0ZW0gKTtcbiAgICAgICAgaWYgKCBpbmRleCA9PT0gLTEgKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpdGVtLnJlbW92ZUhhbmRsZXIoJ2JvdW5kcy1jaGFuZ2UnLCB0aGlzLl9kZWxlZ2F0ZWRGaWd1cmVTaXplcyk7XG4gICAgICAgIGl0ZW0uZGVzdHJveSgpO1xuICAgICAgICB0aGlzLl9pdGVtcy5zcGxpY2UoIGluZGV4LCAxICk7XG4gICAgICAgIHRoaXMuX2ZpZ3VyZVNpemVzKCk7XG4gICAgICAgIHRoaXMuX25lZWRzRHJhdyA9IHRydWU7XG4gICAgICAgIHRoaXMuX3JhaXNlUmVtb3ZlSXRlbShpdGVtKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGFsbCBpdGVtcy5cbiAgICAgKiBAZmlyZXMgT3BlblNlYWRyYWdvbi5Xb3JsZC5ldmVudDpyZW1vdmUtaXRlbVxuICAgICAqIEBmaXJlcyBPcGVuU2VhZHJhZ29uLldvcmxkLmV2ZW50Om1ldHJpY3MtY2hhbmdlXG4gICAgICovXG4gICAgcmVtb3ZlQWxsOiBmdW5jdGlvbigpIHtcbiAgICAgICAgLy8gV2UgbmVlZCB0byBtYWtlIHN1cmUgYW55IHBlbmRpbmcgaW1hZ2VzIGFyZSBjYW5jZWxlZCBzbyB0aGUgd29ybGQgaXRlbXMgZG9uJ3QgZ2V0IG1lc3NlZCB1cFxuICAgICAgICB0aGlzLnZpZXdlci5fY2FuY2VsUGVuZGluZ0ltYWdlcygpO1xuICAgICAgICB2YXIgaXRlbTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9pdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaXRlbSA9IHRoaXMuX2l0ZW1zW2ldO1xuICAgICAgICAgICAgaXRlbS5yZW1vdmVIYW5kbGVyKCdib3VuZHMtY2hhbmdlJywgdGhpcy5fZGVsZWdhdGVkRmlndXJlU2l6ZXMpO1xuICAgICAgICAgICAgaXRlbS5kZXN0cm95KCk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgcmVtb3ZlZEl0ZW1zID0gdGhpcy5faXRlbXM7XG4gICAgICAgIHRoaXMuX2l0ZW1zID0gW107XG4gICAgICAgIHRoaXMuX2ZpZ3VyZVNpemVzKCk7XG4gICAgICAgIHRoaXMuX25lZWRzRHJhdyA9IHRydWU7XG5cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHJlbW92ZWRJdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaXRlbSA9IHJlbW92ZWRJdGVtc1tpXTtcbiAgICAgICAgICAgIHRoaXMuX3JhaXNlUmVtb3ZlSXRlbShpdGVtKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDbGVhcnMgYWxsIHRpbGVzIGFuZCB0cmlnZ2VycyB1cGRhdGVzIGZvciBhbGwgaXRlbXMuXG4gICAgICovXG4gICAgcmVzZXRJdGVtczogZnVuY3Rpb24oKSB7XG4gICAgICAgIGZvciAoIHZhciBpID0gMDsgaSA8IHRoaXMuX2l0ZW1zLmxlbmd0aDsgaSsrICkge1xuICAgICAgICAgICAgdGhpcy5faXRlbXNbaV0ucmVzZXQoKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIChpLmUuIGFuaW1hdGVzIGJvdW5kcyBvZikgYWxsIGl0ZW1zLlxuICAgICAqL1xuICAgIHVwZGF0ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBhbmltYXRlZCA9IGZhbHNlO1xuICAgICAgICBmb3IgKCB2YXIgaSA9IDA7IGkgPCB0aGlzLl9pdGVtcy5sZW5ndGg7IGkrKyApIHtcbiAgICAgICAgICAgIGFuaW1hdGVkID0gdGhpcy5faXRlbXNbaV0udXBkYXRlKCkgfHwgYW5pbWF0ZWQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYW5pbWF0ZWQ7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIERyYXdzIGFsbCBpdGVtcy5cbiAgICAgKi9cbiAgICBkcmF3OiBmdW5jdGlvbigpIHtcbiAgICAgICAgZm9yICggdmFyIGkgPSAwOyBpIDwgdGhpcy5faXRlbXMubGVuZ3RoOyBpKysgKSB7XG4gICAgICAgICAgICB0aGlzLl9pdGVtc1tpXS5kcmF3KCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9uZWVkc0RyYXcgPSBmYWxzZTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgYW55IGl0ZW1zIG5lZWQgdXBkYXRpbmcuXG4gICAgICovXG4gICAgbmVlZHNEcmF3OiBmdW5jdGlvbigpIHtcbiAgICAgICAgZm9yICggdmFyIGkgPSAwOyBpIDwgdGhpcy5faXRlbXMubGVuZ3RoOyBpKysgKSB7XG4gICAgICAgICAgICBpZiAoIHRoaXMuX2l0ZW1zW2ldLm5lZWRzRHJhdygpICkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9uZWVkc0RyYXc7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIHtPcGVuU2VhZHJhZ29uLlJlY3R9IFRoZSBzbWFsbGVzdCByZWN0YW5nbGUgdGhhdCBlbmNsb3NlcyBhbGwgaXRlbXMsIGluIHZpZXdwb3J0IGNvb3JkaW5hdGVzLlxuICAgICAqL1xuICAgIGdldEhvbWVCb3VuZHM6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faG9tZUJvdW5kcy5jbG9uZSgpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBUbyBmYWNpbGl0YXRlIHpvb20gY29uc3RyYWludHMsIHdlIGtlZXAgdHJhY2sgb2YgdGhlIHBpeGVsIGRlbnNpdHkgb2YgdGhlXG4gICAgICogZGVuc2VzdCBpdGVtIGluIHRoZSBXb3JsZCAoaS5lLiB0aGUgaXRlbSB3aG9zZSBjb250ZW50IHNpemUgdG8gdmlld3BvcnQgc2l6ZVxuICAgICAqIHJhdGlvIGlzIHRoZSBoaWdoZXN0KSBhbmQgc2F2ZSBpdCBhcyB0aGlzIFwiY29udGVudCBmYWN0b3JcIi5cbiAgICAgKiBAcmV0dXJucyB7TnVtYmVyfSB0aGUgbnVtYmVyIG9mIGNvbnRlbnQgdW5pdHMgcGVyIHZpZXdwb3J0IHVuaXQuXG4gICAgICovXG4gICAgZ2V0Q29udGVudEZhY3RvcjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb250ZW50RmFjdG9yO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBBcyBhIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbiwgc2V0dGluZyB0aGlzIGZsYWcgdG8gZmFsc2UgYWxsb3dzIHRoZSBib3VuZHMtY2hhbmdlIGV2ZW50IGhhbmRsZXJcbiAgICAgKiBvbiB0aWxlZEltYWdlcyB0byBza2lwIGNhbGN1bGF0aW9ucyBvbiB0aGUgd29ybGQgYm91bmRzLiBJZiBhIGxvdCBvZiBpbWFnZXMgYXJlIGdvaW5nIHRvIGJlIHBvc2l0aW9uZWQgaW5cbiAgICAgKiByYXBpZCBzdWNjZXNzaW9uLCB0aGlzIGlzIGEgZ29vZCBpZGVhLiBXaGVuIGZpbmlzaGVkLCBzZXRBdXRvUmVmaWd1cmVTaXplcyBzaG91bGQgYmUgY2FsbGVkIHdpdGggdHJ1ZVxuICAgICAqIG9yIHRoZSBzeXN0ZW0gbWF5IGJlaGF2ZSBvZGRseS5cbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IFt2YWx1ZV0gVGhlIHZhbHVlIHRvIHdoaWNoIHRvIHNldCB0aGUgZmxhZy5cbiAgICAgKi9cbiAgICBzZXRBdXRvUmVmaWd1cmVTaXplczogZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgdGhpcy5fYXV0b1JlZmlndXJlU2l6ZXMgPSB2YWx1ZTtcbiAgICAgICAgaWYgKHZhbHVlICYgdGhpcy5fbmVlZHNTaXplc0ZpZ3VyZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2ZpZ3VyZVNpemVzKCk7XG4gICAgICAgICAgICB0aGlzLl9uZWVkc1NpemVzRmlndXJlZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEFycmFuZ2VzIGFsbCBvZiB0aGUgVGlsZWRJbWFnZXMgd2l0aCB0aGUgc3BlY2lmaWVkIHNldHRpbmdzLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gU3BlY2lmaWVzIGhvdyB0byBhcnJhbmdlLlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuaW1tZWRpYXRlbHk9ZmFsc2VdIC0gV2hldGhlciB0byBhbmltYXRlIHRvIHRoZSBuZXcgYXJyYW5nZW1lbnQuXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmxheW91dF0gLSBTZWUgY29sbGVjdGlvbkxheW91dCBpbiB7QGxpbmsgT3BlblNlYWRyYWdvbi5PcHRpb25zfS5cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMucm93c10gLSBTZWUgY29sbGVjdGlvblJvd3MgaW4ge0BsaW5rIE9wZW5TZWFkcmFnb24uT3B0aW9uc30uXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmNvbHVtbnNdIC0gU2VlIGNvbGxlY3Rpb25Db2x1bW5zIGluIHtAbGluayBPcGVuU2VhZHJhZ29uLk9wdGlvbnN9LlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy50aWxlU2l6ZV0gLSBTZWUgY29sbGVjdGlvblRpbGVTaXplIGluIHtAbGluayBPcGVuU2VhZHJhZ29uLk9wdGlvbnN9LlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy50aWxlTWFyZ2luXSAtIFNlZSBjb2xsZWN0aW9uVGlsZU1hcmdpbiBpbiB7QGxpbmsgT3BlblNlYWRyYWdvbi5PcHRpb25zfS5cbiAgICAgKiBAZmlyZXMgT3BlblNlYWRyYWdvbi5Xb3JsZC5ldmVudDptZXRyaWNzLWNoYW5nZVxuICAgICAqL1xuICAgIGFycmFuZ2U6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgICAgIHZhciBpbW1lZGlhdGVseSA9IG9wdGlvbnMuaW1tZWRpYXRlbHkgfHwgZmFsc2U7XG4gICAgICAgIHZhciBsYXlvdXQgPSBvcHRpb25zLmxheW91dCB8fCAkLkRFRkFVTFRfU0VUVElOR1MuY29sbGVjdGlvbkxheW91dDtcbiAgICAgICAgdmFyIHJvd3MgPSBvcHRpb25zLnJvd3MgfHwgJC5ERUZBVUxUX1NFVFRJTkdTLmNvbGxlY3Rpb25Sb3dzO1xuICAgICAgICB2YXIgY29sdW1ucyA9IG9wdGlvbnMuY29sdW1ucyB8fCAkLkRFRkFVTFRfU0VUVElOR1MuY29sbGVjdGlvbkNvbHVtbnM7XG4gICAgICAgIHZhciB0aWxlU2l6ZSA9IG9wdGlvbnMudGlsZVNpemUgfHwgJC5ERUZBVUxUX1NFVFRJTkdTLmNvbGxlY3Rpb25UaWxlU2l6ZTtcbiAgICAgICAgdmFyIHRpbGVNYXJnaW4gPSBvcHRpb25zLnRpbGVNYXJnaW4gfHwgJC5ERUZBVUxUX1NFVFRJTkdTLmNvbGxlY3Rpb25UaWxlTWFyZ2luO1xuICAgICAgICB2YXIgaW5jcmVtZW50ID0gdGlsZVNpemUgKyB0aWxlTWFyZ2luO1xuICAgICAgICB2YXIgd3JhcDtcbiAgICAgICAgaWYgKCFvcHRpb25zLnJvd3MgJiYgY29sdW1ucykge1xuICAgICAgICAgICAgd3JhcCA9IGNvbHVtbnM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB3cmFwID0gTWF0aC5jZWlsKHRoaXMuX2l0ZW1zLmxlbmd0aCAvIHJvd3MpO1xuICAgICAgICB9XG4gICAgICAgIHZhciB4ID0gMDtcbiAgICAgICAgdmFyIHkgPSAwO1xuICAgICAgICB2YXIgaXRlbSwgYm94LCB3aWR0aCwgaGVpZ2h0LCBwb3NpdGlvbjtcblxuICAgICAgICB0aGlzLnNldEF1dG9SZWZpZ3VyZVNpemVzKGZhbHNlKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9pdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGkgJiYgKGkgJSB3cmFwKSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGlmIChsYXlvdXQgPT09ICdob3Jpem9udGFsJykge1xuICAgICAgICAgICAgICAgICAgICB5ICs9IGluY3JlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgeCA9IDA7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgeCArPSBpbmNyZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIHkgPSAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaXRlbSA9IHRoaXMuX2l0ZW1zW2ldO1xuICAgICAgICAgICAgYm94ID0gaXRlbS5nZXRCb3VuZHMoKTtcbiAgICAgICAgICAgIGlmIChib3gud2lkdGggPiBib3guaGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgd2lkdGggPSB0aWxlU2l6ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgd2lkdGggPSB0aWxlU2l6ZSAqIChib3gud2lkdGggLyBib3guaGVpZ2h0KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaGVpZ2h0ID0gd2lkdGggKiAoYm94LmhlaWdodCAvIGJveC53aWR0aCk7XG4gICAgICAgICAgICBwb3NpdGlvbiA9IG5ldyAkLlBvaW50KHggKyAoKHRpbGVTaXplIC0gd2lkdGgpIC8gMiksXG4gICAgICAgICAgICAgICAgeSArICgodGlsZVNpemUgLSBoZWlnaHQpIC8gMikpO1xuXG4gICAgICAgICAgICBpdGVtLnNldFBvc2l0aW9uKHBvc2l0aW9uLCBpbW1lZGlhdGVseSk7XG4gICAgICAgICAgICBpdGVtLnNldFdpZHRoKHdpZHRoLCBpbW1lZGlhdGVseSk7XG5cbiAgICAgICAgICAgIGlmIChsYXlvdXQgPT09ICdob3Jpem9udGFsJykge1xuICAgICAgICAgICAgICAgIHggKz0gaW5jcmVtZW50O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB5ICs9IGluY3JlbWVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldEF1dG9SZWZpZ3VyZVNpemVzKHRydWUpO1xuICAgIH0sXG5cbiAgICAvLyBwcml2YXRlXG4gICAgX2ZpZ3VyZVNpemVzOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIG9sZEhvbWVCb3VuZHMgPSB0aGlzLl9ob21lQm91bmRzID8gdGhpcy5faG9tZUJvdW5kcy5jbG9uZSgpIDogbnVsbDtcbiAgICAgICAgdmFyIG9sZENvbnRlbnRTaXplID0gdGhpcy5fY29udGVudFNpemUgPyB0aGlzLl9jb250ZW50U2l6ZS5jbG9uZSgpIDogbnVsbDtcbiAgICAgICAgdmFyIG9sZENvbnRlbnRGYWN0b3IgPSB0aGlzLl9jb250ZW50RmFjdG9yIHx8IDA7XG5cbiAgICAgICAgaWYgKCF0aGlzLl9pdGVtcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuX2hvbWVCb3VuZHMgPSBuZXcgJC5SZWN0KDAsIDAsIDEsIDEpO1xuICAgICAgICAgICAgdGhpcy5fY29udGVudFNpemUgPSBuZXcgJC5Qb2ludCgxLCAxKTtcbiAgICAgICAgICAgIHRoaXMuX2NvbnRlbnRGYWN0b3IgPSAxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIGl0ZW0gPSB0aGlzLl9pdGVtc1swXTtcbiAgICAgICAgICAgIHZhciBib3VuZHMgPSBpdGVtLmdldEJvdW5kcygpO1xuICAgICAgICAgICAgdGhpcy5fY29udGVudEZhY3RvciA9IGl0ZW0uZ2V0Q29udGVudFNpemUoKS54IC8gYm91bmRzLndpZHRoO1xuICAgICAgICAgICAgdmFyIGNsaXBwZWRCb3VuZHMgPSBpdGVtLmdldENsaXBwZWRCb3VuZHMoKTtcbiAgICAgICAgICAgIHZhciBsZWZ0ID0gY2xpcHBlZEJvdW5kcy54O1xuICAgICAgICAgICAgdmFyIHRvcCA9IGNsaXBwZWRCb3VuZHMueTtcbiAgICAgICAgICAgIHZhciByaWdodCA9IGNsaXBwZWRCb3VuZHMueCArIGNsaXBwZWRCb3VuZHMud2lkdGg7XG4gICAgICAgICAgICB2YXIgYm90dG9tID0gY2xpcHBlZEJvdW5kcy55ICsgY2xpcHBlZEJvdW5kcy5oZWlnaHQ7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IHRoaXMuX2l0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaXRlbSA9IHRoaXMuX2l0ZW1zW2ldO1xuICAgICAgICAgICAgICAgIGJvdW5kcyA9IGl0ZW0uZ2V0Qm91bmRzKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fY29udGVudEZhY3RvciA9IE1hdGgubWF4KHRoaXMuX2NvbnRlbnRGYWN0b3IsXG4gICAgICAgICAgICAgICAgICAgIGl0ZW0uZ2V0Q29udGVudFNpemUoKS54IC8gYm91bmRzLndpZHRoKTtcbiAgICAgICAgICAgICAgICBjbGlwcGVkQm91bmRzID0gaXRlbS5nZXRDbGlwcGVkQm91bmRzKCk7XG4gICAgICAgICAgICAgICAgbGVmdCA9IE1hdGgubWluKGxlZnQsIGNsaXBwZWRCb3VuZHMueCk7XG4gICAgICAgICAgICAgICAgdG9wID0gTWF0aC5taW4odG9wLCBjbGlwcGVkQm91bmRzLnkpO1xuICAgICAgICAgICAgICAgIHJpZ2h0ID0gTWF0aC5tYXgocmlnaHQsIGNsaXBwZWRCb3VuZHMueCArIGNsaXBwZWRCb3VuZHMud2lkdGgpO1xuICAgICAgICAgICAgICAgIGJvdHRvbSA9IE1hdGgubWF4KGJvdHRvbSwgY2xpcHBlZEJvdW5kcy55ICsgY2xpcHBlZEJvdW5kcy5oZWlnaHQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLl9ob21lQm91bmRzID0gbmV3ICQuUmVjdChsZWZ0LCB0b3AsIHJpZ2h0IC0gbGVmdCwgYm90dG9tIC0gdG9wKTtcbiAgICAgICAgICAgIHRoaXMuX2NvbnRlbnRTaXplID0gbmV3ICQuUG9pbnQoXG4gICAgICAgICAgICAgICAgdGhpcy5faG9tZUJvdW5kcy53aWR0aCAqIHRoaXMuX2NvbnRlbnRGYWN0b3IsXG4gICAgICAgICAgICAgICAgdGhpcy5faG9tZUJvdW5kcy5oZWlnaHQgKiB0aGlzLl9jb250ZW50RmFjdG9yKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9jb250ZW50RmFjdG9yICE9PSBvbGRDb250ZW50RmFjdG9yIHx8XG4gICAgICAgICAgICAhdGhpcy5faG9tZUJvdW5kcy5lcXVhbHMob2xkSG9tZUJvdW5kcykgfHxcbiAgICAgICAgICAgICF0aGlzLl9jb250ZW50U2l6ZS5lcXVhbHMob2xkQ29udGVudFNpemUpKSB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIFJhaXNlZCB3aGVuIHRoZSBob21lIGJvdW5kcyBvciBjb250ZW50IGZhY3RvciBjaGFuZ2UuXG4gICAgICAgICAgICAgKiBAZXZlbnQgbWV0cmljcy1jaGFuZ2VcbiAgICAgICAgICAgICAqIEBtZW1iZXJPZiBPcGVuU2VhZHJhZ29uLldvcmxkXG4gICAgICAgICAgICAgKiBAdHlwZSB7b2JqZWN0fVxuICAgICAgICAgICAgICogQHByb3BlcnR5IHtPcGVuU2VhZHJhZ29uLldvcmxkfSBldmVudFNvdXJjZSAtIEEgcmVmZXJlbmNlIHRvIHRoZSBXb3JsZCB3aGljaCByYWlzZWQgdGhlIGV2ZW50LlxuICAgICAgICAgICAgICogQHByb3BlcnR5IHs/T2JqZWN0fSB1c2VyRGF0YSAtIEFyYml0cmFyeSBzdWJzY3JpYmVyLWRlZmluZWQgb2JqZWN0LlxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICB0aGlzLnJhaXNlRXZlbnQoJ21ldHJpY3MtY2hhbmdlJywge30pO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIHByaXZhdGVcbiAgICBfcmFpc2VSZW1vdmVJdGVtOiBmdW5jdGlvbihpdGVtKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSYWlzZWQgd2hlbiBhbiBpdGVtIGlzIHJlbW92ZWQuXG4gICAgICAgICAqIEBldmVudCByZW1vdmUtaXRlbVxuICAgICAgICAgKiBAbWVtYmVyT2YgT3BlblNlYWRyYWdvbi5Xb3JsZFxuICAgICAgICAgKiBAdHlwZSB7b2JqZWN0fVxuICAgICAgICAgKiBAcHJvcGVydHkge09wZW5TZWFkcmFnb24uV29ybGR9IGV2ZW50U291cmNlIC0gQSByZWZlcmVuY2UgdG8gdGhlIFdvcmxkIHdoaWNoIHJhaXNlZCB0aGUgZXZlbnQuXG4gICAgICAgICAqIEBwcm9wZXJ0eSB7T3BlblNlYWRyYWdvbi5UaWxlZEltYWdlfSBpdGVtIC0gVGhlIGl0ZW0ncyB1bmRlcmx5aW5nIGl0ZW0uXG4gICAgICAgICAqIEBwcm9wZXJ0eSB7P09iamVjdH0gdXNlckRhdGEgLSBBcmJpdHJhcnkgc3Vic2NyaWJlci1kZWZpbmVkIG9iamVjdC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMucmFpc2VFdmVudCggJ3JlbW92ZS1pdGVtJywgeyBpdGVtOiBpdGVtIH0gKTtcbiAgICB9XG59KTtcblxufSggT3BlblNlYWRyYWdvbiApKTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9b3BlbnNlYWRyYWdvbi5qcy5tYXAiLCIvKipcbiAqIEFsbG93cyBhcHBsaWNhdGlvbiB0byBhY2Nlc3MgYW5kIHVwZGF0ZSBjdXJyZW50IGFwcCBzdGF0ZSB2aWEgcXVlcnkgc3RyaW5nXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gcXVlcnlTdGF0ZTtcblxudmFyIGV2ZW50aWZ5ID0gcmVxdWlyZSgnbmdyYXBoLmV2ZW50cycpO1xudmFyIHdpbmRvd0hhc2hIaXN0b3J5ID0gcmVxdWlyZSgnLi9saWIvd2luZG93SGFzaEhpc3RvcnkuanMnKTtcblxuLyoqXG4gKiBKdXN0IGEgY29udmVuaWVuY2UgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiBhIHF1ZXJ5IHN0YXRlXG4gKi9cbnF1ZXJ5U3RhdGUuaW5zdGFuY2UgPSBpbnN0YW5jZTtcblxuLy8gdGhpcyB2YXJpYWJsZSBob2xkcyBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHF1ZXJ5IHN0YXRlXG52YXIgc2luZ2xldG9uUVM7XG5cbi8qKlxuICogQ3JlYXRlcyBuZXcgaW5zdGFuY2Ugb2YgdGhlIHF1ZXJ5IHN0YXRlLlxuICovXG5mdW5jdGlvbiBxdWVyeVN0YXRlKGRlZmF1bHRzLCBoaXN0b3J5KSB7XG4gIGhpc3RvcnkgPSBoaXN0b3J5IHx8IHdpbmRvd0hhc2hIaXN0b3J5KGRlZmF1bHRzKTtcbiAgdmFsaWRhdGVIaXN0b3J5QVBJKGhpc3RvcnkpO1xuXG4gIGhpc3Rvcnkub25DaGFuZ2VkKHVwZGF0ZVF1ZXJ5KVxuXG4gIHZhciBxdWVyeSA9IGhpc3RvcnkuZ2V0KCkgfHwgT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuICB2YXIgYXBpID0ge1xuXG4gICAgLyoqXG4gICAgICogR2V0cyBjdXJyZW50IHN0YXRlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmc/fSBrZXlOYW1lIGlmIHByZXNlbnQgdGhlbiB2YWx1ZSBmb3IgdGhpcyBrZXkgaXMgcmV0dXJuZWQuXG4gICAgICogT3RoZXJ3aXNlIHRoZSBlbnRpcmUgYXBwIHN0YXRlIGlzIHJldHVyZW5kLlxuICAgICAqL1xuICAgIGdldDogZ2V0VmFsdWUsXG5cbiAgICAvKipcbiAgICAgKiBNZXJnZXMgY3VycmVudCBhcHAgc3RhdGUgd2l0aCBuZXcga2V5L3ZhbHVlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBuYW1lXG4gICAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfGRhdGV9IHZhbHVlXG4gICAgICovXG4gICAgc2V0OiBzZXRWYWx1ZSxcblxuICAgIC8qKlxuICAgICAqIFNpbWlsYXIgdG8gYHNldCgpYCwgYnV0IG9ubHkgc2V0cyB2YWx1ZSBpZiBpdCB3YXMgbm90IHNldCBiZWZvcmUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IG5hbWVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ8ZGF0ZX0gdmFsdWVcbiAgICAgKi9cbiAgICBzZXRJZkVtcHR5OiBzZXRJZkVtcHR5LFxuXG4gICAgLyoqXG4gICAgICogUmVsZWFzZXMgYWxsIHJlc291cmNlcyBhY3F1aXJlZCBieSBxdWVyeSBzdGF0ZS4gQWZ0ZXIgY2FsbGluZyB0aGlzIG1ldGhvZFxuICAgICAqIG5vIGhhc2ggbW9uaXRvcmluZyB3aWxsIGhhcHBlbiBhbmQgbm8gbW9yZSBldmVudHMgd2lsbCBiZSBmaXJlZC5cbiAgICAgKi9cbiAgICBkaXNwb3NlOiBkaXNwb3NlLFxuXG4gICAgb25DaGFuZ2U6IG9uQ2hhbmdlLFxuICAgIG9mZkNoYW5nZTogb2ZmQ2hhbmdlLFxuXG4gICAgZ2V0SGlzdG9yeU9iamVjdDogZ2V0SGlzdG9yeU9iamVjdCxcbiAgfVxuXG4gIHZhciBldmVudEJ1cyA9IGV2ZW50aWZ5KHt9KTtcblxuICByZXR1cm4gYXBpO1xuXG4gIGZ1bmN0aW9uIG9uQ2hhbmdlKGNhbGxiYWNrLCBjdHgpIHtcbiAgICBldmVudEJ1cy5vbignY2hhbmdlJywgY2FsbGJhY2ssIGN0eCk7XG4gIH1cblxuICBmdW5jdGlvbiBvZmZDaGFuZ2UoY2FsbGJhY2ssIGN0eCkge1xuICAgIGV2ZW50QnVzLm9mZignY2hhbmdlJywgY2FsbGJhY2ssIGN0eClcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldEhpc3RvcnlPYmplY3QoKSB7XG4gICAgcmV0dXJuIGhpc3Rvcnk7XG4gIH1cblxuICBmdW5jdGlvbiBkaXNwb3NlKCkge1xuICAgIC8vIGRpc3Bvc2UgYWxsIGhpc3RvcnkgbGlzdGVuZXJzXG4gICAgaGlzdG9yeS5kaXNwb3NlKCk7XG5cbiAgICAvLyBBbmQgcmVtb3ZlIG91ciBvd24gbGlzdGVuZXJzXG4gICAgZXZlbnRCdXMub2ZmKCk7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRWYWx1ZShrZXlOYW1lKSB7XG4gICAgaWYgKGtleU5hbWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHF1ZXJ5O1xuXG4gICAgcmV0dXJuIHF1ZXJ5W2tleU5hbWVdO1xuICB9XG5cbiAgZnVuY3Rpb24gc2V0VmFsdWUoa2V5TmFtZSwgdmFsdWUpIHtcbiAgICB2YXIga2V5TmFtZVR5cGUgPSB0eXBlb2Yga2V5TmFtZTtcblxuICAgIGlmIChrZXlOYW1lVHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIE9iamVjdC5rZXlzKGtleU5hbWUpLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG4gICAgICAgIHF1ZXJ5W2tleV0gPSBrZXlOYW1lW2tleV07XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKGtleU5hbWVUeXBlID09PSAnc3RyaW5nJykge1xuICAgICAgcXVlcnlba2V5TmFtZV0gPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBoaXN0b3J5LnNldChxdWVyeSk7XG5cbiAgICByZXR1cm4gYXBpO1xuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlUXVlcnkobmV3QXBwU3RhdGUpIHtcbiAgICBxdWVyeSA9IG5ld0FwcFN0YXRlO1xuICAgIGV2ZW50QnVzLmZpcmUoJ2NoYW5nZScsIHF1ZXJ5KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNldElmRW1wdHkoa2V5TmFtZSwgdmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIGtleU5hbWUgPT09ICdvYmplY3QnKSB7XG4gICAgICBPYmplY3Qua2V5cyhrZXlOYW1lKS5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xuICAgICAgICAvLyBUT0RPOiBDYW4gaSByZW1vdmUgY29kZSBkdXBsaWNhdGlvbj8gVGhlIG1haW4gcmVhc29uIHdoeSBJIGRvbid0XG4gICAgICAgIC8vIHdhbnQgcmVjdXJzaW9uIGhlcmUgaXMgdG8gYXZvaWQgc3BhbW1pbmcgYGhpc3Rvcnkuc2V0KClgXG4gICAgICAgIGlmIChrZXkgaW4gcXVlcnkpIHJldHVybjsgLy8ga2V5IG5hbWUgaXMgbm90IGVtcHR5XG5cbiAgICAgICAgcXVlcnlba2V5XSA9IGtleU5hbWVba2V5XTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChrZXlOYW1lIGluIHF1ZXJ5KSByZXR1cm47IC8vIGtleSBuYW1lIGlzIG5vdCBlbXB0eVxuICAgIHF1ZXJ5W2tleU5hbWVdID0gdmFsdWU7XG5cbiAgICBoaXN0b3J5LnNldChxdWVyeSk7XG5cbiAgICByZXR1cm4gYXBpO1xuICB9XG59XG5cbi8qKlxuICogUmV0dXJucyBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHF1ZXJ5IHN0YXRlLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBkZWZhdWx0cyAtIGlmIHByZXNlbnQsIHRoZW4gaXQgaXMgcGFzc2VkIHRvIHRoZSBjdXJyZW50IGluc3RhbmNlXG4gKiBvZiB0aGUgcXVlcnkgc3RhdGUuIERlZmF1bHRzIGFyZSBhcHBsaWVkIG9ubHkgaWYgdGhleSB3ZXJlIG5vdCBwcmVzZW50IGJlZm9yZS5cbiAqL1xuZnVuY3Rpb24gaW5zdGFuY2UoZGVmYXVsdHMpIHtcbiAgaWYgKCFzaW5nbGV0b25RUykge1xuICAgIHNpbmdsZXRvblFTID0gcXVlcnlTdGF0ZShkZWZhdWx0cyk7XG4gIH0gZWxzZSBpZiAoZGVmYXVsdHMpIHtcbiAgICBzaW5nbGV0b25RUy5zZXRJZkVtcHR5KGRlZmF1bHRzKTtcbiAgfVxuXG4gIHJldHVybiBzaW5nbGV0b25RUztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVIaXN0b3J5QVBJKGhpc3RvcnkpIHtcbiAgaWYgKCFoaXN0b3J5KSB0aHJvdyBuZXcgRXJyb3IoJ2hpc3RvcnkgaXMgcmVxdWlyZWQnKTtcbiAgaWYgKHR5cGVvZiBoaXN0b3J5LmRpc3Bvc2UgIT09ICdmdW5jdGlvbicpIHRocm93IG5ldyBFcnJvcignZGlzcG9zZSBpcyByZXF1aXJlZCcpO1xuICBpZiAodHlwZW9mIGhpc3Rvcnkub25DaGFuZ2VkICE9PSAnZnVuY3Rpb24nKSB0aHJvdyBuZXcgRXJyb3IoJ29uQ2hhbmdlZCBpcyByZXF1aXJlZCcpO1xufVxuIiwiLyoqXG4gKiBQcm92aWRlcyBhIGBudWxsYCBvYmplY3QgdGhhdCBtYXRjaGVzIGhpc3RvcnkgQVBJXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gaW5NZW1vcnlIaXN0b3J5O1xuXG5mdW5jdGlvbiBpbk1lbW9yeUhpc3RvcnkoZGVmYXVsdHMpIHtcbiAgdmFyIGxpc3RlbmVycyA9IFtdO1xuICB2YXIgbGFzdFF1ZXJ5T2JqZWN0ID0gZGVmYXVsdHM7XG5cbiAgcmV0dXJuIHtcbiAgICBkaXNwb3NlOiBkaXNwb3NlLFxuICAgIG9uQ2hhbmdlZDogb25DaGFuZ2VkLFxuICAgIHNldDogc2V0LFxuICAgIGdldDogZ2V0XG4gIH07XG5cbiAgZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBsYXN0UXVlcnlPYmplY3Q7XG4gIH1cblxuICBmdW5jdGlvbiBzZXQobmV3UXVlcnlPYmplY3QpIHtcbiAgICBsYXN0UXVlcnlPYmplY3QgPSBuZXdRdWVyeU9iamVjdDtcbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgdHJpZ2dlckNoYW5nZShuZXdRdWVyeU9iamVjdCk7XG4gICAgfSwgMCk7XG4gIH1cblxuICBmdW5jdGlvbiBkaXNwb3NlKCkge1xuICAgIGxpc3RlbmVycyA9IFtdO1xuICB9XG5cbiAgZnVuY3Rpb24gb25DaGFuZ2VkKGNoYW5nZUNhbGxiYWNrKSB7XG4gICAgaWYgKHR5cGVvZiBjaGFuZ2VDYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjaGFuZ2VDYWxsYmFjayBzaG91bGQgYmUgYSBmdW5jdGlvbicpXG4gICAgfVxuXG4gICAgbGlzdGVuZXJzLnB1c2goY2hhbmdlQ2FsbGJhY2spO1xuICB9XG5cbiAgZnVuY3Rpb24gdHJpZ2dlckNoYW5nZShhcHBTdGF0ZSkge1xuICAgIGxpc3RlbmVycy5mb3JFYWNoKGZ1bmN0aW9uKGxpc3RlbmVyKSB7XG4gICAgICBsaXN0ZW5lcihhcHBTdGF0ZSk7XG4gICAgfSk7XG4gIH1cbn1cbiIsIi8qKlxuICogVGhpcyBtb2R1bGUgaXMgc2ltaWxhciB0byBKU09OLCBidXQgaXQgZW5jb2Rlcy9kZWNvZGVzIGluIHF1ZXJ5IHN0cmluZ1xuICogZm9ybWF0IGBrZXkxPXZhbHVlMS4uLmBcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHBhcnNlOiBwYXJzZSxcbiAgc3RyaW5naWZ5OiBzdHJpbmdpZnlcbn07XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeShvYmplY3QpIHtcbiAgaWYgKCFvYmplY3QpIHJldHVybiAnJztcblxuICByZXR1cm4gT2JqZWN0LmtleXMob2JqZWN0KS5tYXAodG9QYWlycykuam9pbignJicpO1xuXG4gIGZ1bmN0aW9uIHRvUGFpcnMoa2V5KSB7XG4gICAgdmFyIHZhbHVlID0gb2JqZWN0W2tleV07XG4gICAgdmFyIHBhaXIgPSBlbmNvZGVVUklDb21wb25lbnQoa2V5KTtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcGFpciArPSAnPScgKyBlbmNvZGVWYWx1ZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhaXI7XG4gIH1cbn1cblxuZnVuY3Rpb24gcGFyc2UocXVlcnlTdHJpbmcpIHtcbiAgdmFyIHF1ZXJ5ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuICBpZiAoIXF1ZXJ5U3RyaW5nKSByZXR1cm4gcXVlcnk7XG5cbiAgcXVlcnlTdHJpbmcuc3BsaXQoJyYnKS5mb3JFYWNoKGRlY29kZVJlY29yZCk7XG5cbiAgcmV0dXJuIHF1ZXJ5O1xuXG4gIGZ1bmN0aW9uIGRlY29kZVJlY29yZChxdWVyeVJlY29yZCkge1xuICAgIGlmICghcXVlcnlSZWNvcmQpIHJldHVybjtcblxuICAgIHZhciBwYWlyID0gcXVlcnlSZWNvcmQuc3BsaXQoJz0nKTtcbiAgICBxdWVyeVtkZWNvZGVVUklDb21wb25lbnQocGFpclswXSldID0gZGVjb2RlVmFsdWUocGFpclsxXSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZW5jb2RlVmFsdWUodmFsdWUpIHtcbiAgLy8gVE9ETzogRG8gSSBuZWVkIHRoaXM/XG4gIC8vIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gIC8vICAgaWYgKHZhbHVlLm1hdGNoKC9eKHRydWV8ZmFsc2UpJC8pKSB7XG4gIC8vICAgICAvLyBzcGVjaWFsIGhhbmRsaW5nIG9mIHN0cmluZ3MgdGhhdCBsb29rIGxpa2UgYm9vbGVhbnNcbiAgLy8gICAgIHZhbHVlID0gSlNPTi5zdHJpbmdpZnkoJycgKyB2YWx1ZSk7XG4gIC8vICAgfSBlbHNlIGlmICh2YWx1ZS5tYXRjaCgvXi0/XFxkK1xcLj9cXGQqJC8pKSB7XG4gIC8vICAgICAvLyBzcGVjaWFsIGhhbmRsaW5nIG9mIHN0cmluZ3MgdGhhdCBsb29rIGxpa2UgbnVtYmVyc1xuICAvLyAgICAgdmFsdWUgPSBKU09OLnN0cmluZ2lmeSgnJyArIHZhbHVlKTtcbiAgLy8gICB9XG4gIC8vIH1cbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgIHZhbHVlID0gdmFsdWUudG9JU09TdHJpbmcoKTtcbiAgfVxuICB2YXIgdXJpVmFsdWUgPSBlbmNvZGVVUklDb21wb25lbnQodmFsdWUpO1xuICByZXR1cm4gdXJpVmFsdWU7XG59XG5cbi8qKlxuICogVGhpcyBtZXRob2QgcmV0dXJucyB0eXBlZCB2YWx1ZSBmcm9tIHN0cmluZ1xuICovXG5mdW5jdGlvbiBkZWNvZGVWYWx1ZSh2YWx1ZSkge1xuICB2YWx1ZSA9IGRlY29kZVVSSUNvbXBvbmVudCh2YWx1ZSk7XG4gIGlmICghaXNOYU4odmFsdWUpKSB7XG4gICAgcmV0dXJuIHBhcnNlRmxvYXQodmFsdWUpO1xuICB9XG4gIGlmIChpc0JvbGVhbih2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWUgPT09ICd0cnVlJztcbiAgfVxuICBpZiAoaXNJU09EYXRlU3RyaW5nKHZhbHVlKSkge1xuICAgIHJldHVybiBuZXcgRGF0ZSh2YWx1ZSk7XG4gIH1cblxuICByZXR1cm4gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIGlzQm9sZWFuKHN0clZhbHVlKSB7XG4gIHJldHVybiBzdHJWYWx1ZSA9PT0gJ3RydWUnIHx8IHN0clZhbHVlID09PSAnZmFsc2UnO1xufVxuXG5mdW5jdGlvbiBpc0lTT0RhdGVTdHJpbmcoc3RyKSB7XG4gIHJldHVybiBzdHIgJiYgc3RyLm1hdGNoKC8oXFxkezR9LVswMV1cXGQtWzAtM11cXGRUWzAtMl1cXGQ6WzAtNV1cXGQ6WzAtNV1cXGRcXC5cXGQrKFsrLV1bMC0yXVxcZDpbMC01XVxcZHxaKSl8KFxcZHs0fS1bMDFdXFxkLVswLTNdXFxkVFswLTJdXFxkOlswLTVdXFxkOlswLTVdXFxkKFsrLV1bMC0yXVxcZDpbMC01XVxcZHxaKSl8KFxcZHs0fS1bMDFdXFxkLVswLTNdXFxkVFswLTJdXFxkOlswLTVdXFxkKFsrLV1bMC0yXVxcZDpbMC01XVxcZHxaKSkvKVxufVxuIiwiLyoqXG4gKiBVc2VzIGB3aW5kb3dgIHRvIG1vbml0b3IgaGFzaCBhbmQgdXBkYXRlIGhhc2hcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSB3aW5kb3dIaXN0b3J5O1xuXG52YXIgaW5NZW1vcnlIaXN0b3J5ID0gcmVxdWlyZSgnLi9pbk1lbW9yeUhpc3RvcnkuanMnKTtcbnZhciBxdWVyeSA9IHJlcXVpcmUoJy4vcXVlcnkuanMnKTtcblxuZnVuY3Rpb24gd2luZG93SGlzdG9yeShkZWZhdWx0cykge1xuICAvLyBJZiB3ZSBkb24ndCBzdXBwb3J0IHdpbmRvdywgd2UgYXJlIHByb2JhYmx5IHJ1bm5pbmcgaW4gbm9kZS4gSnVzdCByZXR1cm5cbiAgLy8gaW4gbWVtb3J5IGhpc3RvcnlcbiAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSByZXR1cm4gaW5NZW1vcnlIaXN0b3J5KGRlZmF1bHRzKTtcblxuICAvLyBTdG9yZSBhbGwgYG9uQ2hhbmdlZCgpYCBsaXN0ZW5lcnMgaGVyZSwgc28gdGhhdCB3ZSBjYW4gaGF2ZSBqdXN0IG9uZVxuICAvLyBgaGFzaGNoYW5nZWAgbGlzdGVuZXIsIGFuZCBub3RpZnkgb25lIGxpc3RlbmVycyB3aXRoaW4gc2luZ2xlIGV2ZW50LlxuICB2YXIgbGlzdGVuZXJzID0gW107XG5cbiAgLy8gVGhpcyBwcmVmaXggaXMgdXNlZCBmb3IgYWxsIHF1ZXJ5IHN0cmluZ3MuIFNvIG91ciBzdGF0ZSBpcyBzdG9yZWQgYXNcbiAgLy8gbXktYXBwLmNvbS8jP2tleT12YWx1ZVxuICB2YXIgaGFzaFByZWZpeCA9ICcjPyc7XG5cbiAgaW5pdCgpO1xuXG4gIC8vIFRoaXMgaXMgb3VyIHB1YmxpYyBBUEk6XG4gIHJldHVybiB7XG4gICAgLyoqXG4gICAgICogQWRkcyBjYWxsYmFjayB0aGF0IGlzIGNhbGxlZCB3aGVuIGhhc2ggY2hhbmdlIGhhcHBlbi4gQ2FsbGJhY2sgcmVjZWl2ZXNcbiAgICAgKiBjdXJyZW50IGhhc2ggc3RyaW5nIHdpdGggYCM/YCBzaWduXG4gICAgICogXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2hhbmdlQ2FsbGJhY2sgLSBhIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIHdoZW4gaGFzaCBpc1xuICAgICAqIGNoYW5nZWQuIENhbGxiYWNrIGdldHMgb25lIGFyZ3VtZW50IHRoYXQgcmVwcmVzZW50cyB0aGUgbmV3IHN0YXRlLlxuICAgICAqL1xuICAgIG9uQ2hhbmdlZDogb25DaGFuZ2VkLFxuXG4gICAgLyoqXG4gICAgICogUmVsZWFzZXMgYWxsIHJlc291cmNlc1xuICAgICAqL1xuICAgIGRpc3Bvc2U6IGRpc3Bvc2UsXG5cbiAgICAvKipcbiAgICAgKiBTZXRzIGEgbmV3IGFwcCBzdGF0ZVxuICAgICAqXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGFwcFN0YXRlIC0gdGhlIG5ldyBhcHBsaWNhdGlvbiBzdGF0ZSwgdGhhdCBzaG91bGQgYmVcbiAgICAgKiBwZXJzaXN0ZWQgaW4gdGhlIGhhc2ggc3RyaW5nXG4gICAgICovXG4gICAgc2V0OiBzZXQsXG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGN1cnJlbnQgYXBwIHN0YXRlXG4gICAgICovXG4gICAgZ2V0OiBnZXRTdGF0ZUZyb21IYXNoXG4gIH07XG5cbiAgLy8gUHVibGljIEFQSSBpcyBvdmVyLiBZb3UgY2FuIGlnbm9yZSB0aGlzIHBhcnQuXG5cbiAgZnVuY3Rpb24gaW5pdCgpIHtcbiAgICB2YXIgc3RhdGVGcm9tSGFzaCA9IGdldFN0YXRlRnJvbUhhc2goKTtcbiAgICB2YXIgc3RhdGVDaGFuZ2VkID0gZmFsc2U7XG5cbiAgICBpZiAodHlwZW9mIGRlZmF1bHRzID09PSAnb2JqZWN0JyAmJiBkZWZhdWx0cykge1xuICAgICAgT2JqZWN0LmtleXMoZGVmYXVsdHMpLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG4gICAgICAgIGlmIChrZXkgaW4gc3RhdGVGcm9tSGFzaCkgcmV0dXJuO1xuXG4gICAgICAgIHN0YXRlRnJvbUhhc2hba2V5XSA9IGRlZmF1bHRzW2tleV1cbiAgICAgICAgc3RhdGVDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChzdGF0ZUNoYW5nZWQpIHNldChzdGF0ZUZyb21IYXNoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNldChhcHBTdGF0ZSkge1xuICAgIHZhciBoYXNoID0gaGFzaFByZWZpeCArIHF1ZXJ5LnN0cmluZ2lmeShhcHBTdGF0ZSk7XG5cbiAgICBpZiAod2luZG93Lmhpc3RvcnkpIHtcbiAgICAgIHdpbmRvdy5oaXN0b3J5LnJlcGxhY2VTdGF0ZSh1bmRlZmluZWQsIHVuZGVmaW5lZCwgaGFzaCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZXBsYWNlKGhhc2gpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG9uQ2hhbmdlZChjaGFuZ2VDYWxsYmFjaykge1xuICAgIGlmICh0eXBlb2YgY2hhbmdlQ2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHRocm93IG5ldyBFcnJvcignY2hhbmdlQ2FsbGJhY2sgbmVlZHMgdG8gYmUgYSBmdW5jdGlvbicpO1xuXG4gICAgLy8gd2Ugc3RhcnQgbGlzdGVuIGp1c3Qgb25jZSwgb25seSBpZiB3ZSBkaWRuJ3QgbGlzdGVuIGJlZm9yZTpcbiAgICBpZiAobGlzdGVuZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2hhc2hjaGFuZ2UnLCBvbkhhc2hDaGFuZ2VkLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgbGlzdGVuZXJzLnB1c2goY2hhbmdlQ2FsbGJhY2spO1xuICB9XG5cbiAgZnVuY3Rpb24gZGlzcG9zZSgpIHtcbiAgICBpZiAobGlzdGVuZXJzLmxlbmd0aCA9PT0gMCkgcmV0dXJuOyAvLyBubyBuZWVkIHRvIGRvIGFueXRoaW5nLlxuXG4gICAgLy8gTGV0IGdhcmJhZ2UgY29sbGVjdG9yIGNvbGxlY3QgYWxsIGxpc3RlbmVycztcbiAgICBsaXN0ZW5lcnMgPSBbXTtcblxuICAgIC8vIEFuZCByZWxlYXNlIGhhc2ggY2hhbmdlIGV2ZW50OlxuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdoYXNoY2hhbmdlJywgb25IYXNoQ2hhbmdlZCwgZmFsc2UpO1xuICB9XG5cbiAgZnVuY3Rpb24gb25IYXNoQ2hhbmdlZCgpIHtcbiAgICB2YXIgYXBwU3RhdGUgPSBnZXRTdGF0ZUZyb21IYXNoKCk7XG4gICAgbm90aWZ5TGlzdGVuZXJzKGFwcFN0YXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG5vdGlmeUxpc3RlbmVycyhhcHBTdGF0ZSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgKytpKSB7XG4gICAgICB2YXIgbGlzdGVuZXIgPSBsaXN0ZW5lcnNbaV07XG4gICAgICBsaXN0ZW5lcihhcHBTdGF0ZSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZ2V0U3RhdGVGcm9tSGFzaCgpIHtcbiAgICB2YXIgcXVlcnlTdHJpbmcgPSAod2luZG93LmxvY2F0aW9uLmhhc2ggfHwgaGFzaFByZWZpeCkuc3Vic3RyKGhhc2hQcmVmaXgubGVuZ3RoKTtcblxuICAgIHJldHVybiBxdWVyeS5wYXJzZShxdWVyeVN0cmluZyk7XG4gIH1cbn1cbiJdfQ== diff --git a/app/dataviz/mark-twain-portrait/docs/mark_twain_cloud.png b/app/dataviz/mark-twain-portrait/docs/mark_twain_cloud.png new file mode 100644 index 00000000..437c7414 Binary files /dev/null and b/app/dataviz/mark-twain-portrait/docs/mark_twain_cloud.png differ diff --git a/app/dataviz/mark-twain-portrait/docs/mark_twain_small.png b/app/dataviz/mark-twain-portrait/docs/mark_twain_small.png new file mode 100644 index 00000000..d5bc47c7 Binary files /dev/null and b/app/dataviz/mark-twain-portrait/docs/mark_twain_small.png differ diff --git a/app/dataviz/mark-twain-portrait/docs/mark_twist.gif b/app/dataviz/mark-twain-portrait/docs/mark_twist.gif new file mode 100644 index 00000000..e996f9dc Binary files /dev/null and b/app/dataviz/mark-twain-portrait/docs/mark_twist.gif differ diff --git a/app/dataviz/mark-twain-portrait/index.html b/app/dataviz/mark-twain-portrait/index.html new file mode 100644 index 00000000..2b4152f4 --- /dev/null +++ b/app/dataviz/mark-twain-portrait/index.html @@ -0,0 +1,127 @@ + + + + + + + Portrait of Mark Twain - Quotes by Mark Twain + + + + +
+
+
+
+
+
+

Portrait

+

+ This is a portrait of Mark Twain. It is made of his + quotes. +

+

+ Navigation works like in Google Maps. To read quotes use mouse wheel or pinch + to zoom in. +

+

+ Read more... +

+
+
+

+ This is a portrait of Mark Twain. It is made of his + quotes. Pinch or mouse wheel to zoom in. + Read more about this project... +

+
+ + + + diff --git a/app/dataviz/mark-twain-portrait/index.js b/app/dataviz/mark-twain-portrait/index.js new file mode 100644 index 00000000..bbf38cc1 --- /dev/null +++ b/app/dataviz/mark-twain-portrait/index.js @@ -0,0 +1,65 @@ +var lastRequest = 0; +var saveDelay = 200; // Don't want to spam with history updates + +var help = require('./lib/help.js'); +var queryState = require('query-state'); +require('openseadragon'); // it adds itself to window. + +var qs = queryState({ + index: 'mark_twain' +}); + +var indexName = qs.get('index') +var indexRoot = 'https://anvaka.github.io/portrait-data/' + indexName + '/'; + +var viewer = window.OpenSeadragon({ + id: 'map', + showNavigationControl: false, + // showNavigator: true, + prefixUrl: '', + preserveViewport: true, + tileSources: indexRoot + 'index.dzi' +}); + +require('./lib/navigator.js')(viewer, indexRoot + 'mini-map.jpg'); + +var box = getBox(); + +viewer.addHandler('open', function() { + if (box) { + viewer.viewport.fitBounds(box, true) + } +}); + +viewer.addHandler('viewport-change', function() { + var viewport = viewer.viewport; + var box = viewport.getBounds(); + if (viewport.getZoom() <= 1) { + help.show(); + } + saveCurrentBox(box); +}); + +function getBox() { + var degrees = qs.get('degrees') || 0; + var height = qs.get('height'); + var width = qs.get('width'); + var x = qs.get('x'); + var y = qs.get('y'); + if (x === undefined || y === undefined || width === undefined || height === undefined) return; + + return new window.OpenSeadragon.Rect(x, y, width, height, degrees) +} + +function saveCurrentBox(box) { + if (lastRequest) { + clearTimeout(lastRequest); + } + + lastRequest = setTimeout(function() { + qs.set(box); + }, saveDelay); +} + + + diff --git a/app/dataviz/mark-twain-portrait/lib/help.js b/app/dataviz/mark-twain-portrait/lib/help.js new file mode 100644 index 00000000..7b28d0ef --- /dev/null +++ b/app/dataviz/mark-twain-portrait/lib/help.js @@ -0,0 +1,39 @@ +module.exports = createHelp(); + +function createHelp() { + var subscribed = false; + var eventSource = document.getElementById('map') + listenToEvents(); + + return { + show: show + } + + function listenToEvents() { + if (subscribed) return; + + subscribed = true; + eventSource.addEventListener('click', hideHelp, true); + eventSource.addEventListener('mousewheel', hideHelp, true); + eventSource.addEventListener('touchstart', hideHelp, true); + } + + function show() { + var items = document.querySelectorAll('.help') + for (var i = 0; i < items.length; ++i) { + items[i].classList.remove('hidden'); + } + listenToEvents(); + } + + function hideHelp() { + eventSource.removeEventListener('click', hideHelp, true); + eventSource.removeEventListener('mousewheel', hideHelp, true); + eventSource.removeEventListener('touchstart', hideHelp, true); + subscribed = false; + var items = document.querySelectorAll('.help') + for (var i = 0; i < items.length; ++i) { + items[i].classList.add('hidden'); + } + } +} diff --git a/app/dataviz/mark-twain-portrait/lib/navigator.js b/app/dataviz/mark-twain-portrait/lib/navigator.js new file mode 100644 index 00000000..933e6417 --- /dev/null +++ b/app/dataviz/mark-twain-portrait/lib/navigator.js @@ -0,0 +1,50 @@ +module.exports = createNavigator; + +function createNavigator(viewer, backgroundImage) { + var displayRegion = document.getElementById('display-region'); + var container = document.getElementById('mini-map'); + container.style.backgroundImage = 'url("' + backgroundImage + '")'; + + viewer.addHandler('viewport-change', update); + container.addEventListener('mousedown', resetZoom); + container.addEventListener('touchstart', resetZoom); + + return; + + function resetZoom(e) { + e.preventDefault(); + e.stopPropagation(); + viewer.viewport.goHome(); + + return false; + } + + function update() { + var viewport = viewer.viewport; + var bounds = viewport.getBoundsNoRotate(true); + + // TODO: This is not entirely correct. Not sure why. Like I'm missing some + // passing or ratio... This can be seen if you zoom to the right side. + // Rectangle shows blank, while pixels are still visible + var MAX_WIDTH = 75; + var MAX_HEIGHT = MAX_WIDTH; + + var x = MAX_WIDTH * bounds.x; + var y = MAX_HEIGHT * bounds.y; + var width = MAX_WIDTH * bounds.width; + var height = MAX_HEIGHT * bounds.height; + + //update style for navigator-box + var style = displayRegion.style; + + + style.top = px(y); + style.left = px(x); + style.width = px(Math.max(width, 0)); + style.height = px(Math.max(height, 0)); + } +} + +function px(x) { + return Math.round(x) + 'px' +} diff --git a/app/dataviz/mark-twain-portrait/lib/panzoom.min.js b/app/dataviz/mark-twain-portrait/lib/panzoom.min.js new file mode 100644 index 00000000..356937d0 --- /dev/null +++ b/app/dataviz/mark-twain-portrait/lib/panzoom.min.js @@ -0,0 +1 @@ +(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.panzoom=f()}})(function(){var define,module,exports;return function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o element. "+"Use its child instead (e.g. ). "+"As of March 2016 only FireFox supported transform on the root element")}owner.setAttribute("tabindex",1);options=options||{};var beforeWheel=options.beforeWheel||noop;var speed=typeof options.zoomSpeed==="number"?options.zoomSpeed:defaultZoomSpeed;var bounds=options.bounds;validateBounds(bounds);var maxZoom=typeof options.maxZoom==="number"?options.maxZoom:Number.POSITIVE_INFINITY;var minZoom=typeof options.minZoom==="number"?options.minZoom:0;var boundsPadding=typeof options.boundsPaddding==="number"?options.boundsPaddding:.05;var zoomDoubleClickSpeed=typeof options.zoomDoubleClickSpeed==="number"?options.zoomDoubleClickSpeed:defaultDoubleTapZoomSpeed;var lastTouchEndTime=0;var touchInProgress=false;var panstartFired=false;var mouseX;var mouseY;var pinchZoomLength;var smoothScroll=kinetic(getRect,scroll);var moveByAnimation;var zoomToAnimation;var multitouch;listenForEvents();return{dispose:dispose,moveBy:internalMoveBy,moveTo:moveTo,centerOn:centerOn,zoomTo:publicZoomTo,zoomAbs:zoomToAbsoluteValue,getTransform:getTransformModel};function getTransformModel(){return transform}function getRect(){return{x:transform.x,y:transform.y}}function moveTo(x,y){transform.x=x;transform.y=y;keepTransformInsideBounds();triggerEvent("pan");makeDirty()}function moveBy(dx,dy){moveTo(transform.x+dx,transform.y+dy)}function keepTransformInsideBounds(){var boundingBox=getBoundingBox();if(!boundingBox)return;var adjusted=false;var clientRect=getClientRect();var diff=boundingBox.left-clientRect.right;if(diff>0){transform.x+=diff;adjusted=true}diff=boundingBox.right-clientRect.left;if(diff<0){transform.x+=diff;adjusted=true}diff=boundingBox.top-clientRect.bottom;if(diff>0){transform.y+=diff;adjusted=true}diff=boundingBox.bottom-clientRect.top;if(diff<0){transform.y+=diff;adjusted=true}return adjusted}function getBoundingBox(){if(!bounds)return;if(typeof bounds==="boolean"){var sceneWidth=owner.clientWidth;var sceneHeight=owner.clientHeight;return{left:sceneWidth*boundsPadding,top:sceneHeight*boundsPadding,right:sceneWidth*(1-boundsPadding),bottom:sceneHeight*(1-boundsPadding)}}return bounds}function getClientRect(){var bbox=svgElement.getBBox();var leftTop=client(bbox.x,bbox.y);return{left:leftTop.x,top:leftTop.y,right:bbox.width*transform.scale+leftTop.x,bottom:bbox.height*transform.scale+leftTop.y}}function client(x,y){return{x:x*transform.scale+transform.x,y:y*transform.scale+transform.y}}function moveTo(x,y){transform.x=x;transform.y=y;keepTransformInsideBounds();makeDirty()}function makeDirty(){isDirty=true;frameAnimation=window.requestAnimationFrame(frame)}function zoomByRatio(clientX,clientY,ratio){var newScale=transform.scale*ratio;if(newScale>maxZoom||newScalepinchZoomLength){delta=-1}var scaleMultiplier=getScaleMultiplier(delta);mouseX=(t1.clientX+t2.clientX)/2;mouseY=(t1.clientY+t2.clientY)/2;publicZoomTo(mouseX,mouseY,scaleMultiplier);pinchZoomLength=currentPinchLength;e.stopPropagation();e.preventDefault()}}function handleTouchEnd(e){if(e.touches.length>0){mouseX=e.touches[0].clientX;mouseY=e.touches[0].clientY}else{var now=new Date;if(now-lastTouchEndTime0){scaleMultiplier=1-speed}else if(delta<0){scaleMultiplier=1+speed}return scaleMultiplier}function triggerPanStart(){if(!panstartFired){triggerEvent("panstart");panstartFired=true;smoothScroll.start()}}function triggerPanEnd(){if(panstartFired){if(!multitouch)smoothScroll.stop();triggerEvent("panend")}}function triggerEvent(name){var event=createEvent(name);svgElement.dispatchEvent(event)}}function noop(){}function validateBounds(bounds){var boundsType=typeof bounds;if(boundsType==="undefined"||boundsType==="boolean")return;var validBounds=isNumber(bounds.left)&&isNumber(bounds.top)&&isNumber(bounds.bottom)&&isNumber(bounds.right);if(!validBounds)throw new Error("Bounds object is not valid. It can be: "+"undefined, boolean (true|false) or an object {left, top, right, bottom}")}function isNumber(x){return Number.isFinite(x)}},{"./lib/createEvent.js":2,"./lib/getSvgTransformMatrix.js":3,"./lib/kinetic.js":4,"./lib/textSlectionInterceptor.js":5,"./lib/transform.js":6,amator:7,wheel:9}],2:[function(require,module,exports){module.exports=createEvent;var isIE=typeof Event!=="function";function createEvent(name){if(isIE){var evt=document.createEvent("CustomEvent");evt.initCustomEvent(name,true,true,undefined);return evt}else{return new Event(name,{bubbles:true})}}},{}],3:[function(require,module,exports){module.exports=getSvgTransformMatrix;function getSvgTransformMatrix(svgElement){var baseVal=svgElement.transform.baseVal;if(baseVal.numberOfItems)return baseVal.getItem(0);var owner=svgElement.ownerSVGElement||svgElement;var transform=owner.createSVGTransform();svgElement.transform.baseVal.appendItem(transform);return transform}},{}],4:[function(require,module,exports){module.exports=kinetic;var minVelocity=10;var amplitude=.42;function kinetic(getRect,scroll){var lastRect;var timestamp;var timeConstant=342;var ticker;var vx,targetX,ax;var vy,targetY,ay;var raf;return{start:start,stop:stop,cancel:dispose};function dispose(){window.clearInterval(ticker);window.cancelAnimationFrame(raf)}function start(){lastRect=getRect();ax=ay=vx=vy=0;timestamp=new Date;window.clearInterval(ticker);window.cancelAnimationFrame(raf);ticker=window.setInterval(track,100)}function track(){var now=Date.now();var elapsed=now-timestamp;timestamp=now;var rect=getRect();var dx=rect.x-lastRect.x;var dy=rect.y-lastRect.y;lastRect=rect;var dt=1e3/(1+elapsed);vx=.8*dx*dt+.2*vx;vy=.8*dy*dt+.2*vy}function stop(){window.clearInterval(ticker);window.cancelAnimationFrame(raf);var rect=getRect();targetX=rect.x;targetY=rect.y;timestamp=Date.now();if(vx<-minVelocity||vx>minVelocity){ax=amplitude*vx;targetX+=ax}if(vy<-minVelocity||vy>minVelocity){ay=amplitude*vy;targetY+=ay}raf=window.requestAnimationFrame(autoScroll)}function autoScroll(){var elapsed=Date.now()-timestamp;var moving=false;var dx=0;var dy=0;if(ax){dx=-ax*Math.exp(-elapsed/timeConstant);if(dx>.5||dx<-.5)moving=true;else dx=ax=0}if(ay){dy=-ay*Math.exp(-elapsed/timeConstant);if(dy>.5||dy<-.5)moving=true;else dy=ay=0}if(moving){scroll(targetX+dx,targetY+dy);raf=window.requestAnimationFrame(autoScroll)}}}},{}],5:[function(require,module,exports){module.exports=createTextSelectionInterceptor;function createTextSelectionInterceptor(){var dragObject;var prevSelectStart;var prevDragStart;return{capture:capture,release:release};function capture(domObject){prevSelectStart=window.document.onselectstart;prevDragStart=window.document.ondragstart;window.document.onselectstart=disabled;dragObject=domObject;dragObject.ondragstart=disabled}function release(){window.document.onselectstart=prevSelectStart;if(dragObject)dragObject.ondragstart=prevDragStart}}function disabled(e){e.stopPropagation();return false}},{}],6:[function(require,module,exports){module.exports=Transform;function Transform(){this.x=0;this.y=0;this.scale=1}},{}],7:[function(require,module,exports){var BezierEasing=require("bezier-easing");var animations={ease:BezierEasing(.25,.1,.25,1),easeIn:BezierEasing(.42,0,1,1),easeOut:BezierEasing(0,0,.58,1),easeInOut:BezierEasing(.42,0,.58,1),linear:BezierEasing(0,0,1,1)};module.exports=animate;function animate(source,target,options){var start=Object.create(null);var diff=Object.create(null);options=options||{};var easing=typeof options.easing==="function"?options.easing:animations[options.easing];if(!easing){if(options.easing){console.warn("Unknown easing function in amator: "+options.easing)}easing=animations.ease}var step=typeof options.step==="function"?options.step:noop;var done=typeof options.done==="function"?options.done:noop;var scheduler=getScheduler(options.scheduler);var keys=Object.keys(target);keys.forEach(function(key){start[key]=source[key];diff[key]=target[key]-source[key]});var durationInMs=options.duration||400;var durationInFrames=Math.max(1,durationInMs*.06);var previousAnimationId;var frame=0;previousAnimationId=scheduler.next(loop);return{cancel:cancel};function cancel(){scheduler.cancel(previousAnimationId);previousAnimationId=0}function loop(){var t=easing(frame/durationInFrames);frame+=1;setValues(t);if(frame<=durationInFrames){previousAnimationId=scheduler.next(loop);step(source)}else{previousAnimationId=0;setTimeout(function(){done(source)},0)}}function setValues(t){keys.forEach(function(key){source[key]=diff[key]*t+start[key]})}}function noop(){}function getScheduler(scheduler){if(!scheduler){var canRaf=typeof window!=="undefined"&&window.requestAnimationFrame;return canRaf?rafScheduler():timeoutScheduler()}if(typeof scheduler.next!=="function")throw new Error("Scheduler is supposed to have next(cb) function");if(typeof scheduler.cancel!=="function")throw new Error("Scheduler is supposed to have cancel(handle) function");return scheduler}function rafScheduler(){return{next:window.requestAnimationFrame.bind(window),cancel:window.cancelAnimationFrame.bind(window)}}function timeoutScheduler(){return{next:function(cb){return setTimeout(cb,1e3/60)},cancel:function(id){return clearTimeout(id)}}}},{"bezier-easing":8}],8:[function(require,module,exports){var NEWTON_ITERATIONS=4;var NEWTON_MIN_SLOPE=.001;var SUBDIVISION_PRECISION=1e-7;var SUBDIVISION_MAX_ITERATIONS=10;var kSplineTableSize=11;var kSampleStepSize=1/(kSplineTableSize-1);var float32ArraySupported=typeof Float32Array==="function";function A(aA1,aA2){return 1-3*aA2+3*aA1}function B(aA1,aA2){return 3*aA2-6*aA1}function C(aA1){return 3*aA1}function calcBezier(aT,aA1,aA2){return((A(aA1,aA2)*aT+B(aA1,aA2))*aT+C(aA1))*aT}function getSlope(aT,aA1,aA2){return 3*A(aA1,aA2)*aT*aT+2*B(aA1,aA2)*aT+C(aA1)}function binarySubdivide(aX,aA,aB,mX1,mX2){var currentX,currentT,i=0;do{currentT=aA+(aB-aA)/2;currentX=calcBezier(currentT,mX1,mX2)-aX;if(currentX>0){aB=currentT}else{aA=currentT}}while(Math.abs(currentX)>SUBDIVISION_PRECISION&&++i=NEWTON_MIN_SLOPE){return newtonRaphsonIterate(aX,guessForT,mX1,mX2)}else if(initialSlope===0){return guessForT}else{return binarySubdivide(aX,intervalStart,intervalStart+kSampleStepSize,mX1,mX2)}}return function BezierEasing(x){if(mX1===mY1&&mX2===mY2){return x}if(x===0){return 0}if(x===1){return 1}return calcBezier(getTForX(x),mY1,mY2)}}},{}],9:[function(require,module,exports){module.exports=addWheelListener;module.exports.addWheelListener=addWheelListener;module.exports.removeWheelListener=removeWheelListener;var prefix="",_addEventListener,_removeEventListener,onwheel,support;detectEventModel(typeof window!=="undefined"&&window,typeof document!=="undefined"&&document);function addWheelListener(elem,callback,useCapture){_addWheelListener(elem,support,callback,useCapture);if(support=="DOMMouseScroll"){_addWheelListener(elem,"MozMousePixelScroll",callback,useCapture)}}function removeWheelListener(elem,callback,useCapture){_removeWheelListener(elem,support,callback,useCapture);if(support=="DOMMouseScroll"){_removeWheelListener(elem,"MozMousePixelScroll",callback,useCapture)}}function _addWheelListener(elem,eventName,callback,useCapture){elem[_addEventListener](prefix+eventName,support=="wheel"?callback:function(originalEvent){!originalEvent&&(originalEvent=window.event);var event={originalEvent:originalEvent,target:originalEvent.target||originalEvent.srcElement,type:"wheel",deltaMode:originalEvent.type=="MozMousePixelScroll"?0:1,deltaX:0,delatZ:0,clientX:originalEvent.clientX,clientY:originalEvent.clientY,preventDefault:function(){originalEvent.preventDefault?originalEvent.preventDefault():originalEvent.returnValue=false},stopPropagation:function(){if(originalEvent.stopPropagation)originalEvent.stopPropagation()},stopImmediatePropagation:function(){if(originalEvent.stopImmediatePropagation)originalEvent.stopImmediatePropagation()}};if(support=="mousewheel"){event.deltaY=-1/40*originalEvent.wheelDelta;originalEvent.wheelDeltaX&&(event.deltaX=-1/40*originalEvent.wheelDeltaX)}else{event.deltaY=originalEvent.detail}return callback(event)},useCapture||false)}function _removeWheelListener(elem,eventName,callback,useCapture){elem[_removeEventListener](prefix+eventName,callback,useCapture||false)}function detectEventModel(window,document){if(window&&window.addEventListener){_addEventListener="addEventListener";_removeEventListener="removeEventListener"}else{_addEventListener="attachEvent";_removeEventListener="detachEvent";prefix="on"}if(document){support="onwheel"in document.createElement("div")?"wheel":document.onmousewheel!==undefined?"mousewheel":"DOMMouseScroll"}else{support="wheel"}}},{}]},{},[1])(1)}); \ No newline at end of file diff --git a/app/dataviz/mark-twain-portrait/lib/query-state.min.js b/app/dataviz/mark-twain-portrait/lib/query-state.min.js new file mode 100644 index 00000000..2032fd48 --- /dev/null +++ b/app/dataviz/mark-twain-portrait/lib/query-state.min.js @@ -0,0 +1 @@ +(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.queryState=f()}})(function(){var define,module,exports;return function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o1){fireArguments=Array.prototype.splice.call(arguments,1)}for(var i=0;i bundle.js", + "watch": "watchify --debug index.js -o bundle.js -v", + "server": "http-server -c-1 -p 8082", + "dev": "concurrently --kill-others \"npm run watch\" \"npm run server\"" + } +} diff --git a/app/dataviz/package-manager/app.js b/app/dataviz/package-manager/app.js new file mode 100644 index 00000000..a3f10821 --- /dev/null +++ b/app/dataviz/package-manager/app.js @@ -0,0 +1,64 @@ +!function(e){function t(r){if(n[r])return n[r].exports;var o=n[r]={exports:{},id:r,loaded:!1};return e[r].call(o.exports,o,o.exports,t),o.loaded=!0,o.exports}var n={};return t.m=e,t.c=n,t.p="",t(0)}([function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}n(181);var o=n(2),i=r(o),a=n(52),s=n(177),u=r(s),l=n(125),c=r(l),h=n(221);(0,a.render)(i.default.createElement(h.Router,{history:h.browserHistory},i.default.createElement(h.Route,{path:"/",component:u.default}),i.default.createElement(h.Route,{path:"/galaxy/:name",component:c.default})),document.getElementById("app"))},function(e,t){function n(){throw new Error("setTimeout has not been defined")}function r(){throw new Error("clearTimeout has not been defined")}function o(e){if(c===setTimeout)return setTimeout(e,0);if((c===n||!c)&&setTimeout)return c=setTimeout,setTimeout(e,0);try{return c(e,0)}catch(t){try{return c.call(null,e,0)}catch(t){return c.call(this,e,0)}}}function i(e){if(h===clearTimeout)return clearTimeout(e);if((h===r||!h)&&clearTimeout)return h=clearTimeout,clearTimeout(e);try{return h(e)}catch(t){try{return h.call(null,e)}catch(t){return h.call(this,e)}}}function a(){m&&d&&(m=!1,d.length?f=d.concat(f):v=-1,f.length&&s())}function s(){if(!m){var e=o(a);m=!0;for(var t=f.length;t;){for(d=f,f=[];++v1)for(var n=1;n2?n-2:0),o=2;o when using tables, nesting tags like
,

, or , or using non-SVG elements in an parent. Try inspecting the child nodes of the element with React ID `%s`.",n,ee.getID(e)):V(!1)},_mountImageIntoNode:function(e,n,i,a){if(!n||n.nodeType!==W&&n.nodeType!==G&&n.nodeType!==q?"production"!==t.env.NODE_ENV?V(!1,"mountComponentIntoNode(...): Target container is not valid."):V(!1):void 0,i){var s=o(n);if(A.canReuseMarkup(e,s))return;var u=s.getAttribute(A.CHECKSUM_ATTR_NAME);s.removeAttribute(A.CHECKSUM_ATTR_NAME);var l=s.outerHTML;s.setAttribute(A.CHECKSUM_ATTR_NAME,u);var c=e;if("production"!==t.env.NODE_ENV){var h;n.nodeType===W?(h=document.createElement("div"),h.innerHTML=e,c=h.innerHTML):(h=document.createElement("iframe"),document.body.appendChild(h),h.contentDocument.write(e),c=h.contentDocument.documentElement.outerHTML,document.body.removeChild(h))}var p=r(c,l),d=" (client) "+c.substring(p-20,p+20)+"\n (server) "+l.substring(p-20,p+20);n.nodeType===G?"production"!==t.env.NODE_ENV?V(!1,"You're trying to render a component to the document using server rendering but the checksum was invalid. This usually means you rendered a different component type or props on the client from the one on the server, or your render() methods are impure. React cannot handle this case due to cross-browser quirks by rendering at the document root. You should look for environment dependent code in your components and ensure the props are the same client and server side:\n%s",d):V(!1):void 0,"production"!==t.env.NODE_ENV&&("production"!==t.env.NODE_ENV?j(!1,"React attempted to reuse markup in a container but the checksum was invalid. This generally means that you are using server rendering and the markup generated on the server was not what the client was expecting. React injected new markup to compensate which works but you have lost many of the benefits of server rendering. Instead, figure out why the markup being generated is different on the client or server:\n%s",d):void 0)}if(n.nodeType===G?"production"!==t.env.NODE_ENV?V(!1,"You're trying to render a component to the document but you didn't use server rendering. We can't do this without using server rendering due to cross-browser quirks. See ReactDOMServer.renderToString() for server rendering."):V(!1):void 0,a.useCreateElement){for(;n.lastChild;)n.removeChild(n.lastChild);n.appendChild(e)}else I(n,e)},ownerDocumentContextKey:X,getReactRootID:i,getID:a,setID:u,getNode:l,getNodeFromInstance:c,isValid:h,purgeID:p};N.measureMethods(ee,"ReactMount",{_renderNewRootComponent:"_renderNewRootComponent",_mountImageIntoNode:"_mountImageIntoNode"}),e.exports=ee}).call(t,n(1))},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t,n){return a.default.createElement("div",{className:"container-fluid row"},a.default.createElement("div",{className:"hidden-xs"},a.default.createElement("div",{className:"col-xs-6"},a.default.createElement("a",{href:t,target:"_blank"},a.default.createElement("h4",{title:n},n))),a.default.createElement("div",{className:"col-xs-3"},a.default.createElement("div",{className:"row"},a.default.createElement("h2",{id:e.id,className:"in-degree"},e.inDegree)),a.default.createElement("div",{className:"row small"},e.inDegreeLabel)),a.default.createElement("div",{className:"col-xs-3"},a.default.createElement("div",{className:"row"},a.default.createElement("h2",{id:e.id,className:"out-degree"},e.outDegree)),a.default.createElement("div",{className:"row small"},e.outDegreeLabel))),a.default.createElement("div",{className:"visible-xs-block"},a.default.createElement("div",{className:"row info-block"},a.default.createElement("div",{className:"col-xs-6 no-overflow"},a.default.createElement("a",{href:t,target:"_blank"},n)),a.default.createElement("div",{id:e.id,className:"in-degree col-xs-3"},e.inDegree),a.default.createElement("div",{id:e.id,className:"out-degree col-xs-3"},e.outDegree))))}Object.defineProperty(t,"__esModule",{value:!0});var i=n(2),a=r(i);t.default=o,e.exports=t.default},function(e,t,n){(function(t){"use strict";var r=n(20),o=n(5),i=n(45),a="function"==typeof Symbol&&Symbol.for&&Symbol.for("react.element")||60103,s={key:!0,ref:!0,__self:!0,__source:!0},u=function(e,n,r,o,s,u,l){var c={$$typeof:a,type:e,key:n,ref:r,props:l,_owner:u};return"production"!==t.env.NODE_ENV&&(c._store={},i?(Object.defineProperty(c._store,"validated",{configurable:!1,enumerable:!1,writable:!0,value:!1}),Object.defineProperty(c,"_self",{configurable:!1,enumerable:!1,writable:!1,value:o}),Object.defineProperty(c,"_source",{configurable:!1,enumerable:!1,writable:!1,value:s})):(c._store.validated=!1,c._self=o,c._source=s),Object.freeze(c.props),Object.freeze(c)),c};u.createElement=function(e,t,n){var o,i={},a=null,l=null,c=null,h=null;if(null!=t){l=void 0===t.ref?null:t.ref,a=void 0===t.key?null:""+t.key,c=void 0===t.__self?null:t.__self,h=void 0===t.__source?null:t.__source;for(o in t)t.hasOwnProperty(o)&&!s.hasOwnProperty(o)&&(i[o]=t[o])}var p=arguments.length-2;if(1===p)i.children=n;else if(p>1){for(var d=Array(p),f=0;f1){for(var m=Array(f),v=0;v2?r-2:0);for(var o=2;o1&&(o=Array.prototype.splice.call(arguments,1));for(var i=0;i should not have a "'+t+'" prop')}t.__esModule=!0,t.falsy=r;var o=n(2),i=o.PropTypes.func,a=o.PropTypes.object,s=o.PropTypes.arrayOf,u=o.PropTypes.oneOfType,l=o.PropTypes.element,c=o.PropTypes.shape,h=o.PropTypes.string,p=c({listen:i.isRequired,pushState:i.isRequired,replaceState:i.isRequired,go:i.isRequired});t.history=p;var d=c({pathname:h.isRequired,search:h.isRequired,state:a,action:h.isRequired,key:h});t.location=d;var f=u([i,h]);t.component=f;var m=u([f,a]);t.components=m;var v=u([a,l]);t.route=v;var g=u([v,s(v)]);t.routes=g,t.default={falsy:r,history:p,location:d,component:f,components:m,route:v}},function(e,t,n){(function(t){"use strict";function r(e,t){return(e&t)===t}var o=n(3),i={MUST_USE_ATTRIBUTE:1,MUST_USE_PROPERTY:2,HAS_SIDE_EFFECTS:4,HAS_BOOLEAN_VALUE:8,HAS_NUMERIC_VALUE:16,HAS_POSITIVE_NUMERIC_VALUE:48,HAS_OVERLOADED_BOOLEAN_VALUE:64,injectDOMPropertyConfig:function(e){var n=i,a=e.Properties||{},u=e.DOMAttributeNamespaces||{},l=e.DOMAttributeNames||{},c=e.DOMPropertyNames||{},h=e.DOMMutationMethods||{}; +e.isCustomAttribute&&s._isCustomAttributeFunctions.push(e.isCustomAttribute);for(var p in a){s.properties.hasOwnProperty(p)?"production"!==t.env.NODE_ENV?o(!1,"injectDOMPropertyConfig(...): You're trying to inject DOM property '%s' which has already been injected. You may be accidentally injecting the same DOM property config twice, or you may be injecting two configs that have conflicting property names.",p):o(!1):void 0;var d=p.toLowerCase(),f=a[p],m={attributeName:d,attributeNamespace:null,propertyName:p,mutationMethod:null,mustUseAttribute:r(f,n.MUST_USE_ATTRIBUTE),mustUseProperty:r(f,n.MUST_USE_PROPERTY),hasSideEffects:r(f,n.HAS_SIDE_EFFECTS),hasBooleanValue:r(f,n.HAS_BOOLEAN_VALUE),hasNumericValue:r(f,n.HAS_NUMERIC_VALUE),hasPositiveNumericValue:r(f,n.HAS_POSITIVE_NUMERIC_VALUE),hasOverloadedBooleanValue:r(f,n.HAS_OVERLOADED_BOOLEAN_VALUE)};if(m.mustUseAttribute&&m.mustUseProperty?"production"!==t.env.NODE_ENV?o(!1,"DOMProperty: Cannot require using both attribute and property: %s",p):o(!1):void 0,!m.mustUseProperty&&m.hasSideEffects?"production"!==t.env.NODE_ENV?o(!1,"DOMProperty: Properties that have side effects must use property: %s",p):o(!1):void 0,m.hasBooleanValue+m.hasNumericValue+m.hasOverloadedBooleanValue<=1?void 0:"production"!==t.env.NODE_ENV?o(!1,"DOMProperty: Value can be one of boolean, overloaded boolean, or numeric value, but not a combination: %s",p):o(!1),"production"!==t.env.NODE_ENV&&(s.getPossibleStandardName[d]=p),l.hasOwnProperty(p)){var v=l[p];m.attributeName=v,"production"!==t.env.NODE_ENV&&(s.getPossibleStandardName[v]=p)}u.hasOwnProperty(p)&&(m.attributeNamespace=u[p]),c.hasOwnProperty(p)&&(m.propertyName=c[p]),h.hasOwnProperty(p)&&(m.mutationMethod=h[p]),s.properties[p]=m}}},a={},s={ID_ATTRIBUTE_NAME:"data-reactid",properties:{},getPossibleStandardName:"production"!==t.env.NODE_ENV?{}:null,_isCustomAttributeFunctions:[],isCustomAttribute:function(e){for(var t=0;t1){var t=e.indexOf(d,1);return t>-1?e.substr(0,t):e}return null},traverseEnterLeave:function(e,t,n,r,o){var i=l(e,t);i!==e&&c(e,i,n,r,!1,!0),i!==t&&c(i,t,n,o,!0,!1)},traverseTwoPhase:function(e,t,n){e&&(c("",e,t,n,!0,!1),c(e,"",t,n,!1,!0))},traverseTwoPhaseSkipTarget:function(e,t,n){e&&(c("",e,t,n,!0,!0),c(e,"",t,n,!0,!0))},traverseAncestors:function(e,t,n){c("",e,t,n,!0,!1)},getFirstCommonAncestorID:l,_getNextDescendantID:u,isAncestorIDOf:a,SEPARATOR:d};e.exports=v}).call(t,n(1))},function(e,t,n){var r=r||{},o={REVISION:"71"};e.exports=o,void 0===Math.sign&&(Math.sign=function(e){return e<0?-1:e>0?1:+e}),o.log=function(){console.log.apply(console,arguments)},o.warn=function(){console.warn.apply(console,arguments)},o.error=function(){console.error.apply(console,arguments)},o.MOUSE={LEFT:0,MIDDLE:1,RIGHT:2},o.CullFaceNone=0,o.CullFaceBack=1,o.CullFaceFront=2,o.CullFaceFrontBack=3,o.FrontFaceDirectionCW=0,o.FrontFaceDirectionCCW=1,o.BasicShadowMap=0,o.PCFShadowMap=1,o.PCFSoftShadowMap=2,o.FrontSide=0,o.BackSide=1,o.DoubleSide=2,o.NoShading=0,o.FlatShading=1,o.SmoothShading=2,o.NoColors=0,o.FaceColors=1,o.VertexColors=2,o.NoBlending=0,o.NormalBlending=1,o.AdditiveBlending=2,o.SubtractiveBlending=3,o.MultiplyBlending=4,o.CustomBlending=5,o.AddEquation=100,o.SubtractEquation=101,o.ReverseSubtractEquation=102,o.MinEquation=103,o.MaxEquation=104,o.ZeroFactor=200,o.OneFactor=201,o.SrcColorFactor=202,o.OneMinusSrcColorFactor=203,o.SrcAlphaFactor=204,o.OneMinusSrcAlphaFactor=205,o.DstAlphaFactor=206,o.OneMinusDstAlphaFactor=207,o.DstColorFactor=208,o.OneMinusDstColorFactor=209,o.SrcAlphaSaturateFactor=210,o.MultiplyOperation=0,o.MixOperation=1,o.AddOperation=2,o.UVMapping=300,o.CubeReflectionMapping=301,o.CubeRefractionMapping=302,o.EquirectangularReflectionMapping=303,o.EquirectangularRefractionMapping=304,o.SphericalReflectionMapping=305,o.RepeatWrapping=1e3,o.ClampToEdgeWrapping=1001,o.MirroredRepeatWrapping=1002,o.NearestFilter=1003,o.NearestMipMapNearestFilter=1004,o.NearestMipMapLinearFilter=1005,o.LinearFilter=1006,o.LinearMipMapNearestFilter=1007,o.LinearMipMapLinearFilter=1008,o.UnsignedByteType=1009,o.ByteType=1010,o.ShortType=1011,o.UnsignedShortType=1012,o.IntType=1013,o.UnsignedIntType=1014,o.FloatType=1015,o.HalfFloatType=1025,o.UnsignedShort4444Type=1016,o.UnsignedShort5551Type=1017,o.UnsignedShort565Type=1018,o.AlphaFormat=1019,o.RGBFormat=1020,o.RGBAFormat=1021,o.LuminanceFormat=1022,o.LuminanceAlphaFormat=1023,o.RGBEFormat=o.RGBAFormat,o.RGB_S3TC_DXT1_Format=2001,o.RGBA_S3TC_DXT1_Format=2002,o.RGBA_S3TC_DXT3_Format=2003,o.RGBA_S3TC_DXT5_Format=2004,o.RGB_PVRTC_4BPPV1_Format=2100,o.RGB_PVRTC_2BPPV1_Format=2101,o.RGBA_PVRTC_4BPPV1_Format=2102,o.RGBA_PVRTC_2BPPV1_Format=2103,o.Projector=function(){o.error("THREE.Projector has been moved to /examples/js/renderers/Projector.js."),this.projectVector=function(e,t){o.warn("THREE.Projector: .projectVector() is now vector.project()."),e.project(t)},this.unprojectVector=function(e,t){o.warn("THREE.Projector: .unprojectVector() is now vector.unproject()."),e.unproject(t)},this.pickingRay=function(e,t){o.error("THREE.Projector: .pickingRay() is now raycaster.setFromCamera().")}},o.CanvasRenderer=function(){o.error("THREE.CanvasRenderer has been moved to /examples/js/renderers/CanvasRenderer.js"),this.domElement=document.createElement("canvas"),this.clear=function(){},this.render=function(){},this.setClearColor=function(){},this.setSize=function(){}},o.Color=function(e){return 3===arguments.length?this.setRGB(arguments[0],arguments[1],arguments[2]):this.set(e)},o.Color.prototype={constructor:o.Color,r:1,g:1,b:1,set:function(e){return e instanceof o.Color?this.copy(e):"number"==typeof e?this.setHex(e):"string"==typeof e&&this.setStyle(e),this},setHex:function(e){return e=Math.floor(e),this.r=(e>>16&255)/255,this.g=(e>>8&255)/255,this.b=(255&e)/255,this},setRGB:function(e,t,n){return this.r=e,this.g=t,this.b=n,this},setHSL:function(e,t,n){if(0===t)this.r=this.g=this.b=n;else{var r=function(e,t,n){return n<0&&(n+=1),n>1&&(n-=1),n<1/6?e+6*(t-e)*n:n<.5?t:n<2/3?e+6*(t-e)*(2/3-n):e},o=n<=.5?n*(1+t):n+t-n*t,i=2*n-o;this.r=r(i,o,e+1/3),this.g=r(i,o,e),this.b=r(i,o,e-1/3)}return this},setStyle:function(e){if(/^rgb\((\d+), ?(\d+), ?(\d+)\)$/i.test(e)){var t=/^rgb\((\d+), ?(\d+), ?(\d+)\)$/i.exec(e);return this.r=Math.min(255,parseInt(t[1],10))/255,this.g=Math.min(255,parseInt(t[2],10))/255,this.b=Math.min(255,parseInt(t[3],10))/255,this}if(/^rgb\((\d+)\%, ?(\d+)\%, ?(\d+)\%\)$/i.test(e)){var t=/^rgb\((\d+)\%, ?(\d+)\%, ?(\d+)\%\)$/i.exec(e);return this.r=Math.min(100,parseInt(t[1],10))/100,this.g=Math.min(100,parseInt(t[2],10))/100,this.b=Math.min(100,parseInt(t[3],10))/100,this}if(/^\#([0-9a-f]{6})$/i.test(e)){var t=/^\#([0-9a-f]{6})$/i.exec(e);return this.setHex(parseInt(t[1],16)),this}if(/^\#([0-9a-f])([0-9a-f])([0-9a-f])$/i.test(e)){var t=/^\#([0-9a-f])([0-9a-f])([0-9a-f])$/i.exec(e);return this.setHex(parseInt(t[1]+t[1]+t[2]+t[2]+t[3]+t[3],16)),this}if(/^(\w+)$/i.test(e))return this.setHex(o.ColorKeywords[e]),this},copy:function(e){return this.r=e.r,this.g=e.g,this.b=e.b,this},copyGammaToLinear:function(e,t){return void 0===t&&(t=2),this.r=Math.pow(e.r,t),this.g=Math.pow(e.g,t),this.b=Math.pow(e.b,t),this},copyLinearToGamma:function(e,t){void 0===t&&(t=2);var n=t>0?1/t:1;return this.r=Math.pow(e.r,n),this.g=Math.pow(e.g,n),this.b=Math.pow(e.b,n),this},convertGammaToLinear:function(){var e=this.r,t=this.g,n=this.b;return this.r=e*e,this.g=t*t,this.b=n*n,this},convertLinearToGamma:function(){return this.r=Math.sqrt(this.r),this.g=Math.sqrt(this.g),this.b=Math.sqrt(this.b),this},getHex:function(){return 255*this.r<<16^255*this.g<<8^255*this.b<<0},getHexString:function(){return("000000"+this.getHex().toString(16)).slice(-6)},getHSL:function(e){var t,n,r=e||{h:0,s:0,l:0},o=this.r,i=this.g,a=this.b,s=Math.max(o,i,a),u=Math.min(o,i,a),l=(u+s)/2;if(u===s)t=0,n=0;else{var c=s-u;switch(n=l<=.5?c/(s+u):c/(2-s-u),s){case o:t=(i-a)/c+(i0?(t=.5/Math.sqrt(p+1),this._w=.25/t,this._x=(c-u)*t,this._y=(i-l)*t,this._z=(a-o)*t):r>s&&r>h?(t=2*Math.sqrt(1+r-s-h),this._w=(c-u)/t,this._x=.25*t,this._y=(o+a)/t,this._z=(i+l)/t):s>h?(t=2*Math.sqrt(1+s-r-h),this._w=(i-l)/t,this._x=(o+a)/t,this._y=.25*t,this._z=(u+c)/t):(t=2*Math.sqrt(1+h-r-s),this._w=(a-o)/t,this._x=(i+l)/t,this._y=(u+c)/t,this._z=.25*t),this.onChangeCallback(),this},setFromUnitVectors:function(){var e,t,n=1e-6;return function(r,i){return void 0===e&&(e=new o.Vector3),t=r.dot(i)+1,tMath.abs(r.z)?e.set(-r.y,r.x,0):e.set(0,-r.z,r.y)):e.crossVectors(r,i),this._x=e.x,this._y=e.y,this._z=e.z,this._w=t,this.normalize(),this}}(),inverse:function(){return this.conjugate().normalize(),this},conjugate:function(){return this._x*=-1,this._y*=-1,this._z*=-1,this.onChangeCallback(),this},dot:function(e){return this._x*e._x+this._y*e._y+this._z*e._z+this._w*e._w},lengthSq:function(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w},length:function(){return Math.sqrt(this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w)},normalize:function(){var e=this.length();return 0===e?(this._x=0,this._y=0,this._z=0,this._w=1):(e=1/e,this._x=this._x*e,this._y=this._y*e,this._z=this._z*e,this._w=this._w*e),this.onChangeCallback(),this},multiply:function(e,t){return void 0!==t?(o.warn("THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead."),this.multiplyQuaternions(e,t)):this.multiplyQuaternions(this,e)},multiplyQuaternions:function(e,t){var n=e._x,r=e._y,o=e._z,i=e._w,a=t._x,s=t._y,u=t._z,l=t._w;return this._x=n*l+i*a+r*u-o*s,this._y=r*l+i*s+o*a-n*u,this._z=o*l+i*u+n*s-r*a,this._w=i*l-n*a-r*s-o*u,this.onChangeCallback(),this},multiplyVector3:function(e){return o.warn("THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead."),e.applyQuaternion(this)},slerp:function(e,t){if(0===t)return this;if(1===t)return this.copy(e);var n=this._x,r=this._y,o=this._z,i=this._w,a=i*e._w+n*e._x+r*e._y+o*e._z;if(a<0?(this._w=-e._w,this._x=-e._x,this._y=-e._y,this._z=-e._z,a=-a):this.copy(e),a>=1)return this._w=i,this._x=n,this._y=r,this._z=o,this;var s=Math.acos(a),u=Math.sqrt(1-a*a);if(Math.abs(u)<.001)return this._w=.5*(i+this._w),this._x=.5*(n+this._x),this._y=.5*(r+this._y),this._z=.5*(o+this._z),this;var l=Math.sin((1-t)*s)/u,c=Math.sin(t*s)/u;return this._w=i*l+this._w*c,this._x=n*l+this._x*c,this._y=r*l+this._y*c,this._z=o*l+this._z*c,this.onChangeCallback(),this},equals:function(e){return e._x===this._x&&e._y===this._y&&e._z===this._z&&e._w===this._w},fromArray:function(e,t){return void 0===t&&(t=0),this._x=e[t],this._y=e[t+1],this._z=e[t+2],this._w=e[t+3],this.onChangeCallback(),this},toArray:function(e,t){return void 0===e&&(e=[]),void 0===t&&(t=0),e[t]=this._x,e[t+1]=this._y,e[t+2]=this._z,e[t+3]=this._w,e},onChange:function(e){return this.onChangeCallback=e,this},onChangeCallback:function(){},clone:function(){return new o.Quaternion(this._x,this._y,this._z,this._w)}},o.Quaternion.slerp=function(e,t,n,r){return n.copy(e).slerp(t,r)},o.Vector2=function(e,t){this.x=e||0,this.y=t||0},o.Vector2.prototype={constructor:o.Vector2,set:function(e,t){return this.x=e,this.y=t,this},setX:function(e){return this.x=e,this},setY:function(e){return this.y=e,this},setComponent:function(e,t){switch(e){case 0:this.x=t;break;case 1:this.y=t;break;default:throw new Error("index is out of range: "+e)}},getComponent:function(e){switch(e){case 0:return this.x;case 1:return this.y;default:throw new Error("index is out of range: "+e)}},copy:function(e){return this.x=e.x,this.y=e.y,this},add:function(e,t){return void 0!==t?(o.warn("THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(e,t)):(this.x+=e.x,this.y+=e.y,this)},addScalar:function(e){return this.x+=e,this.y+=e,this},addVectors:function(e,t){return this.x=e.x+t.x,this.y=e.y+t.y,this},sub:function(e,t){return void 0!==t?(o.warn("THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(e,t)):(this.x-=e.x,this.y-=e.y,this)},subScalar:function(e){return this.x-=e,this.y-=e,this},subVectors:function(e,t){return this.x=e.x-t.x,this.y=e.y-t.y,this},multiply:function(e){return this.x*=e.x,this.y*=e.y,this},multiplyScalar:function(e){return this.x*=e,this.y*=e,this},divide:function(e){return this.x/=e.x,this.y/=e.y,this},divideScalar:function(e){if(0!==e){var t=1/e;this.x*=t,this.y*=t}else this.x=0,this.y=0;return this},min:function(e){return this.x>e.x&&(this.x=e.x),this.y>e.y&&(this.y=e.y),this},max:function(e){return this.xt.x&&(this.x=t.x),this.yt.y&&(this.y=t.y),this},clampScalar:function(){var e,t;return function(n,r){return void 0===e&&(e=new o.Vector2,t=new o.Vector2),e.set(n,n),t.set(r,r),this.clamp(e,t)}}(),floor:function(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this},ceil:function(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this},round:function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this},roundToZero:function(){return this.x=this.x<0?Math.ceil(this.x):Math.floor(this.x),this.y=this.y<0?Math.ceil(this.y):Math.floor(this.y),this},negate:function(){return this.x=-this.x,this.y=-this.y,this},dot:function(e){return this.x*e.x+this.y*e.y},lengthSq:function(){return this.x*this.x+this.y*this.y},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y)},normalize:function(){return this.divideScalar(this.length())},distanceTo:function(e){return Math.sqrt(this.distanceToSquared(e))},distanceToSquared:function(e){var t=this.x-e.x,n=this.y-e.y;return t*t+n*n},setLength:function(e){var t=this.length();return 0!==t&&e!==t&&this.multiplyScalar(e/t),this},lerp:function(e,t){return this.x+=(e.x-this.x)*t,this.y+=(e.y-this.y)*t,this},lerpVectors:function(e,t,n){return this.subVectors(t,e).multiplyScalar(n).add(e),this},equals:function(e){return e.x===this.x&&e.y===this.y},fromArray:function(e,t){return void 0===t&&(t=0),this.x=e[t],this.y=e[t+1],this},toArray:function(e,t){return void 0===e&&(e=[]),void 0===t&&(t=0),e[t]=this.x,e[t+1]=this.y,e},fromAttribute:function(e,t,n){return void 0===n&&(n=0),t=t*e.itemSize+n,this.x=e.array[t],this.y=e.array[t+1],this},clone:function(){return new o.Vector2(this.x,this.y)}},o.Vector3=function(e,t,n){this.x=e||0,this.y=t||0,this.z=n||0},o.Vector3.prototype={constructor:o.Vector3,set:function(e,t,n){return this.x=e,this.y=t,this.z=n,this},setX:function(e){return this.x=e,this},setY:function(e){return this.y=e,this},setZ:function(e){return this.z=e,this},setComponent:function(e,t){switch(e){case 0:this.x=t;break;case 1:this.y=t;break;case 2:this.z=t;break;default:throw new Error("index is out of range: "+e)}},getComponent:function(e){switch(e){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw new Error("index is out of range: "+e)}},copy:function(e){return this.x=e.x,this.y=e.y,this.z=e.z,this},add:function(e,t){return void 0!==t?(o.warn("THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(e,t)):(this.x+=e.x,this.y+=e.y,this.z+=e.z,this)},addScalar:function(e){return this.x+=e,this.y+=e,this.z+=e,this},addVectors:function(e,t){return this.x=e.x+t.x,this.y=e.y+t.y,this.z=e.z+t.z,this},sub:function(e,t){return void 0!==t?(o.warn("THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(e,t)):(this.x-=e.x,this.y-=e.y,this.z-=e.z,this)},subScalar:function(e){return this.x-=e,this.y-=e,this.z-=e,this},subVectors:function(e,t){return this.x=e.x-t.x,this.y=e.y-t.y,this.z=e.z-t.z,this},multiply:function(e,t){return void 0!==t?(o.warn("THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead."),this.multiplyVectors(e,t)):(this.x*=e.x,this.y*=e.y,this.z*=e.z,this)},multiplyScalar:function(e){return this.x*=e,this.y*=e,this.z*=e,this},multiplyVectors:function(e,t){return this.x=e.x*t.x,this.y=e.y*t.y,this.z=e.z*t.z,this},applyEuler:function(){var e;return function(t){return t instanceof o.Euler==!1&&o.error("THREE.Vector3: .applyEuler() now expects a Euler rotation rather than a Vector3 and order."),void 0===e&&(e=new o.Quaternion),this.applyQuaternion(e.setFromEuler(t)),this}}(),applyAxisAngle:function(){var e;return function(t,n){return void 0===e&&(e=new o.Quaternion),this.applyQuaternion(e.setFromAxisAngle(t,n)),this}}(),applyMatrix3:function(e){var t=this.x,n=this.y,r=this.z,o=e.elements;return this.x=o[0]*t+o[3]*n+o[6]*r,this.y=o[1]*t+o[4]*n+o[7]*r,this.z=o[2]*t+o[5]*n+o[8]*r,this},applyMatrix4:function(e){var t=this.x,n=this.y,r=this.z,o=e.elements;return this.x=o[0]*t+o[4]*n+o[8]*r+o[12],this.y=o[1]*t+o[5]*n+o[9]*r+o[13],this.z=o[2]*t+o[6]*n+o[10]*r+o[14],this},applyProjection:function(e){var t=this.x,n=this.y,r=this.z,o=e.elements,i=1/(o[3]*t+o[7]*n+o[11]*r+o[15]);return this.x=(o[0]*t+o[4]*n+o[8]*r+o[12])*i,this.y=(o[1]*t+o[5]*n+o[9]*r+o[13])*i,this.z=(o[2]*t+o[6]*n+o[10]*r+o[14])*i,this},applyQuaternion:function(e){var t=this.x,n=this.y,r=this.z,o=e.x,i=e.y,a=e.z,s=e.w,u=s*t+i*r-a*n,l=s*n+a*t-o*r,c=s*r+o*n-i*t,h=-o*t-i*n-a*r;return this.x=u*s+h*-o+l*-a-c*-i,this.y=l*s+h*-i+c*-o-u*-a,this.z=c*s+h*-a+u*-i-l*-o,this},project:function(){var e;return function(t){return void 0===e&&(e=new o.Matrix4),e.multiplyMatrices(t.projectionMatrix,e.getInverse(t.matrixWorld)),this.applyProjection(e)}}(),unproject:function(){var e;return function(t){return void 0===e&&(e=new o.Matrix4),e.multiplyMatrices(t.matrixWorld,e.getInverse(t.projectionMatrix)),this.applyProjection(e)}}(),transformDirection:function(e){var t=this.x,n=this.y,r=this.z,o=e.elements;return this.x=o[0]*t+o[4]*n+o[8]*r,this.y=o[1]*t+o[5]*n+o[9]*r,this.z=o[2]*t+o[6]*n+o[10]*r,this.normalize(),this},divide:function(e){return this.x/=e.x,this.y/=e.y,this.z/=e.z,this},divideScalar:function(e){if(0!==e){var t=1/e;this.x*=t,this.y*=t,this.z*=t}else this.x=0,this.y=0,this.z=0;return this},min:function(e){return this.x>e.x&&(this.x=e.x),this.y>e.y&&(this.y=e.y),this.z>e.z&&(this.z=e.z),this},max:function(e){return this.xt.x&&(this.x=t.x),this.yt.y&&(this.y=t.y),this.zt.z&&(this.z=t.z),this},clampScalar:function(){var e,t;return function(n,r){return void 0===e&&(e=new o.Vector3,t=new o.Vector3),e.set(n,n,n),t.set(r,r,r),this.clamp(e,t)}}(),floor:function(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this},ceil:function(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this},round:function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this},roundToZero:function(){return this.x=this.x<0?Math.ceil(this.x):Math.floor(this.x),this.y=this.y<0?Math.ceil(this.y):Math.floor(this.y),this.z=this.z<0?Math.ceil(this.z):Math.floor(this.z),this},negate:function(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this},dot:function(e){return this.x*e.x+this.y*e.y+this.z*e.z},lengthSq:function(){return this.x*this.x+this.y*this.y+this.z*this.z},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)},lengthManhattan:function(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)},normalize:function(){return this.divideScalar(this.length())},setLength:function(e){var t=this.length();return 0!==t&&e!==t&&this.multiplyScalar(e/t),this},lerp:function(e,t){return this.x+=(e.x-this.x)*t,this.y+=(e.y-this.y)*t,this.z+=(e.z-this.z)*t,this},lerpVectors:function(e,t,n){return this.subVectors(t,e).multiplyScalar(n).add(e),this},cross:function(e,t){if(void 0!==t)return o.warn("THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead."),this.crossVectors(e,t);var n=this.x,r=this.y,i=this.z;return this.x=r*e.z-i*e.y,this.y=i*e.x-n*e.z,this.z=n*e.y-r*e.x,this},crossVectors:function(e,t){var n=e.x,r=e.y,o=e.z,i=t.x,a=t.y,s=t.z;return this.x=r*s-o*a,this.y=o*i-n*s,this.z=n*a-r*i,this},projectOnVector:function(){var e,t;return function(n){return void 0===e&&(e=new o.Vector3),e.copy(n).normalize(),t=this.dot(e),this.copy(e).multiplyScalar(t)}}(),projectOnPlane:function(){var e;return function(t){return void 0===e&&(e=new o.Vector3),e.copy(this).projectOnVector(t),this.sub(e)}}(),reflect:function(){var e;return function(t){return void 0===e&&(e=new o.Vector3),this.sub(e.copy(t).multiplyScalar(2*this.dot(t)))}}(),angleTo:function(e){var t=this.dot(e)/(this.length()*e.length());return Math.acos(o.Math.clamp(t,-1,1))},distanceTo:function(e){ +return Math.sqrt(this.distanceToSquared(e))},distanceToSquared:function(e){var t=this.x-e.x,n=this.y-e.y,r=this.z-e.z;return t*t+n*n+r*r},setEulerFromRotationMatrix:function(e,t){o.error("THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.")},setEulerFromQuaternion:function(e,t){o.error("THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.")},getPositionFromMatrix:function(e){return o.warn("THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition()."),this.setFromMatrixPosition(e)},getScaleFromMatrix:function(e){return o.warn("THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale()."),this.setFromMatrixScale(e)},getColumnFromMatrix:function(e,t){return o.warn("THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn()."),this.setFromMatrixColumn(e,t)},setFromMatrixPosition:function(e){return this.x=e.elements[12],this.y=e.elements[13],this.z=e.elements[14],this},setFromMatrixScale:function(e){var t=this.set(e.elements[0],e.elements[1],e.elements[2]).length(),n=this.set(e.elements[4],e.elements[5],e.elements[6]).length(),r=this.set(e.elements[8],e.elements[9],e.elements[10]).length();return this.x=t,this.y=n,this.z=r,this},setFromMatrixColumn:function(e,t){var n=4*e,r=t.elements;return this.x=r[n],this.y=r[n+1],this.z=r[n+2],this},equals:function(e){return e.x===this.x&&e.y===this.y&&e.z===this.z},fromArray:function(e,t){return void 0===t&&(t=0),this.x=e[t],this.y=e[t+1],this.z=e[t+2],this},toArray:function(e,t){return void 0===e&&(e=[]),void 0===t&&(t=0),e[t]=this.x,e[t+1]=this.y,e[t+2]=this.z,e},fromAttribute:function(e,t,n){return void 0===n&&(n=0),t=t*e.itemSize+n,this.x=e.array[t],this.y=e.array[t+1],this.z=e.array[t+2],this},clone:function(){return new o.Vector3(this.x,this.y,this.z)}},o.Vector4=function(e,t,n,r){this.x=e||0,this.y=t||0,this.z=n||0,this.w=void 0!==r?r:1},o.Vector4.prototype={constructor:o.Vector4,set:function(e,t,n,r){return this.x=e,this.y=t,this.z=n,this.w=r,this},setX:function(e){return this.x=e,this},setY:function(e){return this.y=e,this},setZ:function(e){return this.z=e,this},setW:function(e){return this.w=e,this},setComponent:function(e,t){switch(e){case 0:this.x=t;break;case 1:this.y=t;break;case 2:this.z=t;break;case 3:this.w=t;break;default:throw new Error("index is out of range: "+e)}},getComponent:function(e){switch(e){case 0:return this.x;case 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw new Error("index is out of range: "+e)}},copy:function(e){return this.x=e.x,this.y=e.y,this.z=e.z,this.w=void 0!==e.w?e.w:1,this},add:function(e,t){return void 0!==t?(o.warn("THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(e,t)):(this.x+=e.x,this.y+=e.y,this.z+=e.z,this.w+=e.w,this)},addScalar:function(e){return this.x+=e,this.y+=e,this.z+=e,this.w+=e,this},addVectors:function(e,t){return this.x=e.x+t.x,this.y=e.y+t.y,this.z=e.z+t.z,this.w=e.w+t.w,this},sub:function(e,t){return void 0!==t?(o.warn("THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(e,t)):(this.x-=e.x,this.y-=e.y,this.z-=e.z,this.w-=e.w,this)},subScalar:function(e){return this.x-=e,this.y-=e,this.z-=e,this.w-=e,this},subVectors:function(e,t){return this.x=e.x-t.x,this.y=e.y-t.y,this.z=e.z-t.z,this.w=e.w-t.w,this},multiplyScalar:function(e){return this.x*=e,this.y*=e,this.z*=e,this.w*=e,this},applyMatrix4:function(e){var t=this.x,n=this.y,r=this.z,o=this.w,i=e.elements;return this.x=i[0]*t+i[4]*n+i[8]*r+i[12]*o,this.y=i[1]*t+i[5]*n+i[9]*r+i[13]*o,this.z=i[2]*t+i[6]*n+i[10]*r+i[14]*o,this.w=i[3]*t+i[7]*n+i[11]*r+i[15]*o,this},divideScalar:function(e){if(0!==e){var t=1/e;this.x*=t,this.y*=t,this.z*=t,this.w*=t}else this.x=0,this.y=0,this.z=0,this.w=1;return this},setAxisAngleFromQuaternion:function(e){this.w=2*Math.acos(e.w);var t=Math.sqrt(1-e.w*e.w);return t<1e-4?(this.x=1,this.y=0,this.z=0):(this.x=e.x/t,this.y=e.y/t,this.z=e.z/t),this},setAxisAngleFromRotationMatrix:function(e){var t,n,r,o,i=.01,a=.1,s=e.elements,u=s[0],l=s[4],c=s[8],h=s[1],p=s[5],d=s[9],f=s[2],m=s[6],v=s[10];if(Math.abs(l-h)y&&g>_?g_?ye.x&&(this.x=e.x),this.y>e.y&&(this.y=e.y),this.z>e.z&&(this.z=e.z),this.w>e.w&&(this.w=e.w),this},max:function(e){return this.xt.x&&(this.x=t.x),this.yt.y&&(this.y=t.y),this.zt.z&&(this.z=t.z),this.wt.w&&(this.w=t.w),this},clampScalar:function(){var e,t;return function(n,r){return void 0===e&&(e=new o.Vector4,t=new o.Vector4),e.set(n,n,n,n),t.set(r,r,r,r),this.clamp(e,t)}}(),floor:function(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this.w=Math.floor(this.w),this},ceil:function(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this.w=Math.ceil(this.w),this},round:function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this.w=Math.round(this.w),this},roundToZero:function(){return this.x=this.x<0?Math.ceil(this.x):Math.floor(this.x),this.y=this.y<0?Math.ceil(this.y):Math.floor(this.y),this.z=this.z<0?Math.ceil(this.z):Math.floor(this.z),this.w=this.w<0?Math.ceil(this.w):Math.floor(this.w),this},negate:function(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this.w=-this.w,this},dot:function(e){return this.x*e.x+this.y*e.y+this.z*e.z+this.w*e.w},lengthSq:function(){return this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w)},lengthManhattan:function(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)+Math.abs(this.w)},normalize:function(){return this.divideScalar(this.length())},setLength:function(e){var t=this.length();return 0!==t&&e!==t&&this.multiplyScalar(e/t),this},lerp:function(e,t){return this.x+=(e.x-this.x)*t,this.y+=(e.y-this.y)*t,this.z+=(e.z-this.z)*t,this.w+=(e.w-this.w)*t,this},lerpVectors:function(e,t,n){return this.subVectors(t,e).multiplyScalar(n).add(e),this},equals:function(e){return e.x===this.x&&e.y===this.y&&e.z===this.z&&e.w===this.w},fromArray:function(e,t){return void 0===t&&(t=0),this.x=e[t],this.y=e[t+1],this.z=e[t+2],this.w=e[t+3],this},toArray:function(e,t){return void 0===e&&(e=[]),void 0===t&&(t=0),e[t]=this.x,e[t+1]=this.y,e[t+2]=this.z,e[t+3]=this.w,e},fromAttribute:function(e,t,n){return void 0===n&&(n=0),t=t*e.itemSize+n,this.x=e.array[t],this.y=e.array[t+1],this.z=e.array[t+2],this.w=e.array[t+3],this},clone:function(){return new o.Vector4(this.x,this.y,this.z,this.w)}},o.Euler=function(e,t,n,r){this._x=e||0,this._y=t||0,this._z=n||0,this._order=r||o.Euler.DefaultOrder},o.Euler.RotationOrders=["XYZ","YZX","ZXY","XZY","YXZ","ZYX"],o.Euler.DefaultOrder="XYZ",o.Euler.prototype={constructor:o.Euler,_x:0,_y:0,_z:0,_order:o.Euler.DefaultOrder,get x(){return this._x},set x(e){this._x=e,this.onChangeCallback()},get y(){return this._y},set y(e){this._y=e,this.onChangeCallback()},get z(){return this._z},set z(e){this._z=e,this.onChangeCallback()},get order(){return this._order},set order(e){this._order=e,this.onChangeCallback()},set:function(e,t,n,r){return this._x=e,this._y=t,this._z=n,this._order=r||this._order,this.onChangeCallback(),this},copy:function(e){return this._x=e._x,this._y=e._y,this._z=e._z,this._order=e._order,this.onChangeCallback(),this},setFromRotationMatrix:function(e,t,n){var r=o.Math.clamp,i=e.elements,a=i[0],s=i[4],u=i[8],l=i[1],c=i[5],h=i[9],p=i[2],d=i[6],f=i[10];return t=t||this._order,"XYZ"===t?(this._y=Math.asin(r(u,-1,1)),Math.abs(u)<.99999?(this._x=Math.atan2(-h,f),this._z=Math.atan2(-s,a)):(this._x=Math.atan2(d,c),this._z=0)):"YXZ"===t?(this._x=Math.asin(-r(h,-1,1)),Math.abs(h)<.99999?(this._y=Math.atan2(u,f),this._z=Math.atan2(l,c)):(this._y=Math.atan2(-p,a),this._z=0)):"ZXY"===t?(this._x=Math.asin(r(d,-1,1)),Math.abs(d)<.99999?(this._y=Math.atan2(-p,f),this._z=Math.atan2(-s,c)):(this._y=0,this._z=Math.atan2(l,a))):"ZYX"===t?(this._y=Math.asin(-r(p,-1,1)),Math.abs(p)<.99999?(this._x=Math.atan2(d,f),this._z=Math.atan2(l,a)):(this._x=0,this._z=Math.atan2(-s,c))):"YZX"===t?(this._z=Math.asin(r(l,-1,1)),Math.abs(l)<.99999?(this._x=Math.atan2(-h,c),this._y=Math.atan2(-p,a)):(this._x=0,this._y=Math.atan2(u,f))):"XZY"===t?(this._z=Math.asin(-r(s,-1,1)),Math.abs(s)<.99999?(this._x=Math.atan2(d,c),this._y=Math.atan2(u,a)):(this._x=Math.atan2(-h,f),this._y=0)):o.warn("THREE.Euler: .setFromRotationMatrix() given unsupported order: "+t),this._order=t,n!==!1&&this.onChangeCallback(),this},setFromQuaternion:function(){var e;return function(t,n,r){return void 0===e&&(e=new o.Matrix4),e.makeRotationFromQuaternion(t),this.setFromRotationMatrix(e,n,r),this}}(),setFromVector3:function(e,t){return this.set(e.x,e.y,e.z,t||this._order)},reorder:function(){var e=new o.Quaternion;return function(t){e.setFromEuler(this),this.setFromQuaternion(e,t)}}(),equals:function(e){return e._x===this._x&&e._y===this._y&&e._z===this._z&&e._order===this._order},fromArray:function(e){return this._x=e[0],this._y=e[1],this._z=e[2],void 0!==e[3]&&(this._order=e[3]),this.onChangeCallback(),this},toArray:function(e,t){return void 0===e&&(e=[]),void 0===t&&(t=0),e[t]=this._x,e[t+1]=this._y,e[t+2]=this._z,e[t+3]=this._order,e},toVector3:function(e){return e?e.set(this._x,this._y,this._z):new o.Vector3(this._x,this._y,this._z)},onChange:function(e){return this.onChangeCallback=e,this},onChangeCallback:function(){},clone:function(){return new o.Euler(this._x,this._y,this._z,this._order)}},o.Line3=function(e,t){this.start=void 0!==e?e:new o.Vector3,this.end=void 0!==t?t:new o.Vector3},o.Line3.prototype={constructor:o.Line3,set:function(e,t){return this.start.copy(e),this.end.copy(t),this},copy:function(e){return this.start.copy(e.start),this.end.copy(e.end),this},center:function(e){var t=e||new o.Vector3;return t.addVectors(this.start,this.end).multiplyScalar(.5)},delta:function(e){var t=e||new o.Vector3;return t.subVectors(this.end,this.start)},distanceSq:function(){return this.start.distanceToSquared(this.end)},distance:function(){return this.start.distanceTo(this.end)},at:function(e,t){var n=t||new o.Vector3;return this.delta(n).multiplyScalar(e).add(this.start)},closestPointToPointParameter:function(){var e=new o.Vector3,t=new o.Vector3;return function(n,r){e.subVectors(n,this.start),t.subVectors(this.end,this.start);var i=t.dot(t),a=t.dot(e),s=a/i;return r&&(s=o.Math.clamp(s,0,1)),s}}(),closestPointToPoint:function(e,t,n){var r=this.closestPointToPointParameter(e,t),i=n||new o.Vector3;return this.delta(i).multiplyScalar(r).add(this.start)},applyMatrix4:function(e){return this.start.applyMatrix4(e),this.end.applyMatrix4(e),this},equals:function(e){return e.start.equals(this.start)&&e.end.equals(this.end)},clone:function(){return(new o.Line3).copy(this)}},o.Box2=function(e,t){this.min=void 0!==e?e:new o.Vector2(1/0,1/0),this.max=void 0!==t?t:new o.Vector2(-(1/0),-(1/0))},o.Box2.prototype={constructor:o.Box2,set:function(e,t){return this.min.copy(e),this.max.copy(t),this},setFromPoints:function(e){this.makeEmpty();for(var t=0,n=e.length;tthis.max.x||e.ythis.max.y)},containsBox:function(e){return this.min.x<=e.min.x&&e.max.x<=this.max.x&&this.min.y<=e.min.y&&e.max.y<=this.max.y},getParameter:function(e,t){var n=t||new o.Vector2;return n.set((e.x-this.min.x)/(this.max.x-this.min.x),(e.y-this.min.y)/(this.max.y-this.min.y))},isIntersectionBox:function(e){return!(e.max.xthis.max.x||e.max.ythis.max.y)},clampPoint:function(e,t){var n=t||new o.Vector2;return n.copy(e).clamp(this.min,this.max)},distanceToPoint:function(){var e=new o.Vector2;return function(t){var n=e.copy(t).clamp(this.min,this.max);return n.sub(t).length()}}(),intersect:function(e){return this.min.max(e.min),this.max.min(e.max),this},union:function(e){return this.min.min(e.min),this.max.max(e.max),this},translate:function(e){return this.min.add(e),this.max.add(e),this},equals:function(e){return e.min.equals(this.min)&&e.max.equals(this.max)},clone:function(){return(new o.Box2).copy(this)}},o.Box3=function(e,t){this.min=void 0!==e?e:new o.Vector3(1/0,1/0,1/0),this.max=void 0!==t?t:new o.Vector3(-(1/0),-(1/0),-(1/0))},o.Box3.prototype={constructor:o.Box3,set:function(e,t){return this.min.copy(e),this.max.copy(t),this},setFromPoints:function(e){this.makeEmpty();for(var t=0,n=e.length;tthis.max.x||e.ythis.max.y||e.zthis.max.z)},containsBox:function(e){return this.min.x<=e.min.x&&e.max.x<=this.max.x&&this.min.y<=e.min.y&&e.max.y<=this.max.y&&this.min.z<=e.min.z&&e.max.z<=this.max.z},getParameter:function(e,t){var n=t||new o.Vector3;return n.set((e.x-this.min.x)/(this.max.x-this.min.x),(e.y-this.min.y)/(this.max.y-this.min.y),(e.z-this.min.z)/(this.max.z-this.min.z))},isIntersectionBox:function(e){return!(e.max.xthis.max.x||e.max.ythis.max.y||e.max.zthis.max.z)},clampPoint:function(e,t){var n=t||new o.Vector3;return n.copy(e).clamp(this.min,this.max)},distanceToPoint:function(){var e=new o.Vector3;return function(t){var n=e.copy(t).clamp(this.min,this.max);return n.sub(t).length()}}(),getBoundingSphere:function(){var e=new o.Vector3;return function(t){var n=t||new o.Sphere;return n.center=this.center(),n.radius=.5*this.size(e).length(),n}}(),intersect:function(e){return this.min.max(e.min),this.max.min(e.max),this},union:function(e){return this.min.min(e.min),this.max.max(e.max),this},applyMatrix4:function(){var e=[new o.Vector3,new o.Vector3,new o.Vector3,new o.Vector3,new o.Vector3,new o.Vector3,new o.Vector3,new o.Vector3];return function(t){return e[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(t),e[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(t),e[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(t),e[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(t),e[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(t),e[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(t),e[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(t),e[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(t),this.makeEmpty(),this.setFromPoints(e),this}}(),translate:function(e){return this.min.add(e),this.max.add(e),this},equals:function(e){return e.min.equals(this.min)&&e.max.equals(this.max)},clone:function(){return(new o.Box3).copy(this)}},o.Matrix3=function(){this.elements=new Float32Array([1,0,0,0,1,0,0,0,1]),arguments.length>0&&o.error("THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.")},o.Matrix3.prototype={constructor:o.Matrix3,set:function(e,t,n,r,o,i,a,s,u){var l=this.elements;return l[0]=e,l[3]=t,l[6]=n,l[1]=r,l[4]=o,l[7]=i,l[2]=a,l[5]=s,l[8]=u,this},identity:function(){return this.set(1,0,0,0,1,0,0,0,1),this},copy:function(e){var t=e.elements;return this.set(t[0],t[3],t[6],t[1],t[4],t[7],t[2],t[5],t[8]),this},multiplyVector3:function(e){return o.warn("THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead."),e.applyMatrix3(this)},multiplyVector3Array:function(e){return o.warn("THREE.Matrix3: .multiplyVector3Array() has been renamed. Use matrix.applyToVector3Array( array ) instead."),this.applyToVector3Array(e)},applyToVector3Array:function(){var e=new o.Vector3;return function(t,n,r){void 0===n&&(n=0),void 0===r&&(r=t.length);for(var o=0,i=n;o0&&o.error("THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.")},o.Matrix4.prototype={constructor:o.Matrix4,set:function(e,t,n,r,o,i,a,s,u,l,c,h,p,d,f,m){var v=this.elements;return v[0]=e,v[4]=t,v[8]=n,v[12]=r,v[1]=o,v[5]=i,v[9]=a,v[13]=s,v[2]=u,v[6]=l,v[10]=c,v[14]=h,v[3]=p,v[7]=d,v[11]=f,v[15]=m,this},identity:function(){return this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1),this},copy:function(e){return this.elements.set(e.elements),this},extractPosition:function(e){return o.warn("THREE.Matrix4: .extractPosition() has been renamed to .copyPosition()."),this.copyPosition(e)},copyPosition:function(e){var t=this.elements,n=e.elements;return t[12]=n[12],t[13]=n[13],t[14]=n[14],this},extractBasis:function(e,t,n){var r=this.elements;return e.set(r[0],r[1],r[2]),t.set(r[4],r[5],r[6]),n.set(r[8],r[9],r[10]),this},makeBasis:function(e,t,n){return this.set(e.x,t.x,n.x,0,e.y,t.y,n.y,0,e.z,t.z,n.z,0,0,0,0,1),this},extractRotation:function(){var e=new o.Vector3;return function(t){var n=this.elements,r=t.elements,o=1/e.set(r[0],r[1],r[2]).length(),i=1/e.set(r[4],r[5],r[6]).length(),a=1/e.set(r[8],r[9],r[10]).length();return n[0]=r[0]*o,n[1]=r[1]*o,n[2]=r[2]*o,n[4]=r[4]*i,n[5]=r[5]*i,n[6]=r[6]*i,n[8]=r[8]*a,n[9]=r[9]*a,n[10]=r[10]*a,this}}(),makeRotationFromEuler:function(e){e instanceof o.Euler==!1&&o.error("THREE.Matrix: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.");var t=this.elements,n=e.x,r=e.y,i=e.z,a=Math.cos(n),s=Math.sin(n),u=Math.cos(r),l=Math.sin(r),c=Math.cos(i),h=Math.sin(i);if("XYZ"===e.order){var p=a*c,d=a*h,f=s*c,m=s*h;t[0]=u*c,t[4]=-u*h,t[8]=l,t[1]=d+f*l,t[5]=p-m*l,t[9]=-s*u,t[2]=m-p*l,t[6]=f+d*l,t[10]=a*u}else if("YXZ"===e.order){var v=u*c,g=u*h,y=l*c,_=l*h;t[0]=v+_*s,t[4]=y*s-g,t[8]=a*l,t[1]=a*h,t[5]=a*c,t[9]=-s,t[2]=g*s-y,t[6]=_+v*s,t[10]=a*u}else if("ZXY"===e.order){var v=u*c,g=u*h,y=l*c,_=l*h;t[0]=v-_*s,t[4]=-a*h,t[8]=y+g*s,t[1]=g+y*s,t[5]=a*c,t[9]=_-v*s,t[2]=-a*l,t[6]=s,t[10]=a*u}else if("ZYX"===e.order){var p=a*c,d=a*h,f=s*c,m=s*h;t[0]=u*c,t[4]=f*l-d,t[8]=p*l+m,t[1]=u*h,t[5]=m*l+p,t[9]=d*l-f,t[2]=-l,t[6]=s*u,t[10]=a*u}else if("YZX"===e.order){var b=a*u,x=a*l,w=s*u,E=s*l;t[0]=u*c,t[4]=E-b*h,t[8]=w*h+x,t[1]=h,t[5]=a*c,t[9]=-s*c,t[2]=-l*c,t[6]=x*h+w,t[10]=b-E*h}else if("XZY"===e.order){var b=a*u,x=a*l,w=s*u,E=s*l;t[0]=u*c,t[4]=-h,t[8]=l*c,t[1]=b*h+E,t[5]=a*c,t[9]=x*h-w,t[2]=w*h-x,t[6]=s*c,t[10]=E*h+b}return t[3]=0,t[7]=0,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,this},setRotationFromQuaternion:function(e){return o.warn("THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion()."),this.makeRotationFromQuaternion(e)},makeRotationFromQuaternion:function(e){var t=this.elements,n=e.x,r=e.y,o=e.z,i=e.w,a=n+n,s=r+r,u=o+o,l=n*a,c=n*s,h=n*u,p=r*s,d=r*u,f=o*u,m=i*a,v=i*s,g=i*u;return t[0]=1-(p+f),t[4]=c-g,t[8]=h+v,t[1]=c+g,t[5]=1-(l+f),t[9]=d-m,t[2]=h-v,t[6]=d+m,t[10]=1-(l+p),t[3]=0,t[7]=0,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,this},lookAt:function(){var e=new o.Vector3,t=new o.Vector3,n=new o.Vector3;return function(r,o,i){var a=this.elements;return n.subVectors(r,o).normalize(),0===n.length()&&(n.z=1),e.crossVectors(i,n).normalize(),0===e.length()&&(n.x+=1e-4,e.crossVectors(i,n).normalize()),t.crossVectors(n,e),a[0]=e.x,a[4]=t.x,a[8]=n.x,a[1]=e.y,a[5]=t.y,a[9]=n.y,a[2]=e.z,a[6]=t.z,a[10]=n.z,this}}(),multiply:function(e,t){return void 0!==t?(o.warn("THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead."),this.multiplyMatrices(e,t)):this.multiplyMatrices(this,e)},multiplyMatrices:function(e,t){var n=e.elements,r=t.elements,o=this.elements,i=n[0],a=n[4],s=n[8],u=n[12],l=n[1],c=n[5],h=n[9],p=n[13],d=n[2],f=n[6],m=n[10],v=n[14],g=n[3],y=n[7],_=n[11],b=n[15],x=r[0],w=r[4],E=r[8],M=r[12],C=r[1],S=r[5],T=r[9],A=r[13],N=r[2],P=r[6],R=r[10],D=r[14],O=r[3],L=r[7],k=r[11],F=r[15];return o[0]=i*x+a*C+s*N+u*O,o[4]=i*w+a*S+s*P+u*L,o[8]=i*E+a*T+s*R+u*k,o[12]=i*M+a*A+s*D+u*F,o[1]=l*x+c*C+h*N+p*O,o[5]=l*w+c*S+h*P+p*L,o[9]=l*E+c*T+h*R+p*k,o[13]=l*M+c*A+h*D+p*F,o[2]=d*x+f*C+m*N+v*O,o[6]=d*w+f*S+m*P+v*L,o[10]=d*E+f*T+m*R+v*k,o[14]=d*M+f*A+m*D+v*F,o[3]=g*x+y*C+_*N+b*O,o[7]=g*w+y*S+_*P+b*L,o[11]=g*E+y*T+_*R+b*k,o[15]=g*M+y*A+_*D+b*F,this},multiplyToArray:function(e,t,n){var r=this.elements;return this.multiplyMatrices(e,t),n[0]=r[0],n[1]=r[1],n[2]=r[2],n[3]=r[3],n[4]=r[4],n[5]=r[5],n[6]=r[6],n[7]=r[7],n[8]=r[8],n[9]=r[9],n[10]=r[10],n[11]=r[11],n[12]=r[12],n[13]=r[13],n[14]=r[14],n[15]=r[15],this},multiplyScalar:function(e){var t=this.elements;return t[0]*=e,t[4]*=e,t[8]*=e,t[12]*=e,t[1]*=e,t[5]*=e,t[9]*=e,t[13]*=e,t[2]*=e,t[6]*=e,t[10]*=e,t[14]*=e,t[3]*=e,t[7]*=e,t[11]*=e,t[15]*=e,this},multiplyVector3:function(e){return o.warn("THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) or vector.applyProjection( matrix ) instead."),e.applyProjection(this)},multiplyVector4:function(e){return o.warn("THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead."),e.applyMatrix4(this)},multiplyVector3Array:function(e){return o.warn("THREE.Matrix4: .multiplyVector3Array() has been renamed. Use matrix.applyToVector3Array( array ) instead."),this.applyToVector3Array(e)},applyToVector3Array:function(){var e=new o.Vector3;return function(t,n,r){void 0===n&&(n=0),void 0===r&&(r=t.length);for(var o=0,i=n;o0)if(s=p*f-d,u=p*d-f,c=h*v,s>=0)if(u>=-c)if(u<=c){var g=1/v;s*=g,u*=g,l=s*(s+p*u+2*d)+u*(p*s+u+2*f)+m}else u=h,s=Math.max(0,-(p*u+d)),l=-s*s+u*(u+2*f)+m;else u=-h,s=Math.max(0,-(p*u+d)),l=-s*s+u*(u+2*f)+m;else u<=-c?(s=Math.max(0,-(-p*h+d)),u=s>0?-h:Math.min(Math.max(-h,-f),h),l=-s*s+u*(u+2*f)+m):u<=c?(s=0,u=Math.min(Math.max(-h,-f),h),l=u*(u+2*f)+m):(s=Math.max(0,-(p*h+d)),u=s>0?h:Math.min(Math.max(-h,-f),h),l=-s*s+u*(u+2*f)+m);else u=p>0?-h:h,s=Math.max(0,-(p*u+d)),l=-s*s+u*(u+2*f)+m;return i&&i.copy(this.direction).multiplyScalar(s).add(this.origin),a&&a.copy(t).multiplyScalar(u).add(e),l}}(),isIntersectionSphere:function(e){return this.distanceToPoint(e.center)<=e.radius},intersectSphere:function(){var e=new o.Vector3;return function(t,n){e.subVectors(t.center,this.origin);var r=e.dot(this.direction),o=e.dot(e)-r*r,i=t.radius*t.radius;if(o>i)return null;var a=Math.sqrt(i-o),s=r-a,u=r+a;return s<0&&u<0?null:s<0?this.at(u,n):this.at(s,n)}}(),isIntersectionPlane:function(e){var t=e.distanceToPoint(this.origin);if(0===t)return!0;var n=e.normal.dot(this.direction);return n*t<0},distanceToPlane:function(e){var t=e.normal.dot(this.direction);if(0==t)return 0==e.distanceToPoint(this.origin)?0:null;var n=-(this.origin.dot(e.normal)+e.constant)/t;return n>=0?n:null},intersectPlane:function(e,t){var n=this.distanceToPlane(e);return null===n?null:this.at(n,t)},isIntersectionBox:function(){var e=new o.Vector3;return function(t){return null!==this.intersectBox(t,e)}}(),intersectBox:function(e,t){var n,r,o,i,a,s,u=1/this.direction.x,l=1/this.direction.y,c=1/this.direction.z,h=this.origin;return u>=0?(n=(e.min.x-h.x)*u,r=(e.max.x-h.x)*u):(n=(e.max.x-h.x)*u,r=(e.min.x-h.x)*u),l>=0?(o=(e.min.y-h.y)*l,i=(e.max.y-h.y)*l):(o=(e.max.y-h.y)*l,i=(e.min.y-h.y)*l),n>i||o>r?null:((o>n||n!==n)&&(n=o),(i=0?(a=(e.min.z-h.z)*c,s=(e.max.z-h.z)*c):(a=(e.max.z-h.z)*c,s=(e.min.z-h.z)*c),n>s||a>r?null:((a>n||n!==n)&&(n=a),(s=0?n:r,t)))},intersectTriangle:function(){var e=new o.Vector3,t=new o.Vector3,n=new o.Vector3,r=new o.Vector3;return function(o,i,a,s,u){t.subVectors(i,o),n.subVectors(a,o),r.crossVectors(t,n);var l,c=this.direction.dot(r);if(c>0){if(s)return null;l=1}else{if(!(c<0))return null;l=-1,c=-c}e.subVectors(this.origin,o);var h=l*this.direction.dot(n.crossVectors(e,n));if(h<0)return null;var p=l*this.direction.dot(t.cross(e));if(p<0)return null;if(h+p>c)return null;var d=-l*e.dot(r);return d<0?null:this.at(d/c,u)}}(),applyMatrix4:function(e){return this.direction.add(this.origin).applyMatrix4(e),this.origin.applyMatrix4(e),this.direction.sub(this.origin),this.direction.normalize(),this},equals:function(e){return e.origin.equals(this.origin)&&e.direction.equals(this.direction)},clone:function(){return(new o.Ray).copy(this)}},o.Sphere=function(e,t){this.center=void 0!==e?e:new o.Vector3,this.radius=void 0!==t?t:0},o.Sphere.prototype={constructor:o.Sphere,set:function(e,t){return this.center.copy(e),this.radius=t,this},setFromPoints:function(){var e=new o.Box3;return function(t,n){var r=this.center;void 0!==n?r.copy(n):e.setFromPoints(t).center(r);for(var o=0,i=0,a=t.length;ithis.radius*this.radius&&(r.sub(this.center).normalize(),r.multiplyScalar(this.radius).add(this.center)),r},getBoundingBox:function(e){var t=e||new o.Box3;return t.set(this.center,this.center),t.expandByScalar(this.radius),t},applyMatrix4:function(e){return this.center.applyMatrix4(e),this.radius=this.radius*e.getMaxScaleOnAxis(),this},translate:function(e){return this.center.add(e),this},equals:function(e){return e.center.equals(this.center)&&e.radius===this.radius},clone:function(){return(new o.Sphere).copy(this)}},o.Frustum=function(e,t,n,r,i,a){this.planes=[void 0!==e?e:new o.Plane,void 0!==t?t:new o.Plane,void 0!==n?n:new o.Plane,void 0!==r?r:new o.Plane,void 0!==i?i:new o.Plane,void 0!==a?a:new o.Plane]},o.Frustum.prototype={constructor:o.Frustum,set:function(e,t,n,r,o,i){var a=this.planes;return a[0].copy(e),a[1].copy(t),a[2].copy(n),a[3].copy(r),a[4].copy(o),a[5].copy(i),this},copy:function(e){for(var t=this.planes,n=0;n<6;n++)t[n].copy(e.planes[n]);return this},setFromMatrix:function(e){var t=this.planes,n=e.elements,r=n[0],o=n[1],i=n[2],a=n[3],s=n[4],u=n[5],l=n[6],c=n[7],h=n[8],p=n[9],d=n[10],f=n[11],m=n[12],v=n[13],g=n[14],y=n[15];return t[0].setComponents(a-r,c-s,f-h,y-m).normalize(),t[1].setComponents(a+r,c+s,f+h,y+m).normalize(),t[2].setComponents(a+o,c+u,f+p,y+v).normalize(),t[3].setComponents(a-o,c-u,f-p,y-v).normalize(),t[4].setComponents(a-i,c-l,f-d,y-g).normalize(),t[5].setComponents(a+i,c+l,f+d,y+g).normalize(),this},intersectsObject:function(){var e=new o.Sphere;return function(t){var n=t.geometry;return null===n.boundingSphere&&n.computeBoundingSphere(),e.copy(n.boundingSphere),e.applyMatrix4(t.matrixWorld),this.intersectsSphere(e)}}(),intersectsSphere:function(e){for(var t=this.planes,n=e.center,r=-e.radius,o=0;o<6;o++){var i=t[o].distanceToPoint(n);if(i0?n.min.x:n.max.x,t.x=i.normal.x>0?n.max.x:n.min.x,e.y=i.normal.y>0?n.min.y:n.max.y,t.y=i.normal.y>0?n.max.y:n.min.y,e.z=i.normal.z>0?n.min.z:n.max.z,t.z=i.normal.z>0?n.max.z:n.min.z;var a=i.distanceToPoint(e),s=i.distanceToPoint(t);if(a<0&&s<0)return!1}return!0}}(),containsPoint:function(e){for(var t=this.planes,n=0;n<6;n++)if(t[n].distanceToPoint(e)<0)return!1;return!0},clone:function(){return(new o.Frustum).copy(this)}},o.Plane=function(e,t){this.normal=void 0!==e?e:new o.Vector3(1,0,0),this.constant=void 0!==t?t:0},o.Plane.prototype={constructor:o.Plane,set:function(e,t){return this.normal.copy(e),this.constant=t,this},setComponents:function(e,t,n,r){return this.normal.set(e,t,n),this.constant=r,this},setFromNormalAndCoplanarPoint:function(e,t){return this.normal.copy(e),this.constant=-t.dot(this.normal),this},setFromCoplanarPoints:function(){var e=new o.Vector3,t=new o.Vector3;return function(n,r,o){var i=e.subVectors(o,r).cross(t.subVectors(n,r)).normalize();return this.setFromNormalAndCoplanarPoint(i,n),this}}(),copy:function(e){return this.normal.copy(e.normal),this.constant=e.constant,this},normalize:function(){var e=1/this.normal.length();return this.normal.multiplyScalar(e),this.constant*=e,this},negate:function(){return this.constant*=-1,this.normal.negate(),this},distanceToPoint:function(e){return this.normal.dot(e)+this.constant},distanceToSphere:function(e){return this.distanceToPoint(e.center)-e.radius},projectPoint:function(e,t){return this.orthoPoint(e,t).sub(e).negate()},orthoPoint:function(e,t){var n=this.distanceToPoint(e),r=t||new o.Vector3;return r.copy(this.normal).multiplyScalar(n)},isIntersectionLine:function(e){var t=this.distanceToPoint(e.start),n=this.distanceToPoint(e.end);return t<0&&n>0||n<0&&t>0},intersectLine:function(){var e=new o.Vector3;return function(t,n){var r=n||new o.Vector3,i=t.delta(e),a=this.normal.dot(i);if(0!=a){var s=-(t.start.dot(this.normal)+this.constant)/a;if(!(s<0||s>1))return r.copy(i).multiplyScalar(s).add(t.start)}else if(0==this.distanceToPoint(t.start))return r.copy(t.start)}}(),coplanarPoint:function(e){var t=e||new o.Vector3;return t.copy(this.normal).multiplyScalar(-this.constant)},applyMatrix4:function(){var e=new o.Vector3,t=new o.Vector3,n=new o.Matrix3;return function(r,o){var i=o||n.getNormalMatrix(r),a=e.copy(this.normal).applyMatrix3(i),s=this.coplanarPoint(t);return s.applyMatrix4(r),this.setFromNormalAndCoplanarPoint(a,s),this}}(),translate:function(e){return this.constant=this.constant-e.dot(this.normal),this},equals:function(e){return e.normal.equals(this.normal)&&e.constant==this.constant},clone:function(){return(new o.Plane).copy(this)}},o.Math={generateUUID:function(){var e,t="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split(""),n=new Array(36),r=0;return function(){for(var o=0;o<36;o++)8==o||13==o||18==o||23==o?n[o]="-":14==o?n[o]="4":(r<=2&&(r=33554432+16777216*Math.random()|0),e=15&r,r>>=4,n[o]=t[19==o?3&e|8:e]);return n.join("")}}(),clamp:function(e,t,n){return en?n:e},clampBottom:function(e,t){return e=n?1:(e=(e-t)/(n-t),e*e*(3-2*e))},smootherstep:function(e,t,n){return e<=t?0:e>=n?1:(e=(e-t)/(n-t),e*e*e*(e*(6*e-15)+10))},random16:function(){return(65280*Math.random()+255*Math.random())/65535},randInt:function(e,t){return Math.floor(this.randFloat(e,t))},randFloat:function(e,t){return e+Math.random()*(t-e)},randFloatSpread:function(e){return e*(.5-Math.random())},degToRad:function(){var e=Math.PI/180;return function(t){return t*e}}(),radToDeg:function(){var e=180/Math.PI;return function(t){return t*e}}(),isPowerOfTwo:function(e){return 0===(e&e-1)&&0!==e},nextPowerOfTwo:function(e){return e--,e|=e>>1,e|=e>>2,e|=e>>4,e|=e>>8,e|=e>>16,e++,e}},o.Spline=function(e){function t(e,t,n,r,o,i,a){var s=.5*(n-e),u=.5*(r-t);return(2*(t-n)+s+u)*a+(-3*(t-n)-2*s-u)*i+s*o+t}this.points=e;var n,r,i,a,s,u,l,c,h,p=[],d={x:0,y:0,z:0};this.initFromArray=function(e){this.points=[];for(var t=0;tthis.points.length-2?this.points.length-1:r+1,p[3]=r>this.points.length-3?this.points.length-1:r+2,u=this.points[p[0]],l=this.points[p[1]],c=this.points[p[2]],h=this.points[p[3]],a=i*i,s=i*a,d.x=t(u.x,l.x,c.x,h.x,i,a,s),d.y=t(u.y,l.y,c.y,h.y,i,a,s),d.z=t(u.z,l.z,c.z,h.z,i,a,s),d},this.getControlPointsArray=function(){var e,t,n=this.points.length,r=[];for(e=0;e0?a.multiplyScalar(1/Math.sqrt(s)):a.set(0,0,0)}}(),o.Triangle.barycoordFromPoint=function(){var e=new o.Vector3,t=new o.Vector3,n=new o.Vector3;return function(r,i,a,s,u){e.subVectors(s,i),t.subVectors(a,i),n.subVectors(r,i);var l=e.dot(e),c=e.dot(t),h=e.dot(n),p=t.dot(t),d=t.dot(n),f=l*p-c*c,m=u||new o.Vector3;if(0==f)return m.set(-2,-1,-1);var v=1/f,g=(p*h-c*d)*v,y=(l*d-c*h)*v;return m.set(1-g-y,y,g)}}(),o.Triangle.containsPoint=function(){var e=new o.Vector3;return function(t,n,r,i){var a=o.Triangle.barycoordFromPoint(t,n,r,i,e);return a.x>=0&&a.y>=0&&a.x+a.y<=1}}(),o.Triangle.prototype={constructor:o.Triangle,set:function(e,t,n){return this.a.copy(e),this.b.copy(t),this.c.copy(n),this},setFromPointsAndIndices:function(e,t,n,r){return this.a.copy(e[t]),this.b.copy(e[n]),this.c.copy(e[r]),this},copy:function(e){return this.a.copy(e.a),this.b.copy(e.b),this.c.copy(e.c),this},area:function(){var e=new o.Vector3,t=new o.Vector3;return function(){return e.subVectors(this.c,this.b),t.subVectors(this.a,this.b),.5*e.cross(t).length()}}(),midpoint:function(e){var t=e||new o.Vector3;return t.addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)},normal:function(e){return o.Triangle.normal(this.a,this.b,this.c,e)},plane:function(e){var t=e||new o.Plane;return t.setFromCoplanarPoints(this.a,this.b,this.c)},barycoordFromPoint:function(e,t){return o.Triangle.barycoordFromPoint(e,this.a,this.b,this.c,t)},containsPoint:function(e){return o.Triangle.containsPoint(e,this.a,this.b,this.c)},equals:function(e){return e.a.equals(this.a)&&e.b.equals(this.b)&&e.c.equals(this.c)},clone:function(){return(new o.Triangle).copy(this)}},o.Clock=function(e){this.autoStart=void 0===e||e,this.startTime=0,this.oldTime=0,this.elapsedTime=0,this.running=!1},o.Clock.prototype={constructor:o.Clock,start:function(){this.startTime=void 0!==r.performance&&void 0!==r.performance.now?r.performance.now():Date.now(),this.oldTime=this.startTime,this.running=!0},stop:function(){this.getElapsedTime(),this.running=!1},getElapsedTime:function(){return this.getDelta(),this.elapsedTime},getDelta:function(){var e=0;if(this.autoStart&&!this.running&&this.start(),this.running){var t=void 0!==r.performance&&void 0!==r.performance.now?r.performance.now():Date.now();e=.001*(t-this.oldTime),this.oldTime=t,this.elapsedTime+=e}return e}},o.EventDispatcher=function(){},o.EventDispatcher.prototype={constructor:o.EventDispatcher,apply:function(e){e.addEventListener=o.EventDispatcher.prototype.addEventListener,e.hasEventListener=o.EventDispatcher.prototype.hasEventListener,e.removeEventListener=o.EventDispatcher.prototype.removeEventListener,e.dispatchEvent=o.EventDispatcher.prototype.dispatchEvent},addEventListener:function(e,t){void 0===this._listeners&&(this._listeners={});var n=this._listeners;void 0===n[e]&&(n[e]=[]),n[e].indexOf(t)===-1&&n[e].push(t)},hasEventListener:function(e,t){if(void 0===this._listeners)return!1;var n=this._listeners;return void 0!==n[e]&&n[e].indexOf(t)!==-1},removeEventListener:function(e,t){if(void 0!==this._listeners){var n=this._listeners,r=n[e];if(void 0!==r){var o=r.indexOf(t);o!==-1&&r.splice(o,1)}}},dispatchEvent:function(e){if(void 0!==this._listeners){var t=this._listeners,n=t[e.type];if(void 0!==n){e.target=this;for(var r=[],o=n.length,i=0;i1){for(var t=0;t1)for(var t=0;t0){t.children=[];for(var r=0;r0,u=3==r[0].vertexNormals.length,l=new Float32Array(3*r.length*3);this.addAttribute("position",new o.BufferAttribute(l,3));var c=new Float32Array(3*r.length*3);if(this.addAttribute("normal",new o.BufferAttribute(c,3)),a!==o.NoColors){var h=new Float32Array(3*r.length*3);this.addAttribute("color",new o.BufferAttribute(h,3))}if(s===!0){var p=new Float32Array(3*r.length*2);this.addAttribute("uv",new o.BufferAttribute(p,2))}for(var d=0,f=0,m=0;d0?this.offsets:[{start:0,count:f.length,index:0}],v=0,g=m.length;vu.index+e){var _={start:i,count:0,index:a};s.push(_),u=_;for(var b=0;b<6;b+=2){var x=h[b+1];x>-1&&x0&&(e.data.offsets=JSON.parse(JSON.stringify(n))),null!==r&&(e.data.boundingSphere={center:r.center.toArray(),radius:r.radius}),e},clone:function(){var e=new o.BufferGeometry;for(var t in this.attributes){var n=this.attributes[t];e.addAttribute(t,n.clone())}for(var r=0,i=this.offsets.length;r0)for(var h=0;h0&&(e+=t[n].distanceTo(t[n-1])),this.lineDistances[n]=e},computeBoundingBox:function(){null===this.boundingBox&&(this.boundingBox=new o.Box3),this.boundingBox.setFromPoints(this.vertices)},computeBoundingSphere:function(){null===this.boundingSphere&&(this.boundingSphere=new o.Sphere),this.boundingSphere.setFromPoints(this.vertices)},merge:function(e,t,n){if(e instanceof o.Geometry==!1)return void o.error("THREE.Geometry.merge(): geometry not an instance of THREE.Geometry.",e);var r,i=this.vertices.length,a=this.vertices,s=e.vertices,u=this.faces,l=e.faces,c=this.faceVertexUvs[0],h=e.faceVertexUvs[0];void 0===n&&(n=0),void 0!==t&&(r=(new o.Matrix3).getNormalMatrix(t));for(var p=0,d=s.length;p=0;n--){var v=d[n];for(this.faces.splice(v,1),a=0,s=this.faceVertexUvs.length;a0,w=g.vertexNormals.length>0,E=1!==g.color.r||1!==g.color.g||1!==g.color.b,M=g.vertexColors.length>0,C=0;if(C=e(C,0,0),C=e(C,1,y),C=e(C,2,_),C=e(C,3,b),C=e(C,4,x),C=e(C,5,w),C=e(C,6,E),C=e(C,7,M),c.push(C),c.push(g.a,g.b,g.c),b){var S=this.faceVertexUvs[0][u];c.push(r(S[0]),r(S[1]),r(S[2]))}if(x&&c.push(t(g.normal)),w){var T=g.vertexNormals;c.push(t(T[0]),t(T[1]),t(T[2]))}if(E&&c.push(n(g.color)),M){var A=g.vertexColors;c.push(n(A[0]),n(A[1]),n(A[2]))}}return o.data={},o.data.vertices=s,o.data.normals=h,d.length>0&&(o.data.colors=d),m.length>0&&(o.data.uvs=[m]),o.data.faces=c,o},clone:function(){for(var e=new o.Geometry,t=this.vertices,n=0,r=t.length;n1?e.skinWeights[n+1]:0,u=t>2?e.skinWeights[n+2]:0,l=t>3?e.skinWeights[n+3]:0;a.skinWeights.push(new o.Vector4(i,s,u,l))}if(e.skinIndices)for(var n=0,r=e.skinIndices.length;n1?e.skinIndices[n+1]:0,p=t>2?e.skinIndices[n+2]:0,d=t>3?e.skinIndices[n+3]:0;a.skinIndices.push(new o.Vector4(c,h,p,d))}a.bones=e.bones,a.bones&&a.bones.length>0&&(a.skinWeights.length!==a.skinIndices.length||a.skinIndices.length!==a.vertices.length)&&o.warn("THREE.JSONLoader: When skinning, number of vertices ("+a.vertices.length+"), skinIndices ("+a.skinIndices.length+"), and skinWeights ("+a.skinWeights.length+") should match."),a.animation=e.animation,a.animations=e.animations}function i(t){if(void 0!==e.morphTargets){var n,r,i,s,u,l;for(n=0,r=e.morphTargets.length;n0){var i=new o.LoadingManager(t),a=new o.ImageLoader(i);a.setCrossOrigin(this.crossOrigin);for(var s=function(e){return n.manager.itemStart(e),a.load(e,function(){n.manager.itemEnd(e)})},u=0,l=e.length;us)){var S=t.origin.distanceTo(p);Sr.far||i.push({distance:S,point:h.clone().applyMatrix4(this.matrixWorld),index:w,offsetIndex:y,face:null,faceIndex:null,object:this})}}}else for(var v=f.position.array,w=0;ws)){var S=t.origin.distanceTo(p);Sr.far||i.push({distance:S,point:h.clone().applyMatrix4(this.matrixWorld),index:w,face:null,faceIndex:null,object:this})}}}else if(u instanceof o.Geometry)for(var T=u.vertices,A=T.length,w=0;ws)){var S=t.origin.distanceTo(p);Sr.far||i.push({distance:S,point:h.clone().applyMatrix4(this.matrixWorld),index:w,face:null,faceIndex:null,object:this})}}}}}(),o.Line.prototype.clone=function(e){return void 0===e&&(e=new o.Line(this.geometry,this.material,this.mode)),o.Object3D.prototype.clone.call(this,e),e},o.Mesh=function(e,t){o.Object3D.call(this),this.type="Mesh",this.geometry=void 0!==e?e:new o.Geometry,this.material=void 0!==t?t:new o.MeshBasicMaterial({color:16777215*Math.random()}),this.updateMorphTargets()},o.Mesh.prototype=Object.create(o.Object3D.prototype),o.Mesh.prototype.constructor=o.Mesh,o.Mesh.prototype.updateMorphTargets=function(){if(void 0!==this.geometry.morphTargets&&this.geometry.morphTargets.length>0){this.morphTargetBase=-1,this.morphTargetForcedOrder=[],this.morphTargetInfluences=[],this.morphTargetDictionary={};for(var e=0,t=this.geometry.morphTargets.length;es.far||u.push({distance:T,point:S,face:new o.Face3(h,p,d,o.Triangle.normal(r,i,a)),faceIndex:null,object:this})}}}else for(var g=f.position.array,M=0,A=0,C=g.length;Ms.far||u.push({distance:T,point:S,face:new o.Face3(h,p,d,o.Triangle.normal(r,i,a)),faceIndex:null,object:this})}}}else if(l instanceof o.Geometry)for(var h,p,d,N=this.material instanceof o.MeshFaceMaterial,P=N===!0?this.material.materials:null,m=s.precision,R=l.vertices,D=0,O=l.faces.length;Ds.far||u.push({distance:T,point:S,face:L,faceIndex:D,object:this})}}}}}(),o.Mesh.prototype.clone=function(e,t){return void 0===e&&(e=new o.Mesh(this.geometry,this.material)),o.Object3D.prototype.clone.call(this,e,t),e},o.Bone=function(e){o.Object3D.call(this),this.type="Bone",this.skin=e},o.Bone.prototype=Object.create(o.Object3D.prototype),o.Bone.prototype.constructor=o.Bone,o.Skeleton=function(e,t,n){if(this.useVertexTexture=void 0===n||n,this.identityMatrix=new o.Matrix4,e=e||[],this.bones=e.slice(0),this.useVertexTexture){var r;r=this.bones.length>256?64:this.bones.length>64?32:this.bones.length>16?16:8,this.boneTextureWidth=r,this.boneTextureHeight=r,this.boneMatrices=new Float32Array(this.boneTextureWidth*this.boneTextureHeight*4),this.boneTexture=new o.DataTexture(this.boneMatrices,this.boneTextureWidth,this.boneTextureHeight,o.RGBAFormat,o.FloatType),this.boneTexture.minFilter=o.NearestFilter,this.boneTexture.magFilter=o.NearestFilter,this.boneTexture.generateMipmaps=!1,this.boneTexture.flipY=!1}else this.boneMatrices=new Float32Array(16*this.bones.length);if(void 0===t)this.calculateInverses();else if(this.bones.length===t.length)this.boneInverses=t.slice(0);else{o.warn("THREE.Skeleton bonInverses is the wrong length."),this.boneInverses=[];for(var i=0,a=this.bones.length;i1){var u=s[1];n[u]||(n[u]={start:1/0,end:-(1/0)});var l=n[u];ol.end&&(l.end=o),t||(t=u)}}e.firstAnimation=t},o.MorphAnimMesh.prototype.setAnimationLabel=function(e,t,n){this.geometry.animations||(this.geometry.animations={}),this.geometry.animations[e]={start:t,end:n}},o.MorphAnimMesh.prototype.playAnimation=function(e,t){var n=this.geometry.animations[e];n?(this.setFrameRange(n.start,n.end),this.duration=1e3*((n.end-n.start)/t),this.time=0):o.warn("THREE.MorphAnimMesh: animation["+e+"] undefined in .playAnimation()")},o.MorphAnimMesh.prototype.updateAnimation=function(e){var t=this.duration/this.length;this.time+=this.direction*e,this.mirroredLoop?(this.time>this.duration||this.time<0)&&(this.direction*=-1,this.time>this.duration&&(this.time=this.duration,this.directionBackwards=!0),this.time<0&&(this.time=0,this.directionBackwards=!1)):(this.time=this.time%this.duration,this.time<0&&(this.time+=this.duration));var n=this.startKeyframe+o.Math.clamp(Math.floor(this.time/t),0,this.length-1);n!==this.currentKeyframe&&(this.morphTargetInfluences[this.lastKeyframe]=0,this.morphTargetInfluences[this.currentKeyframe]=1,this.morphTargetInfluences[n]=0,this.lastKeyframe=this.currentKeyframe,this.currentKeyframe=n);var r=this.time%t/t;this.directionBackwards&&(r=1-r),this.morphTargetInfluences[this.currentKeyframe]=r,this.morphTargetInfluences[this.lastKeyframe]=1-r},o.MorphAnimMesh.prototype.interpolateTargets=function(e,t,n){for(var r=this.morphTargetInfluences,o=0,i=r.length;o-1&&(r[e]=1-n),t>-1&&(r[t]=n)},o.MorphAnimMesh.prototype.clone=function(e){return void 0===e&&(e=new o.MorphAnimMesh(this.geometry,this.material)),e.duration=this.duration,e.mirroredLoop=this.mirroredLoop,e.time=this.time,e.lastKeyframe=this.lastKeyframe,e.currentKeyframe=this.currentKeyframe,e.direction=this.direction,e.directionBackwards=this.directionBackwards,o.Mesh.prototype.clone.call(this,e),e},o.LOD=function(){o.Object3D.call(this),this.objects=[]},o.LOD.prototype=Object.create(o.Object3D.prototype),o.LOD.prototype.constructor=o.LOD,o.LOD.prototype.addLevel=function(e,t){void 0===t&&(t=0),t=Math.abs(t);for(var n=0;n1){e.setFromMatrixPosition(n.matrixWorld),t.setFromMatrixPosition(this.matrixWorld);var r=e.distanceTo(t);this.objects[0].object.visible=!0;for(var o=1,i=this.objects.length;o=this.objects[o].distance;o++)this.objects[o-1].object.visible=!1,this.objects[o].object.visible=!0;for(;othis.scale.x||n.push({distance:r,point:this.position,face:null,object:this})}}(),o.Sprite.prototype.clone=function(e){return void 0===e&&(e=new o.Sprite(this.material)),o.Object3D.prototype.clone.call(this,e),e},o.Particle=o.Sprite,o.LensFlare=function(e,t,n,r,i){o.Object3D.call(this),this.lensFlares=[],this.positionScreen=new o.Vector3,this.customUpdateCallback=void 0,void 0!==e&&this.add(e,t,n,r,i)},o.LensFlare.prototype=Object.create(o.Object3D.prototype),o.LensFlare.prototype.constructor=o.LensFlare,o.LensFlare.prototype.add=function(e,t,n,r,i,a){void 0===t&&(t=-1),void 0===n&&(n=0),void 0===a&&(a=1),void 0===i&&(i=new o.Color(16777215)),void 0===r&&(r=o.NormalBlending),n=Math.min(n,Math.max(0,n)),this.lensFlares.push({texture:e,size:t,distance:n,x:0,y:0,z:0,scale:1,rotation:1,opacity:a,color:i,blending:r})},o.LensFlare.prototype.updateLensFlares=function(){var e,t,n=this.lensFlares.length,r=2*-this.positionScreen.x,o=2*-this.positionScreen.y;for(e=0;e 0.0 ) {\n\t return pow( saturate( 1.0 - lightDistance / cutoffDistance ), decayExponent );\n\t}\n\treturn 1.0;\n}\n\nvec3 inputToLinear( in vec3 a ) {\n#ifdef GAMMA_INPUT\n\treturn pow( a, vec3( float( GAMMA_FACTOR ) ) );\n#else\n\treturn a;\n#endif\n}\nvec3 linearToOutput( in vec3 a ) {\n#ifdef GAMMA_OUTPUT\n\treturn pow( a, vec3( 1.0 / float( GAMMA_FACTOR ) ) );\n#else\n\treturn a;\n#endif\n}\n",o.ShaderChunk.alphatest_fragment="#ifdef ALPHATEST\n\n\tif ( diffuseColor.a < ALPHATEST ) discard;\n\n#endif\n",o.ShaderChunk.lights_lambert_vertex="vLightFront = vec3( 0.0 );\n\n#ifdef DOUBLE_SIDED\n\n\tvLightBack = vec3( 0.0 );\n\n#endif\n\ntransformedNormal = normalize( transformedNormal );\n\n#if MAX_DIR_LIGHTS > 0\n\nfor( int i = 0; i < MAX_DIR_LIGHTS; i ++ ) {\n\n\tvec3 dirVector = transformDirection( directionalLightDirection[ i ], viewMatrix );\n\n\tfloat dotProduct = dot( transformedNormal, dirVector );\n\tvec3 directionalLightWeighting = vec3( max( dotProduct, 0.0 ) );\n\n\t#ifdef DOUBLE_SIDED\n\n\t\tvec3 directionalLightWeightingBack = vec3( max( -dotProduct, 0.0 ) );\n\n\t\t#ifdef WRAP_AROUND\n\n\t\t\tvec3 directionalLightWeightingHalfBack = vec3( max( -0.5 * dotProduct + 0.5, 0.0 ) );\n\n\t\t#endif\n\n\t#endif\n\n\t#ifdef WRAP_AROUND\n\n\t\tvec3 directionalLightWeightingHalf = vec3( max( 0.5 * dotProduct + 0.5, 0.0 ) );\n\t\tdirectionalLightWeighting = mix( directionalLightWeighting, directionalLightWeightingHalf, wrapRGB );\n\n\t\t#ifdef DOUBLE_SIDED\n\n\t\t\tdirectionalLightWeightingBack = mix( directionalLightWeightingBack, directionalLightWeightingHalfBack, wrapRGB );\n\n\t\t#endif\n\n\t#endif\n\n\tvLightFront += directionalLightColor[ i ] * directionalLightWeighting;\n\n\t#ifdef DOUBLE_SIDED\n\n\t\tvLightBack += directionalLightColor[ i ] * directionalLightWeightingBack;\n\n\t#endif\n\n}\n\n#endif\n\n#if MAX_POINT_LIGHTS > 0\n\n\tfor( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {\n\n\t\tvec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );\n\t\tvec3 lVector = lPosition.xyz - mvPosition.xyz;\n\n\t\tfloat attenuation = calcLightAttenuation( length( lVector ), pointLightDistance[ i ], pointLightDecay[ i ] );\n\n\t\tlVector = normalize( lVector );\n\t\tfloat dotProduct = dot( transformedNormal, lVector );\n\n\t\tvec3 pointLightWeighting = vec3( max( dotProduct, 0.0 ) );\n\n\t\t#ifdef DOUBLE_SIDED\n\n\t\t\tvec3 pointLightWeightingBack = vec3( max( -dotProduct, 0.0 ) );\n\n\t\t\t#ifdef WRAP_AROUND\n\n\t\t\t\tvec3 pointLightWeightingHalfBack = vec3( max( -0.5 * dotProduct + 0.5, 0.0 ) );\n\n\t\t\t#endif\n\n\t\t#endif\n\n\t\t#ifdef WRAP_AROUND\n\n\t\t\tvec3 pointLightWeightingHalf = vec3( max( 0.5 * dotProduct + 0.5, 0.0 ) );\n\t\t\tpointLightWeighting = mix( pointLightWeighting, pointLightWeightingHalf, wrapRGB );\n\n\t\t\t#ifdef DOUBLE_SIDED\n\n\t\t\t\tpointLightWeightingBack = mix( pointLightWeightingBack, pointLightWeightingHalfBack, wrapRGB );\n\n\t\t\t#endif\n\n\t\t#endif\n\n\t\tvLightFront += pointLightColor[ i ] * pointLightWeighting * attenuation;\n\n\t\t#ifdef DOUBLE_SIDED\n\n\t\t\tvLightBack += pointLightColor[ i ] * pointLightWeightingBack * attenuation;\n\n\t\t#endif\n\n\t}\n\n#endif\n\n#if MAX_SPOT_LIGHTS > 0\n\n\tfor( int i = 0; i < MAX_SPOT_LIGHTS; i ++ ) {\n\n\t\tvec4 lPosition = viewMatrix * vec4( spotLightPosition[ i ], 1.0 );\n\t\tvec3 lVector = lPosition.xyz - mvPosition.xyz;\n\n\t\tfloat spotEffect = dot( spotLightDirection[ i ], normalize( spotLightPosition[ i ] - worldPosition.xyz ) );\n\n\t\tif ( spotEffect > spotLightAngleCos[ i ] ) {\n\n\t\t\tspotEffect = max( pow( max( spotEffect, 0.0 ), spotLightExponent[ i ] ), 0.0 );\n\n\t\t\tfloat attenuation = calcLightAttenuation( length( lVector ), spotLightDistance[ i ], spotLightDecay[ i ] );\n\n\t\t\tlVector = normalize( lVector );\n\n\t\t\tfloat dotProduct = dot( transformedNormal, lVector );\n\t\t\tvec3 spotLightWeighting = vec3( max( dotProduct, 0.0 ) );\n\n\t\t\t#ifdef DOUBLE_SIDED\n\n\t\t\t\tvec3 spotLightWeightingBack = vec3( max( -dotProduct, 0.0 ) );\n\n\t\t\t\t#ifdef WRAP_AROUND\n\n\t\t\t\t\tvec3 spotLightWeightingHalfBack = vec3( max( -0.5 * dotProduct + 0.5, 0.0 ) );\n\n\t\t\t\t#endif\n\n\t\t\t#endif\n\n\t\t\t#ifdef WRAP_AROUND\n\n\t\t\t\tvec3 spotLightWeightingHalf = vec3( max( 0.5 * dotProduct + 0.5, 0.0 ) );\n\t\t\t\tspotLightWeighting = mix( spotLightWeighting, spotLightWeightingHalf, wrapRGB );\n\n\t\t\t\t#ifdef DOUBLE_SIDED\n\n\t\t\t\t\tspotLightWeightingBack = mix( spotLightWeightingBack, spotLightWeightingHalfBack, wrapRGB );\n\n\t\t\t\t#endif\n\n\t\t\t#endif\n\n\t\t\tvLightFront += spotLightColor[ i ] * spotLightWeighting * attenuation * spotEffect;\n\n\t\t\t#ifdef DOUBLE_SIDED\n\n\t\t\t\tvLightBack += spotLightColor[ i ] * spotLightWeightingBack * attenuation * spotEffect;\n\n\t\t\t#endif\n\n\t\t}\n\n\t}\n\n#endif\n\n#if MAX_HEMI_LIGHTS > 0\n\n\tfor( int i = 0; i < MAX_HEMI_LIGHTS; i ++ ) {\n\n\t\tvec3 lVector = transformDirection( hemisphereLightDirection[ i ], viewMatrix );\n\n\t\tfloat dotProduct = dot( transformedNormal, lVector );\n\n\t\tfloat hemiDiffuseWeight = 0.5 * dotProduct + 0.5;\n\t\tfloat hemiDiffuseWeightBack = -0.5 * dotProduct + 0.5;\n\n\t\tvLightFront += mix( hemisphereLightGroundColor[ i ], hemisphereLightSkyColor[ i ], hemiDiffuseWeight );\n\n\t\t#ifdef DOUBLE_SIDED\n\n\t\t\tvLightBack += mix( hemisphereLightGroundColor[ i ], hemisphereLightSkyColor[ i ], hemiDiffuseWeightBack );\n\n\t\t#endif\n\n\t}\n\n#endif\n\nvLightFront += ambientLightColor;\n\n#ifdef DOUBLE_SIDED\n\n\tvLightBack += ambientLightColor;\n\n#endif\n",o.ShaderChunk.map_particle_pars_fragment="#ifdef USE_MAP\n\n\tuniform vec4 offsetRepeat;\n\tuniform sampler2D map;\n\n#endif\n",o.ShaderChunk.default_vertex="#ifdef USE_SKINNING\n\n\tvec4 mvPosition = modelViewMatrix * skinned;\n\n#elif defined( USE_MORPHTARGETS )\n\n\tvec4 mvPosition = modelViewMatrix * vec4( morphed, 1.0 );\n\n#else\n\n\tvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\n\n#endif\n\ngl_Position = projectionMatrix * mvPosition;\n",o.ShaderChunk.map_pars_fragment="#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP )\n\n\tvarying vec2 vUv;\n\n#endif\n\n#ifdef USE_MAP\n\n\tuniform sampler2D map;\n\n#endif",o.ShaderChunk.skinnormal_vertex="#ifdef USE_SKINNING\n\n\tmat4 skinMatrix = mat4( 0.0 );\n\tskinMatrix += skinWeight.x * boneMatX;\n\tskinMatrix += skinWeight.y * boneMatY;\n\tskinMatrix += skinWeight.z * boneMatZ;\n\tskinMatrix += skinWeight.w * boneMatW;\n\tskinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\n\n\t#ifdef USE_MORPHNORMALS\n\n\tvec4 skinnedNormal = skinMatrix * vec4( morphedNormal, 0.0 );\n\n\t#else\n\n\tvec4 skinnedNormal = skinMatrix * vec4( normal, 0.0 );\n\n\t#endif\n\n#endif\n";o.ShaderChunk.logdepthbuf_pars_vertex="#ifdef USE_LOGDEPTHBUF\n\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\n\t\tvarying float vFragDepth;\n\n\t#endif\n\n\tuniform float logDepthBufFC;\n\n#endif";o.ShaderChunk.lightmap_pars_vertex="#ifdef USE_LIGHTMAP\n\n\tvarying vec2 vUv2;\n\n#endif",o.ShaderChunk.lights_phong_fragment="#ifndef FLAT_SHADED\n\n\tvec3 normal = normalize( vNormal );\n\n\t#ifdef DOUBLE_SIDED\n\n\t\tnormal = normal * ( -1.0 + 2.0 * float( gl_FrontFacing ) );\n\n\t#endif\n\n#else\n\n\tvec3 fdx = dFdx( vViewPosition );\n\tvec3 fdy = dFdy( vViewPosition );\n\tvec3 normal = normalize( cross( fdx, fdy ) );\n\n#endif\n\nvec3 viewPosition = normalize( vViewPosition );\n\n#ifdef USE_NORMALMAP\n\n\tnormal = perturbNormal2Arb( -vViewPosition, normal );\n\n#elif defined( USE_BUMPMAP )\n\n\tnormal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd() );\n\n#endif\n\nvec3 totalDiffuseLight = vec3( 0.0 );\nvec3 totalSpecularLight = vec3( 0.0 );\n\n#if MAX_POINT_LIGHTS > 0\n\n\tfor ( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {\n\n\t\tvec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );\n\t\tvec3 lVector = lPosition.xyz + vViewPosition.xyz;\n\n\t\tfloat attenuation = calcLightAttenuation( length( lVector ), pointLightDistance[ i ], pointLightDecay[ i ] );\n\n\t\tlVector = normalize( lVector );\n\n\t\t// diffuse\n\n\t\tfloat dotProduct = dot( normal, lVector );\n\n\t\t#ifdef WRAP_AROUND\n\n\t\t\tfloat pointDiffuseWeightFull = max( dotProduct, 0.0 );\n\t\t\tfloat pointDiffuseWeightHalf = max( 0.5 * dotProduct + 0.5, 0.0 );\n\n\t\t\tvec3 pointDiffuseWeight = mix( vec3( pointDiffuseWeightFull ), vec3( pointDiffuseWeightHalf ), wrapRGB );\n\n\t\t#else\n\n\t\t\tfloat pointDiffuseWeight = max( dotProduct, 0.0 );\n\n\t\t#endif\n\n\t\ttotalDiffuseLight += pointLightColor[ i ] * pointDiffuseWeight * attenuation;\n\n\t\t\t\t// specular\n\n\t\tvec3 pointHalfVector = normalize( lVector + viewPosition );\n\t\tfloat pointDotNormalHalf = max( dot( normal, pointHalfVector ), 0.0 );\n\t\tfloat pointSpecularWeight = specularStrength * max( pow( pointDotNormalHalf, shininess ), 0.0 );\n\n\t\tfloat specularNormalization = ( shininess + 2.0 ) / 8.0;\n\n\t\tvec3 schlick = specular + vec3( 1.0 - specular ) * pow( max( 1.0 - dot( lVector, pointHalfVector ), 0.0 ), 5.0 );\n\t\ttotalSpecularLight += schlick * pointLightColor[ i ] * pointSpecularWeight * pointDiffuseWeight * attenuation * specularNormalization;\n\n\t}\n\n#endif\n\n#if MAX_SPOT_LIGHTS > 0\n\n\tfor ( int i = 0; i < MAX_SPOT_LIGHTS; i ++ ) {\n\n\t\tvec4 lPosition = viewMatrix * vec4( spotLightPosition[ i ], 1.0 );\n\t\tvec3 lVector = lPosition.xyz + vViewPosition.xyz;\n\n\t\tfloat attenuation = calcLightAttenuation( length( lVector ), spotLightDistance[ i ], spotLightDecay[ i ] );\n\n\t\tlVector = normalize( lVector );\n\n\t\tfloat spotEffect = dot( spotLightDirection[ i ], normalize( spotLightPosition[ i ] - vWorldPosition ) );\n\n\t\tif ( spotEffect > spotLightAngleCos[ i ] ) {\n\n\t\t\tspotEffect = max( pow( max( spotEffect, 0.0 ), spotLightExponent[ i ] ), 0.0 );\n\n\t\t\t// diffuse\n\n\t\t\tfloat dotProduct = dot( normal, lVector );\n\n\t\t\t#ifdef WRAP_AROUND\n\n\t\t\t\tfloat spotDiffuseWeightFull = max( dotProduct, 0.0 );\n\t\t\t\tfloat spotDiffuseWeightHalf = max( 0.5 * dotProduct + 0.5, 0.0 );\n\n\t\t\t\tvec3 spotDiffuseWeight = mix( vec3( spotDiffuseWeightFull ), vec3( spotDiffuseWeightHalf ), wrapRGB );\n\n\t\t\t#else\n\n\t\t\t\tfloat spotDiffuseWeight = max( dotProduct, 0.0 );\n\n\t\t\t#endif\n\n\t\t\ttotalDiffuseLight += spotLightColor[ i ] * spotDiffuseWeight * attenuation * spotEffect;\n\n\t\t\t// specular\n\n\t\t\tvec3 spotHalfVector = normalize( lVector + viewPosition );\n\t\t\tfloat spotDotNormalHalf = max( dot( normal, spotHalfVector ), 0.0 );\n\t\t\tfloat spotSpecularWeight = specularStrength * max( pow( spotDotNormalHalf, shininess ), 0.0 );\n\n\t\t\tfloat specularNormalization = ( shininess + 2.0 ) / 8.0;\n\n\t\t\tvec3 schlick = specular + vec3( 1.0 - specular ) * pow( max( 1.0 - dot( lVector, spotHalfVector ), 0.0 ), 5.0 );\n\t\t\ttotalSpecularLight += schlick * spotLightColor[ i ] * spotSpecularWeight * spotDiffuseWeight * attenuation * specularNormalization * spotEffect;\n\n\t\t}\n\n\t}\n\n#endif\n\n#if MAX_DIR_LIGHTS > 0\n\n\tfor( int i = 0; i < MAX_DIR_LIGHTS; i ++ ) {\n\n\t\tvec3 dirVector = transformDirection( directionalLightDirection[ i ], viewMatrix );\n\n\t\t// diffuse\n\n\t\tfloat dotProduct = dot( normal, dirVector );\n\n\t\t#ifdef WRAP_AROUND\n\n\t\t\tfloat dirDiffuseWeightFull = max( dotProduct, 0.0 );\n\t\t\tfloat dirDiffuseWeightHalf = max( 0.5 * dotProduct + 0.5, 0.0 );\n\n\t\t\tvec3 dirDiffuseWeight = mix( vec3( dirDiffuseWeightFull ), vec3( dirDiffuseWeightHalf ), wrapRGB );\n\n\t\t#else\n\n\t\t\tfloat dirDiffuseWeight = max( dotProduct, 0.0 );\n\n\t\t#endif\n\n\t\ttotalDiffuseLight += directionalLightColor[ i ] * dirDiffuseWeight;\n\n\t\t// specular\n\n\t\tvec3 dirHalfVector = normalize( dirVector + viewPosition );\n\t\tfloat dirDotNormalHalf = max( dot( normal, dirHalfVector ), 0.0 );\n\t\tfloat dirSpecularWeight = specularStrength * max( pow( dirDotNormalHalf, shininess ), 0.0 );\n\n\t\t/*\n\t\t// fresnel term from skin shader\n\t\tconst float F0 = 0.128;\n\n\t\tfloat base = 1.0 - dot( viewPosition, dirHalfVector );\n\t\tfloat exponential = pow( base, 5.0 );\n\n\t\tfloat fresnel = exponential + F0 * ( 1.0 - exponential );\n\t\t*/\n\n\t\t/*\n\t\t// fresnel term from fresnel shader\n\t\tconst float mFresnelBias = 0.08;\n\t\tconst float mFresnelScale = 0.3;\n\t\tconst float mFresnelPower = 5.0;\n\n\t\tfloat fresnel = mFresnelBias + mFresnelScale * pow( 1.0 + dot( normalize( -viewPosition ), normal ), mFresnelPower );\n\t\t*/\n\n\t\tfloat specularNormalization = ( shininess + 2.0 ) / 8.0;\n\n\t\t// \t\tdirSpecular += specular * directionalLightColor[ i ] * dirSpecularWeight * dirDiffuseWeight * specularNormalization * fresnel;\n\n\t\tvec3 schlick = specular + vec3( 1.0 - specular ) * pow( max( 1.0 - dot( dirVector, dirHalfVector ), 0.0 ), 5.0 );\n\t\ttotalSpecularLight += schlick * directionalLightColor[ i ] * dirSpecularWeight * dirDiffuseWeight * specularNormalization;\n\n\n\t}\n\n#endif\n\n#if MAX_HEMI_LIGHTS > 0\n\n\tfor( int i = 0; i < MAX_HEMI_LIGHTS; i ++ ) {\n\n\t\tvec3 lVector = transformDirection( hemisphereLightDirection[ i ], viewMatrix );\n\n\t\t// diffuse\n\n\t\tfloat dotProduct = dot( normal, lVector );\n\t\tfloat hemiDiffuseWeight = 0.5 * dotProduct + 0.5;\n\n\t\tvec3 hemiColor = mix( hemisphereLightGroundColor[ i ], hemisphereLightSkyColor[ i ], hemiDiffuseWeight );\n\n\t\ttotalDiffuseLight += hemiColor;\n\n\t\t// specular (sky light)\n\n\t\tvec3 hemiHalfVectorSky = normalize( lVector + viewPosition );\n\t\tfloat hemiDotNormalHalfSky = 0.5 * dot( normal, hemiHalfVectorSky ) + 0.5;\n\t\tfloat hemiSpecularWeightSky = specularStrength * max( pow( max( hemiDotNormalHalfSky, 0.0 ), shininess ), 0.0 );\n\n\t\t// specular (ground light)\n\n\t\tvec3 lVectorGround = -lVector;\n\n\t\tvec3 hemiHalfVectorGround = normalize( lVectorGround + viewPosition );\n\t\tfloat hemiDotNormalHalfGround = 0.5 * dot( normal, hemiHalfVectorGround ) + 0.5;\n\t\tfloat hemiSpecularWeightGround = specularStrength * max( pow( max( hemiDotNormalHalfGround, 0.0 ), shininess ), 0.0 );\n\n\t\tfloat dotProductGround = dot( normal, lVectorGround );\n\n\t\tfloat specularNormalization = ( shininess + 2.0 ) / 8.0;\n\n\t\tvec3 schlickSky = specular + vec3( 1.0 - specular ) * pow( max( 1.0 - dot( lVector, hemiHalfVectorSky ), 0.0 ), 5.0 );\n\t\tvec3 schlickGround = specular + vec3( 1.0 - specular ) * pow( max( 1.0 - dot( lVectorGround, hemiHalfVectorGround ), 0.0 ), 5.0 );\n\t\ttotalSpecularLight += hemiColor * specularNormalization * ( schlickSky * hemiSpecularWeightSky * max( dotProduct, 0.0 ) + schlickGround * hemiSpecularWeightGround * max( dotProductGround, 0.0 ) );\n\n\t}\n\n#endif\n\n#ifdef METAL\n\n\toutgoingLight += diffuseColor.rgb * ( totalDiffuseLight + ambientLightColor ) * specular + totalSpecularLight + emissive;\n\n#else\n\n\toutgoingLight += diffuseColor.rgb * ( totalDiffuseLight + ambientLightColor ) + totalSpecularLight + emissive;\n\n#endif\n", +o.ShaderChunk.fog_pars_fragment="#ifdef USE_FOG\n\n\tuniform vec3 fogColor;\n\n\t#ifdef FOG_EXP2\n\n\t\tuniform float fogDensity;\n\n\t#else\n\n\t\tuniform float fogNear;\n\t\tuniform float fogFar;\n\t#endif\n\n#endif",o.ShaderChunk.morphnormal_vertex="#ifdef USE_MORPHNORMALS\n\n\tvec3 morphedNormal = vec3( 0.0 );\n\n\tmorphedNormal += ( morphNormal0 - normal ) * morphTargetInfluences[ 0 ];\n\tmorphedNormal += ( morphNormal1 - normal ) * morphTargetInfluences[ 1 ];\n\tmorphedNormal += ( morphNormal2 - normal ) * morphTargetInfluences[ 2 ];\n\tmorphedNormal += ( morphNormal3 - normal ) * morphTargetInfluences[ 3 ];\n\n\tmorphedNormal += normal;\n\n#endif",o.ShaderChunk.envmap_pars_fragment="#ifdef USE_ENVMAP\n\n\tuniform float reflectivity;\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tuniform samplerCube envMap;\n\t#else\n\t\tuniform sampler2D envMap;\n\t#endif\n\tuniform float flipEnvMap;\n\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\n\t\tuniform float refractionRatio;\n\n\t#else\n\n\t\tvarying vec3 vReflect;\n\n\t#endif\n\n#endif\n",o.ShaderChunk.logdepthbuf_fragment="#if defined(USE_LOGDEPTHBUF) && defined(USE_LOGDEPTHBUF_EXT)\n\n\tgl_FragDepthEXT = log2(vFragDepth) * logDepthBufFC * 0.5;\n\n#endif",o.ShaderChunk.normalmap_pars_fragment="#ifdef USE_NORMALMAP\n\n\tuniform sampler2D normalMap;\n\tuniform vec2 normalScale;\n\n\t// Per-Pixel Tangent Space Normal Mapping\n\t// http://hacksoflife.blogspot.ch/2009/11/per-pixel-tangent-space-normal-mapping.html\n\n\tvec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm ) {\n\n\t\tvec3 q0 = dFdx( eye_pos.xyz );\n\t\tvec3 q1 = dFdy( eye_pos.xyz );\n\t\tvec2 st0 = dFdx( vUv.st );\n\t\tvec2 st1 = dFdy( vUv.st );\n\n\t\tvec3 S = normalize( q0 * st1.t - q1 * st0.t );\n\t\tvec3 T = normalize( -q0 * st1.s + q1 * st0.s );\n\t\tvec3 N = normalize( surf_norm );\n\n\t\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\t\tmapN.xy = normalScale * mapN.xy;\n\t\tmat3 tsn = mat3( S, T, N );\n\t\treturn normalize( tsn * mapN );\n\n\t}\n\n#endif\n",o.ShaderChunk.lights_phong_pars_vertex="#if MAX_SPOT_LIGHTS > 0 || defined( USE_BUMPMAP ) || defined( USE_ENVMAP )\n\n\tvarying vec3 vWorldPosition;\n\n#endif\n",o.ShaderChunk.lightmap_pars_fragment="#ifdef USE_LIGHTMAP\n\n\tvarying vec2 vUv2;\n\tuniform sampler2D lightMap;\n\n#endif",o.ShaderChunk.shadowmap_vertex="#ifdef USE_SHADOWMAP\n\n\tfor( int i = 0; i < MAX_SHADOWS; i ++ ) {\n\n\t\tvShadowCoord[ i ] = shadowMatrix[ i ] * worldPosition;\n\n\t}\n\n#endif",o.ShaderChunk.lights_phong_vertex="#if MAX_SPOT_LIGHTS > 0 || defined( USE_BUMPMAP ) || defined( USE_ENVMAP )\n\n\tvWorldPosition = worldPosition.xyz;\n\n#endif",o.ShaderChunk.map_fragment="#ifdef USE_MAP\n\n\tvec4 texelColor = texture2D( map, vUv );\n\n\ttexelColor.xyz = inputToLinear( texelColor.xyz );\n\n\tdiffuseColor *= texelColor;\n\n#endif",o.ShaderChunk.lightmap_vertex="#ifdef USE_LIGHTMAP\n\n\tvUv2 = uv2;\n\n#endif",o.ShaderChunk.map_particle_fragment="#ifdef USE_MAP\n\n\tdiffuseColor *= texture2D( map, vec2( gl_PointCoord.x, 1.0 - gl_PointCoord.y ) * offsetRepeat.zw + offsetRepeat.xy );\n\n#endif\n",o.ShaderChunk.color_pars_fragment="#ifdef USE_COLOR\n\n\tvarying vec3 vColor;\n\n#endif\n",o.ShaderChunk.color_vertex="#ifdef USE_COLOR\n\n\tvColor.xyz = inputToLinear( color.xyz );\n\n#endif",o.ShaderChunk.skinning_vertex="#ifdef USE_SKINNING\n\n\t#ifdef USE_MORPHTARGETS\n\n\tvec4 skinVertex = bindMatrix * vec4( morphed, 1.0 );\n\n\t#else\n\n\tvec4 skinVertex = bindMatrix * vec4( position, 1.0 );\n\n\t#endif\n\n\tvec4 skinned = vec4( 0.0 );\n\tskinned += boneMatX * skinVertex * skinWeight.x;\n\tskinned += boneMatY * skinVertex * skinWeight.y;\n\tskinned += boneMatZ * skinVertex * skinWeight.z;\n\tskinned += boneMatW * skinVertex * skinWeight.w;\n\tskinned = bindMatrixInverse * skinned;\n\n#endif\n",o.ShaderChunk.envmap_pars_vertex="#if defined( USE_ENVMAP ) && ! defined( USE_BUMPMAP ) && ! defined( USE_NORMALMAP ) && ! defined( PHONG )\n\n\tvarying vec3 vReflect;\n\n\tuniform float refractionRatio;\n\n#endif\n",o.ShaderChunk.linear_to_gamma_fragment="\n\toutgoingLight = linearToOutput( outgoingLight );\n",o.ShaderChunk.color_pars_vertex="#ifdef USE_COLOR\n\n\tvarying vec3 vColor;\n\n#endif",o.ShaderChunk.lights_lambert_pars_vertex="uniform vec3 ambientLightColor;\n\n#if MAX_DIR_LIGHTS > 0\n\n\tuniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];\n\tuniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];\n\n#endif\n\n#if MAX_HEMI_LIGHTS > 0\n\n\tuniform vec3 hemisphereLightSkyColor[ MAX_HEMI_LIGHTS ];\n\tuniform vec3 hemisphereLightGroundColor[ MAX_HEMI_LIGHTS ];\n\tuniform vec3 hemisphereLightDirection[ MAX_HEMI_LIGHTS ];\n\n#endif\n\n#if MAX_POINT_LIGHTS > 0\n\n\tuniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];\n\tuniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\n\tuniform float pointLightDistance[ MAX_POINT_LIGHTS ];\n\tuniform float pointLightDecay[ MAX_POINT_LIGHTS ];\n\n#endif\n\n#if MAX_SPOT_LIGHTS > 0\n\n\tuniform vec3 spotLightColor[ MAX_SPOT_LIGHTS ];\n\tuniform vec3 spotLightPosition[ MAX_SPOT_LIGHTS ];\n\tuniform vec3 spotLightDirection[ MAX_SPOT_LIGHTS ];\n\tuniform float spotLightDistance[ MAX_SPOT_LIGHTS ];\n\tuniform float spotLightAngleCos[ MAX_SPOT_LIGHTS ];\n\tuniform float spotLightExponent[ MAX_SPOT_LIGHTS ];\n\tuniform float spotLightDecay[ MAX_SPOT_LIGHTS ];\n\n#endif\n\n#ifdef WRAP_AROUND\n\n\tuniform vec3 wrapRGB;\n\n#endif\n",o.ShaderChunk.map_pars_vertex="#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP )\n\n\tvarying vec2 vUv;\n\tuniform vec4 offsetRepeat;\n\n#endif\n",o.ShaderChunk.envmap_fragment="#ifdef USE_ENVMAP\n\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\n\t\tvec3 cameraToVertex = normalize( vWorldPosition - cameraPosition );\n\n\t\t// Transforming Normal Vectors with the Inverse Transformation\n\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\n\t\t\tvec3 reflectVec = reflect( cameraToVertex, worldNormal );\n\n\t\t#else\n\n\t\t\tvec3 reflectVec = refract( cameraToVertex, worldNormal, refractionRatio );\n\n\t\t#endif\n\n\t#else\n\n\t\tvec3 reflectVec = vReflect;\n\n\t#endif\n\n\t#ifdef DOUBLE_SIDED\n\t\tfloat flipNormal = ( -1.0 + 2.0 * float( gl_FrontFacing ) );\n\t#else\n\t\tfloat flipNormal = 1.0;\n\t#endif\n\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 envColor = textureCube( envMap, flipNormal * vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\n\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\tvec2 sampleUV;\n\t\tsampleUV.y = saturate( flipNormal * reflectVec.y * 0.5 + 0.5 );\n\t\tsampleUV.x = atan( flipNormal * reflectVec.z, flipNormal * reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\n\t\tvec4 envColor = texture2D( envMap, sampleUV );\n\n\t#elif defined( ENVMAP_TYPE_SPHERE )\n\t\tvec3 reflectView = flipNormal * normalize((viewMatrix * vec4( reflectVec, 0.0 )).xyz + vec3(0.0,0.0,1.0));\n\t\tvec4 envColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5 );\n\t#endif\n\n\tenvColor.xyz = inputToLinear( envColor.xyz );\n\n\t#ifdef ENVMAP_BLENDING_MULTIPLY\n\n\t\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n\n\t#elif defined( ENVMAP_BLENDING_MIX )\n\n\t\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n\n\t#elif defined( ENVMAP_BLENDING_ADD )\n\n\t\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\n\n\t#endif\n\n#endif\n",o.ShaderChunk.specularmap_pars_fragment="#ifdef USE_SPECULARMAP\n\n\tuniform sampler2D specularMap;\n\n#endif",o.ShaderChunk.logdepthbuf_vertex="#ifdef USE_LOGDEPTHBUF\n\n\tgl_Position.z = log2(max( EPSILON, gl_Position.w + 1.0 )) * logDepthBufFC;\n\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\n\t\tvFragDepth = 1.0 + gl_Position.w;\n\n#else\n\n\t\tgl_Position.z = (gl_Position.z - 1.0) * gl_Position.w;\n\n\t#endif\n\n#endif",o.ShaderChunk.morphtarget_pars_vertex="#ifdef USE_MORPHTARGETS\n\n\t#ifndef USE_MORPHNORMALS\n\n\tuniform float morphTargetInfluences[ 8 ];\n\n\t#else\n\n\tuniform float morphTargetInfluences[ 4 ];\n\n\t#endif\n\n#endif",o.ShaderChunk.specularmap_fragment="float specularStrength;\n\n#ifdef USE_SPECULARMAP\n\n\tvec4 texelSpecular = texture2D( specularMap, vUv );\n\tspecularStrength = texelSpecular.r;\n\n#else\n\n\tspecularStrength = 1.0;\n\n#endif",o.ShaderChunk.fog_fragment="#ifdef USE_FOG\n\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\n\t\tfloat depth = gl_FragDepthEXT / gl_FragCoord.w;\n\n\t#else\n\n\t\tfloat depth = gl_FragCoord.z / gl_FragCoord.w;\n\n\t#endif\n\n\t#ifdef FOG_EXP2\n\n\t\tfloat fogFactor = exp2( - square( fogDensity ) * square( depth ) * LOG2 );\n\t\tfogFactor = whiteCompliment( fogFactor );\n\n\t#else\n\n\t\tfloat fogFactor = smoothstep( fogNear, fogFar, depth );\n\n\t#endif\n\t\n\toutgoingLight = mix( outgoingLight, fogColor, fogFactor );\n\n#endif",o.ShaderChunk.bumpmap_pars_fragment="#ifdef USE_BUMPMAP\n\n\tuniform sampler2D bumpMap;\n\tuniform float bumpScale;\n\n\t// Derivative maps - bump mapping unparametrized surfaces by Morten Mikkelsen\n\t// http://mmikkelsen3d.blogspot.sk/2011/07/derivative-maps.html\n\n\t// Evaluate the derivative of the height w.r.t. screen-space using forward differencing (listing 2)\n\n\tvec2 dHdxy_fwd() {\n\n\t\tvec2 dSTdx = dFdx( vUv );\n\t\tvec2 dSTdy = dFdy( vUv );\n\n\t\tfloat Hll = bumpScale * texture2D( bumpMap, vUv ).x;\n\t\tfloat dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;\n\t\tfloat dBy = bumpScale * texture2D( bumpMap, vUv + dSTdy ).x - Hll;\n\n\t\treturn vec2( dBx, dBy );\n\n\t}\n\n\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy ) {\n\n\t\tvec3 vSigmaX = dFdx( surf_pos );\n\t\tvec3 vSigmaY = dFdy( surf_pos );\n\t\tvec3 vN = surf_norm;\t\t// normalized\n\n\t\tvec3 R1 = cross( vSigmaY, vN );\n\t\tvec3 R2 = cross( vN, vSigmaX );\n\n\t\tfloat fDet = dot( vSigmaX, R1 );\n\n\t\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\n\t\treturn normalize( abs( fDet ) * surf_norm - vGrad );\n\n\t}\n\n#endif\n",o.ShaderChunk.defaultnormal_vertex="#ifdef USE_SKINNING\n\n\tvec3 objectNormal = skinnedNormal.xyz;\n\n#elif defined( USE_MORPHNORMALS )\n\n\tvec3 objectNormal = morphedNormal;\n\n#else\n\n\tvec3 objectNormal = normal;\n\n#endif\n\n#ifdef FLIP_SIDED\n\n\tobjectNormal = -objectNormal;\n\n#endif\n\nvec3 transformedNormal = normalMatrix * objectNormal;\n",o.ShaderChunk.lights_phong_pars_fragment="uniform vec3 ambientLightColor;\n\n#if MAX_DIR_LIGHTS > 0\n\n\tuniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];\n\tuniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];\n\n#endif\n\n#if MAX_HEMI_LIGHTS > 0\n\n\tuniform vec3 hemisphereLightSkyColor[ MAX_HEMI_LIGHTS ];\n\tuniform vec3 hemisphereLightGroundColor[ MAX_HEMI_LIGHTS ];\n\tuniform vec3 hemisphereLightDirection[ MAX_HEMI_LIGHTS ];\n\n#endif\n\n#if MAX_POINT_LIGHTS > 0\n\n\tuniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];\n\n\tuniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\n\tuniform float pointLightDistance[ MAX_POINT_LIGHTS ];\n\tuniform float pointLightDecay[ MAX_POINT_LIGHTS ];\n\n#endif\n\n#if MAX_SPOT_LIGHTS > 0\n\n\tuniform vec3 spotLightColor[ MAX_SPOT_LIGHTS ];\n\tuniform vec3 spotLightPosition[ MAX_SPOT_LIGHTS ];\n\tuniform vec3 spotLightDirection[ MAX_SPOT_LIGHTS ];\n\tuniform float spotLightAngleCos[ MAX_SPOT_LIGHTS ];\n\tuniform float spotLightExponent[ MAX_SPOT_LIGHTS ];\n\tuniform float spotLightDistance[ MAX_SPOT_LIGHTS ];\n\tuniform float spotLightDecay[ MAX_SPOT_LIGHTS ];\n\n#endif\n\n#if MAX_SPOT_LIGHTS > 0 || defined( USE_BUMPMAP ) || defined( USE_ENVMAP )\n\n\tvarying vec3 vWorldPosition;\n\n#endif\n\n#ifdef WRAP_AROUND\n\n\tuniform vec3 wrapRGB;\n\n#endif\n\nvarying vec3 vViewPosition;\n\n#ifndef FLAT_SHADED\n\n\tvarying vec3 vNormal;\n\n#endif\n",o.ShaderChunk.skinbase_vertex="#ifdef USE_SKINNING\n\n\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\n\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\n\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\n\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\n\n#endif",o.ShaderChunk.map_vertex="#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP )\n\n\tvUv = uv * offsetRepeat.zw + offsetRepeat.xy;\n\n#endif",o.ShaderChunk.lightmap_fragment="#ifdef USE_LIGHTMAP\n\n\toutgoingLight *= diffuseColor.xyz * texture2D( lightMap, vUv2 ).xyz;\n\n#endif",o.ShaderChunk.shadowmap_pars_vertex="#ifdef USE_SHADOWMAP\n\n\tvarying vec4 vShadowCoord[ MAX_SHADOWS ];\n\tuniform mat4 shadowMatrix[ MAX_SHADOWS ];\n\n#endif",o.ShaderChunk.color_fragment="#ifdef USE_COLOR\n\n\tdiffuseColor.rgb *= vColor;\n\n#endif",o.ShaderChunk.morphtarget_vertex="#ifdef USE_MORPHTARGETS\n\n\tvec3 morphed = vec3( 0.0 );\n\tmorphed += ( morphTarget0 - position ) * morphTargetInfluences[ 0 ];\n\tmorphed += ( morphTarget1 - position ) * morphTargetInfluences[ 1 ];\n\tmorphed += ( morphTarget2 - position ) * morphTargetInfluences[ 2 ];\n\tmorphed += ( morphTarget3 - position ) * morphTargetInfluences[ 3 ];\n\n\t#ifndef USE_MORPHNORMALS\n\n\tmorphed += ( morphTarget4 - position ) * morphTargetInfluences[ 4 ];\n\tmorphed += ( morphTarget5 - position ) * morphTargetInfluences[ 5 ];\n\tmorphed += ( morphTarget6 - position ) * morphTargetInfluences[ 6 ];\n\tmorphed += ( morphTarget7 - position ) * morphTargetInfluences[ 7 ];\n\n\t#endif\n\n\tmorphed += position;\n\n#endif",o.ShaderChunk.envmap_vertex="#if defined( USE_ENVMAP ) && ! defined( USE_BUMPMAP ) && ! defined( USE_NORMALMAP ) && ! defined( PHONG )\n\n\tvec3 worldNormal = transformDirection( objectNormal, modelMatrix );\n\n\tvec3 cameraToVertex = normalize( worldPosition.xyz - cameraPosition );\n\n\t#ifdef ENVMAP_MODE_REFLECTION\n\n\t\tvReflect = reflect( cameraToVertex, worldNormal );\n\n\t#else\n\n\t\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\n\n\t#endif\n\n#endif\n",o.ShaderChunk.shadowmap_fragment="#ifdef USE_SHADOWMAP\n\n\t#ifdef SHADOWMAP_DEBUG\n\n\t\tvec3 frustumColors[3];\n\t\tfrustumColors[0] = vec3( 1.0, 0.5, 0.0 );\n\t\tfrustumColors[1] = vec3( 0.0, 1.0, 0.8 );\n\t\tfrustumColors[2] = vec3( 0.0, 0.5, 1.0 );\n\n\t#endif\n\n\t#ifdef SHADOWMAP_CASCADE\n\n\t\tint inFrustumCount = 0;\n\n\t#endif\n\n\tfloat fDepth;\n\tvec3 shadowColor = vec3( 1.0 );\n\n\tfor( int i = 0; i < MAX_SHADOWS; i ++ ) {\n\n\t\tvec3 shadowCoord = vShadowCoord[ i ].xyz / vShadowCoord[ i ].w;\n\n\t\t\t\t// if ( something && something ) breaks ATI OpenGL shader compiler\n\t\t\t\t// if ( all( something, something ) ) using this instead\n\n\t\tbvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\n\t\tbool inFrustum = all( inFrustumVec );\n\n\t\t\t\t// don't shadow pixels outside of light frustum\n\t\t\t\t// use just first frustum (for cascades)\n\t\t\t\t// don't shadow pixels behind far plane of light frustum\n\n\t\t#ifdef SHADOWMAP_CASCADE\n\n\t\t\tinFrustumCount += int( inFrustum );\n\t\t\tbvec3 frustumTestVec = bvec3( inFrustum, inFrustumCount == 1, shadowCoord.z <= 1.0 );\n\n\t\t#else\n\n\t\t\tbvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\n\n\t\t#endif\n\n\t\tbool frustumTest = all( frustumTestVec );\n\n\t\tif ( frustumTest ) {\n\n\t\t\tshadowCoord.z += shadowBias[ i ];\n\n\t\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\n\t\t\t\t\t\t// Percentage-close filtering\n\t\t\t\t\t\t// (9 pixel kernel)\n\t\t\t\t\t\t// http://fabiensanglard.net/shadowmappingPCF/\n\n\t\t\t\tfloat shadow = 0.0;\n\n\t\t/*\n\t\t\t\t\t\t// nested loops breaks shader compiler / validator on some ATI cards when using OpenGL\n\t\t\t\t\t\t// must enroll loop manually\n\n\t\t\t\tfor ( float y = -1.25; y <= 1.25; y += 1.25 )\n\t\t\t\t\tfor ( float x = -1.25; x <= 1.25; x += 1.25 ) {\n\n\t\t\t\t\t\tvec4 rgbaDepth = texture2D( shadowMap[ i ], vec2( x * xPixelOffset, y * yPixelOffset ) + shadowCoord.xy );\n\n\t\t\t\t\t\t\t\t// doesn't seem to produce any noticeable visual difference compared to simple texture2D lookup\n\t\t\t\t\t\t\t\t//vec4 rgbaDepth = texture2DProj( shadowMap[ i ], vec4( vShadowCoord[ i ].w * ( vec2( x * xPixelOffset, y * yPixelOffset ) + shadowCoord.xy ), 0.05, vShadowCoord[ i ].w ) );\n\n\t\t\t\t\t\tfloat fDepth = unpackDepth( rgbaDepth );\n\n\t\t\t\t\t\tif ( fDepth < shadowCoord.z )\n\t\t\t\t\t\t\tshadow += 1.0;\n\n\t\t\t\t}\n\n\t\t\t\tshadow /= 9.0;\n\n\t\t*/\n\n\t\t\t\tconst float shadowDelta = 1.0 / 9.0;\n\n\t\t\t\tfloat xPixelOffset = 1.0 / shadowMapSize[ i ].x;\n\t\t\t\tfloat yPixelOffset = 1.0 / shadowMapSize[ i ].y;\n\n\t\t\t\tfloat dx0 = -1.25 * xPixelOffset;\n\t\t\t\tfloat dy0 = -1.25 * yPixelOffset;\n\t\t\t\tfloat dx1 = 1.25 * xPixelOffset;\n\t\t\t\tfloat dy1 = 1.25 * yPixelOffset;\n\n\t\t\t\tfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy0 ) ) );\n\t\t\t\tif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\n\n\t\t\t\tfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy0 ) ) );\n\t\t\t\tif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\n\n\t\t\t\tfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy0 ) ) );\n\t\t\t\tif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\n\n\t\t\t\tfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, 0.0 ) ) );\n\t\t\t\tif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\n\n\t\t\t\tfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy ) );\n\t\t\t\tif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\n\n\t\t\t\tfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, 0.0 ) ) );\n\t\t\t\tif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\n\n\t\t\t\tfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy1 ) ) );\n\t\t\t\tif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\n\n\t\t\t\tfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy1 ) ) );\n\t\t\t\tif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\n\n\t\t\t\tfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy1 ) ) );\n\t\t\t\tif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\n\n\t\t\t\tshadowColor = shadowColor * vec3( ( 1.0 - shadowDarkness[ i ] * shadow ) );\n\n\t\t\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\n\n\t\t\t\t\t\t// Percentage-close filtering\n\t\t\t\t\t\t// (9 pixel kernel)\n\t\t\t\t\t\t// http://fabiensanglard.net/shadowmappingPCF/\n\n\t\t\t\tfloat shadow = 0.0;\n\n\t\t\t\tfloat xPixelOffset = 1.0 / shadowMapSize[ i ].x;\n\t\t\t\tfloat yPixelOffset = 1.0 / shadowMapSize[ i ].y;\n\n\t\t\t\tfloat dx0 = -1.0 * xPixelOffset;\n\t\t\t\tfloat dy0 = -1.0 * yPixelOffset;\n\t\t\t\tfloat dx1 = 1.0 * xPixelOffset;\n\t\t\t\tfloat dy1 = 1.0 * yPixelOffset;\n\n\t\t\t\tmat3 shadowKernel;\n\t\t\t\tmat3 depthKernel;\n\n\t\t\t\tdepthKernel[0][0] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy0 ) ) );\n\t\t\t\tdepthKernel[0][1] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, 0.0 ) ) );\n\t\t\t\tdepthKernel[0][2] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy1 ) ) );\n\t\t\t\tdepthKernel[1][0] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy0 ) ) );\n\t\t\t\tdepthKernel[1][1] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy ) );\n\t\t\t\tdepthKernel[1][2] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy1 ) ) );\n\t\t\t\tdepthKernel[2][0] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy0 ) ) );\n\t\t\t\tdepthKernel[2][1] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, 0.0 ) ) );\n\t\t\t\tdepthKernel[2][2] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy1 ) ) );\n\n\t\t\t\tvec3 shadowZ = vec3( shadowCoord.z );\n\t\t\t\tshadowKernel[0] = vec3(lessThan(depthKernel[0], shadowZ ));\n\t\t\t\tshadowKernel[0] *= vec3(0.25);\n\n\t\t\t\tshadowKernel[1] = vec3(lessThan(depthKernel[1], shadowZ ));\n\t\t\t\tshadowKernel[1] *= vec3(0.25);\n\n\t\t\t\tshadowKernel[2] = vec3(lessThan(depthKernel[2], shadowZ ));\n\t\t\t\tshadowKernel[2] *= vec3(0.25);\n\n\t\t\t\tvec2 fractionalCoord = 1.0 - fract( shadowCoord.xy * shadowMapSize[i].xy );\n\n\t\t\t\tshadowKernel[0] = mix( shadowKernel[1], shadowKernel[0], fractionalCoord.x );\n\t\t\t\tshadowKernel[1] = mix( shadowKernel[2], shadowKernel[1], fractionalCoord.x );\n\n\t\t\t\tvec4 shadowValues;\n\t\t\t\tshadowValues.x = mix( shadowKernel[0][1], shadowKernel[0][0], fractionalCoord.y );\n\t\t\t\tshadowValues.y = mix( shadowKernel[0][2], shadowKernel[0][1], fractionalCoord.y );\n\t\t\t\tshadowValues.z = mix( shadowKernel[1][1], shadowKernel[1][0], fractionalCoord.y );\n\t\t\t\tshadowValues.w = mix( shadowKernel[1][2], shadowKernel[1][1], fractionalCoord.y );\n\n\t\t\t\tshadow = dot( shadowValues, vec4( 1.0 ) );\n\n\t\t\t\tshadowColor = shadowColor * vec3( ( 1.0 - shadowDarkness[ i ] * shadow ) );\n\n\t\t\t#else\n\n\t\t\t\tvec4 rgbaDepth = texture2D( shadowMap[ i ], shadowCoord.xy );\n\t\t\t\tfloat fDepth = unpackDepth( rgbaDepth );\n\n\t\t\t\tif ( fDepth < shadowCoord.z )\n\n\t\t// spot with multiple shadows is darker\n\n\t\t\t\t\tshadowColor = shadowColor * vec3( 1.0 - shadowDarkness[ i ] );\n\n\t\t// spot with multiple shadows has the same color as single shadow spot\n\n\t\t// \t\t\t\t\tshadowColor = min( shadowColor, vec3( shadowDarkness[ i ] ) );\n\n\t\t\t#endif\n\n\t\t}\n\n\n\t\t#ifdef SHADOWMAP_DEBUG\n\n\t\t\t#ifdef SHADOWMAP_CASCADE\n\n\t\t\t\tif ( inFrustum && inFrustumCount == 1 ) outgoingLight *= frustumColors[ i ];\n\n\t\t\t#else\n\n\t\t\t\tif ( inFrustum ) outgoingLight *= frustumColors[ i ];\n\n\t\t\t#endif\n\n\t\t#endif\n\n\t}\n\n\t// NOTE: I am unsure if this is correct in linear space. -bhouston, Dec 29, 2014\n\tshadowColor = inputToLinear( shadowColor );\n\n\toutgoingLight = outgoingLight * shadowColor;\n\n#endif\n",o.ShaderChunk.worldpos_vertex="#if defined( USE_ENVMAP ) || defined( PHONG ) || defined( LAMBERT ) || defined ( USE_SHADOWMAP )\n\n\t#ifdef USE_SKINNING\n\n\t\tvec4 worldPosition = modelMatrix * skinned;\n\n\t#elif defined( USE_MORPHTARGETS )\n\n\t\tvec4 worldPosition = modelMatrix * vec4( morphed, 1.0 );\n\n\t#else\n\n\t\tvec4 worldPosition = modelMatrix * vec4( position, 1.0 );\n\n\t#endif\n\n#endif\n",o.ShaderChunk.shadowmap_pars_fragment="#ifdef USE_SHADOWMAP\n\n\tuniform sampler2D shadowMap[ MAX_SHADOWS ];\n\tuniform vec2 shadowMapSize[ MAX_SHADOWS ];\n\n\tuniform float shadowDarkness[ MAX_SHADOWS ];\n\tuniform float shadowBias[ MAX_SHADOWS ];\n\n\tvarying vec4 vShadowCoord[ MAX_SHADOWS ];\n\n\tfloat unpackDepth( const in vec4 rgba_depth ) {\n\n\t\tconst vec4 bit_shift = vec4( 1.0 / ( 256.0 * 256.0 * 256.0 ), 1.0 / ( 256.0 * 256.0 ), 1.0 / 256.0, 1.0 );\n\t\tfloat depth = dot( rgba_depth, bit_shift );\n\t\treturn depth;\n\n\t}\n\n#endif",o.ShaderChunk.skinning_pars_vertex="#ifdef USE_SKINNING\n\n\tuniform mat4 bindMatrix;\n\tuniform mat4 bindMatrixInverse;\n\n\t#ifdef BONE_TEXTURE\n\n\t\tuniform sampler2D boneTexture;\n\t\tuniform int boneTextureWidth;\n\t\tuniform int boneTextureHeight;\n\n\t\tmat4 getBoneMatrix( const in float i ) {\n\n\t\t\tfloat j = i * 4.0;\n\t\t\tfloat x = mod( j, float( boneTextureWidth ) );\n\t\t\tfloat y = floor( j / float( boneTextureWidth ) );\n\n\t\t\tfloat dx = 1.0 / float( boneTextureWidth );\n\t\t\tfloat dy = 1.0 / float( boneTextureHeight );\n\n\t\t\ty = dy * ( y + 0.5 );\n\n\t\t\tvec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\n\t\t\tvec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\n\t\t\tvec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\n\t\t\tvec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\n\n\t\t\tmat4 bone = mat4( v1, v2, v3, v4 );\n\n\t\t\treturn bone;\n\n\t\t}\n\n\t#else\n\n\t\tuniform mat4 boneGlobalMatrices[ MAX_BONES ];\n\n\t\tmat4 getBoneMatrix( const in float i ) {\n\n\t\t\tmat4 bone = boneGlobalMatrices[ int(i) ];\n\t\t\treturn bone;\n\n\t\t}\n\n\t#endif\n\n#endif\n",o.ShaderChunk.logdepthbuf_pars_fragment="#ifdef USE_LOGDEPTHBUF\n\n\tuniform float logDepthBufFC;\n\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\n\t\t#extension GL_EXT_frag_depth : enable\n\t\tvarying float vFragDepth;\n\n\t#endif\n\n#endif",o.ShaderChunk.alphamap_fragment="#ifdef USE_ALPHAMAP\n\n\tdiffuseColor.a *= texture2D( alphaMap, vUv ).g;\n\n#endif\n",o.ShaderChunk.alphamap_pars_fragment="#ifdef USE_ALPHAMAP\n\n\tuniform sampler2D alphaMap;\n\n#endif\n",o.UniformsUtils={merge:function(e){for(var t={},n=0;n dashSize ) {","\t\tdiscard;","\t}","\tvec3 outgoingLight = vec3( 0.0 );","\tvec4 diffuseColor = vec4( diffuse, opacity );",o.ShaderChunk.logdepthbuf_fragment,o.ShaderChunk.color_fragment,"\toutgoingLight = diffuseColor.rgb;",o.ShaderChunk.fog_fragment,"\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );","}"].join("\n")},depth:{uniforms:{mNear:{type:"f",value:1},mFar:{type:"f",value:2e3},opacity:{type:"f",value:1}},vertexShader:[o.ShaderChunk.common,o.ShaderChunk.morphtarget_pars_vertex,o.ShaderChunk.logdepthbuf_pars_vertex,"void main() {",o.ShaderChunk.morphtarget_vertex,o.ShaderChunk.default_vertex,o.ShaderChunk.logdepthbuf_vertex,"}"].join("\n"),fragmentShader:["uniform float mNear;","uniform float mFar;","uniform float opacity;",o.ShaderChunk.common,o.ShaderChunk.logdepthbuf_pars_fragment,"void main() {",o.ShaderChunk.logdepthbuf_fragment,"\t#ifdef USE_LOGDEPTHBUF_EXT","\t\tfloat depth = gl_FragDepthEXT / gl_FragCoord.w;","\t#else","\t\tfloat depth = gl_FragCoord.z / gl_FragCoord.w;","\t#endif","\tfloat color = 1.0 - smoothstep( mNear, mFar, depth );","\tgl_FragColor = vec4( vec3( color ), opacity );","}"].join("\n")},normal:{uniforms:{opacity:{type:"f",value:1}},vertexShader:["varying vec3 vNormal;",o.ShaderChunk.common,o.ShaderChunk.morphtarget_pars_vertex,o.ShaderChunk.logdepthbuf_pars_vertex,"void main() {","\tvNormal = normalize( normalMatrix * normal );",o.ShaderChunk.morphtarget_vertex,o.ShaderChunk.default_vertex,o.ShaderChunk.logdepthbuf_vertex,"}"].join("\n"),fragmentShader:["uniform float opacity;","varying vec3 vNormal;",o.ShaderChunk.common,o.ShaderChunk.logdepthbuf_pars_fragment,"void main() {","\tgl_FragColor = vec4( 0.5 * normalize( vNormal ) + 0.5, opacity );",o.ShaderChunk.logdepthbuf_fragment,"}"].join("\n")},cube:{uniforms:{tCube:{type:"t",value:null},tFlip:{type:"f",value:-1}},vertexShader:["varying vec3 vWorldPosition;",o.ShaderChunk.common,o.ShaderChunk.logdepthbuf_pars_vertex,"void main() {","\tvWorldPosition = transformDirection( position, modelMatrix );","\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",o.ShaderChunk.logdepthbuf_vertex,"}"].join("\n"),fragmentShader:["uniform samplerCube tCube;","uniform float tFlip;","varying vec3 vWorldPosition;",o.ShaderChunk.common,o.ShaderChunk.logdepthbuf_pars_fragment,"void main() {","\tgl_FragColor = textureCube( tCube, vec3( tFlip * vWorldPosition.x, vWorldPosition.yz ) );",o.ShaderChunk.logdepthbuf_fragment,"}"].join("\n")},equirect:{uniforms:{tEquirect:{type:"t",value:null},tFlip:{type:"f",value:-1}},vertexShader:["varying vec3 vWorldPosition;",o.ShaderChunk.common,o.ShaderChunk.logdepthbuf_pars_vertex,"void main() {","\tvWorldPosition = transformDirection( position, modelMatrix );","\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",o.ShaderChunk.logdepthbuf_vertex,"}"].join("\n"),fragmentShader:["uniform sampler2D tEquirect;","uniform float tFlip;","varying vec3 vWorldPosition;",o.ShaderChunk.common,o.ShaderChunk.logdepthbuf_pars_fragment,"void main() {","vec3 direction = normalize( vWorldPosition );","vec2 sampleUV;","sampleUV.y = saturate( tFlip * direction.y * -0.5 + 0.5 );","sampleUV.x = atan( direction.z, direction.x ) * RECIPROCAL_PI2 + 0.5;","gl_FragColor = texture2D( tEquirect, sampleUV );",o.ShaderChunk.logdepthbuf_fragment,"}"].join("\n")},depthRGBA:{uniforms:{},vertexShader:[o.ShaderChunk.common,o.ShaderChunk.morphtarget_pars_vertex,o.ShaderChunk.skinning_pars_vertex,o.ShaderChunk.logdepthbuf_pars_vertex,"void main() {",o.ShaderChunk.skinbase_vertex,o.ShaderChunk.morphtarget_vertex,o.ShaderChunk.skinning_vertex,o.ShaderChunk.default_vertex,o.ShaderChunk.logdepthbuf_vertex,"}"].join("\n"),fragmentShader:[o.ShaderChunk.common,o.ShaderChunk.logdepthbuf_pars_fragment,"vec4 pack_depth( const in float depth ) {","\tconst vec4 bit_shift = vec4( 256.0 * 256.0 * 256.0, 256.0 * 256.0, 256.0, 1.0 );","\tconst vec4 bit_mask = vec4( 0.0, 1.0 / 256.0, 1.0 / 256.0, 1.0 / 256.0 );","\tvec4 res = mod( depth * bit_shift * vec4( 255 ), vec4( 256 ) ) / vec4( 255 );","\tres -= res.xxyz * bit_mask;","\treturn res;","}","void main() {",o.ShaderChunk.logdepthbuf_fragment,"\t#ifdef USE_LOGDEPTHBUF_EXT","\t\tgl_FragData[ 0 ] = pack_depth( gl_FragDepthEXT );","\t#else","\t\tgl_FragData[ 0 ] = pack_depth( gl_FragCoord.z );","\t#endif","}"].join("\n")}},o.WebGLRenderer=function(e){function t(e){e.__webglVertexBuffer=Re.createBuffer(),e.__webglColorBuffer=Re.createBuffer(),De.info.memory.geometries++}function n(e){e.__webglVertexBuffer=Re.createBuffer(),e.__webglColorBuffer=Re.createBuffer(),e.__webglLineDistanceBuffer=Re.createBuffer(),De.info.memory.geometries++}function r(e){e.__webglVertexBuffer=Re.createBuffer(),e.__webglNormalBuffer=Re.createBuffer(),e.__webglTangentBuffer=Re.createBuffer(),e.__webglColorBuffer=Re.createBuffer(),e.__webglUVBuffer=Re.createBuffer(),e.__webglUV2Buffer=Re.createBuffer(),e.__webglSkinIndicesBuffer=Re.createBuffer(),e.__webglSkinWeightsBuffer=Re.createBuffer(),e.__webglFaceBuffer=Re.createBuffer(),e.__webglLineBuffer=Re.createBuffer();var t=e.numMorphTargets;if(t){e.__webglMorphTargetsBuffers=[];for(var n=0,r=t;n1&&(e.__uv2Array=new Float32Array(2*o)),n.hasTangents&&(e.__tangentArray=new Float32Array(4*o)),t.geometry.skinWeights.length&&t.geometry.skinIndices.length&&(e.__skinIndexArray=new Float32Array(4*o),e.__skinWeightArray=new Float32Array(4*o));var u=null!==et.get("OES_element_index_uint")&&i>21845?Uint32Array:Uint16Array;e.__typeArray=u,e.__faceArray=new u(3*i),e.__lineArray=new u(2*a);var c=e.numMorphTargets;if(c){e.__morphTargetsArrays=[];for(var h=0,p=c;h0&&(Re.bindBuffer(Re.ARRAY_BUFFER,e.__webglSkinIndicesBuffer),Re.bufferData(Re.ARRAY_BUFFER,fe,n),Re.bindBuffer(Re.ARRAY_BUFFER,e.__webglSkinWeightsBuffer),Re.bufferData(Re.ARRAY_BUFFER,me,n))}if(Te){for(a=0,s=Pe.length;a0&&(Re.bindBuffer(Re.ARRAY_BUFFER,e.__webglColorBuffer),Re.bufferData(Re.ARRAY_BUFFER,de,n))}if(Se&&xe.hasTangents){for(a=0,s=Pe.length;a0&&(Re.bindBuffer(Re.ARRAY_BUFFER,e.__webglUVBuffer),Re.bufferData(Re.ARRAY_BUFFER,le,n))}if(Me&&Le){for(a=0,s=Pe.length;a0&&(Re.bindBuffer(Re.ARRAY_BUFFER,e.__webglUV2Buffer),Re.bufferData(Re.ARRAY_BUFFER,ce,n))}if(Ee){for(a=0,s=Pe.length;a=0){var h=o[l];if(void 0!==h){var p=h.itemSize;Re.bindBuffer(Re.ARRAY_BUFFER,h.buffer),$e.enableAttribute(c),Re.vertexAttribPointer(c,p,Re.FLOAT,!1,0,r*p*4)}else void 0!==e.defaultAttributeValues&&(2===e.defaultAttributeValues[l].length?Re.vertexAttrib2fv(c,e.defaultAttributeValues[l]):3===e.defaultAttributeValues[l].length&&Re.vertexAttrib3fv(c,e.defaultAttributeValues[l]))}}$e.disableUnusedAttributes()}function m(e,t,n){var r=e.program.attributes;if(n.morphTargetBase!==-1&&r.position>=0?(Re.bindBuffer(Re.ARRAY_BUFFER,t.__webglMorphTargetsBuffers[n.morphTargetBase]),$e.enableAttribute(r.position),Re.vertexAttribPointer(r.position,3,Re.FLOAT,!1,0,0)):r.position>=0&&(Re.bindBuffer(Re.ARRAY_BUFFER,t.__webglVertexBuffer),$e.enableAttribute(r.position),Re.vertexAttribPointer(r.position,3,Re.FLOAT,!1,0,0)),n.morphTargetForcedOrder.length)for(var o,i=0,a=n.morphTargetForcedOrder,s=n.morphTargetInfluences;i=0&&(Re.bindBuffer(Re.ARRAY_BUFFER,t.__webglMorphTargetsBuffers[a[i]]),$e.enableAttribute(o),Re.vertexAttribPointer(o,3,Re.FLOAT,!1,0,0)),o=r["morphNormal"+i],o>=0&&e.morphNormals&&(Re.bindBuffer(Re.ARRAY_BUFFER,t.__webglMorphNormalsBuffers[a[i]]),$e.enableAttribute(o),Re.vertexAttribPointer(o,3,Re.FLOAT,!1,0,0)),n.__webglMorphTargetInfluences[i]=s[a[i]],i++;else{var u=[],s=n.morphTargetInfluences,l=n.geometry.morphTargets;s.length>l.length&&(console.warn("THREE.WebGLRenderer: Influences array is bigger than morphTargets array."),s.length=l.length);for(var c=0,h=s.length;ce.numSupportedMorphTargets?(u.sort(y),u.length=e.numSupportedMorphTargets):u.length>e.numSupportedMorphNormals?u.sort(y):0===u.length&&u.push([0,0]);for(var o,i=0,d=e.numSupportedMorphTargets;i=0&&(Re.bindBuffer(Re.ARRAY_BUFFER,t.__webglMorphTargetsBuffers[f]),$e.enableAttribute(o),Re.vertexAttribPointer(o,3,Re.FLOAT,!1,0,0)),o=r["morphNormal"+i],o>=0&&e.morphNormals&&(Re.bindBuffer(Re.ARRAY_BUFFER,t.__webglMorphNormalsBuffers[f]),$e.enableAttribute(o),Re.vertexAttribPointer(o,3,Re.FLOAT,!1,0,0)),n.__webglMorphTargetInfluences[i]=s[f]}else n.__webglMorphTargetInfluences[i]=0}null!==e.program.uniforms.morphTargetInfluences&&Re.uniform1fv(e.program.uniforms.morphTargetInfluences,n.__webglMorphTargetInfluences)}function v(e,t){return e.object.renderOrder!==t.object.renderOrder?e.object.renderOrder-t.object.renderOrder:e.material.id!==t.material.id?e.material.id-t.material.id:e.z!==t.z?e.z-t.z:e.id-t.id}function g(e,t){return e.object.renderOrder!==t.object.renderOrder?e.object.renderOrder-t.object.renderOrder:e.z!==t.z?t.z-e.z:e.id-t.id}function y(e,t){return t[0]-e[0]}function _(e){if(e.visible!==!1){if(e instanceof o.Scene||e instanceof o.Group);else if(M(e),e instanceof o.Light)Me.push(e);else if(e instanceof o.Sprite)Ne.push(e);else if(e instanceof o.LensFlare)Pe.push(e);else{var t=Ce[e.id];if(t&&(e.frustumCulled===!1||qe.intersectsObject(e)===!0))for(var n=0,r=t.length;no&&(i[d].counter+=1,n=i[d].hash+"_"+i[d].counter,n in u||(r={id:Rt++,faces3:[],materialIndex:d,vertices:0,numMorphTargets:a,numMorphNormals:s},u[n]=r,l.push(r))),u[n].faces3.push(c),u[n].vertices+=3}return l}function S(e,t){var n=e.material,i=!1;void 0!==Pt[t.id]&&t.groupsNeedUpdate!==!0||(delete Ce[e.id],Pt[t.id]=C(t,n instanceof o.MeshFaceMaterial),t.groupsNeedUpdate=!1);for(var a=Pt[t.id],s=0,l=a.length;s=0;n--)e[n].object===t&&e.splice(n,1)}function L(e,t,n,r){e.addEventListener("dispose",Mt);var i=Dt[e.type];if(i){var a=o.ShaderLib[i];e.__webglShader={uniforms:o.UniformsUtils.clone(a.uniforms),vertexShader:a.vertexShader,fragmentShader:a.fragmentShader}}else e.__webglShader={uniforms:e.uniforms,vertexShader:e.vertexShader,fragmentShader:e.fragmentShader};var s=le(t),u=ce(t),l=ue(r),c={precision:fe,supportsVertexTextures:ut,map:!!e.map,envMap:!!e.envMap,envMapMode:e.envMap&&e.envMap.mapping,lightMap:!!e.lightMap,bumpMap:!!e.bumpMap,normalMap:!!e.normalMap,specularMap:!!e.specularMap,alphaMap:!!e.alphaMap,combine:e.combine,vertexColors:e.vertexColors,fog:n,useFog:e.fog,fogExp:n instanceof o.FogExp2,flatShading:e.shading===o.FlatShading,sizeAttenuation:e.sizeAttenuation,logarithmicDepthBuffer:xe,skinning:e.skinning,maxBones:l,useVertexTexture:lt&&r&&r.skeleton&&r.skeleton.useVertexTexture,morphTargets:e.morphTargets,morphNormals:e.morphNormals,maxMorphTargets:De.maxMorphTargets,maxMorphNormals:De.maxMorphNormals,maxDirLights:s.directional,maxPointLights:s.point,maxSpotLights:s.spot,maxHemiLights:s.hemi,maxShadows:u,shadowMapEnabled:De.shadowMapEnabled&&r.receiveShadow&&u>0,shadowMapType:De.shadowMapType,shadowMapDebug:De.shadowMapDebug,shadowMapCascade:De.shadowMapCascade,alphaTest:e.alphaTest,metal:e.metal,wrapAround:e.wrapAround,doubleSided:e.side===o.DoubleSide,flipSided:e.side===o.BackSide},h=[];if(i?h.push(i):(h.push(e.fragmentShader),h.push(e.vertexShader)),void 0!==e.defines)for(var p in e.defines)h.push(p),h.push(e.defines[p]);for(var p in c)h.push(p),h.push(c[p]);for(var d,f=h.join(),m=0,v=Oe.length;m=0&&e.numSupportedMorphTargets++}if(e.morphNormals){e.numSupportedMorphNormals=0;var _,b="morphNormal";for(x=0;x=0&&e.numSupportedMorphNormals++}e.uniformsList=[];for(var w in e.__webglShader.uniforms){var E=e.program.uniforms[w];E&&e.uniformsList.push([e.__webglShader.uniforms[w],E])}}function k(e){e.transparent===!0?$e.setBlending(e.blending,e.blendEquation,e.blendSrc,e.blendDst,e.blendEquationAlpha,e.blendSrcAlpha,e.blendDstAlpha):$e.setBlending(o.NoBlending),$e.setDepthTest(e.depthTest),$e.setDepthWrite(e.depthWrite),$e.setColorWrite(e.colorWrite),$e.setPolygonOffset(e.polygonOffset,e.polygonOffsetFactor,e.polygonOffsetUnits)}function F(e,t,n,r,i){Ue=0,r.needsUpdate&&(r.program&&Nt(r),L(r,t,n,i),r.needsUpdate=!1),r.morphTargets&&(i.__webglMorphTargetInfluences||(i.__webglMorphTargetInfluences=new Float32Array(De.maxMorphTargets)));var a=!1,s=!1,u=!1,l=r.program,c=l.uniforms,h=r.__webglShader.uniforms;if(l.id!==Le&&(Re.useProgram(l.program),Le=l.id,a=!0,s=!0,u=!0),r.id!==Fe&&(Fe===-1&&(u=!0),Fe=r.id,s=!0),(a||e!==Ie)&&(Re.uniformMatrix4fv(c.projectionMatrix,!1,e.projectionMatrix.elements),xe&&Re.uniform1f(c.logDepthBufFC,2/(Math.log(e.far+1)/Math.LN2)),e!==Ie&&(Ie=e),(r instanceof o.ShaderMaterial||r instanceof o.MeshPhongMaterial||r.envMap)&&null!==c.cameraPosition&&(Ke.setFromMatrixPosition(e.matrixWorld),Re.uniform3f(c.cameraPosition,Ke.x,Ke.y,Ke.z)),(r instanceof o.MeshPhongMaterial||r instanceof o.MeshLambertMaterial||r instanceof o.MeshBasicMaterial||r instanceof o.ShaderMaterial||r.skinning)&&null!==c.viewMatrix&&Re.uniformMatrix4fv(c.viewMatrix,!1,e.matrixWorldInverse.elements)),r.skinning)if(i.bindMatrix&&null!==c.bindMatrix&&Re.uniformMatrix4fv(c.bindMatrix,!1,i.bindMatrix.elements),i.bindMatrixInverse&&null!==c.bindMatrixInverse&&Re.uniformMatrix4fv(c.bindMatrixInverse,!1,i.bindMatrixInverse.elements),lt&&i.skeleton&&i.skeleton.useVertexTexture){if(null!==c.boneTexture){var p=K();Re.uniform1i(c.boneTexture,p),De.setTexture(i.skeleton.boneTexture,p)}null!==c.boneTextureWidth&&Re.uniform1i(c.boneTextureWidth,i.skeleton.boneTextureWidth),null!==c.boneTextureHeight&&Re.uniform1i(c.boneTextureHeight,i.skeleton.boneTextureHeight)}else i.skeleton&&i.skeleton.boneMatrices&&null!==c.boneGlobalMatrices&&Re.uniformMatrix4fv(c.boneGlobalMatrices,!1,i.skeleton.boneMatrices);return s&&(n&&r.fog&&j(h,n),(r instanceof o.MeshPhongMaterial||r instanceof o.MeshLambertMaterial||r.lights)&&(Qe&&(u=!0,J(t),Qe=!1),u?(W(h,Ze),G(h,!0)):G(h,!1)),(r instanceof o.MeshBasicMaterial||r instanceof o.MeshLambertMaterial||r instanceof o.MeshPhongMaterial)&&V(h,r),r instanceof o.LineBasicMaterial?I(h,r):r instanceof o.LineDashedMaterial?(I(h,r),U(h,r)):r instanceof o.PointCloudMaterial?B(h,r):r instanceof o.MeshPhongMaterial?z(h,r):r instanceof o.MeshLambertMaterial?H(h,r):r instanceof o.MeshDepthMaterial?(h.mNear.value=e.near,h.mFar.value=e.far,h.opacity.value=r.opacity):r instanceof o.MeshNormalMaterial&&(h.opacity.value=r.opacity),i.receiveShadow&&!r._shadowPass&&q(h,t),Y(r.uniformsList)),X(c,i),null!==c.modelMatrix&&Re.uniformMatrix4fv(c.modelMatrix,!1,i.matrixWorld.elements),l}function V(e,t){e.opacity.value=t.opacity,e.diffuse.value=t.color,e.map.value=t.map,e.lightMap.value=t.lightMap,e.specularMap.value=t.specularMap,e.alphaMap.value=t.alphaMap,t.bumpMap&&(e.bumpMap.value=t.bumpMap,e.bumpScale.value=t.bumpScale),t.normalMap&&(e.normalMap.value=t.normalMap,e.normalScale.value.copy(t.normalScale));var n;if(t.map?n=t.map:t.specularMap?n=t.specularMap:t.normalMap?n=t.normalMap:t.bumpMap?n=t.bumpMap:t.alphaMap&&(n=t.alphaMap),void 0!==n){var r=n.offset,i=n.repeat;e.offsetRepeat.value.set(r.x,r.y,i.x,i.y)}e.envMap.value=t.envMap,e.flipEnvMap.value=t.envMap instanceof o.WebGLRenderTargetCube?1:-1,e.reflectivity.value=t.reflectivity,e.refractionRatio.value=t.refractionRatio}function I(e,t){e.diffuse.value=t.color,e.opacity.value=t.opacity}function U(e,t){e.dashSize.value=t.dashSize,e.totalSize.value=t.dashSize+t.gapSize,e.scale.value=t.scale}function B(e,t){if(e.psColor.value=t.color,e.opacity.value=t.opacity,e.size.value=t.size,e.scale.value=he.height/2,e.map.value=t.map,null!==t.map){var n=t.map.offset,r=t.map.repeat;e.offsetRepeat.value.set(n.x,n.y,r.x,r.y)}}function j(e,t){e.fogColor.value=t.color,t instanceof o.Fog?(e.fogNear.value=t.near,e.fogFar.value=t.far):t instanceof o.FogExp2&&(e.fogDensity.value=t.density)}function z(e,t){e.shininess.value=t.shininess,e.emissive.value=t.emissive,e.specular.value=t.specular,t.wrapAround&&e.wrapRGB.value.copy(t.wrapRGB)}function H(e,t){e.emissive.value=t.emissive,t.wrapAround&&e.wrapRGB.value.copy(t.wrapRGB)}function W(e,t){e.ambientLightColor.value=t.ambient,e.directionalLightColor.value=t.directional.colors,e.directionalLightDirection.value=t.directional.positions,e.pointLightColor.value=t.point.colors,e.pointLightPosition.value=t.point.positions,e.pointLightDistance.value=t.point.distances,e.pointLightDecay.value=t.point.decays,e.spotLightColor.value=t.spot.colors,e.spotLightPosition.value=t.spot.positions,e.spotLightDistance.value=t.spot.distances,e.spotLightDirection.value=t.spot.directions,e.spotLightAngleCos.value=t.spot.anglesCos,e.spotLightExponent.value=t.spot.exponents,e.spotLightDecay.value=t.spot.decays,e.hemisphereLightSkyColor.value=t.hemi.skyColors,e.hemisphereLightGroundColor.value=t.hemi.groundColors,e.hemisphereLightDirection.value=t.hemi.positions}function G(e,t){e.ambientLightColor.needsUpdate=t,e.directionalLightColor.needsUpdate=t,e.directionalLightDirection.needsUpdate=t,e.pointLightColor.needsUpdate=t,e.pointLightPosition.needsUpdate=t,e.pointLightDistance.needsUpdate=t,e.pointLightDecay.needsUpdate=t,e.spotLightColor.needsUpdate=t,e.spotLightPosition.needsUpdate=t,e.spotLightDistance.needsUpdate=t,e.spotLightDirection.needsUpdate=t,e.spotLightAngleCos.needsUpdate=t,e.spotLightExponent.needsUpdate=t,e.spotLightDecay.needsUpdate=t,e.hemisphereLightSkyColor.needsUpdate=t,e.hemisphereLightGroundColor.needsUpdate=t,e.hemisphereLightDirection.needsUpdate=t}function q(e,t){if(e.shadowMatrix)for(var n=0,r=0,i=t.length;r=ot&&o.warn("WebGLRenderer: trying to use "+e+" texture units while this GPU supports only "+ot),Ue+=1,e}function Y(e){for(var t,n,r,i=0,a=e.length;i1||t.__currentAnisotropy)&&(Re.texParameterf(e,r.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(t.anisotropy,De.getMaxAnisotropy())),t.__currentAnisotropy=t.anisotropy)}function ee(e,t){if(e.width>t||e.height>t){var n=t/Math.max(e.width,e.height),r=document.createElement("canvas");r.width=Math.floor(e.width*n),r.height=Math.floor(e.height*n);var i=r.getContext("2d");return i.drawImage(e,0,0,e.width,e.height,0,0,r.width,r.height),o.warn("THREE.WebGLRenderer: image is too big ("+e.width+"x"+e.height+"). Resized to "+r.width+"x"+r.height,e),r}return e}function te(e,t){if(6===e.image.length)if(e.needsUpdate){e.image.__webglTextureCube||(e.addEventListener("dispose",wt),e.image.__webglTextureCube=Re.createTexture(),De.info.memory.textures++),Re.activeTexture(Re.TEXTURE0+t),Re.bindTexture(Re.TEXTURE_CUBE_MAP,e.image.__webglTextureCube),Re.pixelStorei(Re.UNPACK_FLIP_Y_WEBGL,e.flipY);for(var n=e instanceof o.CompressedTexture,r=e.image[0]instanceof o.DataTexture,i=[],a=0;a<6;a++)!De.autoScaleCubemaps||n||r?i[a]=r?e.image[a].image:e.image[a]:i[a]=ee(e.image[a],st);var s=i[0],u=o.Math.isPowerOfTwo(s.width)&&o.Math.isPowerOfTwo(s.height),l=se(e.format),c=se(e.type);$(Re.TEXTURE_CUBE_MAP,e,u);for(var a=0;a<6;a++)if(n)for(var h,p=i[a].mipmaps,d=0,f=p.length;d-1?Re.compressedTexImage2D(Re.TEXTURE_CUBE_MAP_POSITIVE_X+a,d,l,h.width,h.height,0,h.data):o.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setCubeTexture()"):Re.texImage2D(Re.TEXTURE_CUBE_MAP_POSITIVE_X+a,d,l,h.width,h.height,0,l,c,h.data);else r?Re.texImage2D(Re.TEXTURE_CUBE_MAP_POSITIVE_X+a,0,l,i[a].width,i[a].height,0,l,c,i[a].data):Re.texImage2D(Re.TEXTURE_CUBE_MAP_POSITIVE_X+a,0,l,l,c,i[a]);e.generateMipmaps&&u&&Re.generateMipmap(Re.TEXTURE_CUBE_MAP),e.needsUpdate=!1,e.onUpdate&&e.onUpdate()}else Re.activeTexture(Re.TEXTURE0+t),Re.bindTexture(Re.TEXTURE_CUBE_MAP,e.image.__webglTextureCube)}function ne(e,t){Re.activeTexture(Re.TEXTURE0+t),Re.bindTexture(Re.TEXTURE_CUBE_MAP,e.__webglTexture)}function re(e,t,n){Re.bindFramebuffer(Re.FRAMEBUFFER,e),Re.framebufferTexture2D(Re.FRAMEBUFFER,Re.COLOR_ATTACHMENT0,n,t.__webglTexture,0)}function oe(e,t){Re.bindRenderbuffer(Re.RENDERBUFFER,e),t.depthBuffer&&!t.stencilBuffer?(Re.renderbufferStorage(Re.RENDERBUFFER,Re.DEPTH_COMPONENT16,t.width,t.height),Re.framebufferRenderbuffer(Re.FRAMEBUFFER,Re.DEPTH_ATTACHMENT,Re.RENDERBUFFER,e)):t.depthBuffer&&t.stencilBuffer?(Re.renderbufferStorage(Re.RENDERBUFFER,Re.DEPTH_STENCIL,t.width,t.height),Re.framebufferRenderbuffer(Re.FRAMEBUFFER,Re.DEPTH_STENCIL_ATTACHMENT,Re.RENDERBUFFER,e)):Re.renderbufferStorage(Re.RENDERBUFFER,Re.RGBA4,t.width,t.height)}function ie(e){e instanceof o.WebGLRenderTargetCube?(Re.bindTexture(Re.TEXTURE_CUBE_MAP,e.__webglTexture),Re.generateMipmap(Re.TEXTURE_CUBE_MAP),Re.bindTexture(Re.TEXTURE_CUBE_MAP,null)):(Re.bindTexture(Re.TEXTURE_2D,e.__webglTexture),Re.generateMipmap(Re.TEXTURE_2D),Re.bindTexture(Re.TEXTURE_2D,null))}function ae(e){return e===o.NearestFilter||e===o.NearestMipMapNearestFilter||e===o.NearestMipMapLinearFilter?Re.NEAREST:Re.LINEAR}function se(e){var t;if(e===o.RepeatWrapping)return Re.REPEAT;if(e===o.ClampToEdgeWrapping)return Re.CLAMP_TO_EDGE;if(e===o.MirroredRepeatWrapping)return Re.MIRRORED_REPEAT;if(e===o.NearestFilter)return Re.NEAREST;if(e===o.NearestMipMapNearestFilter)return Re.NEAREST_MIPMAP_NEAREST;if(e===o.NearestMipMapLinearFilter)return Re.NEAREST_MIPMAP_LINEAR;if(e===o.LinearFilter)return Re.LINEAR;if(e===o.LinearMipMapNearestFilter)return Re.LINEAR_MIPMAP_NEAREST;if(e===o.LinearMipMapLinearFilter)return Re.LINEAR_MIPMAP_LINEAR;if(e===o.UnsignedByteType)return Re.UNSIGNED_BYTE;if(e===o.UnsignedShort4444Type)return Re.UNSIGNED_SHORT_4_4_4_4;if(e===o.UnsignedShort5551Type)return Re.UNSIGNED_SHORT_5_5_5_1;if(e===o.UnsignedShort565Type)return Re.UNSIGNED_SHORT_5_6_5;if(e===o.ByteType)return Re.BYTE;if(e===o.ShortType)return Re.SHORT;if(e===o.UnsignedShortType)return Re.UNSIGNED_SHORT;if(e===o.IntType)return Re.INT;if(e===o.UnsignedIntType)return Re.UNSIGNED_INT;if(e===o.FloatType)return Re.FLOAT;if(t=et.get("OES_texture_half_float"),null!==t&&e===o.HalfFloatType)return t.HALF_FLOAT_OES;if(e===o.AlphaFormat)return Re.ALPHA;if(e===o.RGBFormat)return Re.RGB;if(e===o.RGBAFormat)return Re.RGBA;if(e===o.LuminanceFormat)return Re.LUMINANCE;if(e===o.LuminanceAlphaFormat)return Re.LUMINANCE_ALPHA;if(e===o.AddEquation)return Re.FUNC_ADD;if(e===o.SubtractEquation)return Re.FUNC_SUBTRACT;if(e===o.ReverseSubtractEquation)return Re.FUNC_REVERSE_SUBTRACT;if(e===o.ZeroFactor)return Re.ZERO;if(e===o.OneFactor)return Re.ONE;if(e===o.SrcColorFactor)return Re.SRC_COLOR;if(e===o.OneMinusSrcColorFactor)return Re.ONE_MINUS_SRC_COLOR;if(e===o.SrcAlphaFactor)return Re.SRC_ALPHA;if(e===o.OneMinusSrcAlphaFactor)return Re.ONE_MINUS_SRC_ALPHA;if(e===o.DstAlphaFactor)return Re.DST_ALPHA;if(e===o.OneMinusDstAlphaFactor)return Re.ONE_MINUS_DST_ALPHA;if(e===o.DstColorFactor)return Re.DST_COLOR;if(e===o.OneMinusDstColorFactor)return Re.ONE_MINUS_DST_COLOR;if(e===o.SrcAlphaSaturateFactor)return Re.SRC_ALPHA_SATURATE;if(t=et.get("WEBGL_compressed_texture_s3tc"),null!==t){if(e===o.RGB_S3TC_DXT1_Format)return t.COMPRESSED_RGB_S3TC_DXT1_EXT;if(e===o.RGBA_S3TC_DXT1_Format)return t.COMPRESSED_RGBA_S3TC_DXT1_EXT;if(e===o.RGBA_S3TC_DXT3_Format)return t.COMPRESSED_RGBA_S3TC_DXT3_EXT;if(e===o.RGBA_S3TC_DXT5_Format)return t.COMPRESSED_RGBA_S3TC_DXT5_EXT}if(t=et.get("WEBGL_compressed_texture_pvrtc"),null!==t){if(e===o.RGB_PVRTC_4BPPV1_Format)return t.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;if(e===o.RGB_PVRTC_2BPPV1_Format)return t.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;if(e===o.RGBA_PVRTC_4BPPV1_Format)return t.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;if(e===o.RGBA_PVRTC_2BPPV1_Format)return t.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG}if(t=et.get("EXT_blend_minmax"),null!==t){if(e===o.MinEquation)return t.MIN_EXT;if(e===o.MaxEquation)return t.MAX_EXT}return 0}function ue(e){if(lt&&e&&e.skeleton&&e.skeleton.useVertexTexture)return 1024;var t=Re.getParameter(Re.MAX_VERTEX_UNIFORM_VECTORS),n=Math.floor((t-20)/4),r=n;return void 0!==e&&e instanceof o.SkinnedMesh&&(r=Math.min(e.skeleton.bones.length,r),r0,lt=ut&&et.get("OES_texture_float"),ct=Re.getShaderPrecisionFormat(Re.VERTEX_SHADER,Re.HIGH_FLOAT),ht=Re.getShaderPrecisionFormat(Re.VERTEX_SHADER,Re.MEDIUM_FLOAT),pt=Re.getShaderPrecisionFormat(Re.FRAGMENT_SHADER,Re.HIGH_FLOAT),dt=Re.getShaderPrecisionFormat(Re.FRAGMENT_SHADER,Re.MEDIUM_FLOAT),ft=function(){var e;return function(){if(void 0!==e)return e;if(e=[],et.get("WEBGL_compressed_texture_pvrtc")||et.get("WEBGL_compressed_texture_s3tc"))for(var t=Re.getParameter(Re.COMPRESSED_TEXTURE_FORMATS),n=0;n0&&pt.precision>0,vt=ht.precision>0&&dt.precision>0;"highp"!==fe||mt||(vt?(fe="mediump",o.warn("THREE.WebGLRenderer: highp not supported, using mediump.")):(fe="lowp",o.warn("THREE.WebGLRenderer: highp and mediump not supported, using lowp."))),"mediump"!==fe||vt||(fe="lowp",o.warn("THREE.WebGLRenderer: mediump not supported, using lowp."));var gt=new o.ShadowMapPlugin(this,Me,Ce,Se),yt=new o.SpritePlugin(this,Ne),_t=new o.LensFlarePlugin(this,Pe);this.getContext=function(){return Re},this.forceContextLoss=function(){et.get("WEBGL_lose_context").loseContext()},this.supportsVertexTextures=function(){return ut},this.supportsFloatTextures=function(){return et.get("OES_texture_float")},this.supportsHalfFloatTextures=function(){return et.get("OES_texture_half_float")},this.supportsStandardDerivatives=function(){return et.get("OES_standard_derivatives")},this.supportsCompressedTextureS3TC=function(){return et.get("WEBGL_compressed_texture_s3tc")},this.supportsCompressedTexturePVRTC=function(){return et.get("WEBGL_compressed_texture_pvrtc")},this.supportsBlendMinMax=function(){return et.get("EXT_blend_minmax")},this.getMaxAnisotropy=function(){var e;return function(){if(void 0!==e)return e;var t=et.get("EXT_texture_filter_anisotropic");return e=null!==t?Re.getParameter(t.MAX_TEXTURE_MAX_ANISOTROPY_EXT):0}}(),this.getPrecision=function(){return fe},this.getPixelRatio=function(){return de},this.setPixelRatio=function(e){de=e},this.setSize=function(e,t,n){he.width=e*de,he.height=t*de,n!==!1&&(he.style.width=e+"px",he.style.height=t+"px"),this.setViewport(0,0,e,t)},this.setViewport=function(e,t,n,r){Be=e*de,je=t*de,ze=n*de,He=r*de,Re.viewport(Be,je,ze,He)},this.setScissor=function(e,t,n,r){Re.scissor(e*de,t*de,n*de,r*de)},this.enableScissorTest=function(e){e?Re.enable(Re.SCISSOR_TEST):Re.disable(Re.SCISSOR_TEST)},this.getClearColor=function(){return we},this.setClearColor=function(e,t){we.set(e),Ee=void 0!==t?t:1,tt(we.r,we.g,we.b,Ee)},this.getClearAlpha=function(){return Ee},this.setClearAlpha=function(e){Ee=e,tt(we.r,we.g,we.b,Ee)},this.clear=function(e,t,n){var r=0;(void 0===e||e)&&(r|=Re.COLOR_BUFFER_BIT),(void 0===t||t)&&(r|=Re.DEPTH_BUFFER_BIT),(void 0===n||n)&&(r|=Re.STENCIL_BUFFER_BIT),Re.clear(r)},this.clearColor=function(){Re.clear(Re.COLOR_BUFFER_BIT)},this.clearDepth=function(){Re.clear(Re.DEPTH_BUFFER_BIT)},this.clearStencil=function(){Re.clear(Re.STENCIL_BUFFER_BIT)},this.clearTarget=function(e,t,n,r){this.setRenderTarget(e),this.clear(t,n,r)},this.resetGLState=rt;var bt=function(e){var t=e.target;t.traverse(function(e){e.removeEventListener("remove",bt),D(e)})},xt=function(e){var t=e.target;t.removeEventListener("dispose",xt),St(t)},wt=function(e){var t=e.target;t.removeEventListener("dispose",wt),Tt(t),De.info.memory.textures--},Et=function(e){var t=e.target;t.removeEventListener("dispose",Et),At(t),De.info.memory.textures--},Mt=function(e){var t=e.target;t.removeEventListener("dispose",Mt),Nt(t)},Ct=function(e){for(var t=["__webglVertexBuffer","__webglNormalBuffer","__webglTangentBuffer","__webglColorBuffer","__webglUVBuffer","__webglUV2Buffer","__webglSkinIndicesBuffer","__webglSkinWeightsBuffer","__webglFaceBuffer","__webglLineBuffer","__webglLineDistanceBuffer"],n=0,r=t.length;n1&&(u=!0);for(var g=0,y=v.length;g1&&(u=!0);for(var g=0,y=v.length;g=0?l&&(Re.bindBuffer(Re.ARRAY_BUFFER,i.__webglVertexBuffer),$e.enableAttribute(u.position),Re.vertexAttribPointer(u.position,3,Re.FLOAT,!1,0,0)):a.morphTargetBase&&m(r,i,a),l){if(i.__webglCustomAttributesList)for(var p=0,d=i.__webglCustomAttributesList.length;p=0&&(Re.bindBuffer(Re.ARRAY_BUFFER,f.buffer),$e.enableAttribute(u[f.buffer.belongsToAttribute]),Re.vertexAttribPointer(u[f.buffer.belongsToAttribute],f.size,Re.FLOAT,!1,0,0))}u.color>=0&&(a.geometry.colors.length>0||a.geometry.faces.length>0?(Re.bindBuffer(Re.ARRAY_BUFFER,i.__webglColorBuffer),$e.enableAttribute(u.color),Re.vertexAttribPointer(u.color,3,Re.FLOAT,!1,0,0)):void 0!==r.defaultAttributeValues&&Re.vertexAttrib3fv(u.color,r.defaultAttributeValues.color)),u.normal>=0&&(Re.bindBuffer(Re.ARRAY_BUFFER,i.__webglNormalBuffer),$e.enableAttribute(u.normal),Re.vertexAttribPointer(u.normal,3,Re.FLOAT,!1,0,0)),u.tangent>=0&&(Re.bindBuffer(Re.ARRAY_BUFFER,i.__webglTangentBuffer),$e.enableAttribute(u.tangent),Re.vertexAttribPointer(u.tangent,4,Re.FLOAT,!1,0,0)),u.uv>=0&&(a.geometry.faceVertexUvs[0]?(Re.bindBuffer(Re.ARRAY_BUFFER,i.__webglUVBuffer),$e.enableAttribute(u.uv),Re.vertexAttribPointer(u.uv,2,Re.FLOAT,!1,0,0)):void 0!==r.defaultAttributeValues&&Re.vertexAttrib2fv(u.uv,r.defaultAttributeValues.uv)),u.uv2>=0&&(a.geometry.faceVertexUvs[1]?(Re.bindBuffer(Re.ARRAY_BUFFER,i.__webglUV2Buffer),$e.enableAttribute(u.uv2),Re.vertexAttribPointer(u.uv2,2,Re.FLOAT,!1,0,0)):void 0!==r.defaultAttributeValues&&Re.vertexAttrib2fv(u.uv2,r.defaultAttributeValues.uv2)),r.skinning&&u.skinIndex>=0&&u.skinWeight>=0&&(Re.bindBuffer(Re.ARRAY_BUFFER,i.__webglSkinIndicesBuffer),$e.enableAttribute(u.skinIndex),Re.vertexAttribPointer(u.skinIndex,4,Re.FLOAT,!1,0,0),Re.bindBuffer(Re.ARRAY_BUFFER,i.__webglSkinWeightsBuffer),$e.enableAttribute(u.skinWeight),Re.vertexAttribPointer(u.skinWeight,4,Re.FLOAT,!1,0,0)),u.lineDistance>=0&&(Re.bindBuffer(Re.ARRAY_BUFFER,i.__webglLineDistanceBuffer),$e.enableAttribute(u.lineDistance),Re.vertexAttribPointer(u.lineDistance,1,Re.FLOAT,!1,0,0))}if($e.disableUnusedAttributes(),a instanceof o.Mesh){var v=i.__typeArray===Uint32Array?Re.UNSIGNED_INT:Re.UNSIGNED_SHORT;r.wireframe?($e.setLineWidth(r.wireframeLinewidth*de),l&&Re.bindBuffer(Re.ELEMENT_ARRAY_BUFFER,i.__webglLineBuffer),Re.drawElements(Re.LINES,i.__webglLineCount,v,0)):(l&&Re.bindBuffer(Re.ELEMENT_ARRAY_BUFFER,i.__webglFaceBuffer),Re.drawElements(Re.TRIANGLES,i.__webglFaceCount,v,0)),De.info.render.calls++,De.info.render.vertices+=i.__webglFaceCount,De.info.render.faces+=i.__webglFaceCount/3}else if(a instanceof o.Line){var g=a.mode===o.LineStrip?Re.LINE_STRIP:Re.LINES;$e.setLineWidth(r.linewidth*de),Re.drawArrays(g,0,i.__webglLineCount),De.info.render.calls++}else a instanceof o.PointCloud&&(Re.drawArrays(Re.POINTS,0,i.__webglParticleCount),De.info.render.calls++,De.info.render.points+=i.__webglParticleCount)}},this.render=function(e,t,n,r){if(t instanceof o.Camera==!1)return void o.error("THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.");var i=e.fog;Ve="",Fe=-1,Ie=null,Qe=!0,e.autoUpdate===!0&&e.updateMatrixWorld(),void 0===t.parent&&t.updateMatrixWorld(),e.traverse(function(e){e instanceof o.SkinnedMesh&&e.skeleton.update()}),t.matrixWorldInverse.getInverse(t.matrixWorld),Xe.multiplyMatrices(t.projectionMatrix,t.matrixWorldInverse),qe.setFromMatrix(Xe),Me.length=0,Te.length=0,Ae.length=0,Ne.length=0,Pe.length=0,_(e),De.sortObjects===!0&&(Te.sort(v),Ae.sort(g)),gt.render(e,t),De.info.render.calls=0,De.info.render.vertices=0,De.info.render.faces=0,De.info.render.points=0,this.setRenderTarget(n),(this.autoClear||r)&&this.clear(this.autoClearColor,this.autoClearDepth,this.autoClearStencil);for(var a=0,s=Se.length;a0&&n){for(var u=0,l=s.length;u-1?Re.compressedTexImage2D(Re.TEXTURE_2D,u,r,a.width,a.height,0,a.data):o.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()"):Re.texImage2D(Re.TEXTURE_2D,u,r,a.width,a.height,0,r,i,a.data);else if(s.length>0&&n){for(var u=0,l=s.length;u0?i.gammaFactor:1,M=t(h),C=c.createProgram();s instanceof o.RawShaderMaterial?(x="",w=""):(x=["precision "+u.precision+" float;","precision "+u.precision+" int;",M,u.supportsVertexTextures?"#define VERTEX_TEXTURES":"",l.gammaInput?"#define GAMMA_INPUT":"",l.gammaOutput?"#define GAMMA_OUTPUT":"","#define GAMMA_FACTOR "+E,"#define MAX_DIR_LIGHTS "+u.maxDirLights,"#define MAX_POINT_LIGHTS "+u.maxPointLights,"#define MAX_SPOT_LIGHTS "+u.maxSpotLights,"#define MAX_HEMI_LIGHTS "+u.maxHemiLights,"#define MAX_SHADOWS "+u.maxShadows,"#define MAX_BONES "+u.maxBones,u.map?"#define USE_MAP":"",u.envMap?"#define USE_ENVMAP":"",u.envMap?"#define "+_:"",u.lightMap?"#define USE_LIGHTMAP":"",u.bumpMap?"#define USE_BUMPMAP":"",u.normalMap?"#define USE_NORMALMAP":"",u.specularMap?"#define USE_SPECULARMAP":"",u.alphaMap?"#define USE_ALPHAMAP":"",u.vertexColors?"#define USE_COLOR":"",u.flatShading?"#define FLAT_SHADED":"",u.skinning?"#define USE_SKINNING":"",u.useVertexTexture?"#define BONE_TEXTURE":"",u.morphTargets?"#define USE_MORPHTARGETS":"",u.morphNormals?"#define USE_MORPHNORMALS":"",u.wrapAround?"#define WRAP_AROUND":"",u.doubleSided?"#define DOUBLE_SIDED":"",u.flipSided?"#define FLIP_SIDED":"",u.shadowMapEnabled?"#define USE_SHADOWMAP":"",u.shadowMapEnabled?"#define "+g:"",u.shadowMapDebug?"#define SHADOWMAP_DEBUG":"",u.shadowMapCascade?"#define SHADOWMAP_CASCADE":"",u.sizeAttenuation?"#define USE_SIZEATTENUATION":"",u.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"","uniform mat4 modelMatrix;","uniform mat4 modelViewMatrix;","uniform mat4 projectionMatrix;","uniform mat4 viewMatrix;","uniform mat3 normalMatrix;","uniform vec3 cameraPosition;","attribute vec3 position;","attribute vec3 normal;","attribute vec2 uv;","attribute vec2 uv2;","#ifdef USE_COLOR","\tattribute vec3 color;","#endif","#ifdef USE_MORPHTARGETS","\tattribute vec3 morphTarget0;","\tattribute vec3 morphTarget1;","\tattribute vec3 morphTarget2;","\tattribute vec3 morphTarget3;","\t#ifdef USE_MORPHNORMALS","\t\tattribute vec3 morphNormal0;","\t\tattribute vec3 morphNormal1;","\t\tattribute vec3 morphNormal2;","\t\tattribute vec3 morphNormal3;","\t#else","\t\tattribute vec3 morphTarget4;","\t\tattribute vec3 morphTarget5;","\t\tattribute vec3 morphTarget6;","\t\tattribute vec3 morphTarget7;","\t#endif","#endif","#ifdef USE_SKINNING","\tattribute vec4 skinIndex;","\tattribute vec4 skinWeight;","#endif",""].join("\n"),w=["precision "+u.precision+" float;","precision "+u.precision+" int;",u.bumpMap||u.normalMap||u.flatShading?"#extension GL_OES_standard_derivatives : enable":"",M,"#define MAX_DIR_LIGHTS "+u.maxDirLights,"#define MAX_POINT_LIGHTS "+u.maxPointLights,"#define MAX_SPOT_LIGHTS "+u.maxSpotLights,"#define MAX_HEMI_LIGHTS "+u.maxHemiLights,"#define MAX_SHADOWS "+u.maxShadows,u.alphaTest?"#define ALPHATEST "+u.alphaTest:"",l.gammaInput?"#define GAMMA_INPUT":"",l.gammaOutput?"#define GAMMA_OUTPUT":"","#define GAMMA_FACTOR "+E,u.useFog&&u.fog?"#define USE_FOG":"",u.useFog&&u.fogExp?"#define FOG_EXP2":"",u.map?"#define USE_MAP":"",u.envMap?"#define USE_ENVMAP":"",u.envMap?"#define "+y:"",u.envMap?"#define "+_:"",u.envMap?"#define "+b:"",u.lightMap?"#define USE_LIGHTMAP":"",u.bumpMap?"#define USE_BUMPMAP":"",u.normalMap?"#define USE_NORMALMAP":"",u.specularMap?"#define USE_SPECULARMAP":"",u.alphaMap?"#define USE_ALPHAMAP":"",u.vertexColors?"#define USE_COLOR":"",u.flatShading?"#define FLAT_SHADED":"",u.metal?"#define METAL":"",u.wrapAround?"#define WRAP_AROUND":"",u.doubleSided?"#define DOUBLE_SIDED":"",u.flipSided?"#define FLIP_SIDED":"",u.shadowMapEnabled?"#define USE_SHADOWMAP":"",u.shadowMapEnabled?"#define "+g:"",u.shadowMapDebug?"#define SHADOWMAP_DEBUG":"",u.shadowMapCascade?"#define SHADOWMAP_CASCADE":"",u.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"","uniform mat4 viewMatrix;","uniform vec3 cameraPosition;",""].join("\n"));var S=new o.WebGLShader(c,c.VERTEX_SHADER,x+f),T=new o.WebGLShader(c,c.FRAGMENT_SHADER,w+m);c.attachShader(C,S),c.attachShader(C,T),void 0!==v&&c.bindAttribLocation(C,0,v),c.linkProgram(C);var A=c.getProgramInfoLog(C);c.getProgramParameter(C,c.LINK_STATUS)===!1&&o.error("THREE.WebGLProgram: shader error: "+c.getError(),"gl.VALIDATE_STATUS",c.getProgramParameter(C,c.VALIDATE_STATUS),"gl.getPRogramInfoLog",A),""!==A&&o.warn("THREE.WebGLProgram: gl.getProgramInfoLog()"+A),c.deleteShader(S),c.deleteShader(T);var N=["viewMatrix","modelViewMatrix","projectionMatrix","normalMatrix","modelMatrix","cameraPosition","morphTargetInfluences","bindMatrix","bindMatrixInverse"];u.useVertexTexture?(N.push("boneTexture"),N.push("boneTextureWidth"),N.push("boneTextureHeight")):N.push("boneGlobalMatrices"),u.logarithmicDepthBuffer&&N.push("logDepthBufFC");for(var P in p)N.push(P);this.uniforms=n(c,C,N),N=["position","normal","uv","uv2","tangent","color","skinIndex","skinWeight","lineDistance"];for(var R=0;R0;var o;o=l?{vertexShader:["uniform lowp int renderType;","uniform vec3 screenPosition;","uniform vec2 scale;","uniform float rotation;","uniform sampler2D occlusionMap;","attribute vec2 position;","attribute vec2 uv;","varying vec2 vUV;","varying float vVisibility;","void main() {","vUV = uv;","vec2 pos = position;","if( renderType == 2 ) {","vec4 visibility = texture2D( occlusionMap, vec2( 0.1, 0.1 ) );","visibility += texture2D( occlusionMap, vec2( 0.5, 0.1 ) );","visibility += texture2D( occlusionMap, vec2( 0.9, 0.1 ) );","visibility += texture2D( occlusionMap, vec2( 0.9, 0.5 ) );","visibility += texture2D( occlusionMap, vec2( 0.9, 0.9 ) );","visibility += texture2D( occlusionMap, vec2( 0.5, 0.9 ) );","visibility += texture2D( occlusionMap, vec2( 0.1, 0.9 ) );","visibility += texture2D( occlusionMap, vec2( 0.1, 0.5 ) );","visibility += texture2D( occlusionMap, vec2( 0.5, 0.5 ) );","vVisibility = visibility.r / 9.0;","vVisibility *= 1.0 - visibility.g / 9.0;","vVisibility *= visibility.b / 9.0;","vVisibility *= 1.0 - visibility.a / 9.0;","pos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;","pos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;","}","gl_Position = vec4( ( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );","}"].join("\n"),fragmentShader:["uniform lowp int renderType;","uniform sampler2D map;","uniform float opacity;","uniform vec3 color;","varying vec2 vUV;","varying float vVisibility;","void main() {","if( renderType == 0 ) {","gl_FragColor = vec4( 1.0, 0.0, 1.0, 0.0 );","} else if( renderType == 1 ) {","gl_FragColor = texture2D( map, vUV );","} else {","vec4 texture = texture2D( map, vUV );","texture.a *= opacity * vVisibility;","gl_FragColor = texture;","gl_FragColor.rgb *= color;","}","}"].join("\n")}:{vertexShader:["uniform lowp int renderType;","uniform vec3 screenPosition;","uniform vec2 scale;","uniform float rotation;","attribute vec2 position;","attribute vec2 uv;","varying vec2 vUV;","void main() {","vUV = uv;","vec2 pos = position;","if( renderType == 2 ) {","pos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;","pos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;","}","gl_Position = vec4( ( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );","}"].join("\n"),fragmentShader:["precision mediump float;","uniform lowp int renderType;","uniform sampler2D map;","uniform sampler2D occlusionMap;","uniform float opacity;","uniform vec3 color;","varying vec2 vUV;","void main() {","if( renderType == 0 ) {","gl_FragColor = vec4( texture2D( map, vUV ).rgb, 0.0 );","} else if( renderType == 1 ) {","gl_FragColor = texture2D( map, vUV );","} else {","float visibility = texture2D( occlusionMap, vec2( 0.5, 0.1 ) ).a;","visibility += texture2D( occlusionMap, vec2( 0.9, 0.5 ) ).a;","visibility += texture2D( occlusionMap, vec2( 0.5, 0.9 ) ).a;","visibility += texture2D( occlusionMap, vec2( 0.1, 0.5 ) ).a;","visibility = ( 1.0 - visibility / 4.0 );","vec4 texture = texture2D( map, vUV );","texture.a *= opacity * visibility;","gl_FragColor = texture;","gl_FragColor.rgb *= color;","}","}"].join("\n")},a=n(o),s={vertex:p.getAttribLocation(a,"position"),uv:p.getAttribLocation(a,"uv")},u={renderType:p.getUniformLocation(a,"renderType"),map:p.getUniformLocation(a,"map"),occlusionMap:p.getUniformLocation(a,"occlusionMap"),opacity:p.getUniformLocation(a,"opacity"),color:p.getUniformLocation(a,"color"),scale:p.getUniformLocation(a,"scale"),rotation:p.getUniformLocation(a,"rotation"),screenPosition:p.getUniformLocation(a,"screenPosition")}};this.render=function(n,f,m,v){if(0!==t.length){var g=new o.Vector3,y=v/m,_=.5*m,b=.5*v,x=16/v,w=new o.Vector2(x*y,x),E=new o.Vector3(1,1,0),M=new o.Vector2(1,1);void 0===a&&d(),p.useProgram(a),p.enableVertexAttribArray(s.vertex),p.enableVertexAttribArray(s.uv),p.uniform1i(u.occlusionMap,0),p.uniform1i(u.map,1),p.bindBuffer(p.ARRAY_BUFFER,r),p.vertexAttribPointer(s.vertex,2,p.FLOAT,!1,16,0),p.vertexAttribPointer(s.uv,2,p.FLOAT,!1,16,8),p.bindBuffer(p.ELEMENT_ARRAY_BUFFER,i),p.disable(p.CULL_FACE),p.depthMask(!1);for(var C=0,S=t.length;C0&&M.x0&&M.y.001&&P.scale>.001&&(E.x=P.x,E.y=P.y,E.z=P.z,x=P.size*P.scale/v,w.x=x*y,w.y=x,p.uniform3f(u.screenPosition,E.x,E.y,E.z),p.uniform2f(u.scale,w.x,w.y),p.uniform1f(u.rotation,P.rotation),p.uniform1f(u.opacity,P.opacity),p.uniform3f(u.color,P.color.r,P.color.g,P.color.b),e.state.setBlending(P.blending,P.blendEquation,P.blendSrc,P.blendDst),e.setTexture(P.texture,1),p.drawElements(p.TRIANGLES,6,p.UNSIGNED_SHORT,0))}}}p.enable(p.CULL_FACE),p.enable(p.DEPTH_TEST),p.depthMask(!0),e.resetGLState()}}},o.ShadowMapPlugin=function(e,t,n,r){function i(e,t,r){if(t.visible){var o=n[t.id];if(o&&t.castShadow&&(t.frustumCulled===!1||m.intersectsObject(t)===!0))for(var a=0,s=o.length;ay.x&&(y.x=a.x),a.yy.y&&(y.y=a.y),a.zy.z&&(y.z=a.z)}n.left=g.x,n.right=y.x,n.top=y.y,n.bottom=g.y,n.updateProjectionMatrix()}function l(e){return e.material instanceof o.MeshFaceMaterial?e.material.materials[0]:e.material}var c,h,p,d,f=e.context,m=new o.Frustum,v=new o.Matrix4,g=new o.Vector3,y=new o.Vector3,_=new o.Vector3,b=[],x=o.ShaderLib.depthRGBA,w=o.UniformsUtils.clone(x.uniforms); +c=new o.ShaderMaterial({uniforms:w,vertexShader:x.vertexShader,fragmentShader:x.fragmentShader}),h=new o.ShaderMaterial({uniforms:w,vertexShader:x.vertexShader,fragmentShader:x.fragmentShader,morphTargets:!0}),p=new o.ShaderMaterial({uniforms:w,vertexShader:x.vertexShader,fragmentShader:x.fragmentShader,skinning:!0}),d=new o.ShaderMaterial({uniforms:w,vertexShader:x.vertexShader,fragmentShader:x.fragmentShader,morphTargets:!0,skinning:!0}),c._shadowPass=!0,h._shadowPass=!0,p._shadowPass=!0,d._shadowPass=!0,this.render=function(n,g){if(e.shadowMapEnabled!==!1){var y,x,w,E,M,C,S,T,A,N,P,R,D,O=[],L=0,k=null;for(f.clearColor(1,1,1,1),f.disable(f.BLEND),f.enable(f.CULL_FACE),f.frontFace(f.CCW),e.shadowMapCullFace===o.CullFaceFront?f.cullFace(f.FRONT):f.cullFace(f.BACK),e.state.setDepthTest(!0),y=0,x=t.length;y0&&B.morphTargets,z=R instanceof o.SkinnedMesh&&B.skinning,N=R.customDepthMaterial?R.customDepthMaterial:z?j?d:p:j?h:c,e.setMaterialFaces(B),A instanceof o.BufferGeometry?e.renderBufferDirect(T,t,k,N,A,R):e.renderBuffer(T,t,k,N,A,R);for(w=0,E=r.length;w 0 ) {","float depth = gl_FragCoord.z / gl_FragCoord.w;","float fogFactor = 0.0;","if ( fogType == 1 ) {","fogFactor = smoothstep( fogNear, fogFar, depth );","} else {","const float LOG2 = 1.442695;","float fogFactor = exp2( - fogDensity * fogDensity * depth * depth * LOG2 );","fogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );","}","gl_FragColor = mix( gl_FragColor, vec4( fogColor, gl_FragColor.w ), fogFactor );","}","}"].join("\n")),h.compileShader(n),h.compileShader(r),h.attachShader(t,n),h.attachShader(t,r),h.linkProgram(t),t}function r(e,t){return e.z!==t.z?t.z-e.z:t.id-e.id}var i,a,s,u,l,c,h=e.context,p=new o.Vector3,d=new o.Quaternion,f=new o.Vector3,m=function(){var e=new Float32Array([-.5,-.5,0,0,.5,-.5,1,0,.5,.5,1,1,-.5,.5,0,1]),t=new Uint16Array([0,1,2,0,2,3]);i=h.createBuffer(),a=h.createBuffer(),h.bindBuffer(h.ARRAY_BUFFER,i),h.bufferData(h.ARRAY_BUFFER,e,h.STATIC_DRAW),h.bindBuffer(h.ELEMENT_ARRAY_BUFFER,a),h.bufferData(h.ELEMENT_ARRAY_BUFFER,t,h.STATIC_DRAW),s=n(),u={position:h.getAttribLocation(s,"position"),uv:h.getAttribLocation(s,"uv")},l={uvOffset:h.getUniformLocation(s,"uvOffset"),uvScale:h.getUniformLocation(s,"uvScale"),rotation:h.getUniformLocation(s,"rotation"),scale:h.getUniformLocation(s,"scale"),color:h.getUniformLocation(s,"color"),map:h.getUniformLocation(s,"map"),opacity:h.getUniformLocation(s,"opacity"),modelViewMatrix:h.getUniformLocation(s,"modelViewMatrix"),projectionMatrix:h.getUniformLocation(s,"projectionMatrix"),fogType:h.getUniformLocation(s,"fogType"),fogDensity:h.getUniformLocation(s,"fogDensity"),fogNear:h.getUniformLocation(s,"fogNear"),fogFar:h.getUniformLocation(s,"fogFar"),fogColor:h.getUniformLocation(s,"fogColor"),alphaTest:h.getUniformLocation(s,"alphaTest")};var r=document.createElement("canvas");r.width=8,r.height=8;var p=r.getContext("2d");p.fillStyle="white",p.fillRect(0,0,8,8),c=new o.Texture(r),c.needsUpdate=!0};this.render=function(n,v){if(0!==t.length){void 0===s&&m(),h.useProgram(s),h.enableVertexAttribArray(u.position),h.enableVertexAttribArray(u.uv),h.disable(h.CULL_FACE),h.enable(h.BLEND),h.bindBuffer(h.ARRAY_BUFFER,i),h.vertexAttribPointer(u.position,2,h.FLOAT,!1,16,0),h.vertexAttribPointer(u.uv,2,h.FLOAT,!1,16,8),h.bindBuffer(h.ELEMENT_ARRAY_BUFFER,a),h.uniformMatrix4fv(l.projectionMatrix,!1,v.projectionMatrix.elements),h.activeTexture(h.TEXTURE0),h.uniform1i(l.map,0);var g=0,y=0,_=n.fog;_?(h.uniform3f(l.fogColor,_.color.r,_.color.g,_.color.b),_ instanceof o.Fog?(h.uniform1f(l.fogNear,_.near),h.uniform1f(l.fogFar,_.far),h.uniform1i(l.fogType,1),g=1,y=1):_ instanceof o.FogExp2&&(h.uniform1f(l.fogDensity,_.density),h.uniform1i(l.fogType,2),g=2,y=2)):(h.uniform1i(l.fogType,0),g=0,y=0);for(var b=0,x=t.length;ba-1?a-1:d+1,v=p-1<0?0:p-1,g=p+1>i-1?i-1:p+1,y=[],_=[0,0,l[4*(d*i+p)]/255*t];y.push([-1,0,l[4*(d*i+v)]/255*t]),y.push([-1,-1,l[4*(f*i+v)]/255*t]),y.push([0,-1,l[4*(f*i+p)]/255*t]),y.push([1,-1,l[4*(f*i+g)]/255*t]),y.push([1,0,l[4*(d*i+g)]/255*t]),y.push([1,1,l[4*(m*i+g)]/255*t]),y.push([0,1,l[4*(m*i+p)]/255*t]),y.push([-1,1,l[4*(m*i+v)]/255*t]);for(var b=[],x=y.length,w=0;w0)for(s=0;s2;){if(d--<=0)return o.warn("THREE.FontUtils: Warning, unable to triangulate polygon! in Triangulate.process()"),t?h:l;if(a=s,p<=a&&(a=0),s=a+1,p<=s&&(s=0),u=s+1,p<=u&&(u=0),i(e,a,s,u,p,c)){var f,m,v,g,y;for(f=c[a],m=c[s],v=c[u],l.push([e[f],e[m],e[v]]),h.push([c[a],c[s],c[u]]),g=s,y=s+1;y(c-u)*(d-l)-(h-l)*(p-u))return!1;var v,g,y,_,b,x,w,E,M,C,S,T,A,N,P;for(v=p-c,g=d-h,y=u-p,_=l-d,b=c-u,x=h-l,s=0;s=-t&&N>=-t&&A>=-t))return!1;return!0};return e.Triangulate=n,e.Triangulate.area=r,e}(o.FontUtils),r._typeface_js={faces:o.FontUtils.faces,loadFace:o.FontUtils.loadFace},o.typeface_js=r._typeface_js,o.Audio=function(e){o.Object3D.call(this),this.type="Audio",this.context=e.context,this.source=this.context.createBufferSource(),this.source.onended=this.onEnded.bind(this),this.gain=this.context.createGain(),this.gain.connect(this.context.destination),this.panner=this.context.createPanner(),this.panner.connect(this.gain),this.autoplay=!1,this.startTime=0,this.isPlaying=!1},o.Audio.prototype=Object.create(o.Object3D.prototype),o.Audio.prototype.constructor=o.Audio,o.Audio.prototype.load=function(e){var t=this,n=new XMLHttpRequest;return n.open("GET",e,!0),n.responseType="arraybuffer",n.onload=function(e){t.context.decodeAudioData(this.response,function(e){t.source.buffer=e,t.autoplay&&t.play()})},n.send(),this},o.Audio.prototype.play=function(){if(this.isPlaying===!0)return void o.warn("THREE.Audio: Audio is already playing.");var e=this.context.createBufferSource();e.buffer=this.source.buffer,e.loop=this.source.loop,e.onended=this.source.onended,e.connect(this.panner),e.start(0,this.startTime),this.isPlaying=!0,this.source=e},o.Audio.prototype.pause=function(){this.source.stop(),this.startTime=this.context.currentTime},o.Audio.prototype.stop=function(){this.source.stop(),this.startTime=0},o.Audio.prototype.onEnded=function(){this.isPlaying=!1},o.Audio.prototype.setLoop=function(e){this.source.loop=e},o.Audio.prototype.setRefDistance=function(e){this.panner.refDistance=e},o.Audio.prototype.setRolloffFactor=function(e){this.panner.rolloffFactor=e},o.Audio.prototype.setVolume=function(e){this.gain.gain.value=e},o.Audio.prototype.updateMatrixWorld=function(){var e=new o.Vector3;return function(t){o.Object3D.prototype.updateMatrixWorld.call(this,t),e.setFromMatrixPosition(this.matrixWorld),this.panner.setPosition(e.x,e.y,e.z)}}(),o.AudioListener=function(){o.Object3D.call(this),this.type="AudioListener",this.context=new(window.AudioContext||window.webkitAudioContext)},o.AudioListener.prototype=Object.create(o.Object3D.prototype),o.AudioListener.prototype.constructor=o.AudioListener,o.AudioListener.prototype.updateMatrixWorld=function(){var e=new o.Vector3,t=new o.Quaternion,n=new o.Vector3,r=new o.Vector3,i=new o.Vector3,a=new o.Vector3;return function(s){o.Object3D.prototype.updateMatrixWorld.call(this,s);var u=this.context.listener,l=this.up;this.matrixWorld.decompose(e,t,n),r.set(0,0,-1).applyQuaternion(t),i.subVectors(e,a),u.setPosition(e.x,e.y,e.z),u.setOrientation(r.x,r.y,r.z,l.x,l.y,l.z),u.setVelocity(i.x,i.y,i.z),a.copy(e)}}(),o.Curve=function(){},o.Curve.prototype.getPoint=function(e){return o.warn("THREE.Curve: Warning, getPoint() not implemented!"),null},o.Curve.prototype.getPointAt=function(e){var t=this.getUtoTmapping(e);return this.getPoint(t)},o.Curve.prototype.getPoints=function(e){e||(e=5);var t,n=[];for(t=0;t<=e;t++)n.push(this.getPoint(t/e));return n},o.Curve.prototype.getSpacedPoints=function(e){e||(e=5);var t,n=[];for(t=0;t<=e;t++)n.push(this.getPointAt(t/e));return n},o.Curve.prototype.getLength=function(){var e=this.getLengths();return e[e.length-1]},o.Curve.prototype.getLengths=function(e){if(e||(e=this.__arcLengthDivisions?this.__arcLengthDivisions:200),this.cacheArcLengths&&this.cacheArcLengths.length==e+1&&!this.needsUpdate)return this.cacheArcLengths;this.needsUpdate=!1;var t,n,r=[],o=this.getPoint(0),i=0;for(r.push(0),n=1;n<=e;n++)t=this.getPoint(n/e),i+=t.distanceTo(o),r.push(i),o=t;return this.cacheArcLengths=r,r},o.Curve.prototype.updateArcLengths=function(){this.needsUpdate=!0,this.getLengths()},o.Curve.prototype.getUtoTmapping=function(e,t){var n,r=this.getLengths(),o=0,i=r.length;n=t?t:e*r[i-1];for(var a,s=0,u=i-1;s<=u;)if(o=Math.floor(s+(u-s)/2),a=r[o]-n,a<0)s=o+1;else{if(!(a>0)){u=o;break}u=o-1}if(o=u,r[o]==n){var l=o/(i-1);return l}var c=r[o],h=r[o+1],p=h-c,d=(n-c)/p,l=(o+d)/(i-1);return l},o.Curve.prototype.getTangent=function(e){var t=1e-4,n=e-t,r=e+t;n<0&&(n=0),r>1&&(r=1);var o=this.getPoint(n),i=this.getPoint(r),a=i.clone().sub(o);return a.normalize()},o.Curve.prototype.getTangentAt=function(e){var t=this.getUtoTmapping(e);return this.getTangent(t)},o.Curve.Utils={tangentQuadraticBezier:function(e,t,n,r){return 2*(1-e)*(n-t)+2*e*(r-n)},tangentCubicBezier:function(e,t,n,r,o){return-3*t*(1-e)*(1-e)+3*n*(1-e)*(1-e)-6*e*n*(1-e)+6*e*r*(1-e)-3*e*e*r+3*e*e*o},tangentSpline:function(e,t,n,r,o){var i=6*e*e-6*e,a=3*e*e-4*e+1,s=-6*e*e+6*e,u=3*e*e-2*e;return i+a+s+u},interpolate:function(e,t,n,r,o){var i=.5*(n-e),a=.5*(r-t),s=o*o,u=o*s;return(2*t-2*n+i+a)*u+(-3*t+3*n-2*i-a)*s+i*o+t}},o.Curve.create=function(e,t){return e.prototype=Object.create(o.Curve.prototype),e.prototype.constructor=e,e.prototype.getPoint=t,e},o.CurvePath=function(){this.curves=[],this.bends=[],this.autoClose=!1},o.CurvePath.prototype=Object.create(o.Curve.prototype),o.CurvePath.prototype.constructor=o.CurvePath,o.CurvePath.prototype.add=function(e){this.curves.push(e)},o.CurvePath.prototype.checkConnection=function(){},o.CurvePath.prototype.closePath=function(){var e=this.curves[0].getPoint(0),t=this.curves[this.curves.length-1].getPoint(1);e.equals(t)||this.curves.push(new o.LineCurve(t,e))},o.CurvePath.prototype.getPoint=function(e){for(var t,n,r=e*this.getLength(),o=this.getCurveLengths(),i=0;i=r){t=o[i]-r,n=this.curves[i];var a=1-t/n.getLength();return n.getPointAt(a)}i++}return null},o.CurvePath.prototype.getLength=function(){var e=this.getCurveLengths();return e[e.length-1]},o.CurvePath.prototype.getCurveLengths=function(){if(this.cacheLengths&&this.cacheLengths.length==this.curves.length)return this.cacheLengths;var e,t=[],n=0,r=this.curves.length;for(e=0;ee?e=u.x:u.xt?t=u.y:u.yn?n=u.z:u.z0?(v=x[x.length-1],f=v.x,m=v.y):(v=this.actions[n-1].args,f=v[v.length-2],m=v[v.length-1]),g=1;g<=e;g++)y=g/e,_=o.Shape.Utils.b2(y,f,p,u),b=o.Shape.Utils.b2(y,m,d,l),x.push(new o.Vector2(_,b));break;case o.PathActions.BEZIER_CURVE_TO:for(u=s[4],l=s[5],p=s[0],d=s[1],c=s[2],h=s[3],x.length>0?(v=x[x.length-1],f=v.x,m=v.y):(v=this.actions[n-1].args,f=v[v.length-2],m=v[v.length-1]),g=1;g<=e;g++)y=g/e,_=o.Shape.Utils.b3(y,f,p,c,u),b=o.Shape.Utils.b3(y,m,d,h,l),x.push(new o.Vector2(_,b));break;case o.PathActions.CSPLINE_THRU:v=this.actions[n-1].args;var w=new o.Vector2(v[v.length-2],v[v.length-1]),E=[w],M=e*s[0].length;E=E.concat(s[0]);var C=new o.SplineCurve(E);for(g=1;g<=M;g++)x.push(C.getPointAt(g/M));break;case o.PathActions.ARC:var S,T=s[0],A=s[1],N=s[2],P=s[3],R=s[4],D=!!s[5],O=R-P,L=2*e;for(g=1;g<=L;g++)y=g/L,D||(y=1-y),S=P+y*O,_=T+N*Math.cos(S),b=A+N*Math.sin(S),x.push(new o.Vector2(_,b));break;case o.PathActions.ELLIPSE:var S,T=s[0],A=s[1],k=s[2],F=s[3],P=s[4],R=s[5],D=!!s[6],O=R-P,L=2*e;for(g=1;g<=L;g++)y=g/L,D||(y=1-y),S=P+y*O,_=T+k*Math.cos(S),b=A+F*Math.sin(S),x.push(new o.Vector2(_,b))}var V=x[x.length-1],I=1e-10;return Math.abs(V.x-x[0].x)n){if(c<0&&(s=t[a],l=-l,u=t[i],c=-c),e.yu.y)continue;if(e.y==s.y){if(e.x==s.x)return!0}else{var h=c*(e.x-s.x)-l*(e.y-s.y);if(0==h)return!0;if(h<0)continue;o=!o}}else{if(e.y!=s.y)continue;if(u.x<=e.x&&e.x<=s.x||s.x<=e.x&&e.x<=u.x)return!0}}return o}var a=n(this.actions);if(0==a.length)return[];if(t===!0)return r(a);var s,u,l,c=[];if(1==a.length)return u=a[0],l=new o.Shape,l.actions=u.actions,l.curves=u.curves,c.push(l),c;var h=!o.Shape.Utils.isClockWise(a[0].getPoints());h=e?!h:h;var p,d=[],f=[],m=[],v=0;f[v]=void 0,m[v]=[];var g,y;for(g=0,y=a.length;g1){for(var _=!1,b=[],x=0,w=f.length;x0&&(_||(m=d))}var A,N,P;for(g=0,y=f.length;ga){var m;if(d>0){if(f<0||f>d)return[];if(m=c*h-l*p,m<0||m>d)return[]}else{if(f>0||f0||mS?[]:x==S?i?[]:[_]:w<=S?[_,b]:[_,M]}function i(e,t,n,r){var o=1e-10,i=t.x-e.x,a=t.y-e.y,s=n.x-e.x,u=n.y-e.y,l=r.x-e.x,c=r.y-e.y,h=i*u-a*s,p=i*c-a*l;if(Math.abs(h)>o){var d=l*u-c*s;return h>0?p>=0&&d>=0:p>=0||d>=0}return p>0}function a(e,t){function n(e,t){var n=y.length-1,r=e-1;r<0&&(r=n);var o=e+1;o>n&&(o=0);var a=i(y[e],y[r],y[o],s[t]);if(!a)return!1;var u=s.length-1,l=t-1;l<0&&(l=u);var c=t+1;return c>u&&(c=0),a=i(s[t],s[l],s[c],y[e]),!!a}function o(e,t){var n,o,i;for(n=0;n0)return!0;return!1}function a(e,n){var o,i,a,s,u;for(o=0;o<_.length;o++)for(i=t[_[o]],a=0;a0)return!0;return!1}for(var s,u,l,c,h,p,d,f,m,v,g,y=e.concat(),_=[],b=[],x=0,w=t.length;x0;){if(M--,M<0){console.log("Infinite Loop! Holes left:"+_.length+", Probably Hole outside Shape!"); +break}for(l=E;l=0)break;b[d]=!0}if(u>=0)break}}return y}for(var s,u,l,c,h,p,d={},f=e.concat(),m=0,v=t.length;mt.length-2?t.length-1:r+1],l=t[r>t.length-3?t.length-1:r+2],c=new o.Vector2;return c.x=o.Curve.Utils.interpolate(a.x,s.x,u.x,l.x,i),c.y=o.Curve.Utils.interpolate(a.y,s.y,u.y,l.y,i),c},o.EllipseCurve=function(e,t,n,r,o,i,a){this.aX=e,this.aY=t,this.xRadius=n,this.yRadius=r,this.aStartAngle=o,this.aEndAngle=i,this.aClockwise=a},o.EllipseCurve.prototype=Object.create(o.Curve.prototype),o.EllipseCurve.prototype.constructor=o.EllipseCurve,o.EllipseCurve.prototype.getPoint=function(e){var t=this.aEndAngle-this.aStartAngle;t<0&&(t+=2*Math.PI),t>2*Math.PI&&(t-=2*Math.PI);var n;n=this.aClockwise===!0?this.aEndAngle+(1-e)*(2*Math.PI-t):this.aStartAngle+e*t;var r=new o.Vector2;return r.x=this.aX+this.xRadius*Math.cos(n),r.y=this.aY+this.yRadius*Math.sin(n),r},o.ArcCurve=function(e,t,n,r,i,a){o.EllipseCurve.call(this,e,t,n,n,r,i,a)},o.ArcCurve.prototype=Object.create(o.EllipseCurve.prototype),o.ArcCurve.prototype.constructor=o.ArcCurve,o.LineCurve3=o.Curve.create(function(e,t){this.v1=e,this.v2=t},function(e){var t=new o.Vector3;return t.subVectors(this.v2,this.v1),t.multiplyScalar(e),t.add(this.v1),t}),o.QuadraticBezierCurve3=o.Curve.create(function(e,t,n){this.v0=e,this.v1=t,this.v2=n},function(e){var t=new o.Vector3;return t.x=o.Shape.Utils.b2(e,this.v0.x,this.v1.x,this.v2.x),t.y=o.Shape.Utils.b2(e,this.v0.y,this.v1.y,this.v2.y),t.z=o.Shape.Utils.b2(e,this.v0.z,this.v1.z,this.v2.z),t}),o.CubicBezierCurve3=o.Curve.create(function(e,t,n,r){this.v0=e,this.v1=t,this.v2=n,this.v3=r},function(e){var t=new o.Vector3;return t.x=o.Shape.Utils.b3(e,this.v0.x,this.v1.x,this.v2.x,this.v3.x),t.y=o.Shape.Utils.b3(e,this.v0.y,this.v1.y,this.v2.y,this.v3.y),t.z=o.Shape.Utils.b3(e,this.v0.z,this.v1.z,this.v2.z,this.v3.z),t}),o.SplineCurve3=o.Curve.create(function(e){this.points=void 0==e?[]:e},function(e){var t=this.points,n=(t.length-1)*e,r=Math.floor(n),i=n-r,a=t[0==r?r:r-1],s=t[r],u=t[r>t.length-2?t.length-1:r+1],l=t[r>t.length-3?t.length-1:r+2],c=new o.Vector3;return c.x=o.Curve.Utils.interpolate(a.x,s.x,u.x,l.x,i),c.y=o.Curve.Utils.interpolate(a.y,s.y,u.y,l.y,i),c.z=o.Curve.Utils.interpolate(a.z,s.z,u.z,l.z,i),c}),o.ClosedSplineCurve3=o.Curve.create(function(e){this.points=void 0==e?[]:e},function(e){var t=this.points,n=(t.length-0)*e,r=Math.floor(n),i=n-r;r+=r>0?0:(Math.floor(Math.abs(r)/t.length)+1)*t.length;var a=t[(r-1)%t.length],s=t[r%t.length],u=t[(r+1)%t.length],l=t[(r+2)%t.length],c=new o.Vector3;return c.x=o.Curve.Utils.interpolate(a.x,s.x,u.x,l.x,i),c.y=o.Curve.Utils.interpolate(a.y,s.y,u.y,l.y,i),c.z=o.Curve.Utils.interpolate(a.z,s.z,u.z,l.z,i),c}),o.AnimationHandler={LINEAR:0,CATMULLROM:1,CATMULLROM_FORWARD:2,add:function(){o.warn("THREE.AnimationHandler.add() has been deprecated.")},get:function(){o.warn("THREE.AnimationHandler.get() has been deprecated.")},remove:function(){o.warn("THREE.AnimationHandler.remove() has been deprecated.")},animations:[],init:function(e){if(e.initialized===!0)return e;for(var t=0;tu.index;)u=l,l=this.getNextKeyWith(s,e,l.index+1);i.prevKey[s]=u,i.nextKey[s]=l}}},resetBlendWeights:function(){for(var e=0,t=this.hierarchy.length;ee.length-2?r:r+1,p[3]=r>e.length-3?r:r+2,u=e[p[0]],l=e[p[1]],c=e[p[2]],h=e[p[3]],i=o*o,s=o*i,d[0]=a(u[0],l[0],c[0],h[0],o,i,s),d[1]=a(u[1],l[1],c[1],h[1],o,i,s),d[2]=a(u[2],l[2],c[2],h[2],o,i,s),d},a=function(e,t,n,r,o,i,a){var s=.5*(n-e),u=.5*(r-t);return(2*(t-n)+s+u)*a+(-3*(t-n)-2*s-u)*i+s*o+t};return function(a){if(this.isPlaying!==!1&&(this.currentTime+=a*this.timeScale,0!==this.weight)){var s=this.data.length;(this.currentTime>s||this.currentTime<0)&&(this.loop?(this.currentTime%=s,this.currentTime<0&&(this.currentTime+=s),this.reset()):this.stop());for(var u=0,l=this.hierarchy.length;u0&&v.time<=this.currentTime||this.timeScale<0&&m.time>=this.currentTime){for(m=this.data.hierarchy[u].keys[0],v=this.getNextKeyWith(f,u,1);v.timem.index;)m=v,v=this.getNextKeyWith(f,u,v.index+1);h.prevKey[f]=m,h.nextKey[f]=v}var g=(this.currentTime-m.time)/(v.time-m.time),y=m[f],_=v[f];if(g<0&&(g=0),g>1&&(g=1),"pos"===f){if(this.interpolationType===o.AnimationHandler.LINEAR){n.x=y[0]+(_[0]-y[0])*g,n.y=y[1]+(_[1]-y[1])*g,n.z=y[2]+(_[2]-y[2])*g;var b=this.weight/(this.weight+p.positionWeight);c.position.lerp(n,b),p.positionWeight+=this.weight}else if(this.interpolationType===o.AnimationHandler.CATMULLROM||this.interpolationType===o.AnimationHandler.CATMULLROM_FORWARD){e[0]=this.getPrevKeyWith("pos",u,m.index-1).pos,e[1]=y,e[2]=_,e[3]=this.getNextKeyWith("pos",u,v.index+1).pos,g=.33*g+.33;var x=i(e,g),b=this.weight/(this.weight+p.positionWeight);p.positionWeight+=this.weight;var w=c.position;if(w.x=w.x+(x[0]-w.x)*b,w.y=w.y+(x[1]-w.y)*b,w.z=w.z+(x[2]-w.z)*b,this.interpolationType===o.AnimationHandler.CATMULLROM_FORWARD){var E=i(e,1.01*g);t.set(E[0],E[1],E[2]),t.sub(w),t.y=0,t.normalize();var M=Math.atan2(t.x,t.z);c.rotation.set(0,M,0)}}}else if("rot"===f)if(o.Quaternion.slerp(y,_,r,g),0===p.quaternionWeight)c.quaternion.copy(r),p.quaternionWeight=this.weight;else{var b=this.weight/(this.weight+p.quaternionWeight);o.Quaternion.slerp(c.quaternion,r,c.quaternion,b),p.quaternionWeight+=this.weight}else if("scl"===f){n.x=y[0]+(_[0]-y[0])*g,n.y=y[1]+(_[1]-y[1])*g,n.z=y[2]+(_[2]-y[2])*g;var b=this.weight/(this.weight+p.scaleWeight);c.scale.lerp(n,b),p.scaleWeight+=this.weight}}return!0}}}(),getNextKeyWith:function(e,t,n){var r=this.data.hierarchy[t].keys;for(this.interpolationType===o.AnimationHandler.CATMULLROM||this.interpolationType===o.AnimationHandler.CATMULLROM_FORWARD?n=n0?n:0:n>=0?n:n+r.length;n>=0;n--)if(void 0!==r[n][e])return r[n];return this.data.hierarchy[t].keys[r.length-1]}},o.KeyFrameAnimation=function(e){this.root=e.node,this.data=o.AnimationHandler.init(e),this.hierarchy=o.AnimationHandler.parse(this.root),this.currentTime=0,this.timeScale=.001,this.isPlaying=!1,this.isPaused=!0,this.loop=!0;for(var t=0,n=this.hierarchy.length;tt&&(this.currentTime%=t),this.currentTime=Math.min(this.currentTime,t);for(var n=0,r=this.hierarchy.length;nu.index;)u=l,l=a[u.index+1];s.prevKey=u,s.nextKey=l}l.time>=this.currentTime?u.interpolate(l,this.currentTime):u.interpolate(l,l.time),this.data.hierarchy[n].node.updateMatrix(),o.matrixWorldNeedsUpdate=!0}}}},getNextKeyWith:function(e,t,n){var r=this.data.hierarchy[t].keys;for(n%=r.length;n=0?n:n+r.length;n>=0;n--)if(r[n].hasTarget(e))return r[n];return r[r.length-1]}},o.MorphAnimation=function(e){this.mesh=e,this.frames=e.morphTargetInfluences.length,this.currentTime=0,this.duration=1e3,this.loop=!0,this.lastFrame=0,this.currentFrame=0,this.isPlaying=!1},o.MorphAnimation.prototype={constructor:o.MorphAnimation,play:function(){this.isPlaying=!0},pause:function(){this.isPlaying=!1},update:function(e){if(this.isPlaying!==!1){this.currentTime+=e,this.loop===!0&&this.currentTime>this.duration&&(this.currentTime%=this.duration),this.currentTime=Math.min(this.currentTime,this.duration);var t=this.duration/this.frames,n=Math.floor(this.currentTime/t),r=this.mesh.morphTargetInfluences;n!=this.currentFrame&&(r[this.lastFrame]=0,r[this.currentFrame]=1,r[n]=0,this.lastFrame=this.currentFrame,this.currentFrame=n),r[n]=this.currentTime%t/t,r[this.lastFrame]=1-r[n]}}},o.BoxGeometry=function(e,t,n,r,i,a){function s(e,t,n,r,i,a,s,l){var c,h,p,d=u.widthSegments,f=u.heightSegments,m=i/2,v=a/2,g=u.vertices.length;"x"===e&&"y"===t||"y"===e&&"x"===t?c="z":"x"===e&&"z"===t||"z"===e&&"x"===t?(c="y",f=u.depthSegments):("z"===e&&"y"===t||"y"===e&&"z"===t)&&(c="x",d=u.depthSegments);var y=d+1,_=f+1,b=i/d,x=a/f,w=new o.Vector3;for(w[c]=s>0?1:-1,p=0;p<_;p++)for(h=0;h0)for(this.vertices.push(new o.Vector3(0,h,0)),l=0;l0)for(this.vertices.push(new o.Vector3(0,-h,0)),l=0;la){var f=Math.sqrt(p),m=Math.sqrt(c*c+h*h),v=t.x-l/f,g=t.y+u/f,y=n.x-h/m,_=n.y+c/m,b=((y-v)*h-(_-g)*c)/(u*h-l*c);r=v+u*b-e.x,i=g+l*b-e.y;var x=r*r+i*i;if(x<=2)return new o.Vector2(r,i);s=Math.sqrt(x/2)}else{var w=!1;u>a?c>a&&(w=!0):u<-a?c<-a&&(w=!0):Math.sign(l)==Math.sign(h)&&(w=!0),w?(r=-l,i=u,s=Math.sqrt(p)):(r=u,i=l,s=Math.sqrt(p/2))}return new o.Vector2(r/s,i/s)}function i(){if(b){var e=0,t=G*e;for(K=0;K=0;){n=K,r=K-1,r<0&&(r=e.length-1);var o=0,i=w+2*_;for(o=0;o=0;U--){for(j=U/_,z=g*(1-j),B=y*Math.sin(j*Math.PI/2),K=0,Y=I.length;K65535?Uint32Array:Uint16Array)(s*u*6),y=0;y_&&(v.normalize(),i=Math.acos(o.Math.clamp(d[c-1].dot(d[c]),-1,1)),f[c].applyMatrix4(g.makeRotationAxis(v,i))),m[c].crossVectors(d[c],f[c]);if(n)for(i=Math.acos(o.Math.clamp(f[0].dot(f[y-1]),-1,1)),i/=y-1,d[0].dot(v.crossVectors(f[0],f[y-1]))>0&&(i=-i),c=1;c.9&&S<.1&&(w<.2&&(x[0].x+=1),E<.2&&(x[1].x+=1),M<.2&&(x[2].x+=1))}for(var p=0,d=this.vertices.length;p.99999?this.quaternion.set(0,0,0,1):n.y<-.99999?this.quaternion.set(1,0,0,0):(t.set(n.z,0,-n.x).normalize(),e=Math.acos(n.y),this.quaternion.setFromAxisAngle(t,e))}}(),o.ArrowHelper.prototype.setLength=function(e,t,n){void 0===t&&(t=.2*e),void 0===n&&(n=.2*t),this.line.scale.set(1,e-t,1),this.line.updateMatrix(),this.cone.scale.set(n,t,n),this.cone.position.y=e,this.cone.updateMatrix()},o.ArrowHelper.prototype.setColor=function(e){this.line.material.color.set(e),this.cone.material.color.set(e)},o.BoxHelper=function(e){var t=new o.BufferGeometry;t.addAttribute("position",new o.BufferAttribute(new Float32Array(72),3)),o.Line.call(this,t,new o.LineBasicMaterial({color:16776960}),o.LinePieces),void 0!==e&&this.update(e)},o.BoxHelper.prototype=Object.create(o.Line.prototype),o.BoxHelper.prototype.constructor=o.BoxHelper,o.BoxHelper.prototype.update=function(e){var t=e.geometry;null===t.boundingBox&&t.computeBoundingBox();var n=t.boundingBox.min,r=t.boundingBox.max,o=this.geometry.attributes.position.array;o[0]=r.x,o[1]=r.y,o[2]=r.z,o[3]=n.x,o[4]=r.y,o[5]=r.z,o[6]=n.x,o[7]=r.y,o[8]=r.z,o[9]=n.x,o[10]=n.y,o[11]=r.z,o[12]=n.x,o[13]=n.y,o[14]=r.z,o[15]=r.x,o[16]=n.y,o[17]=r.z,o[18]=r.x,o[19]=n.y,o[20]=r.z,o[21]=r.x,o[22]=r.y,o[23]=r.z,o[24]=r.x,o[25]=r.y,o[26]=n.z,o[27]=n.x,o[28]=r.y,o[29]=n.z,o[30]=n.x,o[31]=r.y,o[32]=n.z,o[33]=n.x,o[34]=n.y,o[35]=n.z,o[36]=n.x,o[37]=n.y,o[38]=n.z,o[39]=r.x,o[40]=n.y,o[41]=n.z,o[42]=r.x,o[43]=n.y,o[44]=n.z,o[45]=r.x,o[46]=r.y,o[47]=n.z,o[48]=r.x,o[49]=r.y,o[50]=r.z,o[51]=r.x,o[52]=r.y,o[53]=n.z,o[54]=n.x,o[55]=r.y,o[56]=r.z,o[57]=n.x,o[58]=r.y,o[59]=n.z,o[60]=n.x,o[61]=n.y,o[62]=r.z,o[63]=n.x,o[64]=n.y,o[65]=n.z,o[66]=r.x,o[67]=n.y,o[68]=r.z,o[69]=r.x,o[70]=n.y,o[71]=n.z,this.geometry.attributes.position.needsUpdate=!0,this.geometry.computeBoundingSphere(),this.matrix=e.matrixWorld,this.matrixAutoUpdate=!1},o.BoundingBoxHelper=function(e,t){var n=void 0!==t?t:8947848;this.object=e,this.box=new o.Box3,o.Mesh.call(this,new o.BoxGeometry(1,1,1),new o.MeshBasicMaterial({color:n,wireframe:!0}))},o.BoundingBoxHelper.prototype=Object.create(o.Mesh.prototype),o.BoundingBoxHelper.prototype.constructor=o.BoundingBoxHelper,o.BoundingBoxHelper.prototype.update=function(){this.box.setFromObject(this.object),this.box.size(this.scale),this.box.center(this.position)},o.CameraHelper=function(e){function t(e,t,r){n(e,r),n(t,r)}function n(e,t){r.vertices.push(new o.Vector3),r.colors.push(new o.Color(t)),void 0===a[e]&&(a[e]=[]),a[e].push(r.vertices.length-1)}var r=new o.Geometry,i=new o.LineBasicMaterial({color:16777215,vertexColors:o.FaceColors}),a={},s=16755200,u=16711680,l=43775,c=16777215,h=3355443;t("n1","n2",s),t("n2","n4",s),t("n4","n3",s),t("n3","n1",s),t("f1","f2",s),t("f2","f4",s),t("f4","f3",s),t("f3","f1",s),t("n1","f1",s),t("n2","f2",s),t("n3","f3",s),t("n4","f4",s),t("p","n1",u),t("p","n2",u),t("p","n3",u),t("p","n4",u),t("u1","u2",l),t("u2","u3",l),t("u3","u1",l),t("c","t",c),t("p","c",h),t("cn1","cn2",h),t("cn3","cn4",h),t("cf1","cf2",h),t("cf3","cf4",h),o.Line.call(this,r,i,o.LinePieces),this.camera=e,this.matrix=e.matrixWorld,this.matrixAutoUpdate=!1,this.pointMap=a,this.update()},o.CameraHelper.prototype=Object.create(o.Line.prototype),o.CameraHelper.prototype.constructor=o.CameraHelper,o.CameraHelper.prototype.update=function(){var e,t,n=new o.Vector3,r=new o.Camera,i=function(o,i,a,s){n.set(i,a,s).unproject(r);var u=t[o];if(void 0!==u)for(var l=0,c=u.length;l1){var l=u[1];r[l]||(r[l]={start:1/0,end:-(1/0)});var c=r[l];ic.end&&(c.end=i),t||(t=l)}}for(var l in r){var c=r[l];this.createAnimation(l,c.start,c.end,e)}this.firstAnimation=t},o.MorphBlendMesh.prototype.setAnimationDirectionForward=function(e){var t=this.animationsMap[e];t&&(t.direction=1,t.directionBackwards=!1)},o.MorphBlendMesh.prototype.setAnimationDirectionBackward=function(e){var t=this.animationsMap[e];t&&(t.direction=-1,t.directionBackwards=!0)},o.MorphBlendMesh.prototype.setAnimationFPS=function(e,t){var n=this.animationsMap[e];n&&(n.fps=t,n.duration=(n.end-n.start)/n.fps)},o.MorphBlendMesh.prototype.setAnimationDuration=function(e,t){var n=this.animationsMap[e];n&&(n.duration=t,n.fps=(n.end-n.start)/n.duration)},o.MorphBlendMesh.prototype.setAnimationWeight=function(e,t){var n=this.animationsMap[e];n&&(n.weight=t)},o.MorphBlendMesh.prototype.setAnimationTime=function(e,t){var n=this.animationsMap[e];n&&(n.time=t)},o.MorphBlendMesh.prototype.getAnimationTime=function(e){var t=0,n=this.animationsMap[e];return n&&(t=n.time),t},o.MorphBlendMesh.prototype.getAnimationDuration=function(e){var t=-1,n=this.animationsMap[e];return n&&(t=n.duration),t},o.MorphBlendMesh.prototype.playAnimation=function(e){var t=this.animationsMap[e];t?(t.time=0,t.active=!0):o.warn("THREE.MorphBlendMesh: animation["+e+"] undefined in .playAnimation()")},o.MorphBlendMesh.prototype.stopAnimation=function(e){var t=this.animationsMap[e];t&&(t.active=!1)},o.MorphBlendMesh.prototype.update=function(e){for(var t=0,n=this.animationsList.length;tr.duration||r.time<0)&&(r.direction*=-1,r.time>r.duration&&(r.time=r.duration,r.directionBackwards=!0),r.time<0&&(r.time=0,r.directionBackwards=!1)):(r.time=r.time%r.duration,r.time<0&&(r.time+=r.duration));var a=r.startFrame+o.Math.clamp(Math.floor(r.time/i),0,r.length-1),s=r.weight;a!==r.currentFrame&&(this.morphTargetInfluences[r.lastFrame]=0,this.morphTargetInfluences[r.currentFrame]=1*s,this.morphTargetInfluences[a]=0,r.lastFrame=r.currentFrame,r.currentFrame=a);var u=r.time%i/i;r.directionBackwards&&(u=1-u),this.morphTargetInfluences[r.currentFrame]=u*s,this.morphTargetInfluences[r.lastFrame]=(1-u)*s}}},"undefined"!=typeof e&&e.exports&&(t=e.exports=o),t.THREE=o},function(e,t,n){(function(t){"use strict";var n={};"production"!==t.env.NODE_ENV&&Object.freeze(n),e.exports=n}).call(t,n(1))},function(e,t){"use strict";t.__esModule=!0;var n="PUSH";t.PUSH=n;var r="REPLACE";t.REPLACE=r;var o="POP";t.POP=o,t.default={PUSH:n,REPLACE:r,POP:o}},function(e,t,n){(function(e){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function i(e){return o(e).replace(/\/+/g,"/+")}function a(e){for(var t="",n=[],r=[],o=void 0,a=0,s=/:([a-zA-Z_$][a-zA-Z0-9_$]*)|\*\*|\*|\(|\)/g;o=s.exec(e);)o.index!==a&&(r.push(e.slice(a,o.index)),t+=i(e.slice(a,o.index))),o[1]?(t+="([^/?#]+)",n.push(o[1])):"**"===o[0]?(t+="([\\s\\S]*)",n.push("splat")):"*"===o[0]?(t+="([\\s\\S]*?)",n.push("splat")):"("===o[0]?t+="(?:":")"===o[0]&&(t+=")?"),r.push(o[0]),a=s.lastIndex;return a!==e.length&&(r.push(e.slice(a,e.length)),t+=i(e.slice(a,e.length))),{pattern:e,regexpSource:t,paramNames:n,tokens:r}}function s(e){return e in f||(f[e]=a(e)),f[e]}function u(e,t){"/"!==e.charAt(0)&&(e="/"+e),"/"!==t.charAt(0)&&(t="/"+t);var n=s(e),r=n.regexpSource,o=n.paramNames,i=n.tokens;r+="/*";var a="*"!==i[i.length-1];a&&(r+="([\\s\\S]*?)");var u=t.match(new RegExp("^"+r+"$","i")),l=void 0,c=void 0; +if(null!=u){if(a){l=u.pop();var h=u[0].substr(0,u[0].length-l.length);if(l&&"/"!==h.charAt(h.length-1))return{remainingPathname:null,paramNames:o,paramValues:null}}else l="";c=u.slice(1).map(function(e){return null!=e?decodeURIComponent(e):e})}else l=c=null;return{remainingPathname:l,paramNames:o,paramValues:c}}function l(e){return s(e).paramNames}function c(e,t){var n=u(e,t),r=n.paramNames,o=n.paramValues;return null!=o?r.reduce(function(e,t,n){return e[t]=o[n],e},{}):null}function h(t,n){n=n||{};for(var r=s(t),o=r.tokens,i=0,a="",u=0,l=void 0,c=void 0,h=void 0,p=0,f=o.length;p0?void 0:"production"!==e.env.NODE_ENV?d.default(!1,'Missing splat #%s for path "%s"',u,t):d.default(!1),null!=h&&(a+=encodeURI(h))):"("===l?i+=1:")"===l?i-=1:":"===l.charAt(0)?(c=l.substring(1),h=n[c],null!=h||i>0?void 0:"production"!==e.env.NODE_ENV?d.default(!1,'Missing "%s" parameter for path "%s"',c,t):d.default(!1),null!=h&&(a+=encodeURIComponent(h))):a+=l;return a.replace(/\/+/g,"/")}t.__esModule=!0,t.compilePattern=s,t.matchPattern=u,t.getParamNames=l,t.getParams=c,t.formatPattern=h;var p=n(15),d=r(p),f={}}).call(t,n(1))},function(e,t,n){(function(t){"use strict";function r(){var e=v&&v.traverseTwoPhase&&v.traverseEnterLeave;"production"!==t.env.NODE_ENV?c(e,"InstanceHandle not injected before use!"):void 0}var o=n(94),i=n(233),a=n(107),s=n(116),u=n(117),l=n(3),c=n(6),h={},p=null,d=function(e,t){e&&(i.executeDispatchesInOrder(e,t),e.isPersistent()||e.constructor.release(e))},f=function(e){return d(e,!0)},m=function(e){return d(e,!1)},v=null,g={injection:{injectMount:i.injection.injectMount,injectInstanceHandle:function(e){v=e,"production"!==t.env.NODE_ENV&&r()},getInstanceHandle:function(){return"production"!==t.env.NODE_ENV&&r(),v},injectEventPluginOrder:o.injectEventPluginOrder,injectEventPluginsByName:o.injectEventPluginsByName},eventNameDispatchConfigs:o.eventNameDispatchConfigs,registrationNameModules:o.registrationNameModules,putListener:function(e,n,r){"function"!=typeof r?"production"!==t.env.NODE_ENV?l(!1,"Expected %s listener to be a function, instead got type %s",n,typeof r):l(!1):void 0;var i=h[n]||(h[n]={});i[e]=r;var a=o.registrationNameModules[n];a&&a.didPutListener&&a.didPutListener(e,n,r)},getListener:function(e,t){var n=h[t];return n&&n[e]},deleteListener:function(e,t){var n=o.registrationNameModules[t];n&&n.willDeleteListener&&n.willDeleteListener(e,t);var r=h[t];r&&delete r[e]},deleteAllListeners:function(e){for(var t in h)if(h[t][e]){var n=o.registrationNameModules[t];n&&n.willDeleteListener&&n.willDeleteListener(e,t),delete h[t][e]}},extractEvents:function(e,t,n,r,i){for(var a,u=o.plugins,l=0;l":">","<":"<",'"':""","'":"'"},i=/[&><"']/g;e.exports=r},function(e,t,n){"use strict";var r=n(8),o=/^[ \r\n\t\f]/,i=/<(!--|link|noscript|meta|script|style)[ \r\n\t\f\/>]/,a=function(e,t){e.innerHTML=t};if("undefined"!=typeof MSApp&&MSApp.execUnsafeLocalFunction&&(a=function(e,t){MSApp.execUnsafeLocalFunction(function(){e.innerHTML=t})}),r.canUseDOM){var s=document.createElement("div");s.innerHTML=" ",""===s.innerHTML&&(a=function(e,t){if(e.parentNode&&e.parentNode.replaceChild(e,e),o.test(t)||"<"===t[0]&&i.test(t)){e.innerHTML=String.fromCharCode(65279)+t;var n=e.firstChild;1===n.data.length?e.removeChild(n):n.deleteData(0,1)}else e.innerHTML=t})}e.exports=a},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(){function e(){return E.scale}function t(){return E.manifestVersion}function n(){return E.maxVisibleDistance*E.maxVisibleDistance*E.scale}function r(){return E.pos}function o(){d(!E.showLinks)}function s(){return E.lookAt}function l(){return E.showLinks}function h(){var e=x(window.location.hash),t=!b(e.pos,E.pos)||!b(e.lookAt,E.lookAt),n=E.showLinks!==e.showLinks;t&&(g(e.pos,e.lookAt),M.fire("camera")),n&&d(e.showLinks),v(e.manifestVersion)}function d(e){e!==E.showLinks&&(E.showLinks=e,M.fire("showLinks"),y())}function v(e){if(e!==E.manifestVersion){E=x(window.location.hash),E.manifestVersion=e,y();var t=p.default.getGraphName();u.default.downloadGraphRequested.fire(t)}}function g(e,t){b(e,E.pos)&&b(t,E.lookAt)&&t.w===E.lookAt.w||(E.pos.x=e.x,E.pos.y=e.y,E.pos.z=e.z,E.lookAt.x=t.x,E.lookAt.y=t.y,E.lookAt.z=t.z,E.lookAt.w=t.w,y())}function y(){var e=p.default.getGraphName(),t=E.pos,n=E.lookAt,r="#/galaxy/"+e+"?cx="+Math.round(t.x)+"&cy="+Math.round(t.y)+"&cz="+Math.round(t.z)+"&lx="+n.x.toFixed(4)+"&ly="+n.y.toFixed(4)+"&lz="+n.z.toFixed(4)+"&lw="+n.w.toFixed(4)+"&ml="+E.maxVisibleDistance+"&s="+E.scale+"&l="+(E.showLinks?"1":"0")+"&v="+E.manifestVersion;_(r)}function _(e){w&&window.clearTimeout(w),w=setTimeout(function(){window.history?window.history.replaceState(void 0,void 0,e):window.location.replace(e),w=null},400)}function b(e,t){return!(!e||!t)&&(e.x===t.x&&e.y===t.y&&e.z===t.z)}function x(e){if(!e)return m;var t=f.default.parse(e.split("?")[1]),n={x:t.cx||0,y:t.cy||0,z:t.cz||0},r={x:t.lx||0,y:t.ly||0,z:t.lz||0,w:a(t.lw||1)},o="1"===t.l;return{pos:i(n),lookAt:i(r),showLinks:o,maxVisibleDistance:a(t.ml,m.maxVisibleDistance),scale:a(t.s,m.scale),manifestVersion:t.v||m.manifestVersion}}var w,E=x(window.location.hash),M={getCameraPosition:r,getCameraLookAt:s,getShowLinks:l,getScaleFactor:e,getMaxVisibleEdgeLength:n,setCameraConfig:g,setShowLinks:d,getManifestVersion:t,setManifestVersion:v};return u.default.toggleLinks.on(o),u.default.queryChanged.on(h),(0,c.default)(M),M}function i(e){return e?(e.x=a(e.x),e.y=a(e.y),e.z=a(e.z),e):e}function a(e,t){return void 0===t&&(t=0),e=parseFloat(e),isNaN(e)?t:e}Object.defineProperty(t,"__esModule",{value:!0});var s=n(7),u=r(s),l=n(18),c=r(l),h=n(12),p=r(h),d=n(204),f=r(d),m={pos:{x:0,y:0,z:0},lookAt:{x:0,y:0,z:0,w:1},showLinks:!0,maxVisibleDistance:150,scale:1.75,manifestVersion:0};t.default=o(),e.exports=t.default},function(e,t){"use strict";t.__esModule=!0;var n=!("undefined"==typeof window||!window.document||!window.document.createElement);t.canUseDOM=n},function(e,t){"use strict";function n(e){return e}t.__esModule=!0,t.default=n,e.exports=t.default},function(e,t,n){(function(r){"use strict";function o(e){return e&&e.__esModule?e:{default:e}}function i(e,t,n){var o=e(t,n);e.length<2?n(o):"production"!==r.env.NODE_ENV?s.default(void 0===o,'You should not "return" in a transition hook with a callback argument; call the callback instead'):void 0}t.__esModule=!0;var a=n(14),s=o(a);t.default=i,e.exports=t.default}).call(t,n(1))},function(e,t,n){"use strict";e.exports=n(98)},function(e,t){"use strict";function n(e,t,n){function r(){a=!0,n.apply(this,arguments)}function o(){a||(i=0||Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]);return n}function a(e){for(var t in e)if(e.hasOwnProperty(t))return!0;return!1}function s(e){return function(){function t(e,t){var n=!(arguments.length<=2||void 0===arguments[2])&&arguments[2];return y.default(e,t,n,T.location,T.routes,T.params)}function n(e){var t=e.pathname,n=e.query,r=e.state;return S.createLocation(S.createPath(t,n),r,h.REPLACE)}function o(e,t){A&&A.location===e?s(A,t):w.default(M,e,function(n,r){n?t(n):r?s(u({},r,{location:e}),t):t()})}function s(e,t){var r=m.default(T,e),o=r.leaveRoutes,i=r.enterRoutes;v.runLeaveHooks(o),v.runEnterHooks(i,e,function(r,o){r?t(r):o?t(null,n(o)):b.default(e,function(n,r){n?t(n):t(null,null,T=u({},e,{components:r}))})})}function l(e){return e.__id__||(e.__id__=N++)}function p(e){return e.reduce(function(e,t){return e.push.apply(e,P[l(t)]),e},[])}function f(e,t){w.default(M,e,function(n,r){if(null==r)return void t();A=u({},r,{location:e});for(var o=p(m.default(T,A).leaveRoutes),i=void 0,a=0,s=o.length;null==i&&a=32||13===t?t:0}e.exports=n},function(e,t){"use strict";function n(e){var t=this,n=t.nativeEvent;if(n.getModifierState)return n.getModifierState(e);var r=o[e];return!!r&&!!n[r]}function r(e){return n}var o={Alt:"altKey",Control:"ctrlKey",Meta:"metaKey",Shift:"shiftKey"};e.exports=r},function(e,t){"use strict";function n(e){var t=e.target||e.srcElement||window;return 3===t.nodeType?t.parentNode:t}e.exports=n},function(e,t){"use strict";function n(e){var t=e&&(r&&e[r]||e[o]);if("function"==typeof t)return t}var r="function"==typeof Symbol&&Symbol.iterator,o="@@iterator";e.exports=n},function(e,t,n){(function(t){"use strict";function r(e){if(e){var t=e.getName();if(t)return" Check the render method of `"+t+"`."}return""}function o(e){return"function"==typeof e&&"undefined"!=typeof e.prototype&&"function"==typeof e.prototype.mountComponent&&"function"==typeof e.prototype.receiveComponent}function i(e){var n;if(null===e||e===!1)n=new s(i);else if("object"==typeof e){var a=e;!a||"function"!=typeof a.type&&"string"!=typeof a.type?"production"!==t.env.NODE_ENV?c(!1,"Element type is invalid: expected a string (for built-in components) or a class/function (for composite components) but got: %s.%s",null==a.type?a.type:typeof a.type,r(a._owner)):c(!1):void 0,n="string"==typeof a.type?u.createInternalComponent(a):o(a.type)?new a.type(a):new p; +}else"string"==typeof e||"number"==typeof e?n=u.createInstanceForText(e):"production"!==t.env.NODE_ENV?c(!1,"Encountered invalid React node of type %s",typeof e):c(!1);return"production"!==t.env.NODE_ENV&&("production"!==t.env.NODE_ENV?h("function"==typeof n.construct&&"function"==typeof n.mountComponent&&"function"==typeof n.receiveComponent&&"function"==typeof n.unmountComponent,"Only React Components can be mounted."):void 0),n.construct(e),n._mountIndex=0,n._mountImage=null,"production"!==t.env.NODE_ENV&&(n._isOwnerNecessary=!1,n._warnedAboutRefsInRender=!1),"production"!==t.env.NODE_ENV&&Object.preventExtensions&&Object.preventExtensions(n),n}var a=n(239),s=n(105),u=n(111),l=n(5),c=n(3),h=n(6),p=function(){};l(p.prototype,a.Mixin,{_instantiateReactComponent:i}),e.exports=i}).call(t,n(1))},function(e,t,n){"use strict";/** + * Checks if an event is supported in the current execution environment. + * + * NOTE: This will not work correctly for non-generic events such as `change`, + * `reset`, `load`, `error`, and `select`. + * + * Borrows from Modernizr. + * + * @param {string} eventNameSuffix Event name, e.g. "click". + * @param {?boolean} capture Check if the capture phase is supported. + * @return {boolean} True if the event is supported. + * @internal + * @license Modernizr 3.0.0pre (Custom Build) | MIT + */ +function r(e,t){if(!i.canUseDOM||t&&!("addEventListener"in document))return!1;var n="on"+e,r=n in document;if(!r){var a=document.createElement("div");a.setAttribute(n,"return;"),r="function"==typeof a[n]}return!r&&o&&"wheel"===e&&(r=document.implementation.hasFeature("Events.wheel","3.0")),r}var o,i=n(8);i.canUseDOM&&(o=document.implementation&&document.implementation.hasFeature&&document.implementation.hasFeature("","")!==!0),e.exports=r},function(e,t,n){"use strict";var r=n(8),o=n(46),i=n(47),a=function(e,t){e.textContent=t};r.canUseDOM&&("textContent"in document.documentElement||(a=function(e,t){i(e,o(t))})),e.exports=a},function(e,t){"use strict";function n(e,t){var n=null===e||e===!1,r=null===t||t===!1;if(n||r)return n===r;var o=typeof e,i=typeof t;return"string"===o||"number"===o?"string"===i||"number"===i:"object"===i&&e.type===t.type&&e.key===t.key}e.exports=n},function(e,t,n){(function(t){"use strict";function r(e){return g[e]}function o(e,t){return e&&null!=e.key?a(e.key):t.toString(36)}function i(e){return(""+e).replace(y,r)}function a(e){return"$"+i(e)}function s(e,n,r,i){var u=typeof e;if("undefined"!==u&&"boolean"!==u||(e=null),null===e||"string"===u||"number"===u||c.isValidElement(e))return r(i,e,""===n?m+o(e,0):n),1;var h,g,y=0,b=""===n?m:n+v;if(Array.isArray(e))for(var x=0;x "),A=!!s+"|"+e+"|"+p+"|"+T;if(v[A])return;if(v[A]=!0,s){var N="";"table"===p&&"tr"===e&&(N+=" Add a to your code to match the DOM tree generated by the browser."),"production"!==t.env.NODE_ENV?i(!1,"validateDOMNesting(...): <%s> cannot appear as a child of <%s>. See %s.%s",e,p,T,N):void 0}else"production"!==t.env.NODE_ENV?i(!1,"validateDOMNesting(...): <%s> cannot appear as a descendant of <%s>. See %s.",e,p,T):void 0}},a.ancestorInfoContextKey="__validateDOMNesting_ancestorInfo$"+Math.random().toString(36).slice(2),a.updatedAncestorInfo=p,a.isTagValidInContext=function(e,t){t=t||h;var n=t.parentTag,r=n&&n.tag;return d(e,r)&&!f(e,t)}}e.exports=a}).call(t,n(1))},function(e,t){function n(e){if(void 0===e)return e;var t=typeof e;return"number"===t?e:"string"===t?r(e):3===e.length?e[0]<<16|e[1]<<8|e[2]:void 0}function r(e){return"#"===e[0]?Number.parseInt(e.substring(1),16):Number.parseInt(e,16)}e.exports=n},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e){var t=u.default.getGraphName(),n=(0,a.default)(t),r=u.default.getNodeInfo(e);return{name:r.name,id:r.id,inDegree:(0,c.default)(r.in),inDegreeLabel:n.getInDegreeLabel(r.in),outDegree:(0,c.default)(r.out),outDegreeLabel:n.getOutDegreeLabel(r.out)}}Object.defineProperty(t,"__esModule",{value:!0});var i=n(169),a=r(i),s=n(12),u=r(s),l=n(38),c=r(l);t.default=o,e.exports=t.default},function(e,t){"use strict";function n(e){return e.altKey||e.ctrlKey||e.metaKey||e.shiftKey}Object.defineProperty(t,"__esModule",{value:!0}),t.default={isModifier:n,H:72,L:76,Space:32,"/":191},e.exports=t.default},function(e,t,n){(function(t,n,r){/* @preserve + * The MIT License (MIT) + * + * Copyright (c) 2013-2015 Petka Antonov + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ +!function(t){e.exports=t()}(function(){var e,o,i;return function e(t,n,r){function o(a,s){if(!n[a]){if(!t[a]){var u="function"==typeof _dereq_&&_dereq_;if(!s&&u)return u(a,!0);if(i)return i(a,!0);var l=new Error("Cannot find module '"+a+"'");throw l.code="MODULE_NOT_FOUND",l}var c=n[a]={exports:{}};t[a][0].call(c.exports,function(e){var n=t[a][1][e];return o(n?n:e)},c,c.exports,e,t,n,r)}return n[a].exports}for(var i="function"==typeof _dereq_&&_dereq_,a=0;a0},r.prototype.throwLater=function(e,t){if(1===arguments.length&&(t=e,e=function(){throw t}),"undefined"!=typeof setTimeout)setTimeout(function(){e(t)},0);else try{this._schedule(function(){e(t)})}catch(e){throw new Error("No async scheduler available\n\n See http://goo.gl/m3OTXk\n")}},c.hasDevTools?(u.isStatic&&(u=function(e){setTimeout(e,0)}),r.prototype.invokeLater=function(e,t,n){this._trampolineEnabled?o.call(this,e,t,n):this._schedule(function(){setTimeout(function(){e.call(t,n)},100)})},r.prototype.invoke=function(e,t,n){this._trampolineEnabled?i.call(this,e,t,n):this._schedule(function(){e.call(t,n)})},r.prototype.settlePromises=function(e){this._trampolineEnabled?a.call(this,e):this._schedule(function(){e._settlePromises()})}):(r.prototype.invokeLater=o,r.prototype.invoke=i,r.prototype.settlePromises=a),r.prototype.invokeFirst=function(e,t,n){this._normalQueue.unshift(e,t,n),this._queueTick()},r.prototype._drainQueue=function(e){for(;e.length()>0;){var t=e.shift();if("function"==typeof t){var n=e.shift(),r=e.shift();t.call(n,r)}else t._settlePromises()}},r.prototype._drainQueues=function(){this._drainQueue(this._normalQueue),this._reset(),this._drainQueue(this._lateQueue)},r.prototype._queueTick=function(){this._isTickUsed||(this._isTickUsed=!0,this._schedule(this.drainQueues))},r.prototype._reset=function(){this._isTickUsed=!1},t.exports=new r,t.exports.firstLineError=s},{"./queue.js":28,"./schedule.js":31,"./util.js":38}],3:[function(e,t,n){"use strict";t.exports=function(e,t,n){var r=function(e,t){this._reject(t)},o=function(e,t){t.promiseRejectionQueued=!0,t.bindingPromise._then(r,r,null,this,e)},i=function(e,t){this._isPending()&&this._resolveCallback(t.target)},a=function(e,t){t.promiseRejectionQueued||this._reject(e)};e.prototype.bind=function(r){var s=n(r),u=new e(t);u._propagateFrom(this,1);var l=this._target();if(u._setBoundTo(s),s instanceof e){var c={promiseRejectionQueued:!1,promise:u,target:l,bindingPromise:s};l._then(t,o,u._progress,u,c),s._then(i,a,u._progress,u,c)}else u._resolveCallback(l);return u},e.prototype._setBoundTo=function(e){void 0!==e?(this._bitField=131072|this._bitField,this._boundTo=e):this._bitField=this._bitField&-131073},e.prototype._isBound=function(){return 131072===(131072&this._bitField)},e.bind=function(r,o){var i=n(r),a=new e(t);return a._setBoundTo(i),i instanceof e?i._then(function(){a._resolveCallback(o)},a._reject,a._progress,a,null):a._resolveCallback(o),a}}},{}],4:[function(e,t,n){"use strict";function r(){try{Promise===i&&(Promise=o)}catch(e){}return i}var o;"undefined"!=typeof Promise&&(o=Promise);var i=e("./promise.js")();i.noConflict=r,t.exports=i},{"./promise.js":23}],5:[function(e,t,n){"use strict";var r=Object.create;if(r){var o=r(null),i=r(null);o[" size"]=i[" size"]=0}t.exports=function(t){function n(e,n){var r;if(null!=e&&(r=e[n]),"function"!=typeof r){var o="Object "+s.classString(e)+" has no method '"+s.toString(n)+"'";throw new t.TypeError(o)}return r}function r(e){var t=this.pop(),r=n(e,t);return r.apply(e,this)}function o(e){return e[this]}function i(e){var t=+this;return t<0&&(t=Math.max(0,t+e.length)),e[t]}var a,s=e("./util.js"),u=s.canEvaluate;s.isIdentifier;t.prototype.call=function(e){for(var t=arguments.length,n=new Array(t-1),o=1;o32&&this.uncycle()}function r(e,t){for(var n=0;n=0;--s)if(r[s]===i){a=s;break}for(var s=a;s>=0;--s){var u=r[s];if(t[o]!==u)break;t.pop(),o--}t=r}}function a(e){for(var t=[],n=0;n0&&(t=t.slice(n)),t}function u(e){var t;if("function"==typeof e)t="[function "+(e.name||"anonymous")+"]";else{t=e.toString();var n=/\[object [a-zA-Z0-9$_]+\]/;if(n.test(t))try{var r=JSON.stringify(e);t=r}catch(e){}0===t.length&&(t="(empty array)")}return"(<"+l(t)+">, no stack trace)"}function l(e){var t=41;return e.length=0;--r){var i=t[r].stack;void 0===n[i]&&(n[i]=r)}for(var r=0;r0&&(t[s-1]._parent=void 0,t[s-1]._length=1),t[r]._parent=void 0,t[r]._length=1;var u=r>0?t[r-1]:this;s=0;--c)t[c]._length=l,l++;return}}}},n.prototype.parent=function(){return this._parent},n.prototype.hasParent=function(){return void 0!==this._parent},n.prototype.attachExtraTrace=function(e){if(!e.__stackCleaned__){this.uncycle();for(var t=n.parseStackAndMessage(e),s=t.message,u=[t.stack],l=this;void 0!==l;)u.push(a(l.stack.split("\n"))),l=l._parent;i(u),o(u),d.notEnumerableProp(e,"stack",r(s,u)),d.notEnumerableProp(e,"__stackCleaned__",!0)}},n.parseStackAndMessage=function(e){var t=e.stack,n=e.toString();return t="string"==typeof t&&t.length>0?s(e):[" (No stack trace)"],{message:n,stack:a(t)}},n.formatAndLogError=function(e,t){if("undefined"!=typeof console){var n;if("object"==typeof e||"function"==typeof e){var r=e.stack;n=t+v(r,e)}else n=t+String(e);"function"==typeof h?h(n):"function"!=typeof console.log&&"object"!=typeof console.log||console.log(n)}},n.unhandledRejection=function(e){n.formatAndLogError(e,"^--- With additional stack trace: ")},n.isSupported=function(){return"function"==typeof x},n.fireRejectionEvent=function(e,t,r,o){var i=!1;try{"function"==typeof t&&(i=!0,"rejectionHandled"===e?t(o):t(r,o))}catch(e){p.throwLater(e)}var a=!1;try{a=w(e,r,o)}catch(e){a=!0,p.throwLater(e)}var s=!1;if(b)try{s=b(e.toLowerCase(),{reason:r,promise:o})}catch(e){s=!0,p.throwLater(e)}a||i||s||"unhandledRejection"!==e||n.formatAndLogError(r,"Unhandled rejection ")};var y=function(){return!1},_=/[\/<\(]([^:\/]+):(\d+):(?:\d+)\)?\s*$/;n.setBounds=function(e,t){if(n.isSupported()){for(var r,o,i=e.stack.split("\n"),a=t.stack.split("\n"),s=-1,u=-1,l=0;l=u||(y=function(e){if(f.test(e))return!0;var t=c(e);return!!(t&&t.fileName===r&&s<=t.line&&t.line<=u)})}};var b,x=function(){var e=/^\s*at\s*/,t=function(e,t){return"string"==typeof e?e:void 0!==t.name&&void 0!==t.message?t.toString():u(t)};if("number"==typeof Error.stackTraceLimit&&"function"==typeof Error.captureStackTrace){Error.stackTraceLimit=Error.stackTraceLimit+6,m=e,v=t;var n=Error.captureStackTrace;return y=function(e){return f.test(e)},function(e,t){Error.stackTraceLimit=Error.stackTraceLimit+6,n(e,t),Error.stackTraceLimit=Error.stackTraceLimit-6}}var r=new Error;if("string"==typeof r.stack&&r.stack.split("\n")[0].indexOf("stackDetection@")>=0)return m=/@/,v=t,g=!0,function(e){e.stack=(new Error).stack};var o;try{throw new Error}catch(e){o="stack"in e}return"stack"in r||!o||"number"!=typeof Error.stackTraceLimit?(v=function(e,t){return"string"==typeof e?e:"object"!=typeof t&&"function"!=typeof t||void 0===t.name||void 0===t.message?u(t):t.toString()},null):(m=e,v=t,function(e){Error.stackTraceLimit=Error.stackTraceLimit+6;try{throw new Error}catch(t){e.stack=t.stack}Error.stackTraceLimit=Error.stackTraceLimit-6})}([]),w=function(){if(d.isNode)return function(e,n,r){return"rejectionHandled"===e?t.emit(e,r):t.emit(e,n,r)};var e=!1,n=!0;try{var r=new self.CustomEvent("test");e=r instanceof CustomEvent}catch(e){}if(!e)try{var o=document.createEvent("CustomEvent");o.initCustomEvent("testingtheevent",!1,!0,{}),self.dispatchEvent(o)}catch(e){n=!1}n&&(b=function(t,n){var r;return e?r=new self.CustomEvent(t,{detail:n,bubbles:!1,cancelable:!0}):self.dispatchEvent&&(r=document.createEvent("CustomEvent"),r.initCustomEvent(t,!1,!0,n)),!!r&&!self.dispatchEvent(r)});var i={};return i.unhandledRejection="onunhandledRejection".toLowerCase(),i.rejectionHandled="onrejectionHandled".toLowerCase(),function(e,t,n){var r=i[e],o=self[r];return!!o&&("rejectionHandled"===e?o.call(self,n):o.call(self,t,n),!0)}}();return"undefined"!=typeof console&&"undefined"!=typeof console.warn&&(h=function(e){console.warn(e)},d.isNode&&t.stderr.isTTY?h=function(e){t.stderr.write(""+e+"\n")}:d.isNode||"string"!=typeof(new Error).stack||(h=function(e){console.warn("%c"+e,"color: red")})),n}},{"./async.js":2,"./util.js":38}],8:[function(e,t,n){"use strict";t.exports=function(t){function n(e,t,n){this._instances=e,this._callback=t,this._promise=n}function r(e,t){var n={},r=a(e).call(n,t);if(r===s)return r;var o=u(n);return o.length?(s.e=new l("Catch filter must inherit from Error or be a simple predicate function\n\n See http://goo.gl/o84o68\n"),s):r}var o=e("./util.js"),i=e("./errors.js"),a=o.tryCatch,s=o.errorObj,u=e("./es5.js").keys,l=i.TypeError;return n.prototype.doFilter=function(e){for(var n=this._callback,o=this._promise,i=o._boundValue(),u=0,l=this._instances.length;u=0)return a[e]}var a=[];return r.prototype._pushContext=function(){n()&&void 0!==this._trace&&a.push(this._trace)},r.prototype._popContext=function(){n()&&void 0!==this._trace&&a.pop()},e.prototype._peekContext=i,e.prototype._pushContext=r.prototype._pushContext,e.prototype._popContext=r.prototype._popContext,o}},{}],10:[function(e,n,r){"use strict";n.exports=function(n,r){var o,i,a=n._getDomain,s=e("./async.js"),u=e("./errors.js").Warning,l=e("./util.js"),c=l.canAttachTrace,h=l.isNode&&(!!t.env.BLUEBIRD_DEBUG||"development"===t.env.NODE_ENV);return l.isNode&&0==t.env.BLUEBIRD_DEBUG&&(h=!1),h&&s.disableTrampolineIfNecessary(),n.prototype._ignoreRejections=function(){this._unsetRejectionIsUnhandled(),this._bitField=16777216|this._bitField},n.prototype._ensurePossibleRejectionHandled=function(){0===(16777216&this._bitField)&&(this._setRejectionIsUnhandled(),s.invokeLater(this._notifyUnhandledRejection,this,void 0))},n.prototype._notifyUnhandledRejectionIsHandled=function(){r.fireRejectionEvent("rejectionHandled",o,void 0,this)},n.prototype._notifyUnhandledRejection=function(){if(this._isRejectionUnhandled()){var e=this._getCarriedStackTrace()||this._settledValue;this._setUnhandledRejectionIsNotified(),r.fireRejectionEvent("unhandledRejection",i,e,this)}},n.prototype._setUnhandledRejectionIsNotified=function(){this._bitField=524288|this._bitField},n.prototype._unsetUnhandledRejectionIsNotified=function(){this._bitField=this._bitField&-524289},n.prototype._isUnhandledRejectionNotified=function(){return(524288&this._bitField)>0},n.prototype._setRejectionIsUnhandled=function(){this._bitField=2097152|this._bitField},n.prototype._unsetRejectionIsUnhandled=function(){this._bitField=this._bitField&-2097153,this._isUnhandledRejectionNotified()&&(this._unsetUnhandledRejectionIsNotified(),this._notifyUnhandledRejectionIsHandled())},n.prototype._isRejectionUnhandled=function(){return(2097152&this._bitField)>0},n.prototype._setCarriedStackTrace=function(e){this._bitField=1048576|this._bitField,this._fulfillmentHandler0=e},n.prototype._isCarryingStackTrace=function(){return(1048576&this._bitField)>0},n.prototype._getCarriedStackTrace=function(){return this._isCarryingStackTrace()?this._fulfillmentHandler0:void 0},n.prototype._captureStackTrace=function(){return h&&(this._trace=new r(this._peekContext())),this},n.prototype._attachExtraTrace=function(e,t){if(h&&c(e)){var n=this._trace;if(void 0!==n&&t&&(n=n._parent),void 0!==n)n.attachExtraTrace(e);else if(!e.__stackCleaned__){var o=r.parseStackAndMessage(e);l.notEnumerableProp(e,"stack",o.message+"\n"+o.stack.join("\n")),l.notEnumerableProp(e,"__stackCleaned__",!0)}}},n.prototype._warn=function(e){var t=new u(e),n=this._peekContext();if(n)n.attachExtraTrace(t);else{var o=r.parseStackAndMessage(t);t.stack=o.message+"\n"+o.stack.join("\n")}r.formatAndLogError(t,"")},n.onPossiblyUnhandledRejection=function(e){var t=a();i="function"==typeof e?null===t?e:t.bind(e):void 0},n.onUnhandledRejectionHandled=function(e){var t=a();o="function"==typeof e?null===t?e:t.bind(e):void 0},n.longStackTraces=function(){if(s.haveItemsQueued()&&h===!1)throw new Error("cannot enable long stack traces after promises have been created\n\n See http://goo.gl/DT1qyG\n");h=r.isSupported(),h&&s.disableTrampolineIfNecessary()},n.hasLongStackTraces=function(){return h&&r.isSupported()},r.isSupported()||(n.longStackTraces=function(){},h=!1),function(){return h}}},{"./async.js":2,"./errors.js":13,"./util.js":38}],11:[function(e,t,n){"use strict";var r=e("./util.js"),o=r.isPrimitive;t.exports=function(e){var t=function(){return this},n=function(){throw this},r=function(){},i=function(){throw void 0},a=function(e,t){return 1===t?function(){throw e}:2===t?function(){return e}:void 0};e.prototype.return=e.prototype.thenReturn=function(n){return void 0===n?this.then(r):o(n)?this._then(a(n,2),void 0,void 0,void 0,void 0):(n instanceof e&&n._ignoreRejections(),this._then(t,void 0,void 0,n,void 0))},e.prototype.throw=e.prototype.thenThrow=function(e){return void 0===e?this.then(i):o(e)?this._then(a(e,1),void 0,void 0,void 0,void 0):this._then(n,void 0,void 0,e,void 0)}}},{"./util.js":38}],12:[function(e,t,n){"use strict";t.exports=function(e,t){var n=e.reduce;e.prototype.each=function(e){return n(this,e,null,t)},e.each=function(e,r){return n(e,r,null,t)}}},{}],13:[function(e,t,n){"use strict";function r(e,t){function n(r){return this instanceof n?(h(this,"message","string"==typeof r?r:t),h(this,"name",e),void(Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):Error.call(this))):new n(r)}return c(n,Error),n}function o(e){return this instanceof o?(h(this,"name","OperationalError"),h(this,"message",e),this.cause=e,this.isOperational=!0,void(e instanceof Error?(h(this,"message",e.message),h(this,"stack",e.stack)):Error.captureStackTrace&&Error.captureStackTrace(this,this.constructor))):new o(e)}var i,a,s=e("./es5.js"),u=s.freeze,l=e("./util.js"),c=l.inherits,h=l.notEnumerableProp,p=r("Warning","warning"),d=r("CancellationError","cancellation error"),f=r("TimeoutError","timeout error"),m=r("AggregateError","aggregate error");try{i=TypeError,a=RangeError}catch(e){i=r("TypeError","type error"),a=r("RangeError","range error")}for(var v="join pop push shift unshift slice filter forEach some every map indexOf lastIndexOf reduce reduceRight sort reverse".split(" "),g=0;g0&&"function"==typeof arguments[t]){e=arguments[t];var r}for(var o=arguments.length,i=new Array(o),a=0;a=1?[]:m,c.invoke(s,this,void 0)}function s(){this._init$(void 0,-2)}function u(e,t,n,r){var o="object"==typeof n&&null!==n?n.concurrency:0;return o="number"==typeof o&&isFinite(o)&&o>=1?o:0,new a(e,t,o,r)}var l=t._getDomain,c=e("./async.js"),h=e("./util.js"),p=h.tryCatch,d=h.errorObj,f={},m=[];h.inherits(a,n),a.prototype._init=function(){},a.prototype._promiseFulfilled=function(e,n){var r=this._values,i=this.length(),a=this._preservedValues,s=this._limit;if(r[n]===f){if(r[n]=e,s>=1&&(this._inFlight--,this._drainQueue(),this._isResolved()))return}else{if(s>=1&&this._inFlight>=s)return r[n]=e,void this._queue.push(n);null!==a&&(a[n]=e);var u=this._callback,l=this._promise._boundValue();this._promise._pushContext();var c=p(u).call(l,e,n,i);if(this._promise._popContext(),c===d)return this._reject(c.e);var h=o(c,this._promise);if(h instanceof t){if(h=h._target(),h._isPending())return s>=1&&this._inFlight++,r[n]=f,h._proxyPromiseArray(this,n);if(!h._isFulfilled())return this._reject(h._reason());c=h._value()}r[n]=c}var m=++this._totalResolved;m>=i&&(null!==a?this._filter(r,a):this._resolve(r))},a.prototype._drainQueue=function(){for(var e=this._queue,t=this._limit,n=this._values;e.length>0&&this._inFlight1){var n,o=new Array(t-1),i=0;for(n=0;n0&&"function"!=typeof e&&"function"!=typeof t){var r=".then() only accepts functions but was passed: "+l.classString(e);arguments.length>1&&(r+=", "+l.classString(t)),this._warn(r)}return this._then(e,t,n,void 0,void 0)},r.prototype.done=function(e,t,n){var r=this._then(e,t,n,void 0,void 0);r._setIsFinal()},r.prototype.spread=function(e,t){return this.all()._then(e,t,void 0,m,void 0)},r.prototype.isCancellable=function(){return!this.isResolved()&&this._cancellable()},r.prototype.toJSON=function(){var e={isFulfilled:!1,isRejected:!1, +fulfillmentValue:void 0,rejectionReason:void 0};return this.isFulfilled()?(e.fulfillmentValue=this.value(),e.isFulfilled=!0):this.isRejected()&&(e.rejectionReason=this.reason(),e.isRejected=!0),e},r.prototype.all=function(){return new y(this).promise()},r.prototype.error=function(e){return this.caught(l.originatesFromRejection,e)},r.getNewLibraryCopy=n.exports,r.is=function(e){return e instanceof r},r.fromNode=function(e){var t=new r(f),n=S(e)(M(t));return n===C&&t._rejectCallback(n.e,!0,!0),t},r.all=function(e){return new y(e).promise()},r.defer=r.pending=function(){var e=new r(f);return new E(e)},r.cast=function(e){var t=g(e);if(!(t instanceof r)){var n=t;t=new r(f),t._fulfillUnchecked(n)}return t},r.resolve=r.fulfilled=r.cast,r.reject=r.rejected=function(e){var t=new r(f);return t._captureStackTrace(),t._rejectCallback(e,!0),t},r.setScheduler=function(e){if("function"!=typeof e)throw new d("fn must be a function\n\n See http://goo.gl/916lJJ\n");var t=h._schedule;return h._schedule=e,t},r.prototype._then=function(e,t,n,o,a){var s=void 0!==a,u=s?a:new r(f);s||(u._propagateFrom(this,5),u._captureStackTrace());var l=this._target();l!==this&&(void 0===o&&(o=this._boundTo),s||u._setIsMigrated());var c=l._addCallbacks(e,t,n,u,o,i());return l._isResolved()&&!l._isSettlePromisesQueued()&&h.invoke(l._settlePromiseAtPostResolution,l,c),u},r.prototype._settlePromiseAtPostResolution=function(e){this._isRejectionUnhandled()&&this._unsetRejectionIsUnhandled(),this._settlePromiseAt(e)},r.prototype._length=function(){return 131071&this._bitField},r.prototype._isFollowingOrFulfilledOrRejected=function(){return(939524096&this._bitField)>0},r.prototype._isFollowing=function(){return 536870912===(536870912&this._bitField)},r.prototype._setLength=function(e){this._bitField=this._bitField&-131072|131071&e},r.prototype._setFulfilled=function(){this._bitField=268435456|this._bitField},r.prototype._setRejected=function(){this._bitField=134217728|this._bitField},r.prototype._setFollowing=function(){this._bitField=536870912|this._bitField},r.prototype._setIsFinal=function(){this._bitField=33554432|this._bitField},r.prototype._isFinal=function(){return(33554432&this._bitField)>0},r.prototype._cancellable=function(){return(67108864&this._bitField)>0},r.prototype._setCancellable=function(){this._bitField=67108864|this._bitField},r.prototype._unsetCancellable=function(){this._bitField=this._bitField&-67108865},r.prototype._setIsMigrated=function(){this._bitField=4194304|this._bitField},r.prototype._unsetIsMigrated=function(){this._bitField=this._bitField&-4194305},r.prototype._isMigrated=function(){return(4194304&this._bitField)>0},r.prototype._receiverAt=function(e){var t=0===e?this._receiver0:this[5*e-5+4];if(t!==c)return void 0===t&&this._isBound()?this._boundValue():t},r.prototype._promiseAt=function(e){return 0===e?this._promise0:this[5*e-5+3]},r.prototype._fulfillmentHandlerAt=function(e){return 0===e?this._fulfillmentHandler0:this[5*e-5+0]},r.prototype._rejectionHandlerAt=function(e){return 0===e?this._rejectionHandler0:this[5*e-5+1]},r.prototype._boundValue=function(){var e=this._boundTo;return void 0!==e&&e instanceof r?e.isFulfilled()?e.value():void 0:e},r.prototype._migrateCallbacks=function(e,t){var n=e._fulfillmentHandlerAt(t),o=e._rejectionHandlerAt(t),i=e._progressHandlerAt(t),a=e._promiseAt(t),s=e._receiverAt(t);a instanceof r&&a._setIsMigrated(),void 0===s&&(s=c),this._addCallbacks(n,o,i,a,s,null)},r.prototype._addCallbacks=function(e,t,n,r,o,i){var a=this._length();if(a>=131066&&(a=0,this._setLength(0)),0===a)this._promise0=r,void 0!==o&&(this._receiver0=o),"function"!=typeof e||this._isCarryingStackTrace()||(this._fulfillmentHandler0=null===i?e:i.bind(e)),"function"==typeof t&&(this._rejectionHandler0=null===i?t:i.bind(t)),"function"==typeof n&&(this._progressHandler0=null===i?n:i.bind(n));else{var s=5*a-5;this[s+3]=r,this[s+4]=o,"function"==typeof e&&(this[s+0]=null===i?e:i.bind(e)),"function"==typeof t&&(this[s+1]=null===i?t:i.bind(t)),"function"==typeof n&&(this[s+2]=null===i?n:i.bind(n))}return this._setLength(a+1),a},r.prototype._setProxyHandlers=function(e,t){var n=this._length();if(n>=131066&&(n=0,this._setLength(0)),0===n)this._promise0=t,this._receiver0=e;else{var r=5*n-5;this[r+3]=t,this[r+4]=e}this._setLength(n+1)},r.prototype._proxyPromiseArray=function(e,t){this._setProxyHandlers(e,t)},r.prototype._resolveCallback=function(e,t){if(!this._isFollowingOrFulfilledOrRejected()){if(e===this)return this._rejectCallback(a(),!1,!0);var n=g(e,this);if(!(n instanceof r))return this._fulfill(e);var o=1|(t?4:0);this._propagateFrom(n,o);var i=n._target();if(i._isPending()){for(var s=this._length(),u=0;u0&&e._cancellable()&&(this._setCancellable(),this._cancellationParent=e),(4&t)>0&&e._isBound()&&this._setBoundTo(e._boundTo)},r.prototype._fulfill=function(e){this._isFollowingOrFulfilledOrRejected()||this._fulfillUnchecked(e)},r.prototype._reject=function(e,t){this._isFollowingOrFulfilledOrRejected()||this._rejectUnchecked(e,t)},r.prototype._settlePromiseAt=function(e){var t=this._promiseAt(e),n=t instanceof r;if(n&&t._isMigrated())return t._unsetIsMigrated(),h.invoke(this._settlePromiseAt,this,e);var o=this._isFulfilled()?this._fulfillmentHandlerAt(e):this._rejectionHandlerAt(e),i=this._isCarryingStackTrace()?this._getCarriedStackTrace():void 0,a=this._settledValue,s=this._receiverAt(e);this._clearCallbackDataAtIndex(e),"function"==typeof o?n?this._settlePromiseFromHandler(o,s,a,t):o.call(s,a,t):s instanceof y?s._isResolved()||(this._isFulfilled()?s._promiseFulfilled(a,t):s._promiseRejected(a,t)):n&&(this._isFulfilled()?t._fulfill(a):t._reject(a,i)),e>=4&&4===(31&e)&&h.invokeLater(this._setLength,this,0)},r.prototype._clearCallbackDataAtIndex=function(e){if(0===e)this._isCarryingStackTrace()||(this._fulfillmentHandler0=void 0),this._rejectionHandler0=this._progressHandler0=this._receiver0=this._promise0=void 0;else{var t=5*e-5;this[t+3]=this[t+4]=this[t+0]=this[t+1]=this[t+2]=void 0}},r.prototype._isSettlePromisesQueued=function(){return(this._bitField&-1073741824)===-1073741824},r.prototype._setSettlePromisesQueued=function(){this._bitField=this._bitField|-1073741824},r.prototype._unsetSettlePromisesQueued=function(){this._bitField=1073741823&this._bitField},r.prototype._queueSettlePromises=function(){h.settlePromises(this),this._setSettlePromisesQueued()},r.prototype._fulfillUnchecked=function(e){if(e===this){var t=a();return this._attachExtraTrace(t),this._rejectUnchecked(t,void 0)}this._setFulfilled(),this._settledValue=e,this._cleanValues(),this._length()>0&&this._queueSettlePromises()},r.prototype._rejectUncheckedCheckError=function(e){var t=l.ensureErrorObject(e);this._rejectUnchecked(e,t===e?void 0:t)},r.prototype._rejectUnchecked=function(e,t){if(e===this){var n=a();return this._attachExtraTrace(n),this._rejectUnchecked(n)}return this._setRejected(),this._settledValue=e,this._cleanValues(),this._isFinal()?void h.throwLater(function(e){throw"stack"in e&&h.invokeFirst(_.unhandledRejection,void 0,e),e},void 0===t?e:t):(void 0!==t&&t!==e&&this._setCarriedStackTrace(t),void(this._length()>0?this._queueSettlePromises():this._ensurePossibleRejectionHandled()))},r.prototype._settlePromises=function(){this._unsetSettlePromisesQueued();for(var e=this._length(),t=0;t=this._length&&this._resolve(this._values)},a.prototype._promiseRejected=function(e,t){this._totalResolved++,this._reject(e)},a.prototype.shouldCopyValues=function(){return!0},a.prototype.getActualLength=function(e){return e},a}},{"./util.js":38}],25:[function(e,t,n){"use strict";function r(e){return e instanceof Error&&d.getPrototypeOf(e)===Error.prototype}function o(e){var t;if(r(e)){t=new h(e),t.name=e.name,t.message=e.message,t.stack=e.stack;for(var n=d.keys(e),o=0;o2){for(var i=arguments.length,a=new Array(i-1),s=1;s=this._length){for(var r={},o=this.length(),i=0,a=this.length();i>1},t.prototype.props=function(){return a(this)},t.props=function(e){return a(e)}}},{"./es5.js":14,"./util.js":38}],28:[function(e,t,n){"use strict";function r(e,t,n,r,o){for(var i=0;i=this._length&&this._resolve(this._values)},r.prototype._promiseFulfilled=function(e,t){var n=new o;n._bitField=268435456,n._settledValue=e,this._promiseResolved(t,n)},r.prototype._promiseRejected=function(e,t){var n=new o;n._bitField=134217728,n._settledValue=e,this._promiseResolved(t,n)},t.settle=function(e){return new r(e).promise()},t.prototype.settle=function(){return new r(this).promise()}}},{"./util.js":38}],33:[function(e,t,n){"use strict";t.exports=function(t,n,r){function o(e){this.constructor$(e),this._howMany=0,this._unwrap=!1,this._initialized=!1}function i(e,t){if((0|t)!==t||t<0)return r("expecting a positive integer\n\n See http://goo.gl/1wAmHx\n");var n=new o(e),i=n.promise();return n.setHowMany(t),n.init(),i}var a=e("./util.js"),s=e("./errors.js").RangeError,u=e("./errors.js").AggregateError,l=a.isArray;a.inherits(o,n),o.prototype._init=function(){if(this._initialized){if(0===this._howMany)return void this._resolve([]);this._init$(void 0,-5);var e=l(this._values);!this._isResolved()&&e&&this._howMany>this._canPossiblyFulfill()&&this._reject(this._getRangeError(this.length()))}},o.prototype.init=function(){this._initialized=!0,this._init()},o.prototype.setUnwrap=function(){this._unwrap=!0},o.prototype.howMany=function(){return this._howMany},o.prototype.setHowMany=function(e){this._howMany=e},o.prototype._promiseFulfilled=function(e){this._addFulfilled(e),this._fulfilled()===this.howMany()&&(this._values.length=this.howMany(),1===this.howMany()&&this._unwrap?this._resolve(this._values[0]):this._resolve(this._values))},o.prototype._promiseRejected=function(e){if(this._addRejected(e),this.howMany()>this._canPossiblyFulfill()){for(var t=new u,n=this.length();n0},t.prototype.isRejected=e.prototype._isRejected=function(){return(134217728&this._bitField)>0},t.prototype.isPending=e.prototype._isPending=function(){return 0===(402653184&this._bitField)},t.prototype.isResolved=e.prototype._isResolved=function(){return(402653184&this._bitField)>0},e.prototype.isPending=function(){return this._target()._isPending()},e.prototype.isRejected=function(){return this._target()._isRejected()},e.prototype.isFulfilled=function(){return this._target()._isFulfilled()},e.prototype.isResolved=function(){return this._target()._isResolved()},e.prototype._value=function(){return this._settledValue},e.prototype._reason=function(){return this._unsetRejectionIsUnhandled(),this._settledValue},e.prototype.value=function(){var e=this._target();if(!e.isFulfilled())throw new TypeError("cannot get fulfillment value of a non-fulfilled promise\n\n See http://goo.gl/hc1DLj\n");return e._settledValue},e.prototype.reason=function(){var e=this._target();if(!e.isRejected())throw new TypeError("cannot get rejection reason of a non-rejected promise\n\n See http://goo.gl/hPuiwB\n");return e._unsetRejectionIsUnhandled(),e._settledValue},e.PromiseInspection=t}},{}],35:[function(e,t,n){"use strict";t.exports=function(t,n){function r(e,r){if(l(e)){if(e instanceof t)return e;if(i(e)){var c=new t(n);return e._then(c._fulfillUnchecked,c._rejectUncheckedCheckError,c._progressUnchecked,c,null),c}var h=s.tryCatch(o)(e);if(h===u){r&&r._pushContext();var c=t.reject(h.e);return r&&r._popContext(),c}if("function"==typeof h)return a(e,h,r)}return e}function o(e){return e.then}function i(e){return c.call(e,"_promise0")}function a(e,r,o){function i(e){c&&(c._resolveCallback(e),c=null)}function a(e){c&&(c._rejectCallback(e,p,!0),c=null)}function l(e){c&&"function"==typeof c._progress&&c._progress(e)}var c=new t(n),h=c;o&&o._pushContext(),c._captureStackTrace(),o&&o._popContext();var p=!0,d=s.tryCatch(r).call(e,i,a,l);return p=!1,c&&d===u&&(c._rejectCallback(d.e,!0,!0),c=null),h}var s=e("./util.js"),u=s.errorObj,l=s.isObject,c={}.hasOwnProperty;return r}},{"./util.js":38}],36:[function(e,t,n){"use strict";t.exports=function(t,n){function r(e){var t=this;return t instanceof Number&&(t=+t),clearTimeout(t),e}function o(e){var t=this;throw t instanceof Number&&(t=+t),clearTimeout(t),e}var i=e("./util.js"),a=t.TimeoutError,s=function(e,t){if(e.isPending()){var n;!i.isPrimitive(t)&&t instanceof Error?n=t:("string"!=typeof t&&(t="operation timed out"),n=new a(t)),i.markAsOriginatingFromRejection(n),e._attachExtraTrace(n),e._cancel(n)}},u=function(e){return l(+this).thenReturn(e)},l=t.delay=function(e,r){if(void 0===r){r=e,e=void 0;var o=new t(n);return setTimeout(function(){o._fulfill()},r),o}return r=+r,t.resolve(e)._then(u,null,null,r,void 0)};t.prototype.delay=function(e){return l(this,e)},t.prototype.timeout=function(e,t){e=+e;var n=this.then().cancellable();n._cancellationParent=this;var i=setTimeout(function(){s(n,t)},e);return n._then(r,o,void 0,i,void 0)}}},{"./util.js":38}],37:[function(e,t,n){"use strict";t.exports=function(t,n,r,o){function i(e){for(var n=e.length,r=0;r=u)return l.resolve();var c=s(e[i++]);if(c instanceof t&&c._isDisposable()){try{c=r(c._getDisposer().tryDispose(n),e.promise)}catch(e){return a(e)}if(c instanceof t)return c._then(o,a,null,null,null)}o()}var i=0,u=e.length,l=t.defer();return o(),l.promise}function l(e){var t=new v;return t._settledValue=e,t._bitField=268435456,u(this,t).thenReturn(e)}function c(e){var t=new v;return t._settledValue=e,t._bitField=134217728,u(this,t).thenThrow(e)}function h(e,t,n){this._data=e,this._promise=t,this._context=n}function p(e,t,n){this.constructor$(e,t,n)}function d(e){return h.isDisposer(e)?(this.resources[this.index]._setDisposable(e),e.promise()):e}var f=e("./errors.js").TypeError,m=e("./util.js").inherits,v=t.PromiseInspection;h.prototype.data=function(){return this._data},h.prototype.promise=function(){return this._promise},h.prototype.resource=function(){return this.promise().isFulfilled()?this.promise().value():null},h.prototype.tryDispose=function(e){var t=this.resource(),n=this._context;void 0!==n&&n._pushContext();var r=null!==t?this.doDispose(t,e):null;return void 0!==n&&n._popContext(),this._promise._unsetDisposable(),this._data=null,r},h.isDisposer=function(e){return null!=e&&"function"==typeof e.resource&&"function"==typeof e.tryDispose},m(p,h),p.prototype.doDispose=function(e,t){var n=this.data();return n.call(e,e,t)},t.using=function(){var e=arguments.length;if(e<2)return n("you must pass at least 2 arguments to Promise.using");var o=arguments[e-1];if("function"!=typeof o)return n("fn must be a function\n\n See http://goo.gl/916lJJ\n");var a,s=!0;2===e&&Array.isArray(arguments[0])?(a=arguments[0],e=a.length,s=!1):(a=arguments,e--);for(var u=new Array(e),p=0;p0},t.prototype._getDisposer=function(){return this._disposer},t.prototype._unsetDisposable=function(){this._bitField=this._bitField&-262145,this._disposer=void 0},t.prototype.disposer=function(e){if("function"==typeof e)return new p(e,this,o());throw new f}}},{"./errors.js":13,"./util.js":38}],38:[function(e,n,r){"use strict";function o(){try{var e=T;return T=null,e.apply(this,arguments)}catch(e){return S.e=e,S}}function i(e){return T=e,o}function a(e){return null==e||e===!0||e===!1||"string"==typeof e||"number"==typeof e}function s(e){return!a(e)}function u(e){return a(e)?new Error(g(e)):e}function l(e,t){var n,r=e.length,o=new Array(r+1);for(n=0;n1,r=t.length>0&&!(1===t.length&&"constructor"===t[0]),o=P.test(e+"")&&E.names(e).length>0;if(n||r||o)return!0}return!1}catch(e){return!1}}function f(e){function t(){}t.prototype=e;for(var n=8;n--;)new t;return e}function m(e){return R.test(e)}function v(e,t,n){for(var r=new Array(e),o=0;o10||e[0]>0}(),O.isNode&&O.toFastProperties(t);try{throw new Error}catch(e){O.lastLineError=e}n.exports=O},{"./es5.js":14}]},{},[4])(4)}),"undefined"!=typeof window&&null!==window?window.P=window.Promise:"undefined"!=typeof self&&null!==self&&(self.P=self.Promise)}).call(t,n(1),function(){return this}(),n(299).setImmediate)},function(e,t,n){(function(t){"use strict";var r=n(17),o={listen:function(e,t,n){return e.addEventListener?(e.addEventListener(t,n,!1),{remove:function(){e.removeEventListener(t,n,!1)}}):e.attachEvent?(e.attachEvent("on"+t,n),{remove:function(){e.detachEvent("on"+t,n)}}):void 0},capture:function(e,n,o){return e.addEventListener?(e.addEventListener(n,o,!0),{remove:function(){e.removeEventListener(n,o,!0)}}):("production"!==t.env.NODE_ENV&&console.error("Attempted to listen to events during the capture phase on a browser that does not support the capture phase. Your application will not receive some events."),{remove:r})},registerDefault:function(){}};e.exports=o}).call(t,n(1))},function(e,t,n){"use strict";function r(e,t){var n=!0;e:for(;n;){var r=e,i=t;if(n=!1,r&&i){if(r===i)return!0;if(o(r))return!1;if(o(i)){e=r,t=i.parentNode,n=!0;continue e}return r.contains?r.contains(i):!!r.compareDocumentPosition&&!!(16&r.compareDocumentPosition(i))}return!1}}var o=n(190);e.exports=r},function(e,t){"use strict";function n(e){try{e.focus()}catch(e){}}e.exports=n},function(e,t){"use strict";function n(){if("undefined"==typeof document)return null;try{return document.activeElement||document.body}catch(e){return document.body}}e.exports=n},function(e,t,n){(function(t){"use strict";function r(e){return a?void 0:"production"!==t.env.NODE_ENV?i(!1,"Markup wrapping node not initialized"):i(!1),p.hasOwnProperty(e)||(e="*"),s.hasOwnProperty(e)||("*"===e?a.innerHTML="":a.innerHTML="<"+e+">",s[e]=!a.firstChild),s[e]?p[e]:null}var o=n(8),i=n(3),a=o.canUseDOM?document.createElement("div"):null,s={},u=[1,'"],l=[1,"","
"],c=[3,"","
"],h=[1,'',""],p={"*":[1,"?

"],area:[1,"",""],col:[2,"","
"],legend:[1,"
","
"],param:[1,"",""],tr:[2,"","
"],optgroup:u,option:u,caption:l,colgroup:l,tbody:l,tfoot:l,thead:l,td:c,th:c},d=["circle","clipPath","defs","ellipse","g","image","line","linearGradient","mask","path","pattern","polygon","polyline","radialGradient","rect","stop","text","tspan"];d.forEach(function(e){p[e]=h,s[e]=!0}),e.exports=r}).call(t,n(1))},function(e,t){"use strict";function n(e,t){if(e===t)return!0;if("object"!=typeof e||null===e||"object"!=typeof t||null===t)return!1;var n=Object.keys(e),o=Object.keys(t);if(n.length!==o.length)return!1;for(var i=r.bind(t),a=0;a=48&&i<=57||i>=65&&i<=90||i>=97&&i<=122?t+=e[r]:i<128?t+=n.hexTable[i]:i<2048?t+=n.hexTable[192|i>>6]+n.hexTable[128|63&i]:i<55296||i>=57344?t+=n.hexTable[224|i>>12]+n.hexTable[128|i>>6&63]+n.hexTable[128|63&i]:(++r,i=65536+((1023&i)<<10|1023&e.charCodeAt(r)),t+=n.hexTable[240|i>>18]+n.hexTable[128|i>>12&63]+n.hexTable[128|i>>6&63]+n.hexTable[128|63&i])}return t},t.compact=function(e,n){if("object"!=typeof e||null===e)return e;n=n||[];var r=n.indexOf(e);if(r!==-1)return n[r];if(n.push(e),Array.isArray(e)){for(var o=[],i=0,a=e.length;i=0||Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]);return n}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function s(e){return 0===e.button}function u(e){return!!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)}function l(e){for(var t in e)if(e.hasOwnProperty(t))return!1;return!0}t.__esModule=!0;var c=Object.assign||function(e){for(var t=1;t elements are for router configuration only and should not be rendered"):u.default(!1)},t}(l.Component);g.createRouteFromReactElement=function(e){var t=h.createRouteFromReactElement(e);return t.from&&(t.path=t.from),t.onEnter=function(e,n){var r=e.location,o=e.params,i=void 0;if("/"===t.to.charAt(0))i=p.formatPattern(t.to,o);else if(t.to){var a=e.routes.indexOf(t),s=g.getRoutePattern(e.routes,a-1),u=s.replace(/\/*$/,"/")+t.to;i=p.formatPattern(u,o)}else i=r.pathname;n(t.state||r.state,i,t.query||r.query)},t},g.getRoutePattern=function(e,t){for(var n="",r=t;r>=0;r--){var o=e[r],i=o.path||"";if(n=i.replace(/\/*$/,"/")+n,0===i.indexOf("/"))break}return"/"+n},g.propTypes={path:m,from:m,to:m.isRequired,query:v,state:v,onEnter:d.falsy,children:d.falsy},t.default=g,e.exports=t.default}).call(t,n(1))},function(e,t,n){(function(r){"use strict";function o(e){return e&&e.__esModule?e:{default:e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}t.__esModule=!0;var s=Object.assign||function(e){for(var t=1;t=e.childNodes.length?null:e.childNodes.item(n);e.insertBefore(t,r)}var o=n(230),i=n(110),a=n(13),s=n(47),u=n(70),l=n(3),c={dangerouslyReplaceNodeWithMarkup:o.dangerouslyReplaceNodeWithMarkup,updateTextContent:u,processUpdates:function(e,n){for(var a,c=null,h=null,p=0;p when using tables, nesting tags like ,

, or , or using non-SVG elements in an parent. Try inspecting the child nodes of the element with React ID `%s`.",d,m):l(!1),c=c||{},c[m]=c[m]||[],c[m][d]=f,h=h||[],h.push(f)}var v;if(v=n.length&&"string"==typeof n[0]?o.dangerouslyRenderMarkup(n):n,h)for(var g=0;g-1?void 0:"production"!==t.env.NODE_ENV?a(!1,"EventPluginRegistry: Cannot inject event plugins that do not exist in the plugin ordering, `%s`.",e):a(!1),!l.plugins[r]){n.extractEvents?void 0:"production"!==t.env.NODE_ENV?a(!1,"EventPluginRegistry: Event plugins must implement an `extractEvents` method, but `%s` does not.",e):a(!1),l.plugins[r]=n;var i=n.eventTypes;for(var c in i)o(i[c],n,c)?void 0:"production"!==t.env.NODE_ENV?a(!1,"EventPluginRegistry: Failed to publish event `%s` for plugin `%s`.",c,e):a(!1)}}}function o(e,n,r){l.eventNameDispatchConfigs.hasOwnProperty(r)?"production"!==t.env.NODE_ENV?a(!1,"EventPluginHub: More than one plugin attempted to publish the same event name, `%s`.",r):a(!1):void 0,l.eventNameDispatchConfigs[r]=e;var o=e.phasedRegistrationNames;if(o){for(var s in o)if(o.hasOwnProperty(s)){var u=o[s];i(u,n,r)}return!0}return!!e.registrationName&&(i(e.registrationName,n,r),!0)}function i(e,n,r){l.registrationNameModules[e]?"production"!==t.env.NODE_ENV?a(!1,"EventPluginHub: More than one plugin attempted to publish the same registration name, `%s`.",e):a(!1):void 0,l.registrationNameModules[e]=n,l.registrationNameDependencies[e]=n.eventTypes[r].dependencies}var a=n(3),s=null,u={},l={plugins:[],eventNameDispatchConfigs:{},registrationNameModules:{},registrationNameDependencies:{},injectEventPluginOrder:function(e){s?"production"!==t.env.NODE_ENV?a(!1,"EventPluginRegistry: Cannot inject event plugin ordering more than once. You are likely trying to load more than one copy of React."):a(!1):void 0,s=Array.prototype.slice.call(e),r()},injectEventPluginsByName:function(e){var n=!1;for(var o in e)if(e.hasOwnProperty(o)){var i=e[o];u.hasOwnProperty(o)&&u[o]===i||(u[o]?"production"!==t.env.NODE_ENV?a(!1,"EventPluginRegistry: Cannot inject two different event plugins using the same name, `%s`.",o):a(!1):void 0,u[o]=i,n=!0)}n&&r()},getPluginModuleForEvent:function(e){var t=e.dispatchConfig;if(t.registrationName)return l.registrationNameModules[t.registrationName]||null;for(var n in t.phasedRegistrationNames)if(t.phasedRegistrationNames.hasOwnProperty(n)){var r=l.registrationNameModules[t.phasedRegistrationNames[n]];if(r)return r}return null},_resetEventPlugins:function(){s=null;for(var e in u)u.hasOwnProperty(e)&&delete u[e];l.plugins.length=0;var t=l.eventNameDispatchConfigs;for(var n in t)t.hasOwnProperty(n)&&delete t[n];var r=l.registrationNameModules;for(var o in r)r.hasOwnProperty(o)&&delete r[o]}};e.exports=l}).call(t,n(1))},function(e,t,n){"use strict";function r(e){return(""+e).replace(b,"//")}function o(e,t){this.func=e,this.context=t,this.count=0}function i(e,t,n){var r=e.func,o=e.context;r.call(o,t,e.count++)}function a(e,t,n){if(null==e)return e;var r=o.getPooled(t,n);g(e,i,r),o.release(r)}function s(e,t,n,r){this.result=e,this.keyPrefix=t,this.func=n,this.context=r,this.count=0}function u(e,t,n){var o=e.result,i=e.keyPrefix,a=e.func,s=e.context,u=a.call(s,t,e.count++);Array.isArray(u)?l(u,o,n,v.thatReturnsArgument):null!=u&&(m.isValidElement(u)&&(u=m.cloneAndReplaceKey(u,i+(u!==t?r(u.key||"")+"/":"")+n)),o.push(u))}function l(e,t,n,o,i){var a="";null!=n&&(a=r(n)+"/");var l=s.getPooled(t,a,o,i);g(e,u,l),s.release(l)}function c(e,t,n){if(null==e)return e;var r=[];return l(e,r,null,t,n),r}function h(e,t,n){return null}function p(e,t){return g(e,h,null)}function d(e){var t=[];return l(e,t,null,v.thatReturnsArgument),t}var f=n(23),m=n(11),v=n(17),g=n(72),y=f.twoArgumentPooler,_=f.fourArgumentPooler,b=/\/(?!\/)/g;o.prototype.destructor=function(){this.func=null,this.context=null,this.count=0},f.addPoolingTo(o,y),s.prototype.destructor=function(){this.result=null,this.keyPrefix=null,this.func=null,this.context=null,this.count=0},f.addPoolingTo(s,_);var x={forEach:a,map:c,mapIntoWithKeyPrefixInternal:l,count:p,toArray:d};e.exports=x},function(e,t,n){(function(t){"use strict";function r(){T||(T=!0,"production"!==t.env.NODE_ENV?E(!1,"setProps(...) and replaceProps(...) are deprecated. Instead, call render again at the top level."):void 0)}function o(e,n,r){for(var o in n)n.hasOwnProperty(o)&&("production"!==t.env.NODE_ENV?E("function"==typeof n[o],"%s: %s type `%s` is invalid; it must be a function, usually from React.PropTypes.",e.displayName||"ReactClass",v[r],o):void 0)}function i(e,n){var r=A.hasOwnProperty(n)?A[n]:null;P.hasOwnProperty(n)&&(r!==C.OVERRIDE_BASE?"production"!==t.env.NODE_ENV?b(!1,"ReactClassInterface: You are attempting to override `%s` from your class specification. Ensure that your method names do not overlap with React methods.",n):b(!1):void 0),e.hasOwnProperty(n)&&(r!==C.DEFINE_MANY&&r!==C.DEFINE_MANY_MERGED?"production"!==t.env.NODE_ENV?b(!1,"ReactClassInterface: You are attempting to define `%s` on your component more than once. This conflict may be due to a mixin.",n):b(!1):void 0)}function a(e,n){if(n){"function"==typeof n?"production"!==t.env.NODE_ENV?b(!1,"ReactClass: You're attempting to use a component class as a mixin. Instead, just use a regular object."):b(!1):void 0,f.isValidElement(n)?"production"!==t.env.NODE_ENV?b(!1,"ReactClass: You're attempting to use a component as a mixin. Instead, just use a regular object."):b(!1):void 0;var r=e.prototype;n.hasOwnProperty(M)&&N.mixins(e,n.mixins);for(var o in n)if(n.hasOwnProperty(o)&&o!==M){var a=n[o];if(i(r,o),N.hasOwnProperty(o))N[o](e,a);else{var s=A.hasOwnProperty(o),u=r.hasOwnProperty(o),h="function"==typeof a,p=h&&!s&&!u&&n.autobind!==!1;if(p)r.__reactAutoBindMap||(r.__reactAutoBindMap={}),r.__reactAutoBindMap[o]=a,r[o]=a;else if(u){var d=A[o];!s||d!==C.DEFINE_MANY_MERGED&&d!==C.DEFINE_MANY?"production"!==t.env.NODE_ENV?b(!1,"ReactClass: Unexpected spec policy %s for key %s when mixing in component specs.",d,o):b(!1):void 0,d===C.DEFINE_MANY_MERGED?r[o]=l(r[o],a):d===C.DEFINE_MANY&&(r[o]=c(r[o],a))}else r[o]=a,"production"!==t.env.NODE_ENV&&"function"==typeof a&&n.displayName&&(r[o].displayName=n.displayName+"_"+o)}}}}function s(e,n){if(n)for(var r in n){var o=n[r];if(n.hasOwnProperty(r)){var i=r in N;i?"production"!==t.env.NODE_ENV?b(!1,'ReactClass: You are attempting to define a reserved property, `%s`, that shouldn\'t be on the "statics" key. Define it as an instance property instead; it will still be accessible on the constructor.',r):b(!1):void 0;var a=r in e;a?"production"!==t.env.NODE_ENV?b(!1,"ReactClass: You are attempting to define `%s` on your component more than once. This conflict may be due to a mixin.",r):b(!1):void 0,e[r]=o}}}function u(e,n){e&&n&&"object"==typeof e&&"object"==typeof n?void 0:"production"!==t.env.NODE_ENV?b(!1,"mergeIntoWithNoDuplicateKeys(): Cannot merge non-objects."):b(!1);for(var r in n)n.hasOwnProperty(r)&&(void 0!==e[r]?"production"!==t.env.NODE_ENV?b(!1,"mergeIntoWithNoDuplicateKeys(): Tried to merge two objects with the same key: `%s`. This conflict may be due to a mixin; in particular, this may be caused by two getInitialState() or getDefaultProps() methods returning objects with clashing keys.",r):b(!1):void 0,e[r]=n[r]);return e}function l(e,t){return function(){var n=e.apply(this,arguments),r=t.apply(this,arguments);if(null==n)return r;if(null==r)return n;var o={};return u(o,n),u(o,r),o}}function c(e,t){return function(){e.apply(this,arguments),t.apply(this,arguments)}}function h(e,n){var r=n.bind(e);if("production"!==t.env.NODE_ENV){r.__reactBoundContext=e,r.__reactBoundMethod=n,r.__reactBoundArguments=null;var o=e.constructor.displayName,i=r.bind;r.bind=function(a){for(var s=arguments.length,u=Array(s>1?s-1:0),l=1;l-1&&navigator.userAgent.indexOf("Edge")===-1||navigator.userAgent.indexOf("Firefox")>-1)&&console.debug("Download the React DevTools for a better development experience: https://fb.me/react-devtools");var y=document.documentMode&&document.documentMode<8;"production"!==t.env.NODE_ENV?f(!y,'Internet Explorer is running in compatibility mode; please add the following tag to your HTML to prevent this from happening: '):void 0;for(var _=[Array.isArray,Array.prototype.every,Array.prototype.forEach,Array.prototype.indexOf,Array.prototype.map,Date.now,Function.prototype.bind,Object.keys,String.prototype.split,String.prototype.trim,Object.create,Object.freeze],b=0;b<_.length;b++)if(!_[b]){console.error("One or more ES5 shim/shams expected by React are not available: https://fb.me/react-warning-polyfills");break}}}e.exports=v}).call(t,n(1))},function(e,t){"use strict";var n={useCreateElement:!1};e.exports=n},function(e,t,n){(function(t){"use strict";function r(){if(this._rootNodeID&&this._wrapperState.pendingUpdate){this._wrapperState.pendingUpdate=!1;var e=this._currentElement.props,t=u.getValue(e);null!=t&&a(this,Boolean(e.multiple),t)}}function o(e){if(e){var t=e.getName();if(t)return" Check the render method of `"+t+"`."}return""}function i(e,n){var r=e._currentElement._owner;u.checkPropTypes("select",n,r);for(var i=0;i must be an array if `multiple` is true.%s",a,o(r)):void 0:"production"!==t.env.NODE_ENV?p(!Array.isArray(n[a]),"The `%s` prop supplied to + + + + + +

+ +
+ + + +
+ +
+ + + + + + diff --git a/app/dataviz/primerpedia-master/design/screen/co-editing_sm.png b/app/dataviz/primerpedia-master/design/screen/co-editing_sm.png new file mode 100644 index 00000000..250edd84 Binary files /dev/null and b/app/dataviz/primerpedia-master/design/screen/co-editing_sm.png differ diff --git a/app/dataviz/primerpedia-master/design/screen/collective-memory_sm.png b/app/dataviz/primerpedia-master/design/screen/collective-memory_sm.png new file mode 100644 index 00000000..c224a175 Binary files /dev/null and b/app/dataviz/primerpedia-master/design/screen/collective-memory_sm.png differ diff --git a/app/dataviz/primerpedia-master/design/screen/contributor-locations_sm.png b/app/dataviz/primerpedia-master/design/screen/contributor-locations_sm.png new file mode 100644 index 00000000..6bdc9a48 Binary files /dev/null and b/app/dataviz/primerpedia-master/design/screen/contributor-locations_sm.png differ diff --git a/app/dataviz/primerpedia-master/design/screen/geo-topic-map_sm.png b/app/dataviz/primerpedia-master/design/screen/geo-topic-map_sm.png new file mode 100644 index 00000000..da213db2 Binary files /dev/null and b/app/dataviz/primerpedia-master/design/screen/geo-topic-map_sm.png differ diff --git a/app/dataviz/primerpedia-master/design/screen/history_flow_sm.png b/app/dataviz/primerpedia-master/design/screen/history_flow_sm.png new file mode 100644 index 00000000..6824061a Binary files /dev/null and b/app/dataviz/primerpedia-master/design/screen/history_flow_sm.png differ diff --git a/app/dataviz/primerpedia-master/design/screen/most-controversial_sm.png b/app/dataviz/primerpedia-master/design/screen/most-controversial_sm.png new file mode 100644 index 00000000..993d89c1 Binary files /dev/null and b/app/dataviz/primerpedia-master/design/screen/most-controversial_sm.png differ diff --git a/app/dataviz/primerpedia-master/design/screen/what-is-wikipedia_sm.png b/app/dataviz/primerpedia-master/design/screen/what-is-wikipedia_sm.png new file mode 100644 index 00000000..e824b02f Binary files /dev/null and b/app/dataviz/primerpedia-master/design/screen/what-is-wikipedia_sm.png differ diff --git a/app/dataviz/primerpedia-master/design/screen/wiki-atlas_sm.png b/app/dataviz/primerpedia-master/design/screen/wiki-atlas_sm.png new file mode 100644 index 00000000..ba6587b5 Binary files /dev/null and b/app/dataviz/primerpedia-master/design/screen/wiki-atlas_sm.png differ diff --git a/app/dataviz/primerpedia-master/design/screen/wikigalaxy_sm.png b/app/dataviz/primerpedia-master/design/screen/wikigalaxy_sm.png new file mode 100644 index 00000000..749fd14b Binary files /dev/null and b/app/dataviz/primerpedia-master/design/screen/wikigalaxy_sm.png differ diff --git a/app/dataviz/primerpedia-master/design/screen/wikipedia-globe_sm.png b/app/dataviz/primerpedia-master/design/screen/wikipedia-globe_sm.png new file mode 100644 index 00000000..2f80431f Binary files /dev/null and b/app/dataviz/primerpedia-master/design/screen/wikipedia-globe_sm.png differ diff --git a/app/dataviz/primerpedia-master/design/screen/wikipedia_worldview_sm.png b/app/dataviz/primerpedia-master/design/screen/wikipedia_worldview_sm.png new file mode 100644 index 00000000..6597a2a0 Binary files /dev/null and b/app/dataviz/primerpedia-master/design/screen/wikipedia_worldview_sm.png differ diff --git a/app/dataviz/primerpedia-master/design/script.js b/app/dataviz/primerpedia-master/design/script.js new file mode 100644 index 00000000..5a67ce5c --- /dev/null +++ b/app/dataviz/primerpedia-master/design/script.js @@ -0,0 +1,98 @@ +ToggleSideMenuBtnDat = { + width: 40, + status: false +} +function linkfilterToggle(index) { + + var li = Array.from(document.querySelectorAll("#link-filter>li")) + for (let i of li) { + + i.style.color = "#505061" + } + li[index].style.color = "white" + var linkfilterContHr = document.querySelector("#link-filter>hr") + linkfilterContHr.style.left = li[index].offsetLeft + "px" + linkfilterContHr.style.width = li[index].offsetWidth + "px" + linkfilterContHr.setAttribute("index", index) +} +var MainBody = document.querySelector("#MainBody") +var scrolLef = 0 + + +MainBody.onwheel = (e) => { + if (MainBody.clientHeight + MainBody.scrollTop >= MainBody.scrollHeight) { + e.preventDefault() + if (e.deltaY < 0 && scrolLef < 0) { + scrolLef += 100 + console.log(scrolLef) + for (let i of document.querySelectorAll("#link-container>.website")) { + i.style.marginLeft = scrolLef + "px" + } + } else if (e.deltaY > 0) { + scrolLef -= 100 + for (let i of document.querySelectorAll("#link-container>.website")) { + i.style.marginLeft = scrolLef + "px" + } + } + } + +} + +function ToggleSideMenu(btn) { + + var SideNav = document.querySelector("#LeftNav") + if (SideNav.offsetWidth == 0) { + SideNav.style.width = "240px" + if (window.innerWidth > 801) { + MainBody.style.width = "calc(100% - 240px)" + } else { + MainBody.style.width = "100%" + } + for (let i of Array.from(btn.querySelectorAll("svg"))) { + console.log(i) + i.style.left = "0px" + } + document.querySelector("#logo").style.left = "-0px" + ToggleSideMenuBtnDat.status = false + + } else { + ToggleSideMenuBtnDat.status = true + document.querySelector("#logo").style.left = "-240px" + + SideNav.style.width = "0px" + MainBody.style.width = "100%" + for (let i of Array.from(btn.querySelectorAll("svg"))) { + console.log(i) + i.style.left = -ToggleSideMenuBtnDat.width + "px" + } + + } + console.log(ToggleSideMenuBtnDat.status) + setTimeout(function () { + linkfilterToggle(parseInt(document.querySelector("#link-filter>hr").getAttribute("index"))) + }, 300) + +} +linkfilterToggle(1) +function MediaQueryListner() { + + + if (window.innerWidth < 801) { + document.querySelector("#logo").innerHTML = `` + ToggleSideMenuBtnDat.width = 35 + } else { + document.querySelector("#logo").innerHTML = `Codemo` + } + + setTimeout(function () { linkfilterToggle(parseInt(document.querySelector("#link-filter>hr").getAttribute("index"))) }, 300) + +} +window.onresize = MediaQueryListner +window.onload = MediaQueryListner +// Mobile slider with swipe +function GoTopFunc() { + MainBody.scrollTo({ + top: 0, + behavior: "smooth" + }) +} diff --git a/app/dataviz/primerpedia-master/design/style.css b/app/dataviz/primerpedia-master/design/style.css new file mode 100644 index 00000000..18232865 --- /dev/null +++ b/app/dataviz/primerpedia-master/design/style.css @@ -0,0 +1,572 @@ +@import url('https://fonts.googleapis.com/css2?family=Nunito:wght@200;300;400;500;600;700;800;900;1000&display=swap'); + +html{-moz-tab-size:4;-o-tab-size:4;tab-size:4;line-height:1.15;} +*,::after,::before{box-sizing:border-box;border:0 solid}*{margin:0;} +[type=search]{-webkit-appearance:textfield;outline-offset:-2px} +::-webkit-search-decoration{-webkit-appearance:none} +body{ + background:hsl(240, 11%, 13%); + color:hsl(210, 25%, 70%); + color:#505061; + display: flex; + /* font-style font-weight font-size/line-height font-family */ + font: normal 400 16px/1.5 "Nunito", system-ui, sans-serif; + font-optical-sizing: auto; + height:100vh; + +} +body>.scroll-gutter{scrollbar-gutter:stable both-edges;} +::-moz-focus-inner{border-style:none;padding:0} +:-moz-focusring{outline:1px dotted ButtonText} +:-moz-ui-invalid{box-shadow:none} +/* TEXT SELECTION */ +::-moz-selection{background-color:transparent;color:var(--color-primary)} +::selection {background-color:var(--color-primary-100);color: var(--color-primary-dark);} +/* Modern browsers */ +@supports (scrollbar-width: auto) { + * { + scrollbar-color: var(--scrollbar-color-thumb, --color-primary-dark) var(--scrollbar-color-track, --color-primary-darker); + scrollbar-width: var(--scrollbar-width, thin); + } +} + +[class^="icon"] { + background-color: currentColor; + display: inline-block; + width: 1em; + height: 1em; + mask-image: var(--svg); + mask-repeat: no-repeat; + mask-size: 100% 100%; + vertical-align: -.175em; +} +.icon-bookmark { + --svg: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='none' stroke='%23000' stroke-linejoin='round' stroke-width='1' d='M6 20V5a1 1 0 0 1 1-1h10a1 1 0 0 1 1 1v15l-6-3z'/%3E%3C/svg%3E"); +} +.icon-codemo { + --svg: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='currentColor' d='M12 0h-.079c-1.66 0-3.239.349-4.667.978l.074-.029A12.269 12.269 0 0 0 3.52 3.523A12.219 12.219 0 0 0 .978 7.251l-.031.079A11.398 11.398 0 0 0 0 11.919v.086v-.004v.079c0 1.66.349 3.239.978 4.667l-.029-.074a12.276 12.276 0 0 0 2.572 3.807a12.224 12.224 0 0 0 3.729 2.542l.079.031c1.354.6 2.933.949 4.593.949h.083h-.004h.079c1.66 0 3.239-.349 4.667-.978l-.074.029a12.276 12.276 0 0 0 3.809-2.573a12.219 12.219 0 0 0 2.542-3.728l.031-.079c.6-1.354.949-2.932.949-4.593v-.158c0-1.66-.349-3.239-.978-4.667l.029.074a12.286 12.286 0 0 0-2.573-3.806A12.219 12.219 0 0 0 16.754.981L16.675.95C15.321.35 13.741 0 12.08 0h-.083zm.64 22.79v-2.087l5.193-2.633a.421.421 0 0 0 .154-.129l.001-.001a.335.335 0 0 0 .059-.191v-.011v.001v-1.186c.225-.082.412-.226.543-.412l.002-.004c.133-.179.214-.404.214-.648v-.118a1.146 1.146 0 0 0-.366-.746l-.001-.001a1.09 1.09 0 0 0-.75-.297h-.022h.001h-.02c-.308 0-.587.127-.786.332c-.205.2-.332.478-.332.787v.021v-.001v.059c.002.03.011.057.024.081v-.001c.013.222.096.423.227.583l-.001-.002c.133.163.304.289.501.364l.008.003v.949l-4.649 2.372v-1.942l2.039-.949a.533.533 0 0 0 .166-.13l.001-.001a.3.3 0 0 0 .071-.194v-3.233l3.793-2.134a.318.318 0 0 0 .142-.141l.001-.002a.407.407 0 0 0 .047-.189v-.901c.223-.079.409-.218.543-.397l.002-.003c.133-.177.214-.401.214-.644v-.04c0-.308-.127-.587-.332-.786a1.066 1.066 0 0 0-.775-.332H18.4a1.082 1.082 0 0 0-.71.366l-.001.001a1.113 1.113 0 0 0-.285.746v.025v-.001v.02c0 .243.08.466.216.646l-.002-.003c.137.182.322.321.538.397l.008.003v.688l-3.818 2.134a.51.51 0 0 0-.129.129l-.001.002a.338.338 0 0 0-.055.184v.017v-.001v3.2l-1.52.711v-6.972l3.2-1.566a.379.379 0 0 0 .153-.141l.001-.002a.347.347 0 0 0 .059-.189V7.04c.223-.079.409-.218.543-.397l.002-.003c.133-.177.214-.401.214-.644v-.021v.001v-.061a.078.078 0 0 0-.024-.057a1.127 1.127 0 0 0-.366-.719l-.001-.001a1.06 1.06 0 0 0-.738-.297h-.128a1.108 1.108 0 0 0-.719.378l-.001.001a1.103 1.103 0 0 0-.297.754v.123c.032.227.12.428.251.596l-.002-.003c.127.167.301.291.502.354l.007.002v.972l-2.656 1.304V5.288c.225-.082.412-.226.543-.412l.002-.004c.133-.179.214-.404.214-.648V4.2c0-.308-.127-.587-.332-.786a1.095 1.095 0 0 0-.787-.332h-.021h.001h-.02c-.308 0-.587.127-.786.332c-.205.2-.332.478-.332.787v.021v-.001v.118c.03.223.119.421.25.583l-.002-.002c.133.163.304.289.501.364l.008.003v6.569l-1.874-.996V7.865a.292.292 0 0 0-.048-.16l.001.001a.87.87 0 0 0-.095-.119l-1.306-.998a.825.825 0 0 0 .07-.196l.001-.006c.015-.067.024-.143.024-.222v-.024c0-.308-.127-.587-.332-.786a1.097 1.097 0 0 0-.786-.331H7.52h.001h-.02c-.308 0-.587.127-.786.332c-.205.2-.332.478-.332.787v.021v-.001v.024c0 .305.125.581.326.78c.2.205.478.332.787.332h.021h-.001h.015a.858.858 0 0 0 .288-.049l-.006.002c.11-.041.2-.081.287-.125l-.015.007l1.162.925v3.035a.29.29 0 0 0 .06.178l-.001-.001a.42.42 0 0 0 .152.129l.002.001l2.419 1.28V15.1l-4.055-1.874l.071-1.47v-.024a.29.29 0 0 0-.06-.178l.001.001a.42.42 0 0 0-.152-.129l-.002-.001l-1.851-.97a.522.522 0 0 0 .024-.157v-.2a1.127 1.127 0 0 0-.366-.719l-.001-.001a1.093 1.093 0 0 0-.752-.299h-.018h.001h-.007c-.305 0-.58.127-.775.332c-.208.2-.338.481-.338.792v.015v-.001v.118c.029.285.164.534.366.71l.001.001c.193.177.451.285.735.285h.131a1.45 1.45 0 0 0 .33-.083l-.01.003c.104-.04.195-.092.275-.156l-.002.002l1.707.88l-.047 1.47v.008c0 .075.017.145.048.208l-.001-.003a.305.305 0 0 0 .164.142l.002.001l4.577 2.134v6.869q-.308 0-.605-.024l-.605-.047l.071-4.364a.349.349 0 0 0-.06-.191l.001.001a.364.364 0 0 0-.175-.142l-.002-.001l-2.87-1.328v-.125c0-.305-.127-.58-.332-.775a1.095 1.095 0 0 0-.787-.332H6.49h.001h-.114a1.082 1.082 0 0 0-.71.366l-.001.001a1.113 1.113 0 0 0-.285.746v.025v-.001v.007c0 .305.127.58.332.775c.195.205.47.332.775.332h.039c.156 0 .305-.033.439-.094l-.007.003c.14-.067.261-.147.369-.242l-.002.002l2.656 1.21v4.008a10.611 10.611 0 0 1-3.534-1.343l.048.027a10.85 10.85 0 0 1-2.773-2.354l-.014-.017a11.1 11.1 0 0 1-1.824-3.112l-.026-.076a10.267 10.267 0 0 1-.676-3.699v-.111c0-1.494.314-2.915.88-4.201l-.026.067a11.06 11.06 0 0 1 2.324-3.44A11.019 11.019 0 0 1 7.73 2.065l.071-.028a10.269 10.269 0 0 1 4.139-.856h.061h-.003h.064c1.494 0 2.915.314 4.201.88l-.067-.026a11.078 11.078 0 0 1 3.44 2.32a11 11 0 0 1 2.296 3.369l.028.071c.54 1.218.854 2.639.854 4.134v.067v-.003v.064c0 1.444-.292 2.82-.82 4.072l.026-.069a11.1 11.1 0 0 1-2.175 3.373l.005-.006a10.852 10.852 0 0 1-3.172 2.32l-.065.028c-1.16.568-2.516.932-3.948 1.009l-.026.001z'%3E%3C/path%3E%3C/svg%3E") +} + +.icon-chevron { + --svg: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' %3E%3Cpath stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M19 9l-7 7-7-7' /%3E%3C/svg%3E") +} + +.icon-close { + --svg: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='none' stroke='%23000' stroke-linecap='round' stroke-width='2' d='M12 21a9 9 0 1 1 0-18a9 9 0 0 1 0 18zM9 9l6 6m0-6l-6 6'/%3E%3C/svg%3E"); +} +.icon-dataviz { + --svg: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='none' stroke='%23000' stroke-linecap='round' stroke-linejoin='round' stroke-width='1' d='M12 9v2m4 0V7m-8 4h.01M3 3h1m17 0h-1m0 0v12h-6m6-12H4m0 0v12h6m0 0l-2 6m2-6h4m0 0l2 6'/%3E%3C/svg%3E"); +} + +.icon-dataviz2 { + --svg: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cg fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='1'%3E%3Cpath d='M3 3v18h18'/%3E%3Crect width='12' height='4' x='7' y='5' rx='1'/%3E%3Crect width='7' height='4' x='7' y='13' rx='1'/%3E%3C/g%3E%3C/svg%3E%0A") +} +.icon-elearn { + --svg: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cg fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='1'%3E%3Crect width='8' height='18' x='3' y='3' rx='1'%3E%3C/rect%3E%3Cpath d='M7 3v18m13.4-2.1c.2.5-.1 1.1-.6 1.3l-1.9.7c-.5.2-1.1-.1-1.3-.6L11.1 5.1c-.2-.5.1-1.1.6-1.3l1.9-.7c.5-.2 1.1.1 1.3.6Z'%3E%3C/path%3E%3C/g%3E%3C/svg%3E") +} + +#LeftNav{ + background-color: #141518; + color:white; + font-family: Nunito; + font-size:1rem; + height:100vh; + overflow: auto; + padding-top:50px; + position: relative; + transition-duration: 0.3s; + width: 240px; + z-index: 100; +} + +#MainBody{ + width:calc(100% - 150px); + transition: 0.3s; + height:100vh; + overflow: auto; + background-color: #1d1d24; +} +#LeftNav>li{ + list-style-type: none; + padding:0.5em; + cursor: pointer; + user-select: none; + +} +/* #LeftNav>li>.icon-cat{ + position: relative; + height:10px; + width:20px; + top:-5px; + margin:5px; +} */ +#LeftNav>li:not(#logo):not(.CodemoMenuHeading):hover, +#CodemoMenu>li:hover{ +background-color: #08090a; +} +#CodemoMenu{ + background-color: hsl(214, 10%, 14%); + border-bottom-left-radius: 0.5em; + border-bottom-right-radius: 0.5em; + border-top-left-radius: 0.25em; + border-top-right-radius: 0.25em; + height:auto; + margin:5px 20px;overflow: hidden; + position: relative;width:calc(100% - 40px); +} +#logo{ + align-items: center; + display: flex; + font-size: 1.5rem; + height: 50px; + justify-content: center; + /* margin-top: 10px; */ + position: absolute; + transition: 0.3s; + width: 240px; + z-index: 110; +} +#logo > span { + margin: 0.5rem; +} +.CodemoMenuHeading{ + color: #8b90a6; + font-size: 0.8rem; + font-weight: 600; + text-align: center; +} +#CodemoMenu>hr{ + background:linear-gradient(to Left, #00BCD4, #03A9F4, #2196F3, #3F51B5, #673AB7); + border: none; + position: absolute; + width:100%; + left:0px; + top:0px; + height: 2px; +} +#CodemoMenu>li{ + list-style-type: none; + padding:10px; + cursor: pointer; + user-select: none; + display: flex; + align-items: center; +} + +#CodemoMenu>li>svg:not(.downArrow){ + margin:5px; +} +/* .downArrow{ + margin-left: auto; +} */ +#TopNav{ + align-items: stretch; + display: flex; + height: 60px; + justify-content: space-between; + padding: 0.5rem; +} +#SearchInput{ + flex: 1; + padding: 0.25rem 0.5rem; + font-size: 1rem; + border: none; + background-color: #434650; + border-radius: 5px; + transition-duration: 0.3s; + color: white; + position: relative; +} +#SearchInput:focus{ + background-color: #8b90a6; + border:none; + outline:none; +} +#SearchInput::placeholder{ + color:white; +} +#TopNav>button{ + padding:5px 15px; + margin:0px 5px; + display: grid; + border:none; + cursor:pointer; +place-items: center; + border:none; + background-color: #282a30; + border-radius: 5px; +} +article#container { + border:1px dotted red; + min-height: 50vh; + padding: 2rem; + width: 100%; +} +#link-filter{ + width:calc(100% - 20px); + margin:10px; + display:flex; + justify-content: center; + color:#505061; + font-size:1.3em; + font-weight: 900; + position: relative; + font-family: Nunito; +/* + border-bottom:5px solid #505061; */ +} +#link-filter::after{ + width:100%; + content:''; + position: absolute; + height:5px; + bottom:0px; + border-radius: 5px; + background-color: #505061; +} +#link-filter>li{ + list-style: none; + padding:20px; + position: relative; + transition-duration: 0.3s; + cursor:pointer; + +} +/* We would Make it better */ +#link-filter>hr{ + width:0px; + z-index: 10; + transition-duration: 0.3s; + transition-timing-function: linear; + content:''; + position: absolute; + border:none; + height:5px; + bottom:0px; + left:0px; + border-radius: 5px; + background-color: #1daf00; +} +#link-filter>li:hover{ + color:white; +} +#link-container{ + border:1px dotted red; + box-sizing: border-box; + display: grid;gap: 2rem; + grid-template-rows: calc(280px - 40px) calc(280px - 40px); + grid-template-columns: repeat(8, 315px); + height: 600px; + overflow: hidden; + padding: 2rem; + place-items: center; + width: 100%; +} + +.website{ + flex-shrink: 0; + border-radius: 10px; + margin:10px; + transition-duration: 0.3s; + width:313.2px; + padding:10px; + top:10px; + display:flex; + transition-duration: 0.3s; + flex-direction: column; + height:calc(100% - 10px); + position: relative; + background-color: #3a3a43; + padding-bottom:0px; +} +.link-image { + background-color: #48485c; + border-radius: 10px; + height:100%; + margin-bottom:10px;position: relative; + top:-25px; + transition-duration: 0.3s; + width:100%; +} +.link-image img { + border-radius:8px; + height: 100%; + object-fit: cover; + width: 100%; +} + + +.link-detail{ + display:grid; + grid-template-columns: 50px calc(100% - 20px); + grid-template-rows: 20px 30px; + align-items: center; + +} + +.link-icon{ + background-color: #18181e; + border-radius: 50%; + color: #abc; + display: grid; + grid-area: auto/auto 1/2; + height:40px; + left:-6px; + margin:auto; + place-items: center; + position: relative; + top:0px; + transition-duration: 0.3s; + width:40px; +} +.link-title{ + width: calc(100% - 20px); + color:hsl(0, 0%, 100%); + text-overflow:ellipsis; + font-family: Nunito; + font-weight: 700; + overflow:hidden; + white-space: nowrap; +} +.link-desc{ + grid-area: 2/2; + font-family: Nunito; + font-weight: 800; + color:hsl(237, 9%, 56%); + height:fit-content; + width:fit-content; +} +.link-screenshot{ + display: flex; + list-style-type:none; + font-family: Nunito; + font-size:0.6rem; + color:hsl(0, 0%, 100%); + position: absolute; + width:100%; + margin-top:5px; + bottom:-30px; + display: none; + transition-duration:03s; + font-weight: 800; +} +.link-screenshot>li{ + background-color: hsl(240, 11%, 13%); + border-radius: 5px; + padding:5px; + display:grid; + margin:5px; + height:fit-content; + place-items: center; + grid-template-columns: auto auto; + +} +.link-screenshot>li>svg{ + width:10px; + height:10px; + margin:5px; +} + + .website:hover{ + height:calc(100% + 20px); +} +.website:hover .link-icon{ + left:0px; +} +.website:hover .link-image{ + top:0px; +} +.website:hover .link-screenshot{ + bottom:10px; + display: flex; + position: relative; + animation: PublicityHoverEffect 0.3s linear; +} +@keyframes PublicityHoverEffect{ + 0%{ + bottom:-20px; + opacity: 0; + } + 100%{ + bottom:10px; + opacity: 1; + } +} +#ToggleSideMenu{ + background-color: hsl(225, 8% 10%); /* hsl(240, 10%, 25%);*/ + border-radius: 0.5rem; + cursor: pointer; + display: grid; + gap:0.5rem; + grid-template-columns: 100% 100%; + height:42px; + list-style-type: none; + margin-right:0.5rem; + overflow: hidden; + padding:0.5rem; + position: relative; + width:42px; +} + + +#ToggleSideMenu>svg{ + width:30px; + height:30px; + fill:hsl(0, 0%, 100%); + left:0px; + position: relative; + transition-duration:0.5s; +} +#BtnGoTop{ + width:40px; + height:40px; + border-radius: 50%; + background-color: hsl(180, 99%, 36%); + position: fixed; + bottom:20px; + cursor:pointer; + transition-duration: 0.3s; + right:40px; + display: grid; + place-items: center; +} +@media (max-width:962px) { + #link-container{ + grid-template-columns: repeat(8,50%); + } +} + +@media (max-width:816px) { + #link-container{ + grid-template-columns: repeat(8,70%); + } +} +@media (max-width:440px) { +html{ + font-size: 80%; +} +} +@media (min-width:800px) { + #ToggleSideMenu svg{ + left:0px; + } + #LeftNav{ + width:240px; + } + #MainBody{ + width:calc(100% - 200px) + } + #logo{ + left:0px; + padding:0px; + } +} +@media (max-width:800px) { + #MainBody{ + width:100% !important; + } + #ToggleSideMenu{ + width:35px; + height:35px; + padding:5px; + } + #ToggleSideMenu svg{ + width:100%; + margin:auto; + position: relative; + left:-35px; + height:100% + } + #LeftNav{ + width:0px; + z-index:99; + position: absolute; + } + #MainBody{ + width:100%; + } + #TopNav{ + padding-left:50px; + font-size: 0.8rem; + height: 55px; + + position: sticky; + background-color: hsl(240, 11%, 13%); + z-index:100; + top:0px; + } + #TopNav>input{ + height:35px; + font-size: 1.1rem; + } + #TopNav svg{ + width:13px; + } + #TopNav>button{ + height:100%; + width:auto; + padding:10px 10px; + } + #logo{ + width:auto; + padding:10px; + position: absolute; + left:0px !important; + height:35px; + } + #link-filter{ + margin:0px; + width:100%; + } + #link-filter::after{ + width:100%; + margin:0px; + border-radius: 0px; + + } + #link-container{ + grid-template-columns: repeat(8,45%); + } + #BtnGoTop{ + display:none; + } +} +@media (max-width:670px) { + #link-container{ + grid-template-columns: repeat(8,50%); + } +} +@media (max-width:590px) { + #link-container{ + grid-template-columns: repeat(8,60%); + } +} +@media (max-width:498px) { + #link-container{ + display: flex; + flex-direction: column; + overflow: auto; + justify-content: center; + } + .website{ + height:250px; + margin:20px auto; + position: relative; + width:100% + } + .website:hover{ + height:250px; + } + .link-icon{ + left:0px; + } + .link-image{ + top:0px; + } + .link-screenshot{ + bottom:10px; + display: flex; + position: relative; + animation: PublicityHoverEffect 0.3s linear; + } +} diff --git a/app/dataviz/primerpedia-master/img/cc.png b/app/dataviz/primerpedia-master/img/cc.png new file mode 100644 index 00000000..a1259e24 Binary files /dev/null and b/app/dataviz/primerpedia-master/img/cc.png differ diff --git a/app/dataviz/primerpedia-master/img/cc.svg b/app/dataviz/primerpedia-master/img/cc.svg new file mode 100644 index 00000000..538d88e2 --- /dev/null +++ b/app/dataviz/primerpedia-master/img/cc.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/app/dataviz/primerpedia-master/img/favicon.png b/app/dataviz/primerpedia-master/img/favicon.png new file mode 100644 index 00000000..42d3ac64 Binary files /dev/null and b/app/dataviz/primerpedia-master/img/favicon.png differ diff --git a/app/dataviz/primerpedia-master/img/github.png b/app/dataviz/primerpedia-master/img/github.png new file mode 100644 index 00000000..0ed13b80 Binary files /dev/null and b/app/dataviz/primerpedia-master/img/github.png differ diff --git a/app/dataviz/primerpedia-master/img/github.svg b/app/dataviz/primerpedia-master/img/github.svg new file mode 100644 index 00000000..0057af37 --- /dev/null +++ b/app/dataviz/primerpedia-master/img/github.svg @@ -0,0 +1,4 @@ + + + + diff --git a/app/dataviz/primerpedia-master/img/info.png b/app/dataviz/primerpedia-master/img/info.png new file mode 100644 index 00000000..2679ef7d Binary files /dev/null and b/app/dataviz/primerpedia-master/img/info.png differ diff --git a/app/dataviz/primerpedia-master/img/info.svg b/app/dataviz/primerpedia-master/img/info.svg new file mode 100644 index 00000000..6665f1c7 --- /dev/null +++ b/app/dataviz/primerpedia-master/img/info.svg @@ -0,0 +1,4 @@ + + + + diff --git a/app/dataviz/primerpedia-master/img/loading.svg b/app/dataviz/primerpedia-master/img/loading.svg new file mode 100644 index 00000000..efd7990c --- /dev/null +++ b/app/dataviz/primerpedia-master/img/loading.svg @@ -0,0 +1,12 @@ + + + + + diff --git a/app/dataviz/primerpedia-master/index.html b/app/dataviz/primerpedia-master/index.html new file mode 100644 index 00000000..4f694002 --- /dev/null +++ b/app/dataviz/primerpedia-master/index.html @@ -0,0 +1,99 @@ + + + + + + Wikipedia Summary + + + + + + + + + +
+

+ Wikipedia Summary +

+
+ + + + + + + + +
+ +
+

Summarization of the search response for a quick topic overview. +

+

+ For more information, Concise Wikipedia proposal. + README file. + Outline of Wikipedia +

+
+ + + + + + + diff --git a/app/dataviz/primerpedia-master/utils.js b/app/dataviz/primerpedia-master/utils.js new file mode 100644 index 00000000..975157a6 --- /dev/null +++ b/app/dataviz/primerpedia-master/utils.js @@ -0,0 +1,61 @@ +/** + * @file Primerpedia Utility Functions + */ + +// This file only provides static global functions, +// which are called from primerpedia.js; so we tell eslint +// to ignore the "no unused variables" check for this entire file: +/* eslint-disable no-unused-vars */ + +/** + * Remove any Child Nodes from an Element + * @param {HTMLElement} node - any DOM Node + */ +function clearNode(node) { + var clone = node.cloneNode(false); + node.parentNode.replaceChild(clone, node); + + return clone; +} + +/** + * Changes Visibility of an HTMLElement + * @param {HTMLElement} element - any DOM Node + * @param {boolean} visibility - show or hide DOM Node + */ +function toggleVisibility(element, visibility) { + if(element instanceof HTMLElement) { + if(!visibility) { + element.style.setProperty("display", "none"); + } else { + element.style.removeProperty("display"); + } + } +} + +/** + * Get query string from URL parameter + * + * @see [origin on stackoverflow]{@link https://stackoverflow.com/a/2091331/266309} + * @param {string} parameter - Name of the query parameter to retrieve + * @returns {string|null} - Decoded query parameter or null + */ +function getQueryVariable(parameter) { + // Get query string, excluding the first character, "?" + var query = window.location.search.substring(1); + // Split each parameter=value pair using "&" as separator + var vars = query.split("&"); + // Loop over all the parameter=value pairs, and split them into their parameter/value components + for(var i = 0; i < vars.length; i++) { + var pair = vars[i].split("="); + // If one of the parameter names is the one we're looking for, return its value + if(decodeURIComponent(pair[0]) == parameter) { + return decodeURIComponent(pair[1]); + } + } + return null; +} + +function prefixUrl(language) { + return "https://" + language + "."; +} diff --git a/app/dataviz/primerpedia-master/wiki-outline.css b/app/dataviz/primerpedia-master/wiki-outline.css new file mode 100644 index 00000000..0c8130ff --- /dev/null +++ b/app/dataviz/primerpedia-master/wiki-outline.css @@ -0,0 +1,171 @@ +html, +body { + margin: 0; + padding: 0; +} + +body { + background: hsl(200, 8%, 14%); + color: hsl(210, 25%, 73%); + min-width: 280px; + line-height: 1.5; + font-family: system-ui, sans-serif; + font-size: 16px; +} + +.error { + text-align: center; +} + +#notification { + position: fixed; + top: 0; + left: 0; + width: 100%; + padding: 0.5em 1em; + box-sizing: border-box; +} + +#notification.information { + background-color: hsl(120, 73%, 75%); +} + +#notification-content { + color: initial; +} + +#controls, #content, #article-title { + margin: 0.5em auto; + width: 80%; + max-width: 1000px; +} + +#content { + text-align: left; +} + +h1 { + text-align: center; +} +h1 > a, h1 > a:visited { + background-clip: text; + background-color: hsl(200, 8%, 14%); + color: transparent; + font-family: 'Squada One', sans-serif; + font-size: 1.5em; + font-weight: normal; + line-height: 0.5em; + margin: 0 auto; + text-decoration: none; + text-shadow: 0px 1px 2px hsl(200, 80%, 50%); +} + +h2 { + padding: 0.2em; + background: hsl(202, 9%, 18%); + border-radius: 0.25em; + overflow: auto; +} + +form input { + background: hsl(195, 7%, 11%); + border: 1px solid hsl(203, 8%, 20%); + border-radius: .25rem; + color: hsl(200, 20%, 70%); + margin: 0.25rem; + padding: .3rem .5rem; +} + +form input:focus { + outline: 2px solid hsla(200, 80%, 50%, 0.25); +} + +form input::placeholder { + color: hsl(200, 10%, 50%); +} + +#language { + width: 4em; +} + +#loading-spinner { + display: block; + margin: 2.5em auto; + width: 4em; +} + +a { + color: hsl(200, 80%, 50%); + text-decoration: none; +} + +a:hover { + text-decoration: underline; +} + +a:visited { + color: hsl(245, 35%, 35%); +} + +a:active { + outline: none; /* don't show the dotted border on a clicked link */ +} + +a.actionlink { + display: inline-block; + padding: 0.5em 1em; + line-height: 0.5; + background: linear-gradient(to bottom, hsl(200, 8%, 18%) 0%, hsl(100, 8%, 11%) 100%); + border: 1px solid hsl(200, 8%, 11%); + border-radius: 3px; + box-shadow: inset 0 1px 0 0 hsl(200, 8%, 18%); + color: hsl(0, 0%, 80%); + font-weight: normal; + text-shadow: 0 -1px 0 #2196F3; + transform: scaleX(-1); + -webkit-transform: scaleX(-1); +} + +a.actionlink:hover { + background: linear-gradient(to bottom, hsl(100, 8%, 11%) 0%, hsl(200, 8%, 18%) 100%); + + box-shadow: inset 0 1px 0 0 hsl(200, 8%, 14%); + text-decoration: none; +} + +a.actionlink:active { + border: 1px solid hsl(200, 8%, 11%); + border-bottom: 1px solid hsl(200, 8%, 18%); + box-shadow: inset 0 0 8px 4px hsl(94, 55%, 35%), 0 1px 0 0 hsl(0, 0%, 93%); +} + +div.actionlink-container { + float: right; +} + +input[type=search], input[type=submit], input[type=button], input[type=text] { + font-size: inherit; +} + +#footer a:hover { + text-decoration: none; +} + +object { + pointer-events: none; /* allow clicking on the link that wraps the svg */ +} + +.error { + font-size: small; + color: hsl(0, 0%, 50%); +} + +a#copysharelink { + cursor: pointer; +} + +@media (min-width: 600px) { + html { + font-size: calc(13px + 0.5vw); + } +} diff --git a/app/dataviz/primerpedia-master/wiki-outline.js b/app/dataviz/primerpedia-master/wiki-outline.js new file mode 100644 index 00000000..c7810aa0 --- /dev/null +++ b/app/dataviz/primerpedia-master/wiki-outline.js @@ -0,0 +1,319 @@ +/** + * @file Primerpedia Script Entry Point + * + * There are 3 ways (that I know about) of getting the first section of an article. + * 1) We can use action=parse coupled with the section=0 parameter, + * but the "page" parameter needs to be supplied, + * which means that we'd have to make two API requests + * (either to get a random page, or to resolve a search term) + * btw, this action seems to have a mobileformat= parameter, but the resuts are poor. + * 2) Another option is to use the prop=revisions query, coupled with rvprop=content, + * &rvsection=0 and rvparse=true (see https://stackoverflow.com/q/13517901/266309). + * This request can be combined with a random article generator, + * using generator=random&grnnamespace=0, + * or with a search generator, using generator=search. + * But the parser returns the full html, so we'd have to clean it up ourselves. + * 3) The third option (and the one we are using at the moment) is the prop=extracts query + * (from Extension:TextExtracts, https://www.mediawiki.org/wiki/Extension:TextExtracts), + * coupled with the "exintro" parameter. + * This can be paired with a random page generator, or a search generator. + * The cleanup is pretty good, but links are removed (maybe not a bad thing) + * and some templates are still displayed, so they need to be hidden via css. + */ + +// Declare eslint globals (needed because we're using separated files) +/* global clearNode, toggleVisibility, getQueryVariable */ + +var wikipediaUrl = "wikipedia.org"; +var requestTimeoutInMs = 3000; +var requestCallbackName = "requestCallback"; +var notificationTimeoutInMs = 3000; +var notificationTimeout = null; + +var apiUrl = wikipediaUrl + "/w/api.php"; + +var articleIntroQuery = "action=query&prop=extracts&exintro&indexpageids=true&format=json"; +var editIntroQuery = "?action=edit&section=0"; + +var searchQuery = "&generator=search&gsrlimit=1&gsrsearch="; +var randomArticleQuery = "&generator=random&grnnamespace=0"; + +var notificationElement = null; +var notificationContentElement = null; +var searchTermInputElement = null; +var languageInputElement = null; +var searchButton = null; +var contentDivElement = null; +var viewLinkElem = null; +var editLinkElement = null; +var copyShareLinkElement = null; +var articleTitleElement = null; +var licenseIconElement = null; +var infoIconElement = null; +var copyShareLinkInputElement = null; +var copyInputContainer = null; + +/** + * Used to trigger search for a random topic + */ +// Disable eslint's no-unused-vars warning for the next line. +// Needed because this function is currently only called via HTML +// eslint-disable-next-line no-unused-vars +function random() { + searchTermInputElement.value = ""; + var language = getLanguageCode(); + apiRequest(language, articleIntroQuery + randomArticleQuery); +} + +function search() { + updateSearchButtonEnabledState(); + + var searchTerm = searchTermInputElement.value; + var language = getLanguageCode(); + + if(typeof searchTerm === "string" && searchTerm.length > 0) { + apiRequest(language, articleIntroQuery + searchQuery + searchTerm.replace(/ /g, "_")); + } +} + +function renderLoadingSpinner() { + // Show animated loading spinner -- from https://commons.wikimedia.org/wiki/File:Chromiumthrobber.svg + contentDivElement.innerHTML = "Loading..."; +} + +/** + * Execute a JSONP Request + * @param {string} queryString + */ +function apiRequest(language, queryString) { + + if(typeof queryString !== "string" || queryString.length <= 0) { + throw new Error("apiRequest requires a non-empty string parameter."); + } + + renderLoadingSpinner(); + + var script = document.createElement("script"); + script.type = "text/javascript"; + script.async = true; + script.src = prefixUrl(language) + apiUrl + "?" + queryString + "&callback=" + requestCallbackName; + + document.getElementsByTagName("head")[0].appendChild(script); + + var onCompleted = function () { + // reduce global namespace pollution + delete (window[requestCallbackName]); + // remove jsonp result tag + script.remove(); + } + + var requestTimeout = window.setTimeout(function () { + onCompleted(); + }, requestTimeoutInMs); + + window[requestCallbackName] = function (jsonObject) { + window.clearTimeout(requestTimeout); + + handleRequestResult(jsonObject); + + onCompleted(); + } +} + +function getShareableLink(search, language) { + return window.location.pathname + "?search=" + search + "&language=" + language; +} + +function getLanguageCode() { + return languageInputElement.value || 'en'; +} + +function renderSearchResult(jsonObject) { + var pageid = jsonObject.query.pageids[0]; + var article = jsonObject.query.pages[pageid]; + var encodedArticleTitle = encodeURIComponent(article.title).replace(/%20/g, "_"); + article.url = prefixUrl(getLanguageCode()) + wikipediaUrl + "/wiki/" + encodedArticleTitle; + var editlink = article.url + editIntroQuery; + var shareLink = window.location.href; + + viewLinkElem.textContent = article.title; + viewLinkElem.setAttribute("href", article.url); + + editLinkElement.setAttribute("href", editlink); + toggleVisibility(articleTitleElement, true); + + copyShareLinkInputElement.value = getShareableLink(encodedArticleTitle, language.value); + + contentDivElement = clearNode(contentDivElement); + contentDivElement.innerHTML = article.extract; + + toggleVisibility(licenseIconElement, true); + toggleVisibility(infoIconElement, true); +} + +function renderNotFoundNode() { + toggleVisibility(articleTitleElement, false); + toggleVisibility(licenseIconElement, false); + toggleVisibility(infoIconElement, false); + + var notFoundNode = document.createElement("div"); + notFoundNode.classList.add("error"); + notFoundNode.textContent = "The search term wasn't found."; + + contentDivElement = clearNode(contentDivElement); + + contentDivElement.appendChild(notFoundNode); +} + +function isHistoryStateSet() { + if(history.state === undefined) { + return false; + } + + if(history.state === null) { + return false; + } + + if(!history.state.hasOwnProperty("search")) { + return false; + } + + return true; +} + +function addToBrowserHistory(jsonObject) { + // pretty WET, probably best to make a DTO from the request + var pageid = jsonObject.query.pageids[0]; + var article = jsonObject.query.pages[pageid]; + var search = encodeURIComponent(article.title).replace(/%20/g, "_"); + var language = getLanguageCode(); + + var historyState = { + search: search + }; + + if(isHistoryStateSet() && history.state.search === search) { + //Current page is already in history + return; + } + + history.pushState(historyState, window.title, getShareableLink(search, language)); +} + +function handleRequestResult(jsonObject) { + if(jsonObject.hasOwnProperty("query")) { + var searchData = jsonObject.query.searchinfo; + + if(typeof searchData === "undefined" || searchData.totalhits > 0) { + renderSearchResult(jsonObject); + addToBrowserHistory(jsonObject); + + return; + } else if(typeof searchData.suggestion !== "undefined") { + apiRequest(articleIntroQuery + searchQuery + searchData.suggestion); + + return; + } + } + + renderNotFoundNode(); +} + +function updateSearchButtonEnabledState() { + if(searchTermInputElement instanceof HTMLInputElement && searchButton instanceof HTMLInputElement) { + var searchTermInputElementValue = searchTermInputElement.value; + + if(typeof searchTermInputElementValue === "string" && searchTermInputElementValue.length > 0) { + searchButton.removeAttribute("disabled"); + } else { + searchButton.setAttribute("disabled", "disabled"); + } + } +} + +// Upon loading the page, check if an URL parameter was passed, and use it to perform a search +window.onload = function () { + notificationElement = document.getElementById("notification"); + notificationContentElement = document.getElementById("notification-content"); + searchTermInputElement = document.getElementById("search-term"); + languageInputElement = document.getElementById("language"); + searchButton = document.getElementById("searchButton"); + contentDivElement = document.getElementById("content"); + viewLinkElem = document.getElementById("viewlink"); + editLinkElement = document.getElementById("editlink"); + copyShareLinkElement = document.getElementById("copysharelink"); + articleTitleElement = document.getElementById("article-title"); + licenseIconElement = document.getElementById("license-icon"); + infoIconElement = document.getElementById("info-icon"); + copyShareLinkInputElement = document.getElementById("copyShareLinkInput"); + copyInputContainer = document.getElementById("copyInputContainer"); + + var queryParam = getQueryVariable("search"); + + if(queryParam !== null) { + searchTermInputElement.value = queryParam.replace(/_/g, " "); + search(); + } + + if(!isHistoryStateSet()) { + // just for convenience + history.replaceState({ + search: queryParam + }, window.title, window.location.href); + } + + searchTermInputElement.addEventListener("keyup", function () { + updateSearchButtonEnabledState(); + }); + + searchTermInputElement.addEventListener("blur", function () { + updateSearchButtonEnabledState(); + }); + + copyShareLinkElement.addEventListener("click", function () { + // this should allways be true, but doesn't hurt to check + if(copyShareLinkInputElement instanceof HTMLInputElement) { + // some browsers require a visible source for selection & copy to work + // this container virtually stays invisible + // since we hide it again as soon as we are done executing the copy instruction + toggleVisibility(copyInputContainer, true); + + // clipboard interaction is a dodgy thing + // this should prevent the worst things where browser support + // or permissions are missing + try { + copyShareLinkInputElement.select(); // select the contents of the input + document.execCommand("copy"); // copy the selection into the clipboard + + toggleVisibility(notificationElement, true); // show notification to user + // hide notification after an agreeable time + setTimeout(function () { + toggleVisibility(notificationElement, false); // + }, notificationTimeoutInMs); + } catch(e) { + } + + toggleVisibility(copyInputContainer, false); + } + }); + + notificationContentElement.addEventListener("click", function () { + toggleVisibility(notificationElement, false); + }); +}; + +window.onpopstate = function () { + if(isHistoryStateSet()) { + if(history.state.search === null) { + // we can't search for nothing so we reload the base location + window.location.assign(window.location.href); + return; + } + + // needs to be done to comform to the requirements of search() + var queryParam = decodeURIComponent(history.state.search); + + searchTermInputElement.value = queryParam; + search(); + } +}; diff --git a/app/dataviz/timeline3/Women_in_Computing.html b/app/dataviz/women-in-computing/Women_in_Computing.html similarity index 100% rename from app/dataviz/timeline3/Women_in_Computing.html rename to app/dataviz/women-in-computing/Women_in_Computing.html diff --git a/app/dataviz/timeline3/compare.html b/app/dataviz/women-in-computing/compare.html similarity index 100% rename from app/dataviz/timeline3/compare.html rename to app/dataviz/women-in-computing/compare.html diff --git a/app/dataviz/timeline3/css/fonts/font.abril-droidsans.css b/app/dataviz/women-in-computing/css/fonts/font.abril-droidsans.css similarity index 100% rename from app/dataviz/timeline3/css/fonts/font.abril-droidsans.css rename to app/dataviz/women-in-computing/css/fonts/font.abril-droidsans.css diff --git a/app/dataviz/timeline3/css/fonts/font.amatic-andika.css b/app/dataviz/women-in-computing/css/fonts/font.amatic-andika.css similarity index 100% rename from app/dataviz/timeline3/css/fonts/font.amatic-andika.css rename to app/dataviz/women-in-computing/css/fonts/font.amatic-andika.css diff --git a/app/dataviz/timeline3/css/fonts/font.bevan-pontanosans.css b/app/dataviz/women-in-computing/css/fonts/font.bevan-pontanosans.css similarity index 100% rename from app/dataviz/timeline3/css/fonts/font.bevan-pontanosans.css rename to app/dataviz/women-in-computing/css/fonts/font.bevan-pontanosans.css diff --git a/app/dataviz/timeline3/css/fonts/font.bitter-raleway.css b/app/dataviz/women-in-computing/css/fonts/font.bitter-raleway.css similarity index 100% rename from app/dataviz/timeline3/css/fonts/font.bitter-raleway.css rename to app/dataviz/women-in-computing/css/fonts/font.bitter-raleway.css diff --git a/app/dataviz/timeline3/css/fonts/font.clicker-garamond.css b/app/dataviz/women-in-computing/css/fonts/font.clicker-garamond.css similarity index 100% rename from app/dataviz/timeline3/css/fonts/font.clicker-garamond.css rename to app/dataviz/women-in-computing/css/fonts/font.clicker-garamond.css diff --git a/app/dataviz/timeline3/css/fonts/font.dancing-ledger.css b/app/dataviz/women-in-computing/css/fonts/font.dancing-ledger.css similarity index 100% rename from app/dataviz/timeline3/css/fonts/font.dancing-ledger.css rename to app/dataviz/women-in-computing/css/fonts/font.dancing-ledger.css diff --git a/app/dataviz/timeline3/css/fonts/font.default.css b/app/dataviz/women-in-computing/css/fonts/font.default.css similarity index 100% rename from app/dataviz/timeline3/css/fonts/font.default.css rename to app/dataviz/women-in-computing/css/fonts/font.default.css diff --git a/app/dataviz/timeline3/css/fonts/font.fjalla-average.css b/app/dataviz/women-in-computing/css/fonts/font.fjalla-average.css similarity index 100% rename from app/dataviz/timeline3/css/fonts/font.fjalla-average.css rename to app/dataviz/women-in-computing/css/fonts/font.fjalla-average.css diff --git a/app/dataviz/timeline3/css/fonts/font.georgia-helvetica.css b/app/dataviz/women-in-computing/css/fonts/font.georgia-helvetica.css similarity index 100% rename from app/dataviz/timeline3/css/fonts/font.georgia-helvetica.css rename to app/dataviz/women-in-computing/css/fonts/font.georgia-helvetica.css diff --git a/app/dataviz/timeline3/css/fonts/font.knightlab.css b/app/dataviz/women-in-computing/css/fonts/font.knightlab.css similarity index 100% rename from app/dataviz/timeline3/css/fonts/font.knightlab.css rename to app/dataviz/women-in-computing/css/fonts/font.knightlab.css diff --git a/app/dataviz/timeline3/css/fonts/font.lustria-lato.css b/app/dataviz/women-in-computing/css/fonts/font.lustria-lato.css similarity index 100% rename from app/dataviz/timeline3/css/fonts/font.lustria-lato.css rename to app/dataviz/women-in-computing/css/fonts/font.lustria-lato.css diff --git a/app/dataviz/timeline3/css/fonts/font.medula-lato.css b/app/dataviz/women-in-computing/css/fonts/font.medula-lato.css similarity index 100% rename from app/dataviz/timeline3/css/fonts/font.medula-lato.css rename to app/dataviz/women-in-computing/css/fonts/font.medula-lato.css diff --git a/app/dataviz/timeline3/css/fonts/font.oldstandard.css b/app/dataviz/women-in-computing/css/fonts/font.oldstandard.css similarity index 100% rename from app/dataviz/timeline3/css/fonts/font.oldstandard.css rename to app/dataviz/women-in-computing/css/fonts/font.oldstandard.css diff --git a/app/dataviz/timeline3/css/fonts/font.opensans-gentiumbook.css b/app/dataviz/women-in-computing/css/fonts/font.opensans-gentiumbook.css similarity index 100% rename from app/dataviz/timeline3/css/fonts/font.opensans-gentiumbook.css rename to app/dataviz/women-in-computing/css/fonts/font.opensans-gentiumbook.css diff --git a/app/dataviz/timeline3/css/fonts/font.playfair-faunaone.css b/app/dataviz/women-in-computing/css/fonts/font.playfair-faunaone.css similarity index 100% rename from app/dataviz/timeline3/css/fonts/font.playfair-faunaone.css rename to app/dataviz/women-in-computing/css/fonts/font.playfair-faunaone.css diff --git a/app/dataviz/timeline3/css/fonts/font.playfair.css b/app/dataviz/women-in-computing/css/fonts/font.playfair.css similarity index 100% rename from app/dataviz/timeline3/css/fonts/font.playfair.css rename to app/dataviz/women-in-computing/css/fonts/font.playfair.css diff --git a/app/dataviz/timeline3/css/fonts/font.pt.css b/app/dataviz/women-in-computing/css/fonts/font.pt.css similarity index 100% rename from app/dataviz/timeline3/css/fonts/font.pt.css rename to app/dataviz/women-in-computing/css/fonts/font.pt.css diff --git a/app/dataviz/timeline3/css/fonts/font.roboto-megrim.css b/app/dataviz/women-in-computing/css/fonts/font.roboto-megrim.css similarity index 100% rename from app/dataviz/timeline3/css/fonts/font.roboto-megrim.css rename to app/dataviz/women-in-computing/css/fonts/font.roboto-megrim.css diff --git a/app/dataviz/timeline3/css/fonts/font.rufina-sintony.css b/app/dataviz/women-in-computing/css/fonts/font.rufina-sintony.css similarity index 100% rename from app/dataviz/timeline3/css/fonts/font.rufina-sintony.css rename to app/dataviz/women-in-computing/css/fonts/font.rufina-sintony.css diff --git a/app/dataviz/timeline3/css/fonts/font.ubuntu.css b/app/dataviz/women-in-computing/css/fonts/font.ubuntu.css similarity index 100% rename from app/dataviz/timeline3/css/fonts/font.ubuntu.css rename to app/dataviz/women-in-computing/css/fonts/font.ubuntu.css diff --git a/app/dataviz/timeline3/css/fonts/font.unicaone-vollkorn.css b/app/dataviz/women-in-computing/css/fonts/font.unicaone-vollkorn.css similarity index 100% rename from app/dataviz/timeline3/css/fonts/font.unicaone-vollkorn.css rename to app/dataviz/women-in-computing/css/fonts/font.unicaone-vollkorn.css diff --git a/app/dataviz/timeline3/css/icons/tl-icons.eot b/app/dataviz/women-in-computing/css/icons/tl-icons.eot similarity index 100% rename from app/dataviz/timeline3/css/icons/tl-icons.eot rename to app/dataviz/women-in-computing/css/icons/tl-icons.eot diff --git a/app/dataviz/timeline3/css/icons/tl-icons.svg b/app/dataviz/women-in-computing/css/icons/tl-icons.svg similarity index 100% rename from app/dataviz/timeline3/css/icons/tl-icons.svg rename to app/dataviz/women-in-computing/css/icons/tl-icons.svg diff --git a/app/dataviz/timeline3/css/icons/tl-icons.ttf b/app/dataviz/women-in-computing/css/icons/tl-icons.ttf similarity index 100% rename from app/dataviz/timeline3/css/icons/tl-icons.ttf rename to app/dataviz/women-in-computing/css/icons/tl-icons.ttf diff --git a/app/dataviz/timeline3/css/icons/tl-icons.woff b/app/dataviz/women-in-computing/css/icons/tl-icons.woff similarity index 100% rename from app/dataviz/timeline3/css/icons/tl-icons.woff rename to app/dataviz/women-in-computing/css/icons/tl-icons.woff diff --git a/app/dataviz/timeline3/css/icons/tl-icons.woff2 b/app/dataviz/women-in-computing/css/icons/tl-icons.woff2 similarity index 100% rename from app/dataviz/timeline3/css/icons/tl-icons.woff2 rename to app/dataviz/women-in-computing/css/icons/tl-icons.woff2 diff --git a/app/dataviz/timeline3/css/themes/timeline.theme.contrast.css b/app/dataviz/women-in-computing/css/themes/timeline.theme.contrast.css similarity index 100% rename from app/dataviz/timeline3/css/themes/timeline.theme.contrast.css rename to app/dataviz/women-in-computing/css/themes/timeline.theme.contrast.css diff --git a/app/dataviz/timeline3/css/themes/timeline.theme.dark.css b/app/dataviz/women-in-computing/css/themes/timeline.theme.dark.css similarity index 100% rename from app/dataviz/timeline3/css/themes/timeline.theme.dark.css rename to app/dataviz/women-in-computing/css/themes/timeline.theme.dark.css diff --git a/app/dataviz/timeline3/css/timeline.css b/app/dataviz/women-in-computing/css/timeline.css similarity index 100% rename from app/dataviz/timeline3/css/timeline.css rename to app/dataviz/women-in-computing/css/timeline.css diff --git a/app/dataviz/timeline3/css/timeline.css.map b/app/dataviz/women-in-computing/css/timeline.css.map similarity index 100% rename from app/dataviz/timeline3/css/timeline.css.map rename to app/dataviz/women-in-computing/css/timeline.css.map diff --git a/app/dataviz/timeline3/index.html b/app/dataviz/women-in-computing/index.html similarity index 100% rename from app/dataviz/timeline3/index.html rename to app/dataviz/women-in-computing/index.html diff --git a/app/dataviz/timeline3/js/locale/af.json b/app/dataviz/women-in-computing/js/locale/af.json similarity index 100% rename from app/dataviz/timeline3/js/locale/af.json rename to app/dataviz/women-in-computing/js/locale/af.json diff --git a/app/dataviz/timeline3/js/locale/ar.json b/app/dataviz/women-in-computing/js/locale/ar.json similarity index 100% rename from app/dataviz/timeline3/js/locale/ar.json rename to app/dataviz/women-in-computing/js/locale/ar.json diff --git a/app/dataviz/timeline3/js/locale/be.json b/app/dataviz/women-in-computing/js/locale/be.json similarity index 100% rename from app/dataviz/timeline3/js/locale/be.json rename to app/dataviz/women-in-computing/js/locale/be.json diff --git a/app/dataviz/timeline3/js/locale/bg.json b/app/dataviz/women-in-computing/js/locale/bg.json similarity index 100% rename from app/dataviz/timeline3/js/locale/bg.json rename to app/dataviz/women-in-computing/js/locale/bg.json diff --git a/app/dataviz/timeline3/js/locale/ca.json b/app/dataviz/women-in-computing/js/locale/ca.json similarity index 100% rename from app/dataviz/timeline3/js/locale/ca.json rename to app/dataviz/women-in-computing/js/locale/ca.json diff --git a/app/dataviz/timeline3/js/locale/cz.json b/app/dataviz/women-in-computing/js/locale/cz.json similarity index 100% rename from app/dataviz/timeline3/js/locale/cz.json rename to app/dataviz/women-in-computing/js/locale/cz.json diff --git a/app/dataviz/timeline3/js/locale/da.json b/app/dataviz/women-in-computing/js/locale/da.json similarity index 100% rename from app/dataviz/timeline3/js/locale/da.json rename to app/dataviz/women-in-computing/js/locale/da.json diff --git a/app/dataviz/timeline3/js/locale/de.json b/app/dataviz/women-in-computing/js/locale/de.json similarity index 100% rename from app/dataviz/timeline3/js/locale/de.json rename to app/dataviz/women-in-computing/js/locale/de.json diff --git a/app/dataviz/timeline3/js/locale/el.json b/app/dataviz/women-in-computing/js/locale/el.json similarity index 100% rename from app/dataviz/timeline3/js/locale/el.json rename to app/dataviz/women-in-computing/js/locale/el.json diff --git a/app/dataviz/timeline3/js/locale/en-24hr.json b/app/dataviz/women-in-computing/js/locale/en-24hr.json similarity index 100% rename from app/dataviz/timeline3/js/locale/en-24hr.json rename to app/dataviz/women-in-computing/js/locale/en-24hr.json diff --git a/app/dataviz/timeline3/js/locale/en-gb.json b/app/dataviz/women-in-computing/js/locale/en-gb.json similarity index 100% rename from app/dataviz/timeline3/js/locale/en-gb.json rename to app/dataviz/women-in-computing/js/locale/en-gb.json diff --git a/app/dataviz/timeline3/js/locale/en-week.json b/app/dataviz/women-in-computing/js/locale/en-week.json similarity index 100% rename from app/dataviz/timeline3/js/locale/en-week.json rename to app/dataviz/women-in-computing/js/locale/en-week.json diff --git a/app/dataviz/timeline3/js/locale/en.json b/app/dataviz/women-in-computing/js/locale/en.json similarity index 100% rename from app/dataviz/timeline3/js/locale/en.json rename to app/dataviz/women-in-computing/js/locale/en.json diff --git a/app/dataviz/timeline3/js/locale/eo.json b/app/dataviz/women-in-computing/js/locale/eo.json similarity index 100% rename from app/dataviz/timeline3/js/locale/eo.json rename to app/dataviz/women-in-computing/js/locale/eo.json diff --git a/app/dataviz/timeline3/js/locale/es.json b/app/dataviz/women-in-computing/js/locale/es.json similarity index 100% rename from app/dataviz/timeline3/js/locale/es.json rename to app/dataviz/women-in-computing/js/locale/es.json diff --git a/app/dataviz/timeline3/js/locale/et.json b/app/dataviz/women-in-computing/js/locale/et.json similarity index 100% rename from app/dataviz/timeline3/js/locale/et.json rename to app/dataviz/women-in-computing/js/locale/et.json diff --git a/app/dataviz/timeline3/js/locale/eu.json b/app/dataviz/women-in-computing/js/locale/eu.json similarity index 100% rename from app/dataviz/timeline3/js/locale/eu.json rename to app/dataviz/women-in-computing/js/locale/eu.json diff --git a/app/dataviz/timeline3/js/locale/fa.json b/app/dataviz/women-in-computing/js/locale/fa.json similarity index 100% rename from app/dataviz/timeline3/js/locale/fa.json rename to app/dataviz/women-in-computing/js/locale/fa.json diff --git a/app/dataviz/timeline3/js/locale/fi.json b/app/dataviz/women-in-computing/js/locale/fi.json similarity index 100% rename from app/dataviz/timeline3/js/locale/fi.json rename to app/dataviz/women-in-computing/js/locale/fi.json diff --git a/app/dataviz/timeline3/js/locale/fo.json b/app/dataviz/women-in-computing/js/locale/fo.json similarity index 100% rename from app/dataviz/timeline3/js/locale/fo.json rename to app/dataviz/women-in-computing/js/locale/fo.json diff --git a/app/dataviz/timeline3/js/locale/fr.json b/app/dataviz/women-in-computing/js/locale/fr.json similarity index 100% rename from app/dataviz/timeline3/js/locale/fr.json rename to app/dataviz/women-in-computing/js/locale/fr.json diff --git a/app/dataviz/timeline3/js/locale/fy.json b/app/dataviz/women-in-computing/js/locale/fy.json similarity index 100% rename from app/dataviz/timeline3/js/locale/fy.json rename to app/dataviz/women-in-computing/js/locale/fy.json diff --git a/app/dataviz/timeline3/js/locale/ga.json b/app/dataviz/women-in-computing/js/locale/ga.json similarity index 100% rename from app/dataviz/timeline3/js/locale/ga.json rename to app/dataviz/women-in-computing/js/locale/ga.json diff --git a/app/dataviz/timeline3/js/locale/gl.json b/app/dataviz/women-in-computing/js/locale/gl.json similarity index 100% rename from app/dataviz/timeline3/js/locale/gl.json rename to app/dataviz/women-in-computing/js/locale/gl.json diff --git a/app/dataviz/timeline3/js/locale/he.json b/app/dataviz/women-in-computing/js/locale/he.json similarity index 100% rename from app/dataviz/timeline3/js/locale/he.json rename to app/dataviz/women-in-computing/js/locale/he.json diff --git a/app/dataviz/timeline3/js/locale/hi.json b/app/dataviz/women-in-computing/js/locale/hi.json similarity index 100% rename from app/dataviz/timeline3/js/locale/hi.json rename to app/dataviz/women-in-computing/js/locale/hi.json diff --git a/app/dataviz/timeline3/js/locale/hr.json b/app/dataviz/women-in-computing/js/locale/hr.json similarity index 100% rename from app/dataviz/timeline3/js/locale/hr.json rename to app/dataviz/women-in-computing/js/locale/hr.json diff --git a/app/dataviz/timeline3/js/locale/hu.json b/app/dataviz/women-in-computing/js/locale/hu.json similarity index 100% rename from app/dataviz/timeline3/js/locale/hu.json rename to app/dataviz/women-in-computing/js/locale/hu.json diff --git a/app/dataviz/timeline3/js/locale/hy.json b/app/dataviz/women-in-computing/js/locale/hy.json similarity index 100% rename from app/dataviz/timeline3/js/locale/hy.json rename to app/dataviz/women-in-computing/js/locale/hy.json diff --git a/app/dataviz/timeline3/js/locale/id.json b/app/dataviz/women-in-computing/js/locale/id.json similarity index 100% rename from app/dataviz/timeline3/js/locale/id.json rename to app/dataviz/women-in-computing/js/locale/id.json diff --git a/app/dataviz/timeline3/js/locale/is.json b/app/dataviz/women-in-computing/js/locale/is.json similarity index 100% rename from app/dataviz/timeline3/js/locale/is.json rename to app/dataviz/women-in-computing/js/locale/is.json diff --git a/app/dataviz/timeline3/js/locale/it.json b/app/dataviz/women-in-computing/js/locale/it.json similarity index 100% rename from app/dataviz/timeline3/js/locale/it.json rename to app/dataviz/women-in-computing/js/locale/it.json diff --git a/app/dataviz/timeline3/js/locale/iw.json b/app/dataviz/women-in-computing/js/locale/iw.json similarity index 100% rename from app/dataviz/timeline3/js/locale/iw.json rename to app/dataviz/women-in-computing/js/locale/iw.json diff --git a/app/dataviz/timeline3/js/locale/ja.json b/app/dataviz/women-in-computing/js/locale/ja.json similarity index 100% rename from app/dataviz/timeline3/js/locale/ja.json rename to app/dataviz/women-in-computing/js/locale/ja.json diff --git a/app/dataviz/timeline3/js/locale/ka.json b/app/dataviz/women-in-computing/js/locale/ka.json similarity index 100% rename from app/dataviz/timeline3/js/locale/ka.json rename to app/dataviz/women-in-computing/js/locale/ka.json diff --git a/app/dataviz/timeline3/js/locale/ko.json b/app/dataviz/women-in-computing/js/locale/ko.json similarity index 100% rename from app/dataviz/timeline3/js/locale/ko.json rename to app/dataviz/women-in-computing/js/locale/ko.json diff --git a/app/dataviz/timeline3/js/locale/lb.json b/app/dataviz/women-in-computing/js/locale/lb.json similarity index 100% rename from app/dataviz/timeline3/js/locale/lb.json rename to app/dataviz/women-in-computing/js/locale/lb.json diff --git a/app/dataviz/timeline3/js/locale/lt.json b/app/dataviz/women-in-computing/js/locale/lt.json similarity index 100% rename from app/dataviz/timeline3/js/locale/lt.json rename to app/dataviz/women-in-computing/js/locale/lt.json diff --git a/app/dataviz/timeline3/js/locale/lv.json b/app/dataviz/women-in-computing/js/locale/lv.json similarity index 100% rename from app/dataviz/timeline3/js/locale/lv.json rename to app/dataviz/women-in-computing/js/locale/lv.json diff --git a/app/dataviz/timeline3/js/locale/ms.json b/app/dataviz/women-in-computing/js/locale/ms.json similarity index 100% rename from app/dataviz/timeline3/js/locale/ms.json rename to app/dataviz/women-in-computing/js/locale/ms.json diff --git a/app/dataviz/timeline3/js/locale/my.json b/app/dataviz/women-in-computing/js/locale/my.json similarity index 100% rename from app/dataviz/timeline3/js/locale/my.json rename to app/dataviz/women-in-computing/js/locale/my.json diff --git a/app/dataviz/timeline3/js/locale/nb.json b/app/dataviz/women-in-computing/js/locale/nb.json similarity index 100% rename from app/dataviz/timeline3/js/locale/nb.json rename to app/dataviz/women-in-computing/js/locale/nb.json diff --git a/app/dataviz/timeline3/js/locale/ne.json b/app/dataviz/women-in-computing/js/locale/ne.json similarity index 100% rename from app/dataviz/timeline3/js/locale/ne.json rename to app/dataviz/women-in-computing/js/locale/ne.json diff --git a/app/dataviz/timeline3/js/locale/nl.json b/app/dataviz/women-in-computing/js/locale/nl.json similarity index 100% rename from app/dataviz/timeline3/js/locale/nl.json rename to app/dataviz/women-in-computing/js/locale/nl.json diff --git a/app/dataviz/timeline3/js/locale/nn.json b/app/dataviz/women-in-computing/js/locale/nn.json similarity index 100% rename from app/dataviz/timeline3/js/locale/nn.json rename to app/dataviz/women-in-computing/js/locale/nn.json diff --git a/app/dataviz/timeline3/js/locale/no.json b/app/dataviz/women-in-computing/js/locale/no.json similarity index 100% rename from app/dataviz/timeline3/js/locale/no.json rename to app/dataviz/women-in-computing/js/locale/no.json diff --git a/app/dataviz/timeline3/js/locale/pl.json b/app/dataviz/women-in-computing/js/locale/pl.json similarity index 100% rename from app/dataviz/timeline3/js/locale/pl.json rename to app/dataviz/women-in-computing/js/locale/pl.json diff --git a/app/dataviz/timeline3/js/locale/pt-br.json b/app/dataviz/women-in-computing/js/locale/pt-br.json similarity index 100% rename from app/dataviz/timeline3/js/locale/pt-br.json rename to app/dataviz/women-in-computing/js/locale/pt-br.json diff --git a/app/dataviz/timeline3/js/locale/pt.json b/app/dataviz/women-in-computing/js/locale/pt.json similarity index 100% rename from app/dataviz/timeline3/js/locale/pt.json rename to app/dataviz/women-in-computing/js/locale/pt.json diff --git a/app/dataviz/timeline3/js/locale/rm.json b/app/dataviz/women-in-computing/js/locale/rm.json similarity index 100% rename from app/dataviz/timeline3/js/locale/rm.json rename to app/dataviz/women-in-computing/js/locale/rm.json diff --git a/app/dataviz/timeline3/js/locale/ro.json b/app/dataviz/women-in-computing/js/locale/ro.json similarity index 100% rename from app/dataviz/timeline3/js/locale/ro.json rename to app/dataviz/women-in-computing/js/locale/ro.json diff --git a/app/dataviz/timeline3/js/locale/ru.json b/app/dataviz/women-in-computing/js/locale/ru.json similarity index 100% rename from app/dataviz/timeline3/js/locale/ru.json rename to app/dataviz/women-in-computing/js/locale/ru.json diff --git a/app/dataviz/timeline3/js/locale/si.json b/app/dataviz/women-in-computing/js/locale/si.json similarity index 100% rename from app/dataviz/timeline3/js/locale/si.json rename to app/dataviz/women-in-computing/js/locale/si.json diff --git a/app/dataviz/timeline3/js/locale/sk.json b/app/dataviz/women-in-computing/js/locale/sk.json similarity index 100% rename from app/dataviz/timeline3/js/locale/sk.json rename to app/dataviz/women-in-computing/js/locale/sk.json diff --git a/app/dataviz/timeline3/js/locale/sl.json b/app/dataviz/women-in-computing/js/locale/sl.json similarity index 100% rename from app/dataviz/timeline3/js/locale/sl.json rename to app/dataviz/women-in-computing/js/locale/sl.json diff --git a/app/dataviz/timeline3/js/locale/sr-cy.json b/app/dataviz/women-in-computing/js/locale/sr-cy.json similarity index 100% rename from app/dataviz/timeline3/js/locale/sr-cy.json rename to app/dataviz/women-in-computing/js/locale/sr-cy.json diff --git a/app/dataviz/timeline3/js/locale/sr.json b/app/dataviz/women-in-computing/js/locale/sr.json similarity index 100% rename from app/dataviz/timeline3/js/locale/sr.json rename to app/dataviz/women-in-computing/js/locale/sr.json diff --git a/app/dataviz/timeline3/js/locale/sv.json b/app/dataviz/women-in-computing/js/locale/sv.json similarity index 100% rename from app/dataviz/timeline3/js/locale/sv.json rename to app/dataviz/women-in-computing/js/locale/sv.json diff --git a/app/dataviz/timeline3/js/locale/ta.json b/app/dataviz/women-in-computing/js/locale/ta.json similarity index 100% rename from app/dataviz/timeline3/js/locale/ta.json rename to app/dataviz/women-in-computing/js/locale/ta.json diff --git a/app/dataviz/timeline3/js/locale/te.json b/app/dataviz/women-in-computing/js/locale/te.json similarity index 100% rename from app/dataviz/timeline3/js/locale/te.json rename to app/dataviz/women-in-computing/js/locale/te.json diff --git a/app/dataviz/timeline3/js/locale/th.json b/app/dataviz/women-in-computing/js/locale/th.json similarity index 100% rename from app/dataviz/timeline3/js/locale/th.json rename to app/dataviz/women-in-computing/js/locale/th.json diff --git a/app/dataviz/timeline3/js/locale/tl.json b/app/dataviz/women-in-computing/js/locale/tl.json similarity index 100% rename from app/dataviz/timeline3/js/locale/tl.json rename to app/dataviz/women-in-computing/js/locale/tl.json diff --git a/app/dataviz/timeline3/js/locale/tr.json b/app/dataviz/women-in-computing/js/locale/tr.json similarity index 100% rename from app/dataviz/timeline3/js/locale/tr.json rename to app/dataviz/women-in-computing/js/locale/tr.json diff --git a/app/dataviz/timeline3/js/locale/uk.json b/app/dataviz/women-in-computing/js/locale/uk.json similarity index 100% rename from app/dataviz/timeline3/js/locale/uk.json rename to app/dataviz/women-in-computing/js/locale/uk.json diff --git a/app/dataviz/timeline3/js/locale/ur.json b/app/dataviz/women-in-computing/js/locale/ur.json similarity index 100% rename from app/dataviz/timeline3/js/locale/ur.json rename to app/dataviz/women-in-computing/js/locale/ur.json diff --git a/app/dataviz/timeline3/js/locale/vi.json b/app/dataviz/women-in-computing/js/locale/vi.json similarity index 100% rename from app/dataviz/timeline3/js/locale/vi.json rename to app/dataviz/women-in-computing/js/locale/vi.json diff --git a/app/dataviz/timeline3/js/locale/zh-cn.json b/app/dataviz/women-in-computing/js/locale/zh-cn.json similarity index 100% rename from app/dataviz/timeline3/js/locale/zh-cn.json rename to app/dataviz/women-in-computing/js/locale/zh-cn.json diff --git a/app/dataviz/timeline3/js/locale/zh-tw.json b/app/dataviz/women-in-computing/js/locale/zh-tw.json similarity index 100% rename from app/dataviz/timeline3/js/locale/zh-tw.json rename to app/dataviz/women-in-computing/js/locale/zh-tw.json diff --git a/app/dataviz/timeline3/js/timeline-min.js b/app/dataviz/women-in-computing/js/timeline-min.js similarity index 100% rename from app/dataviz/timeline3/js/timeline-min.js rename to app/dataviz/women-in-computing/js/timeline-min.js diff --git a/app/dataviz/timeline3/js/timeline.js b/app/dataviz/women-in-computing/js/timeline.js similarity index 100% rename from app/dataviz/timeline3/js/timeline.js rename to app/dataviz/women-in-computing/js/timeline.js diff --git a/app/dataviz/timeline3/js/timeline.js.LICENSE.txt b/app/dataviz/women-in-computing/js/timeline.js.LICENSE.txt similarity index 100% rename from app/dataviz/timeline3/js/timeline.js.LICENSE.txt rename to app/dataviz/women-in-computing/js/timeline.js.LICENSE.txt diff --git a/app/dataviz/timeline3/js/timeline.js.map b/app/dataviz/women-in-computing/js/timeline.js.map similarity index 100% rename from app/dataviz/timeline3/js/timeline.js.map rename to app/dataviz/women-in-computing/js/timeline.js.map diff --git a/app/dataviz/timeline3/old-index.html b/app/dataviz/women-in-computing/old-index.html similarity index 100% rename from app/dataviz/timeline3/old-index.html rename to app/dataviz/women-in-computing/old-index.html diff --git a/app/dataviz/timeline3/popular_timelines.json b/app/dataviz/women-in-computing/popular_timelines.json similarity index 100% rename from app/dataviz/timeline3/popular_timelines.json rename to app/dataviz/women-in-computing/popular_timelines.json diff --git a/app/map-travel/note.md b/app/map-travel/note.md new file mode 100644 index 00000000..e69de29b diff --git a/app/multimedia/webgl/blockly-playground/index2.html b/app/multimedia/webgl/blockly-playground/index2.html new file mode 100644 index 00000000..ed87024e --- /dev/null +++ b/app/multimedia/webgl/blockly-playground/index2.html @@ -0,0 +1,125 @@ + + + + + + + + + + + Blockly Threex + + + + + + + + + + + +
+ + + +
+

Blockly Threex Graphic Language for three.js

+

Sometime it is easier to learn something with + graphical representation than with textual one. + I experimented on this using + Blockly + and + three.js. + You controls a robot in webgl and modify its behavior as you wish. + Definitly very fun way to learn programmation thru game development. +

+

Get started today

+
+ + +
+
+

All Graphical

+

The language you use to code is Blockly, + a web-based, graphical programming editor. +

+
+
+

WebGL thru three.js

+

+ Always trying to make three.js easier for beginners. Now you can use it without even knowing javascript. + Maybe without even knowing how to code itself. +

+
+
+

Easier to Learn

+

+ Thanks to Blockly, you can't do any syntax error. + Thanks to three.js you got fancy display where you can have fun customizing your very + own character. +

+
+
+ +
+
+

Chuck Noris Example

+

+ Try It Live » +

+
+
+

Batman Example

+

+ Try It Live » +

+
+
+

Move Example

+

+ Try It Live » +

+
+
+ +
+ + + + + + + + Fork me on GitHub + + + diff --git a/app/private/index.html b/app/private/index.html new file mode 100644 index 00000000..f9e4c33f --- /dev/null +++ b/app/private/index.html @@ -0,0 +1,77 @@ + + + + + +Codemo - GitHub Repository Web File Browser + + + + + + + + + + + + + + + + + + +
+ +
+

Private Folder

+
+
+
+

Codemo

+

GitHub Repository Browser

+
+

+ +

+
+ + +
+
+
+
+
+ + + \ No newline at end of file diff --git a/app/dataviz/archimate-explorer.md b/app/project/archimate-explorer.md similarity index 100% rename from app/dataviz/archimate-explorer.md rename to app/project/archimate-explorer.md diff --git a/app/dataviz/archimate-graph-explorer.md b/app/project/archimate-graph-explorer.md similarity index 100% rename from app/dataviz/archimate-graph-explorer.md rename to app/project/archimate-graph-explorer.md diff --git a/app/dataviz/archimate-graph-explorer.webp b/app/project/archimate-graph-explorer.webp similarity index 100% rename from app/dataviz/archimate-graph-explorer.webp rename to app/project/archimate-graph-explorer.webp diff --git a/app/dataviz/archimate-graph-explorer/LICENSE b/app/project/archimate-graph-explorer/LICENSE similarity index 100% rename from app/dataviz/archimate-graph-explorer/LICENSE rename to app/project/archimate-graph-explorer/LICENSE diff --git a/app/dataviz/archimate-graph-explorer/components/dataAccess.js b/app/project/archimate-graph-explorer/components/dataAccess.js similarity index 100% rename from app/dataviz/archimate-graph-explorer/components/dataAccess.js rename to app/project/archimate-graph-explorer/components/dataAccess.js diff --git a/app/dataviz/archimate-graph-explorer/components/dataParserArchiFormat.js b/app/project/archimate-graph-explorer/components/dataParserArchiFormat.js similarity index 100% rename from app/dataviz/archimate-graph-explorer/components/dataParserArchiFormat.js rename to app/project/archimate-graph-explorer/components/dataParserArchiFormat.js diff --git a/app/dataviz/archimate-graph-explorer/components/dataParserExchangeFormat.js b/app/project/archimate-graph-explorer/components/dataParserExchangeFormat.js similarity index 100% rename from app/dataviz/archimate-graph-explorer/components/dataParserExchangeFormat.js rename to app/project/archimate-graph-explorer/components/dataParserExchangeFormat.js diff --git a/app/dataviz/archimate-graph-explorer/components/filterBar.js b/app/project/archimate-graph-explorer/components/filterBar.js similarity index 100% rename from app/dataviz/archimate-graph-explorer/components/filterBar.js rename to app/project/archimate-graph-explorer/components/filterBar.js diff --git a/app/dataviz/archimate-graph-explorer/components/graphDataSearch.js b/app/project/archimate-graph-explorer/components/graphDataSearch.js similarity index 100% rename from app/dataviz/archimate-graph-explorer/components/graphDataSearch.js rename to app/project/archimate-graph-explorer/components/graphDataSearch.js diff --git a/app/dataviz/archimate-graph-explorer/components/graphExplorer.js b/app/project/archimate-graph-explorer/components/graphExplorer.js similarity index 100% rename from app/dataviz/archimate-graph-explorer/components/graphExplorer.js rename to app/project/archimate-graph-explorer/components/graphExplorer.js diff --git a/app/dataviz/archimate-graph-explorer/components/graphLink.js b/app/project/archimate-graph-explorer/components/graphLink.js similarity index 100% rename from app/dataviz/archimate-graph-explorer/components/graphLink.js rename to app/project/archimate-graph-explorer/components/graphLink.js diff --git a/app/dataviz/archimate-graph-explorer/components/graphNode.js b/app/project/archimate-graph-explorer/components/graphNode.js similarity index 100% rename from app/dataviz/archimate-graph-explorer/components/graphNode.js rename to app/project/archimate-graph-explorer/components/graphNode.js diff --git a/app/dataviz/archimate-graph-explorer/components/userModel.js b/app/project/archimate-graph-explorer/components/userModel.js similarity index 100% rename from app/dataviz/archimate-graph-explorer/components/userModel.js rename to app/project/archimate-graph-explorer/components/userModel.js diff --git a/app/dataviz/archimate-graph-explorer/components/userSettings.js b/app/project/archimate-graph-explorer/components/userSettings.js similarity index 100% rename from app/dataviz/archimate-graph-explorer/components/userSettings.js rename to app/project/archimate-graph-explorer/components/userSettings.js diff --git a/app/dataviz/archimate-graph-explorer/css/archigraph.css b/app/project/archimate-graph-explorer/css/archigraph.css similarity index 100% rename from app/dataviz/archimate-graph-explorer/css/archigraph.css rename to app/project/archimate-graph-explorer/css/archigraph.css diff --git a/app/dataviz/archimate-graph-explorer/css/autoComplete.css b/app/project/archimate-graph-explorer/css/autoComplete.css similarity index 100% rename from app/dataviz/archimate-graph-explorer/css/autoComplete.css rename to app/project/archimate-graph-explorer/css/autoComplete.css diff --git a/app/dataviz/archimate-graph-explorer/css/tail.select-light.css b/app/project/archimate-graph-explorer/css/tail.select-light.css similarity index 100% rename from app/dataviz/archimate-graph-explorer/css/tail.select-light.css rename to app/project/archimate-graph-explorer/css/tail.select-light.css diff --git a/app/dataviz/archimate-graph-explorer/data/ArchiSurance.archimate b/app/project/archimate-graph-explorer/data/ArchiSurance.archimate similarity index 100% rename from app/dataviz/archimate-graph-explorer/data/ArchiSurance.archimate rename to app/project/archimate-graph-explorer/data/ArchiSurance.archimate diff --git a/app/dataviz/archimate-graph-explorer/data/ArchiSurance.xml b/app/project/archimate-graph-explorer/data/ArchiSurance.xml similarity index 100% rename from app/dataviz/archimate-graph-explorer/data/ArchiSurance.xml rename to app/project/archimate-graph-explorer/data/ArchiSurance.xml diff --git a/app/dataviz/archimate-graph-explorer/favicon.ico b/app/project/archimate-graph-explorer/favicon.ico similarity index 100% rename from app/dataviz/archimate-graph-explorer/favicon.ico rename to app/project/archimate-graph-explorer/favicon.ico diff --git a/app/dataviz/archimate-graph-explorer/favicon.svg b/app/project/archimate-graph-explorer/favicon.svg similarity index 100% rename from app/dataviz/archimate-graph-explorer/favicon.svg rename to app/project/archimate-graph-explorer/favicon.svg diff --git a/app/dataviz/archimate-graph-explorer/index.html b/app/project/archimate-graph-explorer/index.html similarity index 100% rename from app/dataviz/archimate-graph-explorer/index.html rename to app/project/archimate-graph-explorer/index.html diff --git a/app/dataviz/archimate-graph-explorer/index.js b/app/project/archimate-graph-explorer/index.js similarity index 100% rename from app/dataviz/archimate-graph-explorer/index.js rename to app/project/archimate-graph-explorer/index.js diff --git a/app/dataviz/archimate-graph-explorer/libs/autoComplete.min.js b/app/project/archimate-graph-explorer/libs/autoComplete.min.js similarity index 100% rename from app/dataviz/archimate-graph-explorer/libs/autoComplete.min.js rename to app/project/archimate-graph-explorer/libs/autoComplete.min.js diff --git a/app/dataviz/archimate-graph-explorer/libs/d3.v7.min.js b/app/project/archimate-graph-explorer/libs/d3.v7.min.js similarity index 100% rename from app/dataviz/archimate-graph-explorer/libs/d3.v7.min.js rename to app/project/archimate-graph-explorer/libs/d3.v7.min.js diff --git a/app/dataviz/archimate-graph-explorer/libs/tail.select-full.min.js b/app/project/archimate-graph-explorer/libs/tail.select-full.min.js similarity index 100% rename from app/dataviz/archimate-graph-explorer/libs/tail.select-full.min.js rename to app/project/archimate-graph-explorer/libs/tail.select-full.min.js diff --git a/app/dataviz/archimate-graph-explorer/settings.js b/app/project/archimate-graph-explorer/settings.js similarity index 100% rename from app/dataviz/archimate-graph-explorer/settings.js rename to app/project/archimate-graph-explorer/settings.js diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/00153750-96fd-427c-a872-4e4be1a148de.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/00153750-96fd-427c-a872-4e4be1a148de.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/00153750-96fd-427c-a872-4e4be1a148de.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/00153750-96fd-427c-a872-4e4be1a148de.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/001867d6-4a8b-43e9-aa32-688fcfc10683.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/001867d6-4a8b-43e9-aa32-688fcfc10683.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/001867d6-4a8b-43e9-aa32-688fcfc10683.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/001867d6-4a8b-43e9-aa32-688fcfc10683.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/001bfa44-9efb-49eb-a995-faa03b4452d8.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/001bfa44-9efb-49eb-a995-faa03b4452d8.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/001bfa44-9efb-49eb-a995-faa03b4452d8.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/001bfa44-9efb-49eb-a995-faa03b4452d8.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/00b93ea9-ee0d-4a27-ae9d-27de627fc1b1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/00b93ea9-ee0d-4a27-ae9d-27de627fc1b1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/00b93ea9-ee0d-4a27-ae9d-27de627fc1b1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/00b93ea9-ee0d-4a27-ae9d-27de627fc1b1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/00d7cfc8-d571-4bce-86a1-dd8fa6b0d22d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/00d7cfc8-d571-4bce-86a1-dd8fa6b0d22d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/00d7cfc8-d571-4bce-86a1-dd8fa6b0d22d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/00d7cfc8-d571-4bce-86a1-dd8fa6b0d22d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0117026d-417a-4ff5-85cf-cb61719eba54.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0117026d-417a-4ff5-85cf-cb61719eba54.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0117026d-417a-4ff5-85cf-cb61719eba54.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0117026d-417a-4ff5-85cf-cb61719eba54.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/01245312-c383-4660-91d8-a827eeab8296.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/01245312-c383-4660-91d8-a827eeab8296.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/01245312-c383-4660-91d8-a827eeab8296.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/01245312-c383-4660-91d8-a827eeab8296.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/01266943-7325-4c7f-8267-953255764bc4.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/01266943-7325-4c7f-8267-953255764bc4.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/01266943-7325-4c7f-8267-953255764bc4.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/01266943-7325-4c7f-8267-953255764bc4.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0132f121-7493-4927-abfa-37f57d08388e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0132f121-7493-4927-abfa-37f57d08388e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0132f121-7493-4927-abfa-37f57d08388e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0132f121-7493-4927-abfa-37f57d08388e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/01403419-322e-43c8-9694-6632e76e5d3d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/01403419-322e-43c8-9694-6632e76e5d3d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/01403419-322e-43c8-9694-6632e76e5d3d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/01403419-322e-43c8-9694-6632e76e5d3d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/01446e9e-49a1-485d-8993-369192bf1a0c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/01446e9e-49a1-485d-8993-369192bf1a0c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/01446e9e-49a1-485d-8993-369192bf1a0c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/01446e9e-49a1-485d-8993-369192bf1a0c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0149b5e4-fc78-4a4c-bd73-991607fe1369.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0149b5e4-fc78-4a4c-bd73-991607fe1369.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0149b5e4-fc78-4a4c-bd73-991607fe1369.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0149b5e4-fc78-4a4c-bd73-991607fe1369.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/015a6779-d76f-45e3-8f86-c8a057ac7610.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/015a6779-d76f-45e3-8f86-c8a057ac7610.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/015a6779-d76f-45e3-8f86-c8a057ac7610.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/015a6779-d76f-45e3-8f86-c8a057ac7610.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/018ea3f8-b187-4665-a855-4980f527daa0.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/018ea3f8-b187-4665-a855-4980f527daa0.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/018ea3f8-b187-4665-a855-4980f527daa0.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/018ea3f8-b187-4665-a855-4980f527daa0.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/019ac483-f2a5-4898-83c7-50fd7b0f662c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/019ac483-f2a5-4898-83c7-50fd7b0f662c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/019ac483-f2a5-4898-83c7-50fd7b0f662c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/019ac483-f2a5-4898-83c7-50fd7b0f662c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/01d5fd0e-33a1-4fbd-8601-9a07d52abdc7.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/01d5fd0e-33a1-4fbd-8601-9a07d52abdc7.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/01d5fd0e-33a1-4fbd-8601-9a07d52abdc7.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/01d5fd0e-33a1-4fbd-8601-9a07d52abdc7.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0209c78d-f76d-49a9-84db-4bd1e356bced.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0209c78d-f76d-49a9-84db-4bd1e356bced.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0209c78d-f76d-49a9-84db-4bd1e356bced.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0209c78d-f76d-49a9-84db-4bd1e356bced.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0217c130-0fc6-4fa0-8dc3-b4c5658fa280.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0217c130-0fc6-4fa0-8dc3-b4c5658fa280.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0217c130-0fc6-4fa0-8dc3-b4c5658fa280.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0217c130-0fc6-4fa0-8dc3-b4c5658fa280.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/02816aec-918d-4c92-81a7-cdab8a794617.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/02816aec-918d-4c92-81a7-cdab8a794617.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/02816aec-918d-4c92-81a7-cdab8a794617.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/02816aec-918d-4c92-81a7-cdab8a794617.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/029368bd-ba18-44a5-aa48-8867481ec0fb.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/029368bd-ba18-44a5-aa48-8867481ec0fb.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/029368bd-ba18-44a5-aa48-8867481ec0fb.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/029368bd-ba18-44a5-aa48-8867481ec0fb.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/02bb771a-69c4-4cf3-9652-9922e70a5c90.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/02bb771a-69c4-4cf3-9652-9922e70a5c90.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/02bb771a-69c4-4cf3-9652-9922e70a5c90.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/02bb771a-69c4-4cf3-9652-9922e70a5c90.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/02d07124-9a90-42e7-9e9b-3e255a3ba1f4.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/02d07124-9a90-42e7-9e9b-3e255a3ba1f4.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/02d07124-9a90-42e7-9e9b-3e255a3ba1f4.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/02d07124-9a90-42e7-9e9b-3e255a3ba1f4.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/02e58b95-d49f-4847-bdf1-27e16b04e6c1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/02e58b95-d49f-4847-bdf1-27e16b04e6c1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/02e58b95-d49f-4847-bdf1-27e16b04e6c1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/02e58b95-d49f-4847-bdf1-27e16b04e6c1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0303ea51-cd4f-461d-a2de-b10ffd64f3fb.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0303ea51-cd4f-461d-a2de-b10ffd64f3fb.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0303ea51-cd4f-461d-a2de-b10ffd64f3fb.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0303ea51-cd4f-461d-a2de-b10ffd64f3fb.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/031a3fc1-3603-44c8-b721-a5feaa26e890.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/031a3fc1-3603-44c8-b721-a5feaa26e890.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/031a3fc1-3603-44c8-b721-a5feaa26e890.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/031a3fc1-3603-44c8-b721-a5feaa26e890.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/033302e5-eebb-4d5b-b163-e7506e1b41a5.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/033302e5-eebb-4d5b-b163-e7506e1b41a5.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/033302e5-eebb-4d5b-b163-e7506e1b41a5.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/033302e5-eebb-4d5b-b163-e7506e1b41a5.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0335b3ad-8da3-4227-a7a3-6e3dc4483ae2.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0335b3ad-8da3-4227-a7a3-6e3dc4483ae2.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0335b3ad-8da3-4227-a7a3-6e3dc4483ae2.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0335b3ad-8da3-4227-a7a3-6e3dc4483ae2.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/034eb67a-dab3-43e2-b31b-60d25417e552.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/034eb67a-dab3-43e2-b31b-60d25417e552.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/034eb67a-dab3-43e2-b31b-60d25417e552.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/034eb67a-dab3-43e2-b31b-60d25417e552.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0362a7df-65ab-4c22-9a87-ec3e2530e770.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0362a7df-65ab-4c22-9a87-ec3e2530e770.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0362a7df-65ab-4c22-9a87-ec3e2530e770.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0362a7df-65ab-4c22-9a87-ec3e2530e770.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/036a0c9f-2183-4c16-8350-9fe0bbcb02e4.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/036a0c9f-2183-4c16-8350-9fe0bbcb02e4.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/036a0c9f-2183-4c16-8350-9fe0bbcb02e4.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/036a0c9f-2183-4c16-8350-9fe0bbcb02e4.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/036b691b-f0a5-4872-83b6-f90786589aaf.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/036b691b-f0a5-4872-83b6-f90786589aaf.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/036b691b-f0a5-4872-83b6-f90786589aaf.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/036b691b-f0a5-4872-83b6-f90786589aaf.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/038711e7-da0d-48fa-8c3d-d2dc88243929.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/038711e7-da0d-48fa-8c3d-d2dc88243929.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/038711e7-da0d-48fa-8c3d-d2dc88243929.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/038711e7-da0d-48fa-8c3d-d2dc88243929.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/039fba91-777d-455e-a777-254c8cce9ad8.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/039fba91-777d-455e-a777-254c8cce9ad8.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/039fba91-777d-455e-a777-254c8cce9ad8.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/039fba91-777d-455e-a777-254c8cce9ad8.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/03c0bc58-c152-4acb-b4d3-a5f1c16d68e4.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/03c0bc58-c152-4acb-b4d3-a5f1c16d68e4.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/03c0bc58-c152-4acb-b4d3-a5f1c16d68e4.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/03c0bc58-c152-4acb-b4d3-a5f1c16d68e4.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/03f87eb2-2132-479b-a15b-91fdf3be966d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/03f87eb2-2132-479b-a15b-91fdf3be966d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/03f87eb2-2132-479b-a15b-91fdf3be966d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/03f87eb2-2132-479b-a15b-91fdf3be966d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/04033408-1683-4879-9253-1f7e91459cd9.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/04033408-1683-4879-9253-1f7e91459cd9.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/04033408-1683-4879-9253-1f7e91459cd9.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/04033408-1683-4879-9253-1f7e91459cd9.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0447eb95-1ea2-4d66-a30d-ebcfaa2dfcc5.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0447eb95-1ea2-4d66-a30d-ebcfaa2dfcc5.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0447eb95-1ea2-4d66-a30d-ebcfaa2dfcc5.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0447eb95-1ea2-4d66-a30d-ebcfaa2dfcc5.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/04480f23-8a5f-4394-80eb-2045ac96e168.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/04480f23-8a5f-4394-80eb-2045ac96e168.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/04480f23-8a5f-4394-80eb-2045ac96e168.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/04480f23-8a5f-4394-80eb-2045ac96e168.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/045aa24f-42fd-4c9e-8a37-257159e42ac7.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/045aa24f-42fd-4c9e-8a37-257159e42ac7.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/045aa24f-42fd-4c9e-8a37-257159e42ac7.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/045aa24f-42fd-4c9e-8a37-257159e42ac7.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/046a670a-a8a1-4263-ba85-60298554248b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/046a670a-a8a1-4263-ba85-60298554248b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/046a670a-a8a1-4263-ba85-60298554248b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/046a670a-a8a1-4263-ba85-60298554248b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/04a99e2b-886e-45bc-a686-7277e12d1894.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/04a99e2b-886e-45bc-a686-7277e12d1894.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/04a99e2b-886e-45bc-a686-7277e12d1894.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/04a99e2b-886e-45bc-a686-7277e12d1894.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/04b51324-dadc-45f8-87eb-fc63f00b4049.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/04b51324-dadc-45f8-87eb-fc63f00b4049.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/04b51324-dadc-45f8-87eb-fc63f00b4049.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/04b51324-dadc-45f8-87eb-fc63f00b4049.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/04e2027b-1457-499c-9a7d-47452e576a37.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/04e2027b-1457-499c-9a7d-47452e576a37.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/04e2027b-1457-499c-9a7d-47452e576a37.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/04e2027b-1457-499c-9a7d-47452e576a37.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/04e2f6c8-5356-4c26-9c34-9d1957695bad.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/04e2f6c8-5356-4c26-9c34-9d1957695bad.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/04e2f6c8-5356-4c26-9c34-9d1957695bad.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/04e2f6c8-5356-4c26-9c34-9d1957695bad.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/04e66ae6-b766-4026-bf7b-4be34cf61cca.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/04e66ae6-b766-4026-bf7b-4be34cf61cca.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/04e66ae6-b766-4026-bf7b-4be34cf61cca.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/04e66ae6-b766-4026-bf7b-4be34cf61cca.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/04e7bd91-889c-4984-b801-8570fb6865e0.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/04e7bd91-889c-4984-b801-8570fb6865e0.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/04e7bd91-889c-4984-b801-8570fb6865e0.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/04e7bd91-889c-4984-b801-8570fb6865e0.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/054b00ab-1920-46e9-9370-a61cea42dede.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/054b00ab-1920-46e9-9370-a61cea42dede.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/054b00ab-1920-46e9-9370-a61cea42dede.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/054b00ab-1920-46e9-9370-a61cea42dede.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/057084dc-4c25-4330-9bc7-9e9d50078866.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/057084dc-4c25-4330-9bc7-9e9d50078866.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/057084dc-4c25-4330-9bc7-9e9d50078866.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/057084dc-4c25-4330-9bc7-9e9d50078866.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/058962da-e3ac-4476-9e92-7d4ed2684b35.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/058962da-e3ac-4476-9e92-7d4ed2684b35.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/058962da-e3ac-4476-9e92-7d4ed2684b35.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/058962da-e3ac-4476-9e92-7d4ed2684b35.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/05e1fe7e-253a-4bae-b0f5-d7d15c6fe024.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/05e1fe7e-253a-4bae-b0f5-d7d15c6fe024.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/05e1fe7e-253a-4bae-b0f5-d7d15c6fe024.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/05e1fe7e-253a-4bae-b0f5-d7d15c6fe024.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/05e680be-908d-4a36-a29e-e6618ec2aa4e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/05e680be-908d-4a36-a29e-e6618ec2aa4e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/05e680be-908d-4a36-a29e-e6618ec2aa4e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/05e680be-908d-4a36-a29e-e6618ec2aa4e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/05f941d9-824a-4a6f-aed4-96587cce5a0f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/05f941d9-824a-4a6f-aed4-96587cce5a0f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/05f941d9-824a-4a6f-aed4-96587cce5a0f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/05f941d9-824a-4a6f-aed4-96587cce5a0f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/06070728-7f1c-4728-87fb-88fd92ba2c30.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/06070728-7f1c-4728-87fb-88fd92ba2c30.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/06070728-7f1c-4728-87fb-88fd92ba2c30.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/06070728-7f1c-4728-87fb-88fd92ba2c30.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/062551cb-47b4-4304-b216-79f879b36e40.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/062551cb-47b4-4304-b216-79f879b36e40.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/062551cb-47b4-4304-b216-79f879b36e40.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/062551cb-47b4-4304-b216-79f879b36e40.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0644dc6c-f935-4bea-93b1-32c155edebcc.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0644dc6c-f935-4bea-93b1-32c155edebcc.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0644dc6c-f935-4bea-93b1-32c155edebcc.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0644dc6c-f935-4bea-93b1-32c155edebcc.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/06671b6c-4b46-4d3c-b629-c31a7c00d8b3.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/06671b6c-4b46-4d3c-b629-c31a7c00d8b3.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/06671b6c-4b46-4d3c-b629-c31a7c00d8b3.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/06671b6c-4b46-4d3c-b629-c31a7c00d8b3.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0688c199-086a-44fb-a276-21b502848aa7.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0688c199-086a-44fb-a276-21b502848aa7.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0688c199-086a-44fb-a276-21b502848aa7.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0688c199-086a-44fb-a276-21b502848aa7.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/068b636b-5f6f-45eb-b0f7-732c9b28c4d4.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/068b636b-5f6f-45eb-b0f7-732c9b28c4d4.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/068b636b-5f6f-45eb-b0f7-732c9b28c4d4.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/068b636b-5f6f-45eb-b0f7-732c9b28c4d4.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0690e245-613a-4a2c-9f43-b147fc3e7a07.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0690e245-613a-4a2c-9f43-b147fc3e7a07.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0690e245-613a-4a2c-9f43-b147fc3e7a07.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0690e245-613a-4a2c-9f43-b147fc3e7a07.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0697c0e8-fdda-4459-9427-8068ba055914.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0697c0e8-fdda-4459-9427-8068ba055914.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0697c0e8-fdda-4459-9427-8068ba055914.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0697c0e8-fdda-4459-9427-8068ba055914.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/06a8ffd5-1b4a-4db2-a870-2467175f9f40.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/06a8ffd5-1b4a-4db2-a870-2467175f9f40.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/06a8ffd5-1b4a-4db2-a870-2467175f9f40.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/06a8ffd5-1b4a-4db2-a870-2467175f9f40.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/06b12fb8-bf8f-4566-a075-b748eca2d613.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/06b12fb8-bf8f-4566-a075-b748eca2d613.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/06b12fb8-bf8f-4566-a075-b748eca2d613.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/06b12fb8-bf8f-4566-a075-b748eca2d613.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/06cb903d-282d-46bd-86c5-0a7adebc2177.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/06cb903d-282d-46bd-86c5-0a7adebc2177.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/06cb903d-282d-46bd-86c5-0a7adebc2177.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/06cb903d-282d-46bd-86c5-0a7adebc2177.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/06e41b0c-4822-46e2-8c81-67edca1927bd.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/06e41b0c-4822-46e2-8c81-67edca1927bd.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/06e41b0c-4822-46e2-8c81-67edca1927bd.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/06e41b0c-4822-46e2-8c81-67edca1927bd.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/06e77d14-ab08-4c70-a359-00c1c4e082da.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/06e77d14-ab08-4c70-a359-00c1c4e082da.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/06e77d14-ab08-4c70-a359-00c1c4e082da.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/06e77d14-ab08-4c70-a359-00c1c4e082da.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/06ebef74-c5d6-4bb5-865f-005bd98309ff.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/06ebef74-c5d6-4bb5-865f-005bd98309ff.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/06ebef74-c5d6-4bb5-865f-005bd98309ff.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/06ebef74-c5d6-4bb5-865f-005bd98309ff.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/072e5d93-6c6c-4e3f-ab65-815c8583f241.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/072e5d93-6c6c-4e3f-ab65-815c8583f241.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/072e5d93-6c6c-4e3f-ab65-815c8583f241.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/072e5d93-6c6c-4e3f-ab65-815c8583f241.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/076c23b7-510e-4eeb-a8d2-4ca330959a4c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/076c23b7-510e-4eeb-a8d2-4ca330959a4c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/076c23b7-510e-4eeb-a8d2-4ca330959a4c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/076c23b7-510e-4eeb-a8d2-4ca330959a4c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0770e6d2-7a3a-4335-aa89-d142b4693a00.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0770e6d2-7a3a-4335-aa89-d142b4693a00.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0770e6d2-7a3a-4335-aa89-d142b4693a00.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0770e6d2-7a3a-4335-aa89-d142b4693a00.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0771c953-b812-4f67-9691-e5caf19c6fa7.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0771c953-b812-4f67-9691-e5caf19c6fa7.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0771c953-b812-4f67-9691-e5caf19c6fa7.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0771c953-b812-4f67-9691-e5caf19c6fa7.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/077e9221-a491-48f2-9dc8-4cd9d51b4a6e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/077e9221-a491-48f2-9dc8-4cd9d51b4a6e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/077e9221-a491-48f2-9dc8-4cd9d51b4a6e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/077e9221-a491-48f2-9dc8-4cd9d51b4a6e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/07946b71-a580-4cff-8f76-4905f963827f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/07946b71-a580-4cff-8f76-4905f963827f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/07946b71-a580-4cff-8f76-4905f963827f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/07946b71-a580-4cff-8f76-4905f963827f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/07c529aa-0e11-413b-9b2b-5313d6c88ecc.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/07c529aa-0e11-413b-9b2b-5313d6c88ecc.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/07c529aa-0e11-413b-9b2b-5313d6c88ecc.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/07c529aa-0e11-413b-9b2b-5313d6c88ecc.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/07d35fcf-cdd1-472f-ae62-7f977e2ae34d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/07d35fcf-cdd1-472f-ae62-7f977e2ae34d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/07d35fcf-cdd1-472f-ae62-7f977e2ae34d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/07d35fcf-cdd1-472f-ae62-7f977e2ae34d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/07f3dc85-9ed5-4bd3-90dc-381060ff6428.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/07f3dc85-9ed5-4bd3-90dc-381060ff6428.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/07f3dc85-9ed5-4bd3-90dc-381060ff6428.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/07f3dc85-9ed5-4bd3-90dc-381060ff6428.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/07faefae-5e2b-4b2d-af76-684b06ac42d4.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/07faefae-5e2b-4b2d-af76-684b06ac42d4.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/07faefae-5e2b-4b2d-af76-684b06ac42d4.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/07faefae-5e2b-4b2d-af76-684b06ac42d4.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0800fdc7-6da5-461d-a3ec-23b8e8d7ceac.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0800fdc7-6da5-461d-a3ec-23b8e8d7ceac.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0800fdc7-6da5-461d-a3ec-23b8e8d7ceac.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0800fdc7-6da5-461d-a3ec-23b8e8d7ceac.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/08040fb4-a901-4d81-b515-202c9d43d275.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/08040fb4-a901-4d81-b515-202c9d43d275.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/08040fb4-a901-4d81-b515-202c9d43d275.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/08040fb4-a901-4d81-b515-202c9d43d275.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/080417c6-900c-4407-acb1-0c52a36b4d5d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/080417c6-900c-4407-acb1-0c52a36b4d5d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/080417c6-900c-4407-acb1-0c52a36b4d5d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/080417c6-900c-4407-acb1-0c52a36b4d5d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0848a38a-d43b-481b-a195-986e905b5172.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0848a38a-d43b-481b-a195-986e905b5172.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0848a38a-d43b-481b-a195-986e905b5172.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0848a38a-d43b-481b-a195-986e905b5172.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0854eea0-a97b-4722-889e-85e1ac321744.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0854eea0-a97b-4722-889e-85e1ac321744.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0854eea0-a97b-4722-889e-85e1ac321744.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0854eea0-a97b-4722-889e-85e1ac321744.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0858d938-ac2f-48da-be26-c5871c9ae151.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0858d938-ac2f-48da-be26-c5871c9ae151.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0858d938-ac2f-48da-be26-c5871c9ae151.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0858d938-ac2f-48da-be26-c5871c9ae151.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/085aa218-e69f-4d72-a70b-0514cfa3381c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/085aa218-e69f-4d72-a70b-0514cfa3381c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/085aa218-e69f-4d72-a70b-0514cfa3381c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/085aa218-e69f-4d72-a70b-0514cfa3381c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/085df0f5-b807-4bb0-88af-8ce4c5696d67.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/085df0f5-b807-4bb0-88af-8ce4c5696d67.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/085df0f5-b807-4bb0-88af-8ce4c5696d67.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/085df0f5-b807-4bb0-88af-8ce4c5696d67.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/086b0578-5ec7-48aa-ac91-434124fd33dd.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/086b0578-5ec7-48aa-ac91-434124fd33dd.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/086b0578-5ec7-48aa-ac91-434124fd33dd.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/086b0578-5ec7-48aa-ac91-434124fd33dd.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0872798e-6c3a-417b-84e6-0877d677b94c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0872798e-6c3a-417b-84e6-0877d677b94c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0872798e-6c3a-417b-84e6-0877d677b94c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0872798e-6c3a-417b-84e6-0877d677b94c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/087f108a-f9c9-41c7-9b68-ee32d908e758.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/087f108a-f9c9-41c7-9b68-ee32d908e758.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/087f108a-f9c9-41c7-9b68-ee32d908e758.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/087f108a-f9c9-41c7-9b68-ee32d908e758.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/08834cd9-39c0-4e22-a947-ee40b2ab3e9c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/08834cd9-39c0-4e22-a947-ee40b2ab3e9c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/08834cd9-39c0-4e22-a947-ee40b2ab3e9c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/08834cd9-39c0-4e22-a947-ee40b2ab3e9c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/08cf9ffe-490d-4a2d-83a2-ac2d857298f2.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/08cf9ffe-490d-4a2d-83a2-ac2d857298f2.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/08cf9ffe-490d-4a2d-83a2-ac2d857298f2.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/08cf9ffe-490d-4a2d-83a2-ac2d857298f2.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/08db2c78-4642-4154-ad8b-4339473ae7b8.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/08db2c78-4642-4154-ad8b-4339473ae7b8.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/08db2c78-4642-4154-ad8b-4339473ae7b8.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/08db2c78-4642-4154-ad8b-4339473ae7b8.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/08e56bb6-c2be-4247-a796-87b1ca053b7d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/08e56bb6-c2be-4247-a796-87b1ca053b7d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/08e56bb6-c2be-4247-a796-87b1ca053b7d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/08e56bb6-c2be-4247-a796-87b1ca053b7d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/08eadcb5-ec18-441a-867e-9b11ccd15a26.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/08eadcb5-ec18-441a-867e-9b11ccd15a26.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/08eadcb5-ec18-441a-867e-9b11ccd15a26.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/08eadcb5-ec18-441a-867e-9b11ccd15a26.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/08f6b3e7-a0c0-4902-8c8c-317b48ac01b9.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/08f6b3e7-a0c0-4902-8c8c-317b48ac01b9.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/08f6b3e7-a0c0-4902-8c8c-317b48ac01b9.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/08f6b3e7-a0c0-4902-8c8c-317b48ac01b9.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/08ffb885-f995-447c-a235-a4adb5072227.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/08ffb885-f995-447c-a235-a4adb5072227.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/08ffb885-f995-447c-a235-a4adb5072227.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/08ffb885-f995-447c-a235-a4adb5072227.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/09097539-dbdc-4d5e-8aae-01115bab4f0d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/09097539-dbdc-4d5e-8aae-01115bab4f0d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/09097539-dbdc-4d5e-8aae-01115bab4f0d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/09097539-dbdc-4d5e-8aae-01115bab4f0d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/09297ca7-b723-420f-9d11-0f0de9e7298e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/09297ca7-b723-420f-9d11-0f0de9e7298e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/09297ca7-b723-420f-9d11-0f0de9e7298e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/09297ca7-b723-420f-9d11-0f0de9e7298e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/092c2888-02ed-4a4b-98f3-b571d1f08020.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/092c2888-02ed-4a4b-98f3-b571d1f08020.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/092c2888-02ed-4a4b-98f3-b571d1f08020.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/092c2888-02ed-4a4b-98f3-b571d1f08020.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/096a7f79-56a9-4a18-8a1c-212fad805de7.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/096a7f79-56a9-4a18-8a1c-212fad805de7.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/096a7f79-56a9-4a18-8a1c-212fad805de7.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/096a7f79-56a9-4a18-8a1c-212fad805de7.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/09c1293e-5af5-43a4-8240-2b56915c9357.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/09c1293e-5af5-43a4-8240-2b56915c9357.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/09c1293e-5af5-43a4-8240-2b56915c9357.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/09c1293e-5af5-43a4-8240-2b56915c9357.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/09eff8b3-98a2-4c99-a312-7579c05bb4d0.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/09eff8b3-98a2-4c99-a312-7579c05bb4d0.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/09eff8b3-98a2-4c99-a312-7579c05bb4d0.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/09eff8b3-98a2-4c99-a312-7579c05bb4d0.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0a2905ef-b921-42be-a839-ecf52a6993a5.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0a2905ef-b921-42be-a839-ecf52a6993a5.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0a2905ef-b921-42be-a839-ecf52a6993a5.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0a2905ef-b921-42be-a839-ecf52a6993a5.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0a3140fd-52d5-475f-86e9-711a2900bd2c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0a3140fd-52d5-475f-86e9-711a2900bd2c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0a3140fd-52d5-475f-86e9-711a2900bd2c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0a3140fd-52d5-475f-86e9-711a2900bd2c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0a5410cb-3b71-472a-81da-e7aed87c4a9f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0a5410cb-3b71-472a-81da-e7aed87c4a9f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0a5410cb-3b71-472a-81da-e7aed87c4a9f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0a5410cb-3b71-472a-81da-e7aed87c4a9f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0a843d8c-f2c9-441a-a9ff-87c8380a6dd6.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0a843d8c-f2c9-441a-a9ff-87c8380a6dd6.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0a843d8c-f2c9-441a-a9ff-87c8380a6dd6.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0a843d8c-f2c9-441a-a9ff-87c8380a6dd6.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0ab4a412-b920-4282-aceb-d66fc2cbe927.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0ab4a412-b920-4282-aceb-d66fc2cbe927.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0ab4a412-b920-4282-aceb-d66fc2cbe927.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0ab4a412-b920-4282-aceb-d66fc2cbe927.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0b19da1e-a641-41b9-9cb3-3390debc1ccf.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0b19da1e-a641-41b9-9cb3-3390debc1ccf.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0b19da1e-a641-41b9-9cb3-3390debc1ccf.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0b19da1e-a641-41b9-9cb3-3390debc1ccf.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0b1c4ad1-abf2-4796-a25d-ac68732a6442.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0b1c4ad1-abf2-4796-a25d-ac68732a6442.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0b1c4ad1-abf2-4796-a25d-ac68732a6442.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0b1c4ad1-abf2-4796-a25d-ac68732a6442.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0b273323-a8eb-4590-8409-418bc245b011.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0b273323-a8eb-4590-8409-418bc245b011.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0b273323-a8eb-4590-8409-418bc245b011.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0b273323-a8eb-4590-8409-418bc245b011.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0b4be396-916a-4b22-a76a-15dfedaf3c5e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0b4be396-916a-4b22-a76a-15dfedaf3c5e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0b4be396-916a-4b22-a76a-15dfedaf3c5e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0b4be396-916a-4b22-a76a-15dfedaf3c5e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0b73f0bd-8f02-46af-9488-d05d05e48419.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0b73f0bd-8f02-46af-9488-d05d05e48419.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0b73f0bd-8f02-46af-9488-d05d05e48419.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0b73f0bd-8f02-46af-9488-d05d05e48419.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0b808a04-d1c0-492d-938d-efcc44167d31.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0b808a04-d1c0-492d-938d-efcc44167d31.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0b808a04-d1c0-492d-938d-efcc44167d31.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0b808a04-d1c0-492d-938d-efcc44167d31.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0bd0960c-0c34-473d-b076-2aa0c576c107.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0bd0960c-0c34-473d-b076-2aa0c576c107.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0bd0960c-0c34-473d-b076-2aa0c576c107.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0bd0960c-0c34-473d-b076-2aa0c576c107.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0bd8a2d9-daed-4c53-a542-884a860aea19.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0bd8a2d9-daed-4c53-a542-884a860aea19.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0bd8a2d9-daed-4c53-a542-884a860aea19.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0bd8a2d9-daed-4c53-a542-884a860aea19.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0be24535-8363-4e7a-a0f5-b76818433019.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0be24535-8363-4e7a-a0f5-b76818433019.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0be24535-8363-4e7a-a0f5-b76818433019.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0be24535-8363-4e7a-a0f5-b76818433019.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0bf7ecc7-3b9e-475f-8e8a-221d126ff321.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0bf7ecc7-3b9e-475f-8e8a-221d126ff321.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0bf7ecc7-3b9e-475f-8e8a-221d126ff321.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0bf7ecc7-3b9e-475f-8e8a-221d126ff321.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0c0bebba-370a-4289-b39f-07de6f609728.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0c0bebba-370a-4289-b39f-07de6f609728.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0c0bebba-370a-4289-b39f-07de6f609728.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0c0bebba-370a-4289-b39f-07de6f609728.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0c1b4650-3b94-45f7-a8c7-1dc6ecd0b5b1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0c1b4650-3b94-45f7-a8c7-1dc6ecd0b5b1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0c1b4650-3b94-45f7-a8c7-1dc6ecd0b5b1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0c1b4650-3b94-45f7-a8c7-1dc6ecd0b5b1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0c1e4f9e-9623-4b81-b57d-de65a35a10ac.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0c1e4f9e-9623-4b81-b57d-de65a35a10ac.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0c1e4f9e-9623-4b81-b57d-de65a35a10ac.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0c1e4f9e-9623-4b81-b57d-de65a35a10ac.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0ca3b7dc-83a6-4ea7-9dcc-176b6d16e87d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0ca3b7dc-83a6-4ea7-9dcc-176b6d16e87d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0ca3b7dc-83a6-4ea7-9dcc-176b6d16e87d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0ca3b7dc-83a6-4ea7-9dcc-176b6d16e87d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0ca6fc1a-b11b-4d83-8ada-db2933808d51.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0ca6fc1a-b11b-4d83-8ada-db2933808d51.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0ca6fc1a-b11b-4d83-8ada-db2933808d51.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0ca6fc1a-b11b-4d83-8ada-db2933808d51.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0cc92b06-bfe8-4d19-af8e-7a66112ac0b9.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0cc92b06-bfe8-4d19-af8e-7a66112ac0b9.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0cc92b06-bfe8-4d19-af8e-7a66112ac0b9.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0cc92b06-bfe8-4d19-af8e-7a66112ac0b9.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0cddbd15-37be-4b59-b2fc-7da266c6f9ff.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0cddbd15-37be-4b59-b2fc-7da266c6f9ff.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0cddbd15-37be-4b59-b2fc-7da266c6f9ff.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0cddbd15-37be-4b59-b2fc-7da266c6f9ff.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0cf9017b-1fdf-42f5-9749-8ddb575d541b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0cf9017b-1fdf-42f5-9749-8ddb575d541b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0cf9017b-1fdf-42f5-9749-8ddb575d541b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0cf9017b-1fdf-42f5-9749-8ddb575d541b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0d06528c-3bba-4412-b03e-2d8bf191a897.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0d06528c-3bba-4412-b03e-2d8bf191a897.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0d06528c-3bba-4412-b03e-2d8bf191a897.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0d06528c-3bba-4412-b03e-2d8bf191a897.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0d0c9a5a-0f97-4624-aaf8-56dda69ae22e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0d0c9a5a-0f97-4624-aaf8-56dda69ae22e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0d0c9a5a-0f97-4624-aaf8-56dda69ae22e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0d0c9a5a-0f97-4624-aaf8-56dda69ae22e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0d2c549f-8040-494d-b793-6b69772cbbeb.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0d2c549f-8040-494d-b793-6b69772cbbeb.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0d2c549f-8040-494d-b793-6b69772cbbeb.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0d2c549f-8040-494d-b793-6b69772cbbeb.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0d57adde-828f-477a-ad6f-3cef79041e43.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0d57adde-828f-477a-ad6f-3cef79041e43.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0d57adde-828f-477a-ad6f-3cef79041e43.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0d57adde-828f-477a-ad6f-3cef79041e43.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0d62b7d0-bfa2-4b4b-bb15-d4c36e3237c6.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0d62b7d0-bfa2-4b4b-bb15-d4c36e3237c6.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0d62b7d0-bfa2-4b4b-bb15-d4c36e3237c6.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0d62b7d0-bfa2-4b4b-bb15-d4c36e3237c6.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0d6c7d1d-377d-4225-93e9-1fe78033d2a5.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0d6c7d1d-377d-4225-93e9-1fe78033d2a5.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0d6c7d1d-377d-4225-93e9-1fe78033d2a5.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0d6c7d1d-377d-4225-93e9-1fe78033d2a5.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0d7519b6-94d1-430a-948e-9391f0167ce3.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0d7519b6-94d1-430a-948e-9391f0167ce3.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0d7519b6-94d1-430a-948e-9391f0167ce3.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0d7519b6-94d1-430a-948e-9391f0167ce3.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0d7a0068-f2a1-4cc0-b206-e64f0eb79e86.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0d7a0068-f2a1-4cc0-b206-e64f0eb79e86.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0d7a0068-f2a1-4cc0-b206-e64f0eb79e86.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0d7a0068-f2a1-4cc0-b206-e64f0eb79e86.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0d7ee36f-9b2d-466f-b6e8-b00effea6197.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0d7ee36f-9b2d-466f-b6e8-b00effea6197.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0d7ee36f-9b2d-466f-b6e8-b00effea6197.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0d7ee36f-9b2d-466f-b6e8-b00effea6197.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0d995de1-54d7-4a5b-8b2a-9aed4548c00d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0d995de1-54d7-4a5b-8b2a-9aed4548c00d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0d995de1-54d7-4a5b-8b2a-9aed4548c00d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0d995de1-54d7-4a5b-8b2a-9aed4548c00d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0d9f83e4-7ec7-41b2-ac0b-ea104e93e83f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0d9f83e4-7ec7-41b2-ac0b-ea104e93e83f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0d9f83e4-7ec7-41b2-ac0b-ea104e93e83f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0d9f83e4-7ec7-41b2-ac0b-ea104e93e83f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0dc1240d-ba6c-41bc-9de9-825989e6b15d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0dc1240d-ba6c-41bc-9de9-825989e6b15d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0dc1240d-ba6c-41bc-9de9-825989e6b15d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0dc1240d-ba6c-41bc-9de9-825989e6b15d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0dd3396d-e9a4-438f-977e-1f35337d9d21.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0dd3396d-e9a4-438f-977e-1f35337d9d21.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0dd3396d-e9a4-438f-977e-1f35337d9d21.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0dd3396d-e9a4-438f-977e-1f35337d9d21.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0de32a0f-bde6-49c6-96b1-ef1dd894d6f8.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0de32a0f-bde6-49c6-96b1-ef1dd894d6f8.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0de32a0f-bde6-49c6-96b1-ef1dd894d6f8.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0de32a0f-bde6-49c6-96b1-ef1dd894d6f8.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0df3fce6-d909-4141-9efb-a7f51bb36ada.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0df3fce6-d909-4141-9efb-a7f51bb36ada.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0df3fce6-d909-4141-9efb-a7f51bb36ada.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0df3fce6-d909-4141-9efb-a7f51bb36ada.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0df4a03d-070d-4051-a9ea-568c89d8f71a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0df4a03d-070d-4051-a9ea-568c89d8f71a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0df4a03d-070d-4051-a9ea-568c89d8f71a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0df4a03d-070d-4051-a9ea-568c89d8f71a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0e0afdc9-bd7c-4d15-b173-07fa787596f8.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0e0afdc9-bd7c-4d15-b173-07fa787596f8.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0e0afdc9-bd7c-4d15-b173-07fa787596f8.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0e0afdc9-bd7c-4d15-b173-07fa787596f8.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0e30f86f-ba18-4791-b7c8-81ca75c59c91.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0e30f86f-ba18-4791-b7c8-81ca75c59c91.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0e30f86f-ba18-4791-b7c8-81ca75c59c91.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0e30f86f-ba18-4791-b7c8-81ca75c59c91.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0eac8275-fdfd-47f9-a8dc-3c848a29912b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0eac8275-fdfd-47f9-a8dc-3c848a29912b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0eac8275-fdfd-47f9-a8dc-3c848a29912b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0eac8275-fdfd-47f9-a8dc-3c848a29912b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0ec0637a-4287-47e4-b317-cf795cd4beb0.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0ec0637a-4287-47e4-b317-cf795cd4beb0.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0ec0637a-4287-47e4-b317-cf795cd4beb0.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0ec0637a-4287-47e4-b317-cf795cd4beb0.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0f0f5554-8ba4-41bd-bb8d-6b2c642b0602.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0f0f5554-8ba4-41bd-bb8d-6b2c642b0602.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0f0f5554-8ba4-41bd-bb8d-6b2c642b0602.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0f0f5554-8ba4-41bd-bb8d-6b2c642b0602.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0f1383f5-3e3c-4afd-9b6e-42b98748e50b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0f1383f5-3e3c-4afd-9b6e-42b98748e50b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0f1383f5-3e3c-4afd-9b6e-42b98748e50b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0f1383f5-3e3c-4afd-9b6e-42b98748e50b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0f14da7d-685b-4fdd-be1d-80a8ef6b18d9.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0f14da7d-685b-4fdd-be1d-80a8ef6b18d9.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0f14da7d-685b-4fdd-be1d-80a8ef6b18d9.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0f14da7d-685b-4fdd-be1d-80a8ef6b18d9.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0f394840-040a-4592-8361-fd34fd8920dc.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0f394840-040a-4592-8361-fd34fd8920dc.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0f394840-040a-4592-8361-fd34fd8920dc.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0f394840-040a-4592-8361-fd34fd8920dc.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0f829b68-8610-46d6-adfa-a9612e6b1fdd.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0f829b68-8610-46d6-adfa-a9612e6b1fdd.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0f829b68-8610-46d6-adfa-a9612e6b1fdd.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0f829b68-8610-46d6-adfa-a9612e6b1fdd.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0f892456-2375-4032-86c5-a62e39cef333.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0f892456-2375-4032-86c5-a62e39cef333.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0f892456-2375-4032-86c5-a62e39cef333.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0f892456-2375-4032-86c5-a62e39cef333.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0f9388d3-e4be-49ad-8d5d-2101915b88e6.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0f9388d3-e4be-49ad-8d5d-2101915b88e6.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0f9388d3-e4be-49ad-8d5d-2101915b88e6.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0f9388d3-e4be-49ad-8d5d-2101915b88e6.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0f9dfd03-578b-4ca8-b29b-845295a9db1b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0f9dfd03-578b-4ca8-b29b-845295a9db1b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0f9dfd03-578b-4ca8-b29b-845295a9db1b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0f9dfd03-578b-4ca8-b29b-845295a9db1b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0fdc4bc6-d771-4220-a7c0-903d2d312509.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0fdc4bc6-d771-4220-a7c0-903d2d312509.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0fdc4bc6-d771-4220-a7c0-903d2d312509.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/0fdc4bc6-d771-4220-a7c0-903d2d312509.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/10085f58-abe4-426c-8937-ed557bc0e70f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/10085f58-abe4-426c-8937-ed557bc0e70f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/10085f58-abe4-426c-8937-ed557bc0e70f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/10085f58-abe4-426c-8937-ed557bc0e70f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/100a1ebc-e5b4-4386-b743-f040b9833fba.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/100a1ebc-e5b4-4386-b743-f040b9833fba.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/100a1ebc-e5b4-4386-b743-f040b9833fba.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/100a1ebc-e5b4-4386-b743-f040b9833fba.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/10414579-f013-4b11-830e-fed855cdae5d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/10414579-f013-4b11-830e-fed855cdae5d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/10414579-f013-4b11-830e-fed855cdae5d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/10414579-f013-4b11-830e-fed855cdae5d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/10441c3d-084d-4428-ae9e-14c542702c15.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/10441c3d-084d-4428-ae9e-14c542702c15.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/10441c3d-084d-4428-ae9e-14c542702c15.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/10441c3d-084d-4428-ae9e-14c542702c15.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1048e4f5-e345-45c5-8737-9b7c7625bd48.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1048e4f5-e345-45c5-8737-9b7c7625bd48.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1048e4f5-e345-45c5-8737-9b7c7625bd48.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1048e4f5-e345-45c5-8737-9b7c7625bd48.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/10533dfe-4808-4e21-96e9-495f0ad474df.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/10533dfe-4808-4e21-96e9-495f0ad474df.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/10533dfe-4808-4e21-96e9-495f0ad474df.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/10533dfe-4808-4e21-96e9-495f0ad474df.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/106f6be6-f6ef-436a-a387-f390c280200d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/106f6be6-f6ef-436a-a387-f390c280200d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/106f6be6-f6ef-436a-a387-f390c280200d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/106f6be6-f6ef-436a-a387-f390c280200d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/107c922a-1dcb-4359-947c-2bded6a02126.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/107c922a-1dcb-4359-947c-2bded6a02126.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/107c922a-1dcb-4359-947c-2bded6a02126.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/107c922a-1dcb-4359-947c-2bded6a02126.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/10ad6903-40ae-4238-849b-c92534c34174.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/10ad6903-40ae-4238-849b-c92534c34174.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/10ad6903-40ae-4238-849b-c92534c34174.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/10ad6903-40ae-4238-849b-c92534c34174.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/10c25e93-0140-42f4-836e-3a01c82bd9f8.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/10c25e93-0140-42f4-836e-3a01c82bd9f8.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/10c25e93-0140-42f4-836e-3a01c82bd9f8.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/10c25e93-0140-42f4-836e-3a01c82bd9f8.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/10cd301f-3a3e-4021-99ba-c437e9be5468.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/10cd301f-3a3e-4021-99ba-c437e9be5468.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/10cd301f-3a3e-4021-99ba-c437e9be5468.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/10cd301f-3a3e-4021-99ba-c437e9be5468.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/10d2bb18-d2fc-4b39-a7b0-293effaab9de.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/10d2bb18-d2fc-4b39-a7b0-293effaab9de.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/10d2bb18-d2fc-4b39-a7b0-293effaab9de.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/10d2bb18-d2fc-4b39-a7b0-293effaab9de.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/10d3916b-c30e-4280-8385-4c3221b55d6b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/10d3916b-c30e-4280-8385-4c3221b55d6b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/10d3916b-c30e-4280-8385-4c3221b55d6b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/10d3916b-c30e-4280-8385-4c3221b55d6b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/10e11698-fbca-42bd-a519-f7c5cabb3c50.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/10e11698-fbca-42bd-a519-f7c5cabb3c50.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/10e11698-fbca-42bd-a519-f7c5cabb3c50.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/10e11698-fbca-42bd-a519-f7c5cabb3c50.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/112de6df-1271-4f3e-9f02-eebbe8de010f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/112de6df-1271-4f3e-9f02-eebbe8de010f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/112de6df-1271-4f3e-9f02-eebbe8de010f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/112de6df-1271-4f3e-9f02-eebbe8de010f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/116820d3-9323-4550-bd4f-6ee389df4e15.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/116820d3-9323-4550-bd4f-6ee389df4e15.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/116820d3-9323-4550-bd4f-6ee389df4e15.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/116820d3-9323-4550-bd4f-6ee389df4e15.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1181ff81-2bf9-4726-858b-7bf156b5b4e8.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1181ff81-2bf9-4726-858b-7bf156b5b4e8.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1181ff81-2bf9-4726-858b-7bf156b5b4e8.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1181ff81-2bf9-4726-858b-7bf156b5b4e8.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1191925b-f93d-45c9-9027-5e884d76daa9.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1191925b-f93d-45c9-9027-5e884d76daa9.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1191925b-f93d-45c9-9027-5e884d76daa9.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1191925b-f93d-45c9-9027-5e884d76daa9.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/11944170-e5c8-4afa-a4b4-87d3702f7f85.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/11944170-e5c8-4afa-a4b4-87d3702f7f85.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/11944170-e5c8-4afa-a4b4-87d3702f7f85.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/11944170-e5c8-4afa-a4b4-87d3702f7f85.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/11b54438-b3a9-4c30-8b57-49c326c53b75.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/11b54438-b3a9-4c30-8b57-49c326c53b75.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/11b54438-b3a9-4c30-8b57-49c326c53b75.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/11b54438-b3a9-4c30-8b57-49c326c53b75.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/11c6cace-c34c-4611-982b-00d07c27717b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/11c6cace-c34c-4611-982b-00d07c27717b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/11c6cace-c34c-4611-982b-00d07c27717b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/11c6cace-c34c-4611-982b-00d07c27717b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1207a48e-e0d6-4ebf-9607-3e3459b04d05.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1207a48e-e0d6-4ebf-9607-3e3459b04d05.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1207a48e-e0d6-4ebf-9607-3e3459b04d05.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1207a48e-e0d6-4ebf-9607-3e3459b04d05.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/12211bfe-7693-46a6-b4dc-d904ec5f0ea9.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/12211bfe-7693-46a6-b4dc-d904ec5f0ea9.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/12211bfe-7693-46a6-b4dc-d904ec5f0ea9.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/12211bfe-7693-46a6-b4dc-d904ec5f0ea9.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/122e58ae-e7e0-4b5e-83bc-cb872fc8f7f7.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/122e58ae-e7e0-4b5e-83bc-cb872fc8f7f7.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/122e58ae-e7e0-4b5e-83bc-cb872fc8f7f7.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/122e58ae-e7e0-4b5e-83bc-cb872fc8f7f7.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/12458860-28f6-4f81-923c-821d41f7918b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/12458860-28f6-4f81-923c-821d41f7918b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/12458860-28f6-4f81-923c-821d41f7918b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/12458860-28f6-4f81-923c-821d41f7918b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1261c8c5-60ae-4742-a666-8e1c2690a7a2.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1261c8c5-60ae-4742-a666-8e1c2690a7a2.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1261c8c5-60ae-4742-a666-8e1c2690a7a2.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1261c8c5-60ae-4742-a666-8e1c2690a7a2.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/126455fc-208b-405e-b02c-f8f9d4702f43.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/126455fc-208b-405e-b02c-f8f9d4702f43.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/126455fc-208b-405e-b02c-f8f9d4702f43.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/126455fc-208b-405e-b02c-f8f9d4702f43.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1266ae34-ed5b-4c96-bf3a-92dc3222f0dc.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1266ae34-ed5b-4c96-bf3a-92dc3222f0dc.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1266ae34-ed5b-4c96-bf3a-92dc3222f0dc.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1266ae34-ed5b-4c96-bf3a-92dc3222f0dc.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/12724870-de30-43c7-9941-acd4059cc52e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/12724870-de30-43c7-9941-acd4059cc52e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/12724870-de30-43c7-9941-acd4059cc52e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/12724870-de30-43c7-9941-acd4059cc52e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/127b6846-5578-4393-afe3-9ae9f7c1330c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/127b6846-5578-4393-afe3-9ae9f7c1330c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/127b6846-5578-4393-afe3-9ae9f7c1330c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/127b6846-5578-4393-afe3-9ae9f7c1330c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/129411aa-9e18-44a2-bb7d-e187d160b009.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/129411aa-9e18-44a2-bb7d-e187d160b009.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/129411aa-9e18-44a2-bb7d-e187d160b009.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/129411aa-9e18-44a2-bb7d-e187d160b009.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/12c6a177-009f-4c87-ac1b-68ac46a4ff13.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/12c6a177-009f-4c87-ac1b-68ac46a4ff13.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/12c6a177-009f-4c87-ac1b-68ac46a4ff13.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/12c6a177-009f-4c87-ac1b-68ac46a4ff13.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/12cdb5e1-b5bc-4d53-980c-2b2f07e996c3.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/12cdb5e1-b5bc-4d53-980c-2b2f07e996c3.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/12cdb5e1-b5bc-4d53-980c-2b2f07e996c3.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/12cdb5e1-b5bc-4d53-980c-2b2f07e996c3.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/12d59278-aa8d-47c6-82fb-8d531f4cc983.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/12d59278-aa8d-47c6-82fb-8d531f4cc983.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/12d59278-aa8d-47c6-82fb-8d531f4cc983.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/12d59278-aa8d-47c6-82fb-8d531f4cc983.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/12e0ec42-8192-46f0-a26d-babb28c64910.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/12e0ec42-8192-46f0-a26d-babb28c64910.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/12e0ec42-8192-46f0-a26d-babb28c64910.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/12e0ec42-8192-46f0-a26d-babb28c64910.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/12e3d8ac-c871-43ec-95e1-624659332761.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/12e3d8ac-c871-43ec-95e1-624659332761.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/12e3d8ac-c871-43ec-95e1-624659332761.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/12e3d8ac-c871-43ec-95e1-624659332761.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/12f99b1b-503d-4156-81f6-d85d1e921948.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/12f99b1b-503d-4156-81f6-d85d1e921948.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/12f99b1b-503d-4156-81f6-d85d1e921948.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/12f99b1b-503d-4156-81f6-d85d1e921948.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/133bf5e2-7e4e-4ac0-b698-7cfa1916f8e1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/133bf5e2-7e4e-4ac0-b698-7cfa1916f8e1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/133bf5e2-7e4e-4ac0-b698-7cfa1916f8e1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/133bf5e2-7e4e-4ac0-b698-7cfa1916f8e1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/134b69f3-6512-4ead-81b8-f0701c9519c7.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/134b69f3-6512-4ead-81b8-f0701c9519c7.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/134b69f3-6512-4ead-81b8-f0701c9519c7.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/134b69f3-6512-4ead-81b8-f0701c9519c7.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1373fe02-0e8f-41f9-a13c-aa0c32c58abb.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1373fe02-0e8f-41f9-a13c-aa0c32c58abb.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1373fe02-0e8f-41f9-a13c-aa0c32c58abb.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1373fe02-0e8f-41f9-a13c-aa0c32c58abb.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/13a565d5-01f7-47e3-9a9e-58d0563c802c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/13a565d5-01f7-47e3-9a9e-58d0563c802c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/13a565d5-01f7-47e3-9a9e-58d0563c802c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/13a565d5-01f7-47e3-9a9e-58d0563c802c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/13e251b5-30eb-47b0-8cbc-1361bd9cac9a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/13e251b5-30eb-47b0-8cbc-1361bd9cac9a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/13e251b5-30eb-47b0-8cbc-1361bd9cac9a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/13e251b5-30eb-47b0-8cbc-1361bd9cac9a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/13f57206-17e7-446d-b79f-fc8b40d2760b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/13f57206-17e7-446d-b79f-fc8b40d2760b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/13f57206-17e7-446d-b79f-fc8b40d2760b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/13f57206-17e7-446d-b79f-fc8b40d2760b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1405b28d-9229-43eb-bacb-7848991713e9.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1405b28d-9229-43eb-bacb-7848991713e9.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1405b28d-9229-43eb-bacb-7848991713e9.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1405b28d-9229-43eb-bacb-7848991713e9.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/14091a5b-421e-4dbc-9a2d-242ab487089a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/14091a5b-421e-4dbc-9a2d-242ab487089a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/14091a5b-421e-4dbc-9a2d-242ab487089a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/14091a5b-421e-4dbc-9a2d-242ab487089a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/14276910-c68a-4201-94f4-cc605af28adf.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/14276910-c68a-4201-94f4-cc605af28adf.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/14276910-c68a-4201-94f4-cc605af28adf.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/14276910-c68a-4201-94f4-cc605af28adf.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/143f3013-3a1a-4850-9d81-15a1a4d67075.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/143f3013-3a1a-4850-9d81-15a1a4d67075.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/143f3013-3a1a-4850-9d81-15a1a4d67075.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/143f3013-3a1a-4850-9d81-15a1a4d67075.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/144f1d73-e07a-4994-9459-f4092c08cb16.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/144f1d73-e07a-4994-9459-f4092c08cb16.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/144f1d73-e07a-4994-9459-f4092c08cb16.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/144f1d73-e07a-4994-9459-f4092c08cb16.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1474fd42-f867-4891-ae38-6395e0b2dcff.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1474fd42-f867-4891-ae38-6395e0b2dcff.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1474fd42-f867-4891-ae38-6395e0b2dcff.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1474fd42-f867-4891-ae38-6395e0b2dcff.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/147e7762-5a23-4f72-bb1f-f08e1c10b1b0.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/147e7762-5a23-4f72-bb1f-f08e1c10b1b0.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/147e7762-5a23-4f72-bb1f-f08e1c10b1b0.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/147e7762-5a23-4f72-bb1f-f08e1c10b1b0.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/147e903b-6c0d-4df8-9927-0d242cd5c72e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/147e903b-6c0d-4df8-9927-0d242cd5c72e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/147e903b-6c0d-4df8-9927-0d242cd5c72e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/147e903b-6c0d-4df8-9927-0d242cd5c72e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1498846b-668a-4a08-aac5-337402c19ead.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1498846b-668a-4a08-aac5-337402c19ead.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1498846b-668a-4a08-aac5-337402c19ead.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1498846b-668a-4a08-aac5-337402c19ead.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/14bbaa88-21c8-4969-8d39-77d823268bc5.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/14bbaa88-21c8-4969-8d39-77d823268bc5.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/14bbaa88-21c8-4969-8d39-77d823268bc5.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/14bbaa88-21c8-4969-8d39-77d823268bc5.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/14e0599c-5cdd-4b95-9ff1-47d4ce1691cb.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/14e0599c-5cdd-4b95-9ff1-47d4ce1691cb.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/14e0599c-5cdd-4b95-9ff1-47d4ce1691cb.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/14e0599c-5cdd-4b95-9ff1-47d4ce1691cb.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/14e2390f-189c-4e68-974e-56c9421a7a72.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/14e2390f-189c-4e68-974e-56c9421a7a72.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/14e2390f-189c-4e68-974e-56c9421a7a72.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/14e2390f-189c-4e68-974e-56c9421a7a72.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/14e50c4d-634a-416d-9677-fa8ad2b4d2a3.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/14e50c4d-634a-416d-9677-fa8ad2b4d2a3.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/14e50c4d-634a-416d-9677-fa8ad2b4d2a3.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/14e50c4d-634a-416d-9677-fa8ad2b4d2a3.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/15130a97-7e7d-43cd-abd5-d289eda65921.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/15130a97-7e7d-43cd-abd5-d289eda65921.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/15130a97-7e7d-43cd-abd5-d289eda65921.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/15130a97-7e7d-43cd-abd5-d289eda65921.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/15187fba-56ec-4d5f-931b-a933941355e2.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/15187fba-56ec-4d5f-931b-a933941355e2.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/15187fba-56ec-4d5f-931b-a933941355e2.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/15187fba-56ec-4d5f-931b-a933941355e2.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1530d842-2c53-49c9-b207-eea165b340ce.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1530d842-2c53-49c9-b207-eea165b340ce.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1530d842-2c53-49c9-b207-eea165b340ce.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1530d842-2c53-49c9-b207-eea165b340ce.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/15ee36ff-6d21-43e4-b89f-aa776980fd5f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/15ee36ff-6d21-43e4-b89f-aa776980fd5f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/15ee36ff-6d21-43e4-b89f-aa776980fd5f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/15ee36ff-6d21-43e4-b89f-aa776980fd5f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/15f6d5e1-591f-481c-99b7-71b9e4928204.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/15f6d5e1-591f-481c-99b7-71b9e4928204.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/15f6d5e1-591f-481c-99b7-71b9e4928204.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/15f6d5e1-591f-481c-99b7-71b9e4928204.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1628e329-2b36-4533-b974-f6e191898d67.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1628e329-2b36-4533-b974-f6e191898d67.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1628e329-2b36-4533-b974-f6e191898d67.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1628e329-2b36-4533-b974-f6e191898d67.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/165250d7-d0f8-475a-bf9c-fc87ab935b49.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/165250d7-d0f8-475a-bf9c-fc87ab935b49.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/165250d7-d0f8-475a-bf9c-fc87ab935b49.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/165250d7-d0f8-475a-bf9c-fc87ab935b49.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/167941d3-6d52-46be-89b7-2ae3b2844f7e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/167941d3-6d52-46be-89b7-2ae3b2844f7e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/167941d3-6d52-46be-89b7-2ae3b2844f7e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/167941d3-6d52-46be-89b7-2ae3b2844f7e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/167ecdc0-0527-447c-8275-20ebcad2f437.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/167ecdc0-0527-447c-8275-20ebcad2f437.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/167ecdc0-0527-447c-8275-20ebcad2f437.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/167ecdc0-0527-447c-8275-20ebcad2f437.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/16a369a1-90b5-4e20-8dc2-86a728fbe257.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/16a369a1-90b5-4e20-8dc2-86a728fbe257.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/16a369a1-90b5-4e20-8dc2-86a728fbe257.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/16a369a1-90b5-4e20-8dc2-86a728fbe257.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/16aa4cef-9420-4278-97f7-e0d02fbdda1e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/16aa4cef-9420-4278-97f7-e0d02fbdda1e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/16aa4cef-9420-4278-97f7-e0d02fbdda1e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/16aa4cef-9420-4278-97f7-e0d02fbdda1e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/16c691db-b66b-49a9-b33c-1b98f5eef1a3.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/16c691db-b66b-49a9-b33c-1b98f5eef1a3.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/16c691db-b66b-49a9-b33c-1b98f5eef1a3.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/16c691db-b66b-49a9-b33c-1b98f5eef1a3.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/16e9055b-1594-4628-8218-21da4a74888d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/16e9055b-1594-4628-8218-21da4a74888d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/16e9055b-1594-4628-8218-21da4a74888d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/16e9055b-1594-4628-8218-21da4a74888d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/172a6122-a1c2-4db7-9dda-10b3091f6917.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/172a6122-a1c2-4db7-9dda-10b3091f6917.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/172a6122-a1c2-4db7-9dda-10b3091f6917.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/172a6122-a1c2-4db7-9dda-10b3091f6917.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1756b1ed-7c3f-458d-bf94-ae41d473c2c2.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1756b1ed-7c3f-458d-bf94-ae41d473c2c2.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1756b1ed-7c3f-458d-bf94-ae41d473c2c2.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1756b1ed-7c3f-458d-bf94-ae41d473c2c2.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1761f7fe-0732-4f2a-b1cf-c5db7f1afe08.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1761f7fe-0732-4f2a-b1cf-c5db7f1afe08.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1761f7fe-0732-4f2a-b1cf-c5db7f1afe08.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1761f7fe-0732-4f2a-b1cf-c5db7f1afe08.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/177fbd70-13b6-4991-b8fe-c89d42d0ba71.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/177fbd70-13b6-4991-b8fe-c89d42d0ba71.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/177fbd70-13b6-4991-b8fe-c89d42d0ba71.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/177fbd70-13b6-4991-b8fe-c89d42d0ba71.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/17d4b6f5-6639-49ec-96e3-eb569f320c50.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/17d4b6f5-6639-49ec-96e3-eb569f320c50.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/17d4b6f5-6639-49ec-96e3-eb569f320c50.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/17d4b6f5-6639-49ec-96e3-eb569f320c50.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/17e6aad5-08ba-436c-a20e-7ed202c19ef4.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/17e6aad5-08ba-436c-a20e-7ed202c19ef4.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/17e6aad5-08ba-436c-a20e-7ed202c19ef4.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/17e6aad5-08ba-436c-a20e-7ed202c19ef4.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/181728d6-872a-46d9-b1d2-f84dd91b388c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/181728d6-872a-46d9-b1d2-f84dd91b388c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/181728d6-872a-46d9-b1d2-f84dd91b388c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/181728d6-872a-46d9-b1d2-f84dd91b388c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/184767ec-1af0-46ee-910a-69ebaf9c7667.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/184767ec-1af0-46ee-910a-69ebaf9c7667.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/184767ec-1af0-46ee-910a-69ebaf9c7667.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/184767ec-1af0-46ee-910a-69ebaf9c7667.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/184ec664-e51a-426e-9758-c31111028184.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/184ec664-e51a-426e-9758-c31111028184.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/184ec664-e51a-426e-9758-c31111028184.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/184ec664-e51a-426e-9758-c31111028184.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1869bba1-282c-4236-b993-3536e144f844.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1869bba1-282c-4236-b993-3536e144f844.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1869bba1-282c-4236-b993-3536e144f844.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1869bba1-282c-4236-b993-3536e144f844.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1877ddd5-a071-4772-be94-140e0039f649.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1877ddd5-a071-4772-be94-140e0039f649.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1877ddd5-a071-4772-be94-140e0039f649.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1877ddd5-a071-4772-be94-140e0039f649.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1879c567-2ac3-4ae8-8c2a-3f744e784a7a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1879c567-2ac3-4ae8-8c2a-3f744e784a7a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1879c567-2ac3-4ae8-8c2a-3f744e784a7a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1879c567-2ac3-4ae8-8c2a-3f744e784a7a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/187b60b1-f65e-42dc-bd5f-d842629b1539.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/187b60b1-f65e-42dc-bd5f-d842629b1539.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/187b60b1-f65e-42dc-bd5f-d842629b1539.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/187b60b1-f65e-42dc-bd5f-d842629b1539.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/18a2b95b-9be4-4ad4-a12b-693e9aa4df15.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/18a2b95b-9be4-4ad4-a12b-693e9aa4df15.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/18a2b95b-9be4-4ad4-a12b-693e9aa4df15.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/18a2b95b-9be4-4ad4-a12b-693e9aa4df15.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/18a6a1cd-8091-481c-a427-00426345315b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/18a6a1cd-8091-481c-a427-00426345315b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/18a6a1cd-8091-481c-a427-00426345315b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/18a6a1cd-8091-481c-a427-00426345315b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/18c16533-62f5-420c-a51a-5a83a66b1de3.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/18c16533-62f5-420c-a51a-5a83a66b1de3.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/18c16533-62f5-420c-a51a-5a83a66b1de3.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/18c16533-62f5-420c-a51a-5a83a66b1de3.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/18c1ef71-d743-4604-a32a-09f3122edb00.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/18c1ef71-d743-4604-a32a-09f3122edb00.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/18c1ef71-d743-4604-a32a-09f3122edb00.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/18c1ef71-d743-4604-a32a-09f3122edb00.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/18d14079-bd52-4bed-8fc2-02e4ebdf3fde.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/18d14079-bd52-4bed-8fc2-02e4ebdf3fde.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/18d14079-bd52-4bed-8fc2-02e4ebdf3fde.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/18d14079-bd52-4bed-8fc2-02e4ebdf3fde.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/191003d2-caa7-4ec7-9380-e19ac3c236ac.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/191003d2-caa7-4ec7-9380-e19ac3c236ac.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/191003d2-caa7-4ec7-9380-e19ac3c236ac.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/191003d2-caa7-4ec7-9380-e19ac3c236ac.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/191a3a83-e8c4-4487-87c9-e575f1f53929.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/191a3a83-e8c4-4487-87c9-e575f1f53929.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/191a3a83-e8c4-4487-87c9-e575f1f53929.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/191a3a83-e8c4-4487-87c9-e575f1f53929.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/191f5973-0f0c-413f-9d6e-70fb399ef126.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/191f5973-0f0c-413f-9d6e-70fb399ef126.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/191f5973-0f0c-413f-9d6e-70fb399ef126.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/191f5973-0f0c-413f-9d6e-70fb399ef126.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/19230be2-3cbe-4217-aae5-50ae4acc8a94.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/19230be2-3cbe-4217-aae5-50ae4acc8a94.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/19230be2-3cbe-4217-aae5-50ae4acc8a94.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/19230be2-3cbe-4217-aae5-50ae4acc8a94.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/19806658-e817-43c6-b1e5-f78626aaa7fb.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/19806658-e817-43c6-b1e5-f78626aaa7fb.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/19806658-e817-43c6-b1e5-f78626aaa7fb.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/19806658-e817-43c6-b1e5-f78626aaa7fb.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/198caf4e-a556-463e-9da1-f11a01c70306.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/198caf4e-a556-463e-9da1-f11a01c70306.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/198caf4e-a556-463e-9da1-f11a01c70306.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/198caf4e-a556-463e-9da1-f11a01c70306.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/198e99f3-263a-4e35-a273-7afe80920ed3.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/198e99f3-263a-4e35-a273-7afe80920ed3.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/198e99f3-263a-4e35-a273-7afe80920ed3.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/198e99f3-263a-4e35-a273-7afe80920ed3.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/198f4cdd-aa79-4556-b8d6-ea28634a6ace.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/198f4cdd-aa79-4556-b8d6-ea28634a6ace.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/198f4cdd-aa79-4556-b8d6-ea28634a6ace.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/198f4cdd-aa79-4556-b8d6-ea28634a6ace.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/19a38c94-fed1-4bb8-a1c4-73c7163a1578.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/19a38c94-fed1-4bb8-a1c4-73c7163a1578.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/19a38c94-fed1-4bb8-a1c4-73c7163a1578.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/19a38c94-fed1-4bb8-a1c4-73c7163a1578.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/19ae0117-8e3b-4aa1-b586-e26645214f61.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/19ae0117-8e3b-4aa1-b586-e26645214f61.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/19ae0117-8e3b-4aa1-b586-e26645214f61.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/19ae0117-8e3b-4aa1-b586-e26645214f61.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/19d3ce2a-2f09-436f-8333-afb6849c8000.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/19d3ce2a-2f09-436f-8333-afb6849c8000.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/19d3ce2a-2f09-436f-8333-afb6849c8000.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/19d3ce2a-2f09-436f-8333-afb6849c8000.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/19d487d0-ad86-424c-9871-075679fd2a65.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/19d487d0-ad86-424c-9871-075679fd2a65.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/19d487d0-ad86-424c-9871-075679fd2a65.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/19d487d0-ad86-424c-9871-075679fd2a65.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/19f079b3-bd75-48d2-8e93-5a3ec836b510.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/19f079b3-bd75-48d2-8e93-5a3ec836b510.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/19f079b3-bd75-48d2-8e93-5a3ec836b510.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/19f079b3-bd75-48d2-8e93-5a3ec836b510.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1a1717f4-f166-49b5-835b-c58283812850.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1a1717f4-f166-49b5-835b-c58283812850.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1a1717f4-f166-49b5-835b-c58283812850.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1a1717f4-f166-49b5-835b-c58283812850.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1a1d8c0b-63bd-4fc5-bcae-4ebaaa204f26.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1a1d8c0b-63bd-4fc5-bcae-4ebaaa204f26.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1a1d8c0b-63bd-4fc5-bcae-4ebaaa204f26.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1a1d8c0b-63bd-4fc5-bcae-4ebaaa204f26.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1a22c4ea-85dd-4c64-afc2-d137a6efbc9b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1a22c4ea-85dd-4c64-afc2-d137a6efbc9b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1a22c4ea-85dd-4c64-afc2-d137a6efbc9b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1a22c4ea-85dd-4c64-afc2-d137a6efbc9b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1a397f94-c143-4f50-8610-47958fe68444.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1a397f94-c143-4f50-8610-47958fe68444.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1a397f94-c143-4f50-8610-47958fe68444.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1a397f94-c143-4f50-8610-47958fe68444.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1a43c0b0-3336-49ea-a171-8031910ca9e5.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1a43c0b0-3336-49ea-a171-8031910ca9e5.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1a43c0b0-3336-49ea-a171-8031910ca9e5.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1a43c0b0-3336-49ea-a171-8031910ca9e5.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1a5374b1-f6e6-4301-8a87-40e6c11e074a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1a5374b1-f6e6-4301-8a87-40e6c11e074a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1a5374b1-f6e6-4301-8a87-40e6c11e074a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1a5374b1-f6e6-4301-8a87-40e6c11e074a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1abaf931-2891-4891-818d-1bab6826f73f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1abaf931-2891-4891-818d-1bab6826f73f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1abaf931-2891-4891-818d-1bab6826f73f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1abaf931-2891-4891-818d-1bab6826f73f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1aeb34d4-5e36-44df-b893-94cc92b0925e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1aeb34d4-5e36-44df-b893-94cc92b0925e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1aeb34d4-5e36-44df-b893-94cc92b0925e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1aeb34d4-5e36-44df-b893-94cc92b0925e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1af2f3ae-e6aa-476f-b927-04c15da2d849.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1af2f3ae-e6aa-476f-b927-04c15da2d849.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1af2f3ae-e6aa-476f-b927-04c15da2d849.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1af2f3ae-e6aa-476f-b927-04c15da2d849.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1b0e4eb2-d493-4895-932e-fa735226ea57.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1b0e4eb2-d493-4895-932e-fa735226ea57.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1b0e4eb2-d493-4895-932e-fa735226ea57.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1b0e4eb2-d493-4895-932e-fa735226ea57.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1b1dcb1e-d3a5-4dbc-b2de-60c6db246b13.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1b1dcb1e-d3a5-4dbc-b2de-60c6db246b13.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1b1dcb1e-d3a5-4dbc-b2de-60c6db246b13.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1b1dcb1e-d3a5-4dbc-b2de-60c6db246b13.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1b5d5bef-b264-49fb-9454-5ea333b1119c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1b5d5bef-b264-49fb-9454-5ea333b1119c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1b5d5bef-b264-49fb-9454-5ea333b1119c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1b5d5bef-b264-49fb-9454-5ea333b1119c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1b7d2f17-5da2-42c3-b02e-2b632b820408.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1b7d2f17-5da2-42c3-b02e-2b632b820408.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1b7d2f17-5da2-42c3-b02e-2b632b820408.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1b7d2f17-5da2-42c3-b02e-2b632b820408.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1bb4e0aa-7ddf-421e-b7df-06967ab69ddc.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1bb4e0aa-7ddf-421e-b7df-06967ab69ddc.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1bb4e0aa-7ddf-421e-b7df-06967ab69ddc.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1bb4e0aa-7ddf-421e-b7df-06967ab69ddc.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1bc39469-ee3d-4b89-a711-c2809bcdbfdf.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1bc39469-ee3d-4b89-a711-c2809bcdbfdf.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1bc39469-ee3d-4b89-a711-c2809bcdbfdf.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1bc39469-ee3d-4b89-a711-c2809bcdbfdf.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1be315dc-a0f1-4973-8686-58adc59cac54.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1be315dc-a0f1-4973-8686-58adc59cac54.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1be315dc-a0f1-4973-8686-58adc59cac54.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1be315dc-a0f1-4973-8686-58adc59cac54.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1bfa85c3-4266-4317-a28b-7413e709b154.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1bfa85c3-4266-4317-a28b-7413e709b154.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1bfa85c3-4266-4317-a28b-7413e709b154.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1bfa85c3-4266-4317-a28b-7413e709b154.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1c31d978-a724-40b0-b284-1ebb610be372.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1c31d978-a724-40b0-b284-1ebb610be372.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1c31d978-a724-40b0-b284-1ebb610be372.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1c31d978-a724-40b0-b284-1ebb610be372.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1c50c668-5e14-43af-81a1-30cc24e55c67.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1c50c668-5e14-43af-81a1-30cc24e55c67.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1c50c668-5e14-43af-81a1-30cc24e55c67.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1c50c668-5e14-43af-81a1-30cc24e55c67.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1c87e3e0-3eab-4020-b2cb-22c6876658f7.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1c87e3e0-3eab-4020-b2cb-22c6876658f7.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1c87e3e0-3eab-4020-b2cb-22c6876658f7.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1c87e3e0-3eab-4020-b2cb-22c6876658f7.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1c8e8594-fa8e-43ca-81c7-555d001388a6.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1c8e8594-fa8e-43ca-81c7-555d001388a6.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1c8e8594-fa8e-43ca-81c7-555d001388a6.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1c8e8594-fa8e-43ca-81c7-555d001388a6.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1d16cb94-19a6-4560-acce-498ca700a49d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1d16cb94-19a6-4560-acce-498ca700a49d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1d16cb94-19a6-4560-acce-498ca700a49d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1d16cb94-19a6-4560-acce-498ca700a49d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1d5df0dc-b044-407f-a3b3-222303be2033.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1d5df0dc-b044-407f-a3b3-222303be2033.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1d5df0dc-b044-407f-a3b3-222303be2033.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1d5df0dc-b044-407f-a3b3-222303be2033.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1d5ed53d-20d8-407a-9563-a1755ca489ad.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1d5ed53d-20d8-407a-9563-a1755ca489ad.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1d5ed53d-20d8-407a-9563-a1755ca489ad.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1d5ed53d-20d8-407a-9563-a1755ca489ad.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1d7ff19e-1249-4700-8e97-36d72e887e2e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1d7ff19e-1249-4700-8e97-36d72e887e2e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1d7ff19e-1249-4700-8e97-36d72e887e2e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1d7ff19e-1249-4700-8e97-36d72e887e2e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1d8cb900-f8dc-47d6-9e22-5767982bcbad.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1d8cb900-f8dc-47d6-9e22-5767982bcbad.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1d8cb900-f8dc-47d6-9e22-5767982bcbad.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1d8cb900-f8dc-47d6-9e22-5767982bcbad.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1dc37223-1593-43c4-8b99-95c69fec2183.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1dc37223-1593-43c4-8b99-95c69fec2183.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1dc37223-1593-43c4-8b99-95c69fec2183.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1dc37223-1593-43c4-8b99-95c69fec2183.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1df051af-9300-46ae-8bde-4c1f37a34065.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1df051af-9300-46ae-8bde-4c1f37a34065.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1df051af-9300-46ae-8bde-4c1f37a34065.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1df051af-9300-46ae-8bde-4c1f37a34065.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1e2bc857-df43-49a0-b723-1d32d4da0c3d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1e2bc857-df43-49a0-b723-1d32d4da0c3d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1e2bc857-df43-49a0-b723-1d32d4da0c3d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1e2bc857-df43-49a0-b723-1d32d4da0c3d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1ec218ef-2982-4596-8b5d-4af0f940cde3.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1ec218ef-2982-4596-8b5d-4af0f940cde3.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1ec218ef-2982-4596-8b5d-4af0f940cde3.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1ec218ef-2982-4596-8b5d-4af0f940cde3.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1edc1f68-bc8f-4e9e-b3cb-d60902da7c7c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1edc1f68-bc8f-4e9e-b3cb-d60902da7c7c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1edc1f68-bc8f-4e9e-b3cb-d60902da7c7c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1edc1f68-bc8f-4e9e-b3cb-d60902da7c7c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1edccfed-b1af-4f7b-aaf9-44dc0d5b51bc.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1edccfed-b1af-4f7b-aaf9-44dc0d5b51bc.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1edccfed-b1af-4f7b-aaf9-44dc0d5b51bc.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1edccfed-b1af-4f7b-aaf9-44dc0d5b51bc.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1ee11837-825e-43eb-b21e-b849bea54cd4.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1ee11837-825e-43eb-b21e-b849bea54cd4.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1ee11837-825e-43eb-b21e-b849bea54cd4.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1ee11837-825e-43eb-b21e-b849bea54cd4.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1f05c853-1f6c-4b48-b38a-5ec355876b64.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1f05c853-1f6c-4b48-b38a-5ec355876b64.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1f05c853-1f6c-4b48-b38a-5ec355876b64.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1f05c853-1f6c-4b48-b38a-5ec355876b64.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1f1131cb-1a47-4525-b7c9-e9e052fa55c9.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1f1131cb-1a47-4525-b7c9-e9e052fa55c9.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1f1131cb-1a47-4525-b7c9-e9e052fa55c9.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1f1131cb-1a47-4525-b7c9-e9e052fa55c9.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1f5f77e2-2406-4bd5-98b5-23c9c9e8ec92.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1f5f77e2-2406-4bd5-98b5-23c9c9e8ec92.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1f5f77e2-2406-4bd5-98b5-23c9c9e8ec92.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1f5f77e2-2406-4bd5-98b5-23c9c9e8ec92.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1f7237b0-588c-4414-96f6-45ee7f421960.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1f7237b0-588c-4414-96f6-45ee7f421960.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1f7237b0-588c-4414-96f6-45ee7f421960.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1f7237b0-588c-4414-96f6-45ee7f421960.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1f743c22-f2bd-46f6-b408-9001e96674ba.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1f743c22-f2bd-46f6-b408-9001e96674ba.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1f743c22-f2bd-46f6-b408-9001e96674ba.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1f743c22-f2bd-46f6-b408-9001e96674ba.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1f86a4bc-7f8c-4270-a273-ccd801463359.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1f86a4bc-7f8c-4270-a273-ccd801463359.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1f86a4bc-7f8c-4270-a273-ccd801463359.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1f86a4bc-7f8c-4270-a273-ccd801463359.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1f9879fa-94dc-4e8c-a4ea-59158ce9b85a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1f9879fa-94dc-4e8c-a4ea-59158ce9b85a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1f9879fa-94dc-4e8c-a4ea-59158ce9b85a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1f9879fa-94dc-4e8c-a4ea-59158ce9b85a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1fccb2ec-2b1a-4257-8d0d-00429d6fe5a4.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1fccb2ec-2b1a-4257-8d0d-00429d6fe5a4.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1fccb2ec-2b1a-4257-8d0d-00429d6fe5a4.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1fccb2ec-2b1a-4257-8d0d-00429d6fe5a4.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1ff8f494-63d7-41bb-bbc7-c9f9733637ed.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1ff8f494-63d7-41bb-bbc7-c9f9733637ed.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1ff8f494-63d7-41bb-bbc7-c9f9733637ed.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/1ff8f494-63d7-41bb-bbc7-c9f9733637ed.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/200a062f-a546-43c9-9e79-7ee1a4705d54.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/200a062f-a546-43c9-9e79-7ee1a4705d54.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/200a062f-a546-43c9-9e79-7ee1a4705d54.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/200a062f-a546-43c9-9e79-7ee1a4705d54.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/201abc48-c681-424e-80ff-1a9ba0cbc6dd.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/201abc48-c681-424e-80ff-1a9ba0cbc6dd.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/201abc48-c681-424e-80ff-1a9ba0cbc6dd.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/201abc48-c681-424e-80ff-1a9ba0cbc6dd.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/202b510c-8e0d-4332-9262-78e577507684.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/202b510c-8e0d-4332-9262-78e577507684.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/202b510c-8e0d-4332-9262-78e577507684.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/202b510c-8e0d-4332-9262-78e577507684.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/202d6be7-73e1-4b4c-af70-eb6b7aa4979f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/202d6be7-73e1-4b4c-af70-eb6b7aa4979f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/202d6be7-73e1-4b4c-af70-eb6b7aa4979f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/202d6be7-73e1-4b4c-af70-eb6b7aa4979f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2057ac37-41f2-40f7-a5d4-c0fae9517bb3.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2057ac37-41f2-40f7-a5d4-c0fae9517bb3.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2057ac37-41f2-40f7-a5d4-c0fae9517bb3.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2057ac37-41f2-40f7-a5d4-c0fae9517bb3.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/20627efb-ccab-4dee-812a-eff1f5a74454.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/20627efb-ccab-4dee-812a-eff1f5a74454.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/20627efb-ccab-4dee-812a-eff1f5a74454.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/20627efb-ccab-4dee-812a-eff1f5a74454.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/208071c6-d715-4119-8af3-c11b7bec3109.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/208071c6-d715-4119-8af3-c11b7bec3109.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/208071c6-d715-4119-8af3-c11b7bec3109.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/208071c6-d715-4119-8af3-c11b7bec3109.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/208c6393-edc7-4a73-a8fe-66a2e8e90993.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/208c6393-edc7-4a73-a8fe-66a2e8e90993.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/208c6393-edc7-4a73-a8fe-66a2e8e90993.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/208c6393-edc7-4a73-a8fe-66a2e8e90993.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/20954642-38b0-47ac-b800-9a68e8e7e72a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/20954642-38b0-47ac-b800-9a68e8e7e72a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/20954642-38b0-47ac-b800-9a68e8e7e72a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/20954642-38b0-47ac-b800-9a68e8e7e72a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/20a96016-dc22-4dfe-a6c0-c456c0622a7b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/20a96016-dc22-4dfe-a6c0-c456c0622a7b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/20a96016-dc22-4dfe-a6c0-c456c0622a7b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/20a96016-dc22-4dfe-a6c0-c456c0622a7b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/20c3b72d-3212-4419-9c23-ac481496a229.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/20c3b72d-3212-4419-9c23-ac481496a229.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/20c3b72d-3212-4419-9c23-ac481496a229.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/20c3b72d-3212-4419-9c23-ac481496a229.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/20df57c4-d397-45e9-a472-1bf429208880.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/20df57c4-d397-45e9-a472-1bf429208880.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/20df57c4-d397-45e9-a472-1bf429208880.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/20df57c4-d397-45e9-a472-1bf429208880.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2108e14d-46fa-427b-9f1f-7d5a397279e3.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2108e14d-46fa-427b-9f1f-7d5a397279e3.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2108e14d-46fa-427b-9f1f-7d5a397279e3.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2108e14d-46fa-427b-9f1f-7d5a397279e3.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/214a1085-ecf0-4dd9-91c9-537416f3dcdc.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/214a1085-ecf0-4dd9-91c9-537416f3dcdc.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/214a1085-ecf0-4dd9-91c9-537416f3dcdc.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/214a1085-ecf0-4dd9-91c9-537416f3dcdc.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/214f173e-7c36-4e9c-a36b-f88eb051db1e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/214f173e-7c36-4e9c-a36b-f88eb051db1e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/214f173e-7c36-4e9c-a36b-f88eb051db1e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/214f173e-7c36-4e9c-a36b-f88eb051db1e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/216a825e-1645-41cc-8323-a9afc3f72052.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/216a825e-1645-41cc-8323-a9afc3f72052.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/216a825e-1645-41cc-8323-a9afc3f72052.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/216a825e-1645-41cc-8323-a9afc3f72052.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/21736228-ab5a-40ad-a64f-503ede294d64.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/21736228-ab5a-40ad-a64f-503ede294d64.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/21736228-ab5a-40ad-a64f-503ede294d64.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/21736228-ab5a-40ad-a64f-503ede294d64.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/21891305-06a4-4bd7-b235-6e11c60c9554.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/21891305-06a4-4bd7-b235-6e11c60c9554.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/21891305-06a4-4bd7-b235-6e11c60c9554.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/21891305-06a4-4bd7-b235-6e11c60c9554.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/21950e74-df0e-40e2-a4df-c8b939f3ef52.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/21950e74-df0e-40e2-a4df-c8b939f3ef52.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/21950e74-df0e-40e2-a4df-c8b939f3ef52.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/21950e74-df0e-40e2-a4df-c8b939f3ef52.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/21c74d85-6fbb-4565-b8c8-1b09434e44f9.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/21c74d85-6fbb-4565-b8c8-1b09434e44f9.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/21c74d85-6fbb-4565-b8c8-1b09434e44f9.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/21c74d85-6fbb-4565-b8c8-1b09434e44f9.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/21cd03fa-d93f-4369-9f67-f95129f2e5c9.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/21cd03fa-d93f-4369-9f67-f95129f2e5c9.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/21cd03fa-d93f-4369-9f67-f95129f2e5c9.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/21cd03fa-d93f-4369-9f67-f95129f2e5c9.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/21e7a602-0dc5-4d39-95d0-cf9561f2fa62.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/21e7a602-0dc5-4d39-95d0-cf9561f2fa62.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/21e7a602-0dc5-4d39-95d0-cf9561f2fa62.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/21e7a602-0dc5-4d39-95d0-cf9561f2fa62.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/21efa32b-952d-4021-bb21-b75cc9b5077e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/21efa32b-952d-4021-bb21-b75cc9b5077e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/21efa32b-952d-4021-bb21-b75cc9b5077e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/21efa32b-952d-4021-bb21-b75cc9b5077e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2223cb03-9844-4b18-a25b-5f637c678ed9.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2223cb03-9844-4b18-a25b-5f637c678ed9.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2223cb03-9844-4b18-a25b-5f637c678ed9.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2223cb03-9844-4b18-a25b-5f637c678ed9.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/22401ce2-4ebf-4af2-bbe3-2ecf893de41c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/22401ce2-4ebf-4af2-bbe3-2ecf893de41c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/22401ce2-4ebf-4af2-bbe3-2ecf893de41c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/22401ce2-4ebf-4af2-bbe3-2ecf893de41c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/22591bce-b4d9-4faf-8cac-0e790c193556.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/22591bce-b4d9-4faf-8cac-0e790c193556.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/22591bce-b4d9-4faf-8cac-0e790c193556.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/22591bce-b4d9-4faf-8cac-0e790c193556.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/22b1d87a-6e5d-46bc-aadf-2463cb8d0e29.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/22b1d87a-6e5d-46bc-aadf-2463cb8d0e29.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/22b1d87a-6e5d-46bc-aadf-2463cb8d0e29.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/22b1d87a-6e5d-46bc-aadf-2463cb8d0e29.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/22b47d8f-fc6f-4bb5-86df-f7f782bfa62e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/22b47d8f-fc6f-4bb5-86df-f7f782bfa62e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/22b47d8f-fc6f-4bb5-86df-f7f782bfa62e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/22b47d8f-fc6f-4bb5-86df-f7f782bfa62e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/22d9683b-867b-47e1-8be6-19624324a46a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/22d9683b-867b-47e1-8be6-19624324a46a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/22d9683b-867b-47e1-8be6-19624324a46a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/22d9683b-867b-47e1-8be6-19624324a46a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/22e70958-5750-41fe-aaa0-325a1467d255.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/22e70958-5750-41fe-aaa0-325a1467d255.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/22e70958-5750-41fe-aaa0-325a1467d255.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/22e70958-5750-41fe-aaa0-325a1467d255.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/23373cb8-ad9c-4d20-adfc-7bd1b8f5b09c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/23373cb8-ad9c-4d20-adfc-7bd1b8f5b09c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/23373cb8-ad9c-4d20-adfc-7bd1b8f5b09c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/23373cb8-ad9c-4d20-adfc-7bd1b8f5b09c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2362773c-cdba-4679-8146-b3eb46daf54d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2362773c-cdba-4679-8146-b3eb46daf54d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2362773c-cdba-4679-8146-b3eb46daf54d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2362773c-cdba-4679-8146-b3eb46daf54d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/23656865-52d1-41d9-becc-3bc4fb5bd071.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/23656865-52d1-41d9-becc-3bc4fb5bd071.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/23656865-52d1-41d9-becc-3bc4fb5bd071.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/23656865-52d1-41d9-becc-3bc4fb5bd071.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/23769ae4-4a84-46d3-b1af-3acd4ce56c2b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/23769ae4-4a84-46d3-b1af-3acd4ce56c2b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/23769ae4-4a84-46d3-b1af-3acd4ce56c2b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/23769ae4-4a84-46d3-b1af-3acd4ce56c2b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/23878612-a7b8-4ae2-821d-b916bcdcfed3.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/23878612-a7b8-4ae2-821d-b916bcdcfed3.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/23878612-a7b8-4ae2-821d-b916bcdcfed3.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/23878612-a7b8-4ae2-821d-b916bcdcfed3.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/23944ce4-c489-4646-9350-39f5c73aae6c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/23944ce4-c489-4646-9350-39f5c73aae6c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/23944ce4-c489-4646-9350-39f5c73aae6c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/23944ce4-c489-4646-9350-39f5c73aae6c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/239d6908-7246-4e62-b206-0cc1cffccacd.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/239d6908-7246-4e62-b206-0cc1cffccacd.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/239d6908-7246-4e62-b206-0cc1cffccacd.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/239d6908-7246-4e62-b206-0cc1cffccacd.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/239dff83-e499-4152-9fa1-b04dd8029bc1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/239dff83-e499-4152-9fa1-b04dd8029bc1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/239dff83-e499-4152-9fa1-b04dd8029bc1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/239dff83-e499-4152-9fa1-b04dd8029bc1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/23abcd1d-04f9-4d0f-b11f-3b20ea7a276e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/23abcd1d-04f9-4d0f-b11f-3b20ea7a276e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/23abcd1d-04f9-4d0f-b11f-3b20ea7a276e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/23abcd1d-04f9-4d0f-b11f-3b20ea7a276e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/23babf2f-7dcd-4d87-97f2-6eba800e09a6.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/23babf2f-7dcd-4d87-97f2-6eba800e09a6.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/23babf2f-7dcd-4d87-97f2-6eba800e09a6.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/23babf2f-7dcd-4d87-97f2-6eba800e09a6.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/23dc5f36-6a89-4f2e-80a9-e71f95d6b4a0.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/23dc5f36-6a89-4f2e-80a9-e71f95d6b4a0.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/23dc5f36-6a89-4f2e-80a9-e71f95d6b4a0.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/23dc5f36-6a89-4f2e-80a9-e71f95d6b4a0.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/23e37b75-6915-43f7-bcfe-1a44a284dcac.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/23e37b75-6915-43f7-bcfe-1a44a284dcac.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/23e37b75-6915-43f7-bcfe-1a44a284dcac.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/23e37b75-6915-43f7-bcfe-1a44a284dcac.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/23eb7b16-793d-497a-800f-55ff3d3c323c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/23eb7b16-793d-497a-800f-55ff3d3c323c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/23eb7b16-793d-497a-800f-55ff3d3c323c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/23eb7b16-793d-497a-800f-55ff3d3c323c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2401ab42-857f-4c1f-b852-7ed26b8d7fec.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2401ab42-857f-4c1f-b852-7ed26b8d7fec.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2401ab42-857f-4c1f-b852-7ed26b8d7fec.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2401ab42-857f-4c1f-b852-7ed26b8d7fec.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2419a63d-dac7-4155-ac36-e90e1deca991.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2419a63d-dac7-4155-ac36-e90e1deca991.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2419a63d-dac7-4155-ac36-e90e1deca991.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2419a63d-dac7-4155-ac36-e90e1deca991.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/245cce39-8899-4074-9689-4a9c730ac1d4.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/245cce39-8899-4074-9689-4a9c730ac1d4.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/245cce39-8899-4074-9689-4a9c730ac1d4.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/245cce39-8899-4074-9689-4a9c730ac1d4.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/24860630-9b93-41d7-9d48-3e7fef21bdc3.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/24860630-9b93-41d7-9d48-3e7fef21bdc3.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/24860630-9b93-41d7-9d48-3e7fef21bdc3.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/24860630-9b93-41d7-9d48-3e7fef21bdc3.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/249a1749-021e-44d2-8700-77068ca9efe4.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/249a1749-021e-44d2-8700-77068ca9efe4.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/249a1749-021e-44d2-8700-77068ca9efe4.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/249a1749-021e-44d2-8700-77068ca9efe4.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/249b9af6-dc71-4638-bf67-9a16f50f07e8.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/249b9af6-dc71-4638-bf67-9a16f50f07e8.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/249b9af6-dc71-4638-bf67-9a16f50f07e8.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/249b9af6-dc71-4638-bf67-9a16f50f07e8.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/24a68c97-eb69-4a8c-9ede-4198f1a48f31.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/24a68c97-eb69-4a8c-9ede-4198f1a48f31.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/24a68c97-eb69-4a8c-9ede-4198f1a48f31.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/24a68c97-eb69-4a8c-9ede-4198f1a48f31.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/24b0bb1f-3001-4438-b186-a7004cd2b423.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/24b0bb1f-3001-4438-b186-a7004cd2b423.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/24b0bb1f-3001-4438-b186-a7004cd2b423.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/24b0bb1f-3001-4438-b186-a7004cd2b423.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/24b34ad9-3690-4e01-9ddb-0e12a00c5679.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/24b34ad9-3690-4e01-9ddb-0e12a00c5679.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/24b34ad9-3690-4e01-9ddb-0e12a00c5679.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/24b34ad9-3690-4e01-9ddb-0e12a00c5679.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/24c4e0e2-28f7-40cb-8815-4f436316f504.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/24c4e0e2-28f7-40cb-8815-4f436316f504.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/24c4e0e2-28f7-40cb-8815-4f436316f504.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/24c4e0e2-28f7-40cb-8815-4f436316f504.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/24cec455-5865-45db-8c27-06a21323cc55.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/24cec455-5865-45db-8c27-06a21323cc55.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/24cec455-5865-45db-8c27-06a21323cc55.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/24cec455-5865-45db-8c27-06a21323cc55.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/24dcf7b1-aa5f-45a1-bca9-69772a097091.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/24dcf7b1-aa5f-45a1-bca9-69772a097091.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/24dcf7b1-aa5f-45a1-bca9-69772a097091.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/24dcf7b1-aa5f-45a1-bca9-69772a097091.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/24e508f1-2ff7-40d3-8bd0-953ce8962194.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/24e508f1-2ff7-40d3-8bd0-953ce8962194.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/24e508f1-2ff7-40d3-8bd0-953ce8962194.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/24e508f1-2ff7-40d3-8bd0-953ce8962194.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2500479e-ad85-41e2-9e31-62853262bf51.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2500479e-ad85-41e2-9e31-62853262bf51.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2500479e-ad85-41e2-9e31-62853262bf51.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2500479e-ad85-41e2-9e31-62853262bf51.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/250cb1d7-bd62-4d04-a24d-f5c494d13ed6.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/250cb1d7-bd62-4d04-a24d-f5c494d13ed6.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/250cb1d7-bd62-4d04-a24d-f5c494d13ed6.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/250cb1d7-bd62-4d04-a24d-f5c494d13ed6.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2517d75c-6654-47a5-877c-bcc1703c8148.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2517d75c-6654-47a5-877c-bcc1703c8148.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2517d75c-6654-47a5-877c-bcc1703c8148.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2517d75c-6654-47a5-877c-bcc1703c8148.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/253260d9-9412-43ef-93ab-7ab6404970bb.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/253260d9-9412-43ef-93ab-7ab6404970bb.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/253260d9-9412-43ef-93ab-7ab6404970bb.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/253260d9-9412-43ef-93ab-7ab6404970bb.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/253356e4-3d8e-4ab4-8cc4-67009affd06e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/253356e4-3d8e-4ab4-8cc4-67009affd06e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/253356e4-3d8e-4ab4-8cc4-67009affd06e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/253356e4-3d8e-4ab4-8cc4-67009affd06e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/25389b22-ef9b-45e9-886a-62d1b4accc3d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/25389b22-ef9b-45e9-886a-62d1b4accc3d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/25389b22-ef9b-45e9-886a-62d1b4accc3d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/25389b22-ef9b-45e9-886a-62d1b4accc3d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2569e42e-abdd-40ee-bc16-dcf625a34a94.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2569e42e-abdd-40ee-bc16-dcf625a34a94.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2569e42e-abdd-40ee-bc16-dcf625a34a94.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2569e42e-abdd-40ee-bc16-dcf625a34a94.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2571adaa-4f8e-48f5-acce-5c45745ec768.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2571adaa-4f8e-48f5-acce-5c45745ec768.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2571adaa-4f8e-48f5-acce-5c45745ec768.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2571adaa-4f8e-48f5-acce-5c45745ec768.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2578406c-4e11-4c1f-80cf-ddac7a03123b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2578406c-4e11-4c1f-80cf-ddac7a03123b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2578406c-4e11-4c1f-80cf-ddac7a03123b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2578406c-4e11-4c1f-80cf-ddac7a03123b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/258ba471-5275-4c2c-a702-5b05af4e9d9b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/258ba471-5275-4c2c-a702-5b05af4e9d9b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/258ba471-5275-4c2c-a702-5b05af4e9d9b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/258ba471-5275-4c2c-a702-5b05af4e9d9b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/259842e7-7678-4b93-b13e-ba1b4b948e35.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/259842e7-7678-4b93-b13e-ba1b4b948e35.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/259842e7-7678-4b93-b13e-ba1b4b948e35.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/259842e7-7678-4b93-b13e-ba1b4b948e35.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/25c2d463-e0f7-477f-8a3f-9606bb76965c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/25c2d463-e0f7-477f-8a3f-9606bb76965c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/25c2d463-e0f7-477f-8a3f-9606bb76965c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/25c2d463-e0f7-477f-8a3f-9606bb76965c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/25e021e8-bbf3-4392-ae6f-f3e40a3406ec.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/25e021e8-bbf3-4392-ae6f-f3e40a3406ec.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/25e021e8-bbf3-4392-ae6f-f3e40a3406ec.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/25e021e8-bbf3-4392-ae6f-f3e40a3406ec.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/25e6fae1-09b0-432e-bbc5-49030d47136c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/25e6fae1-09b0-432e-bbc5-49030d47136c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/25e6fae1-09b0-432e-bbc5-49030d47136c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/25e6fae1-09b0-432e-bbc5-49030d47136c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/25ec59fb-25dd-44f0-a7cd-607298c55988.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/25ec59fb-25dd-44f0-a7cd-607298c55988.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/25ec59fb-25dd-44f0-a7cd-607298c55988.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/25ec59fb-25dd-44f0-a7cd-607298c55988.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/25f747e7-621e-4cfd-92b2-4833c6a4d6f9.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/25f747e7-621e-4cfd-92b2-4833c6a4d6f9.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/25f747e7-621e-4cfd-92b2-4833c6a4d6f9.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/25f747e7-621e-4cfd-92b2-4833c6a4d6f9.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/26146db1-6d36-4062-868e-29d5fef43b66.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/26146db1-6d36-4062-868e-29d5fef43b66.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/26146db1-6d36-4062-868e-29d5fef43b66.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/26146db1-6d36-4062-868e-29d5fef43b66.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/262205e1-0852-4c3c-8a02-bdcb6208e92c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/262205e1-0852-4c3c-8a02-bdcb6208e92c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/262205e1-0852-4c3c-8a02-bdcb6208e92c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/262205e1-0852-4c3c-8a02-bdcb6208e92c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2633d6ca-a4b0-4780-b370-7949a29936be.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2633d6ca-a4b0-4780-b370-7949a29936be.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2633d6ca-a4b0-4780-b370-7949a29936be.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2633d6ca-a4b0-4780-b370-7949a29936be.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/264e7b7f-f20b-4462-b8f0-bfe7cb3c64eb.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/264e7b7f-f20b-4462-b8f0-bfe7cb3c64eb.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/264e7b7f-f20b-4462-b8f0-bfe7cb3c64eb.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/264e7b7f-f20b-4462-b8f0-bfe7cb3c64eb.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/268af634-ae84-4780-914c-36e665602ced.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/268af634-ae84-4780-914c-36e665602ced.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/268af634-ae84-4780-914c-36e665602ced.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/268af634-ae84-4780-914c-36e665602ced.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/268c24a0-a8b4-4a2a-9cf5-a50fa8332a92.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/268c24a0-a8b4-4a2a-9cf5-a50fa8332a92.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/268c24a0-a8b4-4a2a-9cf5-a50fa8332a92.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/268c24a0-a8b4-4a2a-9cf5-a50fa8332a92.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/269ffb4d-7e83-4220-b761-07503d478817.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/269ffb4d-7e83-4220-b761-07503d478817.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/269ffb4d-7e83-4220-b761-07503d478817.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/269ffb4d-7e83-4220-b761-07503d478817.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/26ade352-2159-4b0f-bd8f-ab9bf394966f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/26ade352-2159-4b0f-bd8f-ab9bf394966f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/26ade352-2159-4b0f-bd8f-ab9bf394966f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/26ade352-2159-4b0f-bd8f-ab9bf394966f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/26c006a9-677e-4cf8-83be-3f9a8c625d76.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/26c006a9-677e-4cf8-83be-3f9a8c625d76.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/26c006a9-677e-4cf8-83be-3f9a8c625d76.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/26c006a9-677e-4cf8-83be-3f9a8c625d76.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/26e38180-90df-459d-a4f3-9f9a6e60a0c0.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/26e38180-90df-459d-a4f3-9f9a6e60a0c0.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/26e38180-90df-459d-a4f3-9f9a6e60a0c0.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/26e38180-90df-459d-a4f3-9f9a6e60a0c0.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/27298629-b799-4a78-9fd3-da3ce23d054d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/27298629-b799-4a78-9fd3-da3ce23d054d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/27298629-b799-4a78-9fd3-da3ce23d054d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/27298629-b799-4a78-9fd3-da3ce23d054d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/272b89e2-4c69-4dce-91c4-f82f4dd31919.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/272b89e2-4c69-4dce-91c4-f82f4dd31919.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/272b89e2-4c69-4dce-91c4-f82f4dd31919.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/272b89e2-4c69-4dce-91c4-f82f4dd31919.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2733db79-c1bb-49c4-b3ef-a4ad7b1edf0d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2733db79-c1bb-49c4-b3ef-a4ad7b1edf0d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2733db79-c1bb-49c4-b3ef-a4ad7b1edf0d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2733db79-c1bb-49c4-b3ef-a4ad7b1edf0d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/27959228-eca4-421b-8f49-144938215239.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/27959228-eca4-421b-8f49-144938215239.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/27959228-eca4-421b-8f49-144938215239.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/27959228-eca4-421b-8f49-144938215239.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/27a4c3fb-444c-4b3e-ba35-43bad2321b8a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/27a4c3fb-444c-4b3e-ba35-43bad2321b8a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/27a4c3fb-444c-4b3e-ba35-43bad2321b8a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/27a4c3fb-444c-4b3e-ba35-43bad2321b8a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/27baa8b4-9a11-4ca4-b6b4-5e1fb2fa47a4.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/27baa8b4-9a11-4ca4-b6b4-5e1fb2fa47a4.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/27baa8b4-9a11-4ca4-b6b4-5e1fb2fa47a4.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/27baa8b4-9a11-4ca4-b6b4-5e1fb2fa47a4.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/27be43eb-055a-4f4c-87c6-74a06dfd66d1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/27be43eb-055a-4f4c-87c6-74a06dfd66d1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/27be43eb-055a-4f4c-87c6-74a06dfd66d1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/27be43eb-055a-4f4c-87c6-74a06dfd66d1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/27d86bc8-1506-485b-aa89-e3b17d7461f7.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/27d86bc8-1506-485b-aa89-e3b17d7461f7.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/27d86bc8-1506-485b-aa89-e3b17d7461f7.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/27d86bc8-1506-485b-aa89-e3b17d7461f7.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/27ee8c69-e98c-4445-8d1a-ee48b44124c9.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/27ee8c69-e98c-4445-8d1a-ee48b44124c9.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/27ee8c69-e98c-4445-8d1a-ee48b44124c9.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/27ee8c69-e98c-4445-8d1a-ee48b44124c9.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/27fbcef0-c6fc-4d8c-b53e-6c3d94f6ec8e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/27fbcef0-c6fc-4d8c-b53e-6c3d94f6ec8e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/27fbcef0-c6fc-4d8c-b53e-6c3d94f6ec8e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/27fbcef0-c6fc-4d8c-b53e-6c3d94f6ec8e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/283ab963-b04b-44b7-aaa3-e6afe3e7d7e1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/283ab963-b04b-44b7-aaa3-e6afe3e7d7e1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/283ab963-b04b-44b7-aaa3-e6afe3e7d7e1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/283ab963-b04b-44b7-aaa3-e6afe3e7d7e1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/287059a2-1cb1-44e3-98b4-0bbbafc4b670.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/287059a2-1cb1-44e3-98b4-0bbbafc4b670.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/287059a2-1cb1-44e3-98b4-0bbbafc4b670.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/287059a2-1cb1-44e3-98b4-0bbbafc4b670.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/28718719-5838-450d-b9d4-453e75c3c8de.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/28718719-5838-450d-b9d4-453e75c3c8de.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/28718719-5838-450d-b9d4-453e75c3c8de.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/28718719-5838-450d-b9d4-453e75c3c8de.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/287ef69a-01ae-4d16-9417-96f6596ef34b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/287ef69a-01ae-4d16-9417-96f6596ef34b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/287ef69a-01ae-4d16-9417-96f6596ef34b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/287ef69a-01ae-4d16-9417-96f6596ef34b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2891277c-d08e-4201-9906-03b85a5afff4.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2891277c-d08e-4201-9906-03b85a5afff4.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2891277c-d08e-4201-9906-03b85a5afff4.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2891277c-d08e-4201-9906-03b85a5afff4.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/289d7482-e071-47b6-b1a9-ad358ab551a0.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/289d7482-e071-47b6-b1a9-ad358ab551a0.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/289d7482-e071-47b6-b1a9-ad358ab551a0.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/289d7482-e071-47b6-b1a9-ad358ab551a0.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/28fc962b-de54-4f29-a3e7-457b409d42a0.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/28fc962b-de54-4f29-a3e7-457b409d42a0.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/28fc962b-de54-4f29-a3e7-457b409d42a0.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/28fc962b-de54-4f29-a3e7-457b409d42a0.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/29021251-7bf3-472c-8ffb-5ee6f4cf6bb9.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/29021251-7bf3-472c-8ffb-5ee6f4cf6bb9.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/29021251-7bf3-472c-8ffb-5ee6f4cf6bb9.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/29021251-7bf3-472c-8ffb-5ee6f4cf6bb9.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/290f0a8d-cd0e-497c-b68e-900e47b21e2f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/290f0a8d-cd0e-497c-b68e-900e47b21e2f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/290f0a8d-cd0e-497c-b68e-900e47b21e2f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/290f0a8d-cd0e-497c-b68e-900e47b21e2f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/293054cc-b934-47f4-b67b-a2bb55030d51.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/293054cc-b934-47f4-b67b-a2bb55030d51.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/293054cc-b934-47f4-b67b-a2bb55030d51.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/293054cc-b934-47f4-b67b-a2bb55030d51.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2931bda7-b524-4712-9656-8253db01ec51.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2931bda7-b524-4712-9656-8253db01ec51.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2931bda7-b524-4712-9656-8253db01ec51.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2931bda7-b524-4712-9656-8253db01ec51.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/293622e8-ef69-48e3-93ec-30571f6535b0.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/293622e8-ef69-48e3-93ec-30571f6535b0.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/293622e8-ef69-48e3-93ec-30571f6535b0.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/293622e8-ef69-48e3-93ec-30571f6535b0.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2979534e-2f29-4dc7-aeec-efa9e10629b0.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2979534e-2f29-4dc7-aeec-efa9e10629b0.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2979534e-2f29-4dc7-aeec-efa9e10629b0.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2979534e-2f29-4dc7-aeec-efa9e10629b0.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/297e5031-8fd3-436f-87cc-ac52010e58ec.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/297e5031-8fd3-436f-87cc-ac52010e58ec.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/297e5031-8fd3-436f-87cc-ac52010e58ec.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/297e5031-8fd3-436f-87cc-ac52010e58ec.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/297e8d01-971a-435a-a5fc-12ad59b0b70c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/297e8d01-971a-435a-a5fc-12ad59b0b70c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/297e8d01-971a-435a-a5fc-12ad59b0b70c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/297e8d01-971a-435a-a5fc-12ad59b0b70c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/299d968d-44e8-43b4-a619-eae56b1237da.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/299d968d-44e8-43b4-a619-eae56b1237da.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/299d968d-44e8-43b4-a619-eae56b1237da.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/299d968d-44e8-43b4-a619-eae56b1237da.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/299e7ed5-fc17-4e94-b326-7cc24cb2c500.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/299e7ed5-fc17-4e94-b326-7cc24cb2c500.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/299e7ed5-fc17-4e94-b326-7cc24cb2c500.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/299e7ed5-fc17-4e94-b326-7cc24cb2c500.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/29a63c74-b4f1-4078-bd04-dd7d982d7580.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/29a63c74-b4f1-4078-bd04-dd7d982d7580.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/29a63c74-b4f1-4078-bd04-dd7d982d7580.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/29a63c74-b4f1-4078-bd04-dd7d982d7580.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/29e016c6-1f24-4fb6-8297-b9082981be7a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/29e016c6-1f24-4fb6-8297-b9082981be7a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/29e016c6-1f24-4fb6-8297-b9082981be7a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/29e016c6-1f24-4fb6-8297-b9082981be7a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/29ea3edd-2bac-4fb6-8026-6a76346a9e0f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/29ea3edd-2bac-4fb6-8026-6a76346a9e0f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/29ea3edd-2bac-4fb6-8026-6a76346a9e0f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/29ea3edd-2bac-4fb6-8026-6a76346a9e0f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/29efb4a1-ac7b-40fa-a500-4c22fcb0bb02.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/29efb4a1-ac7b-40fa-a500-4c22fcb0bb02.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/29efb4a1-ac7b-40fa-a500-4c22fcb0bb02.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/29efb4a1-ac7b-40fa-a500-4c22fcb0bb02.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/29f75139-d073-4f4d-abfa-739f382db899.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/29f75139-d073-4f4d-abfa-739f382db899.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/29f75139-d073-4f4d-abfa-739f382db899.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/29f75139-d073-4f4d-abfa-739f382db899.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2a06b384-8ba3-4121-872c-2bf7b60c4d29.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2a06b384-8ba3-4121-872c-2bf7b60c4d29.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2a06b384-8ba3-4121-872c-2bf7b60c4d29.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2a06b384-8ba3-4121-872c-2bf7b60c4d29.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2a13f18e-57e2-44a7-8b88-523c0ab81a14.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2a13f18e-57e2-44a7-8b88-523c0ab81a14.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2a13f18e-57e2-44a7-8b88-523c0ab81a14.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2a13f18e-57e2-44a7-8b88-523c0ab81a14.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2a16e7ad-0ad1-4def-8a25-c9befe098259.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2a16e7ad-0ad1-4def-8a25-c9befe098259.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2a16e7ad-0ad1-4def-8a25-c9befe098259.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2a16e7ad-0ad1-4def-8a25-c9befe098259.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2a1f93ec-e3c2-4ba5-b9fb-4459cb5901e3.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2a1f93ec-e3c2-4ba5-b9fb-4459cb5901e3.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2a1f93ec-e3c2-4ba5-b9fb-4459cb5901e3.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2a1f93ec-e3c2-4ba5-b9fb-4459cb5901e3.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2a243009-e68e-4e07-9945-56b5a01887a8.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2a243009-e68e-4e07-9945-56b5a01887a8.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2a243009-e68e-4e07-9945-56b5a01887a8.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2a243009-e68e-4e07-9945-56b5a01887a8.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2a476574-6d69-4c73-b442-b2f7f28ec9e0.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2a476574-6d69-4c73-b442-b2f7f28ec9e0.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2a476574-6d69-4c73-b442-b2f7f28ec9e0.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2a476574-6d69-4c73-b442-b2f7f28ec9e0.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2a50c049-d489-478b-93d6-f282695551ef.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2a50c049-d489-478b-93d6-f282695551ef.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2a50c049-d489-478b-93d6-f282695551ef.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2a50c049-d489-478b-93d6-f282695551ef.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2a5c7d37-fb24-4bb0-bd80-98e80edd3e97.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2a5c7d37-fb24-4bb0-bd80-98e80edd3e97.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2a5c7d37-fb24-4bb0-bd80-98e80edd3e97.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2a5c7d37-fb24-4bb0-bd80-98e80edd3e97.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2a6c0cc5-115b-4a03-988a-b8e84364b724.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2a6c0cc5-115b-4a03-988a-b8e84364b724.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2a6c0cc5-115b-4a03-988a-b8e84364b724.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2a6c0cc5-115b-4a03-988a-b8e84364b724.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2a6d3a9f-6394-47d2-9541-27b2375958ec.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2a6d3a9f-6394-47d2-9541-27b2375958ec.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2a6d3a9f-6394-47d2-9541-27b2375958ec.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2a6d3a9f-6394-47d2-9541-27b2375958ec.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2a77d48a-f4e3-4e92-84cd-14f2b5c41c6b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2a77d48a-f4e3-4e92-84cd-14f2b5c41c6b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2a77d48a-f4e3-4e92-84cd-14f2b5c41c6b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2a77d48a-f4e3-4e92-84cd-14f2b5c41c6b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2a7cfaf9-9fab-4029-9275-1cf6ab08b5d5.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2a7cfaf9-9fab-4029-9275-1cf6ab08b5d5.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2a7cfaf9-9fab-4029-9275-1cf6ab08b5d5.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2a7cfaf9-9fab-4029-9275-1cf6ab08b5d5.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2abec36c-90ef-423f-8750-96c1dfa3be67.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2abec36c-90ef-423f-8750-96c1dfa3be67.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2abec36c-90ef-423f-8750-96c1dfa3be67.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2abec36c-90ef-423f-8750-96c1dfa3be67.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2acbcac0-bdf4-4432-983f-4751794e751d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2acbcac0-bdf4-4432-983f-4751794e751d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2acbcac0-bdf4-4432-983f-4751794e751d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2acbcac0-bdf4-4432-983f-4751794e751d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2af59530-d8bc-4839-8688-4cd49538ef58.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2af59530-d8bc-4839-8688-4cd49538ef58.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2af59530-d8bc-4839-8688-4cd49538ef58.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2af59530-d8bc-4839-8688-4cd49538ef58.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2b168644-757d-4582-8cfe-466f56a580e3.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2b168644-757d-4582-8cfe-466f56a580e3.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2b168644-757d-4582-8cfe-466f56a580e3.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2b168644-757d-4582-8cfe-466f56a580e3.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2b1ca45f-5c2c-4481-8cbf-ea35bb6d2238.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2b1ca45f-5c2c-4481-8cbf-ea35bb6d2238.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2b1ca45f-5c2c-4481-8cbf-ea35bb6d2238.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2b1ca45f-5c2c-4481-8cbf-ea35bb6d2238.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2b4e2f2c-1ee1-40cf-a585-e312f018aabc.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2b4e2f2c-1ee1-40cf-a585-e312f018aabc.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2b4e2f2c-1ee1-40cf-a585-e312f018aabc.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2b4e2f2c-1ee1-40cf-a585-e312f018aabc.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2ba41903-705e-4695-97f9-3ab965e8ddf2.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2ba41903-705e-4695-97f9-3ab965e8ddf2.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2ba41903-705e-4695-97f9-3ab965e8ddf2.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2ba41903-705e-4695-97f9-3ab965e8ddf2.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2bb95ce4-ff8d-4c02-adc4-6cb448c1fcad.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2bb95ce4-ff8d-4c02-adc4-6cb448c1fcad.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2bb95ce4-ff8d-4c02-adc4-6cb448c1fcad.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2bb95ce4-ff8d-4c02-adc4-6cb448c1fcad.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2bce96c5-5bd6-483b-97fa-c041d0daa4e8.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2bce96c5-5bd6-483b-97fa-c041d0daa4e8.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2bce96c5-5bd6-483b-97fa-c041d0daa4e8.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2bce96c5-5bd6-483b-97fa-c041d0daa4e8.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2bd9421e-d0fd-4b3a-a2df-788065229d82.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2bd9421e-d0fd-4b3a-a2df-788065229d82.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2bd9421e-d0fd-4b3a-a2df-788065229d82.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2bd9421e-d0fd-4b3a-a2df-788065229d82.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2c1f1185-f602-4df8-bc76-dd8291b0bf8e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2c1f1185-f602-4df8-bc76-dd8291b0bf8e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2c1f1185-f602-4df8-bc76-dd8291b0bf8e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2c1f1185-f602-4df8-bc76-dd8291b0bf8e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2c2948c6-404d-4a9d-bf7c-6cd4347dfad6.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2c2948c6-404d-4a9d-bf7c-6cd4347dfad6.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2c2948c6-404d-4a9d-bf7c-6cd4347dfad6.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2c2948c6-404d-4a9d-bf7c-6cd4347dfad6.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2c2d0996-42e8-4106-a8d6-41bb3942a586.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2c2d0996-42e8-4106-a8d6-41bb3942a586.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2c2d0996-42e8-4106-a8d6-41bb3942a586.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2c2d0996-42e8-4106-a8d6-41bb3942a586.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2c4494bb-5a33-440a-9fc9-f939aba725e1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2c4494bb-5a33-440a-9fc9-f939aba725e1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2c4494bb-5a33-440a-9fc9-f939aba725e1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2c4494bb-5a33-440a-9fc9-f939aba725e1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2c5d89b7-048e-42e3-b1fa-c6c1148e2e51.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2c5d89b7-048e-42e3-b1fa-c6c1148e2e51.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2c5d89b7-048e-42e3-b1fa-c6c1148e2e51.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2c5d89b7-048e-42e3-b1fa-c6c1148e2e51.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2ca1e76f-c457-478e-9d2e-13a48e522446.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2ca1e76f-c457-478e-9d2e-13a48e522446.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2ca1e76f-c457-478e-9d2e-13a48e522446.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2ca1e76f-c457-478e-9d2e-13a48e522446.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2cb108e2-c5a9-4bbe-809f-28c20afe397b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2cb108e2-c5a9-4bbe-809f-28c20afe397b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2cb108e2-c5a9-4bbe-809f-28c20afe397b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2cb108e2-c5a9-4bbe-809f-28c20afe397b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2d218991-e00f-4e88-9a10-98b49a68a3b9.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2d218991-e00f-4e88-9a10-98b49a68a3b9.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2d218991-e00f-4e88-9a10-98b49a68a3b9.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2d218991-e00f-4e88-9a10-98b49a68a3b9.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2d2fa6fe-0634-4f21-b18b-a3208c1c657a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2d2fa6fe-0634-4f21-b18b-a3208c1c657a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2d2fa6fe-0634-4f21-b18b-a3208c1c657a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2d2fa6fe-0634-4f21-b18b-a3208c1c657a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2d573388-32b9-450e-80ac-194b2bcc5686.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2d573388-32b9-450e-80ac-194b2bcc5686.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2d573388-32b9-450e-80ac-194b2bcc5686.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2d573388-32b9-450e-80ac-194b2bcc5686.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2d5d0142-18eb-4115-8c0f-65fd7132b28d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2d5d0142-18eb-4115-8c0f-65fd7132b28d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2d5d0142-18eb-4115-8c0f-65fd7132b28d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2d5d0142-18eb-4115-8c0f-65fd7132b28d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2d6cf43f-e908-4d6d-89a3-23f955440be0.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2d6cf43f-e908-4d6d-89a3-23f955440be0.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2d6cf43f-e908-4d6d-89a3-23f955440be0.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2d6cf43f-e908-4d6d-89a3-23f955440be0.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2da04d11-a551-44b2-aecf-36c41c3e454f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2da04d11-a551-44b2-aecf-36c41c3e454f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2da04d11-a551-44b2-aecf-36c41c3e454f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2da04d11-a551-44b2-aecf-36c41c3e454f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2dbe8afd-f6b3-4d3a-a444-05276d2f5953.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2dbe8afd-f6b3-4d3a-a444-05276d2f5953.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2dbe8afd-f6b3-4d3a-a444-05276d2f5953.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2dbe8afd-f6b3-4d3a-a444-05276d2f5953.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2dcc580a-6a40-4990-bc09-f45a2d1ab09f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2dcc580a-6a40-4990-bc09-f45a2d1ab09f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2dcc580a-6a40-4990-bc09-f45a2d1ab09f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2dcc580a-6a40-4990-bc09-f45a2d1ab09f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2dd05395-cd94-4df6-9e8a-ad9d7311f61f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2dd05395-cd94-4df6-9e8a-ad9d7311f61f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2dd05395-cd94-4df6-9e8a-ad9d7311f61f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2dd05395-cd94-4df6-9e8a-ad9d7311f61f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2ddf15e6-2d6a-4afc-8721-5ffdaece978c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2ddf15e6-2d6a-4afc-8721-5ffdaece978c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2ddf15e6-2d6a-4afc-8721-5ffdaece978c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2ddf15e6-2d6a-4afc-8721-5ffdaece978c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2de81234-dff1-44bd-ad3c-772c9e05cb5b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2de81234-dff1-44bd-ad3c-772c9e05cb5b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2de81234-dff1-44bd-ad3c-772c9e05cb5b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2de81234-dff1-44bd-ad3c-772c9e05cb5b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2e1406ff-ec6c-48c3-b4d5-fa4a40c9f9fb.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2e1406ff-ec6c-48c3-b4d5-fa4a40c9f9fb.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2e1406ff-ec6c-48c3-b4d5-fa4a40c9f9fb.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2e1406ff-ec6c-48c3-b4d5-fa4a40c9f9fb.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2e3309ae-df49-4ece-bc5d-e62017f54d89.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2e3309ae-df49-4ece-bc5d-e62017f54d89.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2e3309ae-df49-4ece-bc5d-e62017f54d89.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2e3309ae-df49-4ece-bc5d-e62017f54d89.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2e93dcbb-cea5-4d20-80a2-4b7d78b57041.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2e93dcbb-cea5-4d20-80a2-4b7d78b57041.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2e93dcbb-cea5-4d20-80a2-4b7d78b57041.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2e93dcbb-cea5-4d20-80a2-4b7d78b57041.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2e9491dd-3c73-4a90-a220-1445c0a9c89d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2e9491dd-3c73-4a90-a220-1445c0a9c89d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2e9491dd-3c73-4a90-a220-1445c0a9c89d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2e9491dd-3c73-4a90-a220-1445c0a9c89d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2eb234dc-4316-475e-9c0e-f21f1b30ee65.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2eb234dc-4316-475e-9c0e-f21f1b30ee65.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2eb234dc-4316-475e-9c0e-f21f1b30ee65.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2eb234dc-4316-475e-9c0e-f21f1b30ee65.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2ec5144b-8ffb-4fab-ad15-67aa1535ebc5.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2ec5144b-8ffb-4fab-ad15-67aa1535ebc5.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2ec5144b-8ffb-4fab-ad15-67aa1535ebc5.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2ec5144b-8ffb-4fab-ad15-67aa1535ebc5.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2ecd470d-6477-406b-8f40-ea7e6b0c42b2.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2ecd470d-6477-406b-8f40-ea7e6b0c42b2.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2ecd470d-6477-406b-8f40-ea7e6b0c42b2.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2ecd470d-6477-406b-8f40-ea7e6b0c42b2.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2ed12ca2-ef27-43ea-a8b9-acca8251e804.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2ed12ca2-ef27-43ea-a8b9-acca8251e804.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2ed12ca2-ef27-43ea-a8b9-acca8251e804.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2ed12ca2-ef27-43ea-a8b9-acca8251e804.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2ee3a23c-7f25-4d8b-b521-e4cb7247d1ea.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2ee3a23c-7f25-4d8b-b521-e4cb7247d1ea.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2ee3a23c-7f25-4d8b-b521-e4cb7247d1ea.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2ee3a23c-7f25-4d8b-b521-e4cb7247d1ea.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2f43e27b-f7a9-4d35-9a3e-055d1e9d49cc.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2f43e27b-f7a9-4d35-9a3e-055d1e9d49cc.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2f43e27b-f7a9-4d35-9a3e-055d1e9d49cc.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2f43e27b-f7a9-4d35-9a3e-055d1e9d49cc.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2f5c1f69-0bee-477c-af53-204ddd184459.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2f5c1f69-0bee-477c-af53-204ddd184459.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2f5c1f69-0bee-477c-af53-204ddd184459.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2f5c1f69-0bee-477c-af53-204ddd184459.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2f6ed32e-a242-44a4-9416-4b32e07594e4.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2f6ed32e-a242-44a4-9416-4b32e07594e4.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2f6ed32e-a242-44a4-9416-4b32e07594e4.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2f6ed32e-a242-44a4-9416-4b32e07594e4.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2f7681de-fbde-4d8d-849b-d36d5dabac0e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2f7681de-fbde-4d8d-849b-d36d5dabac0e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2f7681de-fbde-4d8d-849b-d36d5dabac0e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2f7681de-fbde-4d8d-849b-d36d5dabac0e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2f7d7208-15c9-4f67-847b-1e09350cf081.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2f7d7208-15c9-4f67-847b-1e09350cf081.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2f7d7208-15c9-4f67-847b-1e09350cf081.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2f7d7208-15c9-4f67-847b-1e09350cf081.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2f9504be-324a-47f9-a8d5-ca449d8c5d93.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2f9504be-324a-47f9-a8d5-ca449d8c5d93.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2f9504be-324a-47f9-a8d5-ca449d8c5d93.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2f9504be-324a-47f9-a8d5-ca449d8c5d93.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2f95aa26-1fbc-4961-a25c-f847bdca9d87.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2f95aa26-1fbc-4961-a25c-f847bdca9d87.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2f95aa26-1fbc-4961-a25c-f847bdca9d87.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2f95aa26-1fbc-4961-a25c-f847bdca9d87.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2fb8648d-acb4-49fc-a826-b384deba9a63.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2fb8648d-acb4-49fc-a826-b384deba9a63.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2fb8648d-acb4-49fc-a826-b384deba9a63.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2fb8648d-acb4-49fc-a826-b384deba9a63.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2fb973e7-bc3e-43cb-a893-d186de6c19c1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2fb973e7-bc3e-43cb-a893-d186de6c19c1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2fb973e7-bc3e-43cb-a893-d186de6c19c1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2fb973e7-bc3e-43cb-a893-d186de6c19c1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2fc0e16d-cf41-4cee-b734-f1390b6a356b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2fc0e16d-cf41-4cee-b734-f1390b6a356b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2fc0e16d-cf41-4cee-b734-f1390b6a356b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2fc0e16d-cf41-4cee-b734-f1390b6a356b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2fca6c68-7658-40e0-83cb-975acbc62641.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2fca6c68-7658-40e0-83cb-975acbc62641.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2fca6c68-7658-40e0-83cb-975acbc62641.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2fca6c68-7658-40e0-83cb-975acbc62641.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2fe7709f-b641-45b9-a8a4-eb8461f0f5e1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2fe7709f-b641-45b9-a8a4-eb8461f0f5e1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2fe7709f-b641-45b9-a8a4-eb8461f0f5e1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2fe7709f-b641-45b9-a8a4-eb8461f0f5e1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2fe97dd4-35d0-4a2a-b9b5-2bc8b272974b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2fe97dd4-35d0-4a2a-b9b5-2bc8b272974b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2fe97dd4-35d0-4a2a-b9b5-2bc8b272974b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/2fe97dd4-35d0-4a2a-b9b5-2bc8b272974b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/300cad8a-ff99-4ef2-9c17-b898db528263.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/300cad8a-ff99-4ef2-9c17-b898db528263.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/300cad8a-ff99-4ef2-9c17-b898db528263.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/300cad8a-ff99-4ef2-9c17-b898db528263.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/30140bbf-9534-4a79-bd50-60f4d6ed8029.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/30140bbf-9534-4a79-bd50-60f4d6ed8029.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/30140bbf-9534-4a79-bd50-60f4d6ed8029.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/30140bbf-9534-4a79-bd50-60f4d6ed8029.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3029afb4-ce51-4978-8980-7857d8e8d88b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3029afb4-ce51-4978-8980-7857d8e8d88b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3029afb4-ce51-4978-8980-7857d8e8d88b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3029afb4-ce51-4978-8980-7857d8e8d88b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/302dcff2-c6ac-45b7-a956-b146686e5c78.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/302dcff2-c6ac-45b7-a956-b146686e5c78.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/302dcff2-c6ac-45b7-a956-b146686e5c78.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/302dcff2-c6ac-45b7-a956-b146686e5c78.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/30382d0c-124d-424b-bd1a-bfdc5c132257.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/30382d0c-124d-424b-bd1a-bfdc5c132257.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/30382d0c-124d-424b-bd1a-bfdc5c132257.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/30382d0c-124d-424b-bd1a-bfdc5c132257.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/30460c37-e48f-4a7b-86a0-ff10706d3568.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/30460c37-e48f-4a7b-86a0-ff10706d3568.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/30460c37-e48f-4a7b-86a0-ff10706d3568.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/30460c37-e48f-4a7b-86a0-ff10706d3568.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/306418ba-6009-4cd4-9a01-a31fc97685b5.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/306418ba-6009-4cd4-9a01-a31fc97685b5.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/306418ba-6009-4cd4-9a01-a31fc97685b5.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/306418ba-6009-4cd4-9a01-a31fc97685b5.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/30766b8d-5f19-4660-821a-717b7ab89e3a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/30766b8d-5f19-4660-821a-717b7ab89e3a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/30766b8d-5f19-4660-821a-717b7ab89e3a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/30766b8d-5f19-4660-821a-717b7ab89e3a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3087387b-7d4f-4c91-ac7f-f7e7d2c80c6c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3087387b-7d4f-4c91-ac7f-f7e7d2c80c6c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3087387b-7d4f-4c91-ac7f-f7e7d2c80c6c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3087387b-7d4f-4c91-ac7f-f7e7d2c80c6c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/308e3c90-be3e-4d49-9478-0f5b33ec4ae2.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/308e3c90-be3e-4d49-9478-0f5b33ec4ae2.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/308e3c90-be3e-4d49-9478-0f5b33ec4ae2.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/308e3c90-be3e-4d49-9478-0f5b33ec4ae2.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/309b0cdd-7609-4532-9d2a-89f67addf4fa.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/309b0cdd-7609-4532-9d2a-89f67addf4fa.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/309b0cdd-7609-4532-9d2a-89f67addf4fa.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/309b0cdd-7609-4532-9d2a-89f67addf4fa.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/30b80d01-6fa7-488c-8938-a16ee4b6b9d3.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/30b80d01-6fa7-488c-8938-a16ee4b6b9d3.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/30b80d01-6fa7-488c-8938-a16ee4b6b9d3.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/30b80d01-6fa7-488c-8938-a16ee4b6b9d3.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/30d15ae7-c830-4ca7-ac47-b1e01f6a12c2.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/30d15ae7-c830-4ca7-ac47-b1e01f6a12c2.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/30d15ae7-c830-4ca7-ac47-b1e01f6a12c2.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/30d15ae7-c830-4ca7-ac47-b1e01f6a12c2.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/30d41ba5-c815-4dc3-a3cf-0dd2e7a26782.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/30d41ba5-c815-4dc3-a3cf-0dd2e7a26782.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/30d41ba5-c815-4dc3-a3cf-0dd2e7a26782.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/30d41ba5-c815-4dc3-a3cf-0dd2e7a26782.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/31062253-e2f0-472e-ba38-91382bc1c3dc.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/31062253-e2f0-472e-ba38-91382bc1c3dc.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/31062253-e2f0-472e-ba38-91382bc1c3dc.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/31062253-e2f0-472e-ba38-91382bc1c3dc.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/31153102-0ed7-4ad2-848e-d28b6a06e9dc.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/31153102-0ed7-4ad2-848e-d28b6a06e9dc.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/31153102-0ed7-4ad2-848e-d28b6a06e9dc.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/31153102-0ed7-4ad2-848e-d28b6a06e9dc.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3136bb1a-49ff-4424-b77c-b31fbdac6b21.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3136bb1a-49ff-4424-b77c-b31fbdac6b21.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3136bb1a-49ff-4424-b77c-b31fbdac6b21.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3136bb1a-49ff-4424-b77c-b31fbdac6b21.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/313bf21b-1912-4f2a-97d7-6df343946ab6.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/313bf21b-1912-4f2a-97d7-6df343946ab6.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/313bf21b-1912-4f2a-97d7-6df343946ab6.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/313bf21b-1912-4f2a-97d7-6df343946ab6.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/313d3b82-6f9e-4d90-b126-d29daae4f5e0.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/313d3b82-6f9e-4d90-b126-d29daae4f5e0.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/313d3b82-6f9e-4d90-b126-d29daae4f5e0.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/313d3b82-6f9e-4d90-b126-d29daae4f5e0.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/31aac27d-566b-423c-aa37-86bd03a24d80.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/31aac27d-566b-423c-aa37-86bd03a24d80.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/31aac27d-566b-423c-aa37-86bd03a24d80.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/31aac27d-566b-423c-aa37-86bd03a24d80.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/31c6590a-9f75-404d-863c-abdda1c85f54.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/31c6590a-9f75-404d-863c-abdda1c85f54.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/31c6590a-9f75-404d-863c-abdda1c85f54.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/31c6590a-9f75-404d-863c-abdda1c85f54.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/31c902b7-6cff-4368-918f-0229a86d3ce7.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/31c902b7-6cff-4368-918f-0229a86d3ce7.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/31c902b7-6cff-4368-918f-0229a86d3ce7.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/31c902b7-6cff-4368-918f-0229a86d3ce7.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/31ebc99d-63c2-417c-98a7-2db8e5323b18.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/31ebc99d-63c2-417c-98a7-2db8e5323b18.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/31ebc99d-63c2-417c-98a7-2db8e5323b18.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/31ebc99d-63c2-417c-98a7-2db8e5323b18.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/32147210-538f-498a-86a8-9493c54d236d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/32147210-538f-498a-86a8-9493c54d236d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/32147210-538f-498a-86a8-9493c54d236d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/32147210-538f-498a-86a8-9493c54d236d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/324ec9cd-8a6f-4821-a7a6-3f972c773285.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/324ec9cd-8a6f-4821-a7a6-3f972c773285.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/324ec9cd-8a6f-4821-a7a6-3f972c773285.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/324ec9cd-8a6f-4821-a7a6-3f972c773285.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3263f2d0-10a5-40c3-914b-f599cdf67b3d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3263f2d0-10a5-40c3-914b-f599cdf67b3d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3263f2d0-10a5-40c3-914b-f599cdf67b3d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3263f2d0-10a5-40c3-914b-f599cdf67b3d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/329b28e2-e6c3-4beb-9a43-a78023fa2557.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/329b28e2-e6c3-4beb-9a43-a78023fa2557.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/329b28e2-e6c3-4beb-9a43-a78023fa2557.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/329b28e2-e6c3-4beb-9a43-a78023fa2557.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/32c571b9-5e8a-4025-81c9-961eb9f60bb9.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/32c571b9-5e8a-4025-81c9-961eb9f60bb9.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/32c571b9-5e8a-4025-81c9-961eb9f60bb9.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/32c571b9-5e8a-4025-81c9-961eb9f60bb9.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/32d4db5f-43d0-454a-b87f-1e6ff2249465.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/32d4db5f-43d0-454a-b87f-1e6ff2249465.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/32d4db5f-43d0-454a-b87f-1e6ff2249465.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/32d4db5f-43d0-454a-b87f-1e6ff2249465.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/32dd474d-fd73-49dc-aafa-0c9f53cffef9.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/32dd474d-fd73-49dc-aafa-0c9f53cffef9.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/32dd474d-fd73-49dc-aafa-0c9f53cffef9.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/32dd474d-fd73-49dc-aafa-0c9f53cffef9.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/32dfec47-ef28-4146-91d9-bc5335644624.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/32dfec47-ef28-4146-91d9-bc5335644624.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/32dfec47-ef28-4146-91d9-bc5335644624.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/32dfec47-ef28-4146-91d9-bc5335644624.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/32f713c4-9391-4dca-b0b1-b9f53a5372dd.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/32f713c4-9391-4dca-b0b1-b9f53a5372dd.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/32f713c4-9391-4dca-b0b1-b9f53a5372dd.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/32f713c4-9391-4dca-b0b1-b9f53a5372dd.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3302ed2a-5e4c-423e-b704-8146663c4dc2.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3302ed2a-5e4c-423e-b704-8146663c4dc2.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3302ed2a-5e4c-423e-b704-8146663c4dc2.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3302ed2a-5e4c-423e-b704-8146663c4dc2.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/331dd87d-0670-4fef-9dcd-3207a5d17b87.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/331dd87d-0670-4fef-9dcd-3207a5d17b87.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/331dd87d-0670-4fef-9dcd-3207a5d17b87.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/331dd87d-0670-4fef-9dcd-3207a5d17b87.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/33547ded-5d95-429a-b931-33f7fda81738.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/33547ded-5d95-429a-b931-33f7fda81738.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/33547ded-5d95-429a-b931-33f7fda81738.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/33547ded-5d95-429a-b931-33f7fda81738.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3363742c-9b5a-4fcf-a20b-33da136a01c0.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3363742c-9b5a-4fcf-a20b-33da136a01c0.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3363742c-9b5a-4fcf-a20b-33da136a01c0.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3363742c-9b5a-4fcf-a20b-33da136a01c0.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/33a04d9a-de87-41dd-914b-ef09f23bbf62.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/33a04d9a-de87-41dd-914b-ef09f23bbf62.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/33a04d9a-de87-41dd-914b-ef09f23bbf62.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/33a04d9a-de87-41dd-914b-ef09f23bbf62.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/33ab57d2-9bff-4baa-a23b-ffb685862409.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/33ab57d2-9bff-4baa-a23b-ffb685862409.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/33ab57d2-9bff-4baa-a23b-ffb685862409.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/33ab57d2-9bff-4baa-a23b-ffb685862409.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/33b08a33-2b61-4324-b614-da3a857fe8da.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/33b08a33-2b61-4324-b614-da3a857fe8da.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/33b08a33-2b61-4324-b614-da3a857fe8da.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/33b08a33-2b61-4324-b614-da3a857fe8da.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/33b0e9cc-adcf-4ce6-915c-a736f8a05901.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/33b0e9cc-adcf-4ce6-915c-a736f8a05901.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/33b0e9cc-adcf-4ce6-915c-a736f8a05901.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/33b0e9cc-adcf-4ce6-915c-a736f8a05901.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/33e3bb35-ebff-4ebf-a150-110cf5c6afe0.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/33e3bb35-ebff-4ebf-a150-110cf5c6afe0.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/33e3bb35-ebff-4ebf-a150-110cf5c6afe0.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/33e3bb35-ebff-4ebf-a150-110cf5c6afe0.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/33e40b21-4a7c-48d1-ad51-c56f86d7e6c1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/33e40b21-4a7c-48d1-ad51-c56f86d7e6c1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/33e40b21-4a7c-48d1-ad51-c56f86d7e6c1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/33e40b21-4a7c-48d1-ad51-c56f86d7e6c1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/33e4ab2f-cff9-4830-a440-3e05e1c89503.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/33e4ab2f-cff9-4830-a440-3e05e1c89503.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/33e4ab2f-cff9-4830-a440-3e05e1c89503.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/33e4ab2f-cff9-4830-a440-3e05e1c89503.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/33f3a96a-110f-46bd-a5d6-4e0ba75eeb2f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/33f3a96a-110f-46bd-a5d6-4e0ba75eeb2f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/33f3a96a-110f-46bd-a5d6-4e0ba75eeb2f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/33f3a96a-110f-46bd-a5d6-4e0ba75eeb2f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/341e599f-01a3-43ad-bb1e-1b3b62fd7945.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/341e599f-01a3-43ad-bb1e-1b3b62fd7945.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/341e599f-01a3-43ad-bb1e-1b3b62fd7945.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/341e599f-01a3-43ad-bb1e-1b3b62fd7945.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/342aaa46-bd87-4c66-9202-0ff9074f2b77.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/342aaa46-bd87-4c66-9202-0ff9074f2b77.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/342aaa46-bd87-4c66-9202-0ff9074f2b77.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/342aaa46-bd87-4c66-9202-0ff9074f2b77.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/34438712-59d4-4df2-b0e0-e2bc84d672a3.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/34438712-59d4-4df2-b0e0-e2bc84d672a3.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/34438712-59d4-4df2-b0e0-e2bc84d672a3.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/34438712-59d4-4df2-b0e0-e2bc84d672a3.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/344a84d8-a5bd-40e7-9969-7fc24c4d015d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/344a84d8-a5bd-40e7-9969-7fc24c4d015d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/344a84d8-a5bd-40e7-9969-7fc24c4d015d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/344a84d8-a5bd-40e7-9969-7fc24c4d015d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/344dad49-f60e-456f-b423-939bf605b607.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/344dad49-f60e-456f-b423-939bf605b607.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/344dad49-f60e-456f-b423-939bf605b607.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/344dad49-f60e-456f-b423-939bf605b607.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/344f1c04-8b44-4f06-ade0-cf2a5ea28e0b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/344f1c04-8b44-4f06-ade0-cf2a5ea28e0b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/344f1c04-8b44-4f06-ade0-cf2a5ea28e0b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/344f1c04-8b44-4f06-ade0-cf2a5ea28e0b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/345b6a6f-8b84-48ac-baeb-c51b2dc5c50d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/345b6a6f-8b84-48ac-baeb-c51b2dc5c50d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/345b6a6f-8b84-48ac-baeb-c51b2dc5c50d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/345b6a6f-8b84-48ac-baeb-c51b2dc5c50d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/346652da-65b8-451b-b1da-0cfc16574457.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/346652da-65b8-451b-b1da-0cfc16574457.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/346652da-65b8-451b-b1da-0cfc16574457.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/346652da-65b8-451b-b1da-0cfc16574457.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/346c234e-4c88-45f3-a8e0-392fd06e2bfd.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/346c234e-4c88-45f3-a8e0-392fd06e2bfd.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/346c234e-4c88-45f3-a8e0-392fd06e2bfd.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/346c234e-4c88-45f3-a8e0-392fd06e2bfd.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/347192fe-96c1-4969-982f-4a556794aad1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/347192fe-96c1-4969-982f-4a556794aad1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/347192fe-96c1-4969-982f-4a556794aad1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/347192fe-96c1-4969-982f-4a556794aad1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/348a104b-b1bd-4537-bf6a-356bfebbbef9.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/348a104b-b1bd-4537-bf6a-356bfebbbef9.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/348a104b-b1bd-4537-bf6a-356bfebbbef9.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/348a104b-b1bd-4537-bf6a-356bfebbbef9.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/34c29e45-fda1-43a8-9d99-29a5e5d2a1a5.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/34c29e45-fda1-43a8-9d99-29a5e5d2a1a5.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/34c29e45-fda1-43a8-9d99-29a5e5d2a1a5.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/34c29e45-fda1-43a8-9d99-29a5e5d2a1a5.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/34c898cd-00fc-4809-b759-650d4f4ee082.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/34c898cd-00fc-4809-b759-650d4f4ee082.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/34c898cd-00fc-4809-b759-650d4f4ee082.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/34c898cd-00fc-4809-b759-650d4f4ee082.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/34d0bee5-95e9-4f19-80af-0284e8c42e26.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/34d0bee5-95e9-4f19-80af-0284e8c42e26.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/34d0bee5-95e9-4f19-80af-0284e8c42e26.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/34d0bee5-95e9-4f19-80af-0284e8c42e26.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/34d58a92-43a1-4be6-872e-79919fff22f1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/34d58a92-43a1-4be6-872e-79919fff22f1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/34d58a92-43a1-4be6-872e-79919fff22f1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/34d58a92-43a1-4be6-872e-79919fff22f1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/34df4b1d-82f4-49e5-9f3c-17b49c257268.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/34df4b1d-82f4-49e5-9f3c-17b49c257268.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/34df4b1d-82f4-49e5-9f3c-17b49c257268.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/34df4b1d-82f4-49e5-9f3c-17b49c257268.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/34fab4f6-c7d1-412e-8ce3-ff993c215fe1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/34fab4f6-c7d1-412e-8ce3-ff993c215fe1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/34fab4f6-c7d1-412e-8ce3-ff993c215fe1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/34fab4f6-c7d1-412e-8ce3-ff993c215fe1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/34ff6e3a-08c6-46b6-ace5-1054287261f7.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/34ff6e3a-08c6-46b6-ace5-1054287261f7.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/34ff6e3a-08c6-46b6-ace5-1054287261f7.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/34ff6e3a-08c6-46b6-ace5-1054287261f7.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3510d228-2c3f-4206-9d81-a074e1632754.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3510d228-2c3f-4206-9d81-a074e1632754.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3510d228-2c3f-4206-9d81-a074e1632754.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3510d228-2c3f-4206-9d81-a074e1632754.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/35183a7e-f3e5-48d1-aaf5-4e983632dfca.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/35183a7e-f3e5-48d1-aaf5-4e983632dfca.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/35183a7e-f3e5-48d1-aaf5-4e983632dfca.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/35183a7e-f3e5-48d1-aaf5-4e983632dfca.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/35251afb-20e9-4414-bf04-5aca71bdeb7f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/35251afb-20e9-4414-bf04-5aca71bdeb7f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/35251afb-20e9-4414-bf04-5aca71bdeb7f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/35251afb-20e9-4414-bf04-5aca71bdeb7f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3534584e-f82a-4d67-b331-e74f281d695d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3534584e-f82a-4d67-b331-e74f281d695d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3534584e-f82a-4d67-b331-e74f281d695d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3534584e-f82a-4d67-b331-e74f281d695d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/353534be-26c5-430b-8714-9e2af459b92f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/353534be-26c5-430b-8714-9e2af459b92f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/353534be-26c5-430b-8714-9e2af459b92f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/353534be-26c5-430b-8714-9e2af459b92f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/355967f6-c78b-49b7-b427-afd2dc498219.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/355967f6-c78b-49b7-b427-afd2dc498219.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/355967f6-c78b-49b7-b427-afd2dc498219.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/355967f6-c78b-49b7-b427-afd2dc498219.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3571fab9-d4ba-47e9-9478-fb6d0e10138d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3571fab9-d4ba-47e9-9478-fb6d0e10138d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3571fab9-d4ba-47e9-9478-fb6d0e10138d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3571fab9-d4ba-47e9-9478-fb6d0e10138d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/35a8f1c8-235e-402e-bdf3-5c3cb46c44dd.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/35a8f1c8-235e-402e-bdf3-5c3cb46c44dd.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/35a8f1c8-235e-402e-bdf3-5c3cb46c44dd.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/35a8f1c8-235e-402e-bdf3-5c3cb46c44dd.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/35bd6bd6-dca4-4062-bfa6-c6aca3c4cb40.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/35bd6bd6-dca4-4062-bfa6-c6aca3c4cb40.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/35bd6bd6-dca4-4062-bfa6-c6aca3c4cb40.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/35bd6bd6-dca4-4062-bfa6-c6aca3c4cb40.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/35c93035-07e0-49a7-8b33-671c736a8f49.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/35c93035-07e0-49a7-8b33-671c736a8f49.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/35c93035-07e0-49a7-8b33-671c736a8f49.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/35c93035-07e0-49a7-8b33-671c736a8f49.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/35d70375-67d7-469b-8930-062b96abf3fe.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/35d70375-67d7-469b-8930-062b96abf3fe.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/35d70375-67d7-469b-8930-062b96abf3fe.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/35d70375-67d7-469b-8930-062b96abf3fe.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/35f2c5f1-71c0-4fa8-a726-16c997284262.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/35f2c5f1-71c0-4fa8-a726-16c997284262.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/35f2c5f1-71c0-4fa8-a726-16c997284262.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/35f2c5f1-71c0-4fa8-a726-16c997284262.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/360a936f-6113-43c0-9124-e50662917c53.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/360a936f-6113-43c0-9124-e50662917c53.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/360a936f-6113-43c0-9124-e50662917c53.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/360a936f-6113-43c0-9124-e50662917c53.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3616529e-764b-420a-9059-ec0f167d10b1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3616529e-764b-420a-9059-ec0f167d10b1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3616529e-764b-420a-9059-ec0f167d10b1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3616529e-764b-420a-9059-ec0f167d10b1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/362ac4a2-bde9-4e1e-9a33-8af104730332.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/362ac4a2-bde9-4e1e-9a33-8af104730332.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/362ac4a2-bde9-4e1e-9a33-8af104730332.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/362ac4a2-bde9-4e1e-9a33-8af104730332.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/363e855a-6b28-4a4e-b4b8-27a3b192fce9.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/363e855a-6b28-4a4e-b4b8-27a3b192fce9.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/363e855a-6b28-4a4e-b4b8-27a3b192fce9.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/363e855a-6b28-4a4e-b4b8-27a3b192fce9.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3642c9ea-839f-4a72-b7d1-ab3b378bc96b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3642c9ea-839f-4a72-b7d1-ab3b378bc96b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3642c9ea-839f-4a72-b7d1-ab3b378bc96b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3642c9ea-839f-4a72-b7d1-ab3b378bc96b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/36754788-6447-4782-9449-c2446e80cc30.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/36754788-6447-4782-9449-c2446e80cc30.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/36754788-6447-4782-9449-c2446e80cc30.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/36754788-6447-4782-9449-c2446e80cc30.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/367fba07-1835-4cc1-ad90-740ed130be8e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/367fba07-1835-4cc1-ad90-740ed130be8e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/367fba07-1835-4cc1-ad90-740ed130be8e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/367fba07-1835-4cc1-ad90-740ed130be8e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/369cc983-20d7-42ae-967a-c369f335eab8.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/369cc983-20d7-42ae-967a-c369f335eab8.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/369cc983-20d7-42ae-967a-c369f335eab8.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/369cc983-20d7-42ae-967a-c369f335eab8.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/36cd00d4-6f98-40f9-ab33-a2b8578eae23.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/36cd00d4-6f98-40f9-ab33-a2b8578eae23.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/36cd00d4-6f98-40f9-ab33-a2b8578eae23.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/36cd00d4-6f98-40f9-ab33-a2b8578eae23.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/36d34419-c995-4b05-9bb5-9f96525c01a9.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/36d34419-c995-4b05-9bb5-9f96525c01a9.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/36d34419-c995-4b05-9bb5-9f96525c01a9.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/36d34419-c995-4b05-9bb5-9f96525c01a9.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/36d37374-717d-4690-9625-ae7ff88b766f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/36d37374-717d-4690-9625-ae7ff88b766f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/36d37374-717d-4690-9625-ae7ff88b766f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/36d37374-717d-4690-9625-ae7ff88b766f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/371e0c7e-6874-4c04-8d2f-494b66210ca3.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/371e0c7e-6874-4c04-8d2f-494b66210ca3.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/371e0c7e-6874-4c04-8d2f-494b66210ca3.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/371e0c7e-6874-4c04-8d2f-494b66210ca3.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/374a9a8b-eb0d-4d0e-bdc3-6e48d09712bd.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/374a9a8b-eb0d-4d0e-bdc3-6e48d09712bd.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/374a9a8b-eb0d-4d0e-bdc3-6e48d09712bd.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/374a9a8b-eb0d-4d0e-bdc3-6e48d09712bd.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3769dea3-6af7-476d-a607-85d8d79b006d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3769dea3-6af7-476d-a607-85d8d79b006d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3769dea3-6af7-476d-a607-85d8d79b006d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3769dea3-6af7-476d-a607-85d8d79b006d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/376a8354-6941-4c85-9b6b-522da11e38cd.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/376a8354-6941-4c85-9b6b-522da11e38cd.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/376a8354-6941-4c85-9b6b-522da11e38cd.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/376a8354-6941-4c85-9b6b-522da11e38cd.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/378ee0e0-80d4-4c09-b579-cb0794260cc3.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/378ee0e0-80d4-4c09-b579-cb0794260cc3.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/378ee0e0-80d4-4c09-b579-cb0794260cc3.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/378ee0e0-80d4-4c09-b579-cb0794260cc3.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/37ae96b5-26e1-418e-b710-64bc7d89d4b8.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/37ae96b5-26e1-418e-b710-64bc7d89d4b8.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/37ae96b5-26e1-418e-b710-64bc7d89d4b8.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/37ae96b5-26e1-418e-b710-64bc7d89d4b8.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/37af8010-f282-47c0-995c-b1450d2bcd0e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/37af8010-f282-47c0-995c-b1450d2bcd0e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/37af8010-f282-47c0-995c-b1450d2bcd0e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/37af8010-f282-47c0-995c-b1450d2bcd0e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/37e1e04e-f3f3-478f-90dd-cfa60fd1e375.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/37e1e04e-f3f3-478f-90dd-cfa60fd1e375.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/37e1e04e-f3f3-478f-90dd-cfa60fd1e375.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/37e1e04e-f3f3-478f-90dd-cfa60fd1e375.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3803673c-0d33-4500-9494-d1abdc050bf9.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3803673c-0d33-4500-9494-d1abdc050bf9.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3803673c-0d33-4500-9494-d1abdc050bf9.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3803673c-0d33-4500-9494-d1abdc050bf9.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/380e0806-f9b9-4581-ba08-21cacd80beee.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/380e0806-f9b9-4581-ba08-21cacd80beee.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/380e0806-f9b9-4581-ba08-21cacd80beee.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/380e0806-f9b9-4581-ba08-21cacd80beee.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/384cb1e0-baf3-4dd7-bd51-e453d32c3183.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/384cb1e0-baf3-4dd7-bd51-e453d32c3183.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/384cb1e0-baf3-4dd7-bd51-e453d32c3183.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/384cb1e0-baf3-4dd7-bd51-e453d32c3183.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/38518878-b054-4de4-a562-db342f6d9b01.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/38518878-b054-4de4-a562-db342f6d9b01.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/38518878-b054-4de4-a562-db342f6d9b01.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/38518878-b054-4de4-a562-db342f6d9b01.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/386e19d0-1150-43e2-8af2-2cc21823d358.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/386e19d0-1150-43e2-8af2-2cc21823d358.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/386e19d0-1150-43e2-8af2-2cc21823d358.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/386e19d0-1150-43e2-8af2-2cc21823d358.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/38786ef9-61f7-4470-949d-ae9bbb28d562.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/38786ef9-61f7-4470-949d-ae9bbb28d562.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/38786ef9-61f7-4470-949d-ae9bbb28d562.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/38786ef9-61f7-4470-949d-ae9bbb28d562.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/387ccf9c-3ffe-4f2f-ae6b-1a1381998cdc.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/387ccf9c-3ffe-4f2f-ae6b-1a1381998cdc.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/387ccf9c-3ffe-4f2f-ae6b-1a1381998cdc.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/387ccf9c-3ffe-4f2f-ae6b-1a1381998cdc.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/38a88c9a-0687-4591-8e04-5516d316fe47.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/38a88c9a-0687-4591-8e04-5516d316fe47.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/38a88c9a-0687-4591-8e04-5516d316fe47.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/38a88c9a-0687-4591-8e04-5516d316fe47.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/38c0969c-6017-4e48-85a0-df5401195fed.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/38c0969c-6017-4e48-85a0-df5401195fed.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/38c0969c-6017-4e48-85a0-df5401195fed.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/38c0969c-6017-4e48-85a0-df5401195fed.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/38c11818-ae69-4fe6-b6e0-2396669472cc.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/38c11818-ae69-4fe6-b6e0-2396669472cc.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/38c11818-ae69-4fe6-b6e0-2396669472cc.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/38c11818-ae69-4fe6-b6e0-2396669472cc.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/38d64fb8-0e87-41aa-aa52-5f29dee1c3ff.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/38d64fb8-0e87-41aa-aa52-5f29dee1c3ff.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/38d64fb8-0e87-41aa-aa52-5f29dee1c3ff.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/38d64fb8-0e87-41aa-aa52-5f29dee1c3ff.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/38e043f6-8f0e-48c3-ac09-c6cc741699d1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/38e043f6-8f0e-48c3-ac09-c6cc741699d1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/38e043f6-8f0e-48c3-ac09-c6cc741699d1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/38e043f6-8f0e-48c3-ac09-c6cc741699d1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/38fcfe90-7a36-471d-8cf6-fd81a056bc7d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/38fcfe90-7a36-471d-8cf6-fd81a056bc7d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/38fcfe90-7a36-471d-8cf6-fd81a056bc7d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/38fcfe90-7a36-471d-8cf6-fd81a056bc7d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/38fdace6-e04d-4c5c-996a-1df4eaf153a0.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/38fdace6-e04d-4c5c-996a-1df4eaf153a0.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/38fdace6-e04d-4c5c-996a-1df4eaf153a0.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/38fdace6-e04d-4c5c-996a-1df4eaf153a0.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/39301e78-cc00-4d2a-a499-6f065231123b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/39301e78-cc00-4d2a-a499-6f065231123b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/39301e78-cc00-4d2a-a499-6f065231123b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/39301e78-cc00-4d2a-a499-6f065231123b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/395addce-e348-4d87-afe2-77984770b640.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/395addce-e348-4d87-afe2-77984770b640.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/395addce-e348-4d87-afe2-77984770b640.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/395addce-e348-4d87-afe2-77984770b640.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/39667b3e-a04d-47c3-9565-17f5a9dbd46d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/39667b3e-a04d-47c3-9565-17f5a9dbd46d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/39667b3e-a04d-47c3-9565-17f5a9dbd46d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/39667b3e-a04d-47c3-9565-17f5a9dbd46d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3998e128-2467-4889-9b33-379c0b00201a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3998e128-2467-4889-9b33-379c0b00201a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3998e128-2467-4889-9b33-379c0b00201a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3998e128-2467-4889-9b33-379c0b00201a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/39b7a692-2b1c-43e4-b048-b05e6227c834.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/39b7a692-2b1c-43e4-b048-b05e6227c834.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/39b7a692-2b1c-43e4-b048-b05e6227c834.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/39b7a692-2b1c-43e4-b048-b05e6227c834.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/39c72f20-e8ca-43cd-ba43-7048b9b99659.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/39c72f20-e8ca-43cd-ba43-7048b9b99659.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/39c72f20-e8ca-43cd-ba43-7048b9b99659.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/39c72f20-e8ca-43cd-ba43-7048b9b99659.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/39deea09-a16b-425f-8f0a-66e9a0204588.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/39deea09-a16b-425f-8f0a-66e9a0204588.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/39deea09-a16b-425f-8f0a-66e9a0204588.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/39deea09-a16b-425f-8f0a-66e9a0204588.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/39ea87a5-f401-4c55-8ffb-987cd7a3ef49.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/39ea87a5-f401-4c55-8ffb-987cd7a3ef49.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/39ea87a5-f401-4c55-8ffb-987cd7a3ef49.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/39ea87a5-f401-4c55-8ffb-987cd7a3ef49.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3a0d211a-6211-497e-98ec-f93956aa1a0e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3a0d211a-6211-497e-98ec-f93956aa1a0e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3a0d211a-6211-497e-98ec-f93956aa1a0e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3a0d211a-6211-497e-98ec-f93956aa1a0e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3a185814-e9dd-46a8-b5bb-f0d666902a6e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3a185814-e9dd-46a8-b5bb-f0d666902a6e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3a185814-e9dd-46a8-b5bb-f0d666902a6e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3a185814-e9dd-46a8-b5bb-f0d666902a6e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3a3143f0-26ba-4e61-8a5a-c157a037d919.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3a3143f0-26ba-4e61-8a5a-c157a037d919.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3a3143f0-26ba-4e61-8a5a-c157a037d919.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3a3143f0-26ba-4e61-8a5a-c157a037d919.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3a472361-6910-4aba-87c0-35431268aeb6.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3a472361-6910-4aba-87c0-35431268aeb6.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3a472361-6910-4aba-87c0-35431268aeb6.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3a472361-6910-4aba-87c0-35431268aeb6.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3a5f0d93-da42-4db0-b15b-c2e9d85368da.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3a5f0d93-da42-4db0-b15b-c2e9d85368da.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3a5f0d93-da42-4db0-b15b-c2e9d85368da.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3a5f0d93-da42-4db0-b15b-c2e9d85368da.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3a89a592-b948-4fb8-bb50-caf523f6ae07.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3a89a592-b948-4fb8-bb50-caf523f6ae07.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3a89a592-b948-4fb8-bb50-caf523f6ae07.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3a89a592-b948-4fb8-bb50-caf523f6ae07.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3a94af14-35ec-45b6-87f1-f8f26694031a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3a94af14-35ec-45b6-87f1-f8f26694031a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3a94af14-35ec-45b6-87f1-f8f26694031a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3a94af14-35ec-45b6-87f1-f8f26694031a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3ab2b078-91f1-4a86-9f20-207e30f86c06.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3ab2b078-91f1-4a86-9f20-207e30f86c06.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3ab2b078-91f1-4a86-9f20-207e30f86c06.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3ab2b078-91f1-4a86-9f20-207e30f86c06.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3abf138b-8eb2-44a2-a9ed-14b57956047f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3abf138b-8eb2-44a2-a9ed-14b57956047f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3abf138b-8eb2-44a2-a9ed-14b57956047f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3abf138b-8eb2-44a2-a9ed-14b57956047f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3ad2412a-9c36-41e2-a172-1f7fbc224feb.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3ad2412a-9c36-41e2-a172-1f7fbc224feb.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3ad2412a-9c36-41e2-a172-1f7fbc224feb.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3ad2412a-9c36-41e2-a172-1f7fbc224feb.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3ae02454-1ab4-42d5-870c-5b9ffd95f1aa.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3ae02454-1ab4-42d5-870c-5b9ffd95f1aa.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3ae02454-1ab4-42d5-870c-5b9ffd95f1aa.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3ae02454-1ab4-42d5-870c-5b9ffd95f1aa.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3afa9659-c88a-481a-8e19-05f79a87eefb.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3afa9659-c88a-481a-8e19-05f79a87eefb.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3afa9659-c88a-481a-8e19-05f79a87eefb.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3afa9659-c88a-481a-8e19-05f79a87eefb.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3b319fe2-ff32-445f-859d-faaff897d435.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3b319fe2-ff32-445f-859d-faaff897d435.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3b319fe2-ff32-445f-859d-faaff897d435.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3b319fe2-ff32-445f-859d-faaff897d435.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3b533c27-355b-4df3-8777-8449c074e48d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3b533c27-355b-4df3-8777-8449c074e48d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3b533c27-355b-4df3-8777-8449c074e48d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3b533c27-355b-4df3-8777-8449c074e48d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3b628977-65da-4517-b8df-cae471be0c7a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3b628977-65da-4517-b8df-cae471be0c7a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3b628977-65da-4517-b8df-cae471be0c7a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3b628977-65da-4517-b8df-cae471be0c7a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3b813348-4d08-45a3-80f7-7f391b6d0b6c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3b813348-4d08-45a3-80f7-7f391b6d0b6c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3b813348-4d08-45a3-80f7-7f391b6d0b6c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3b813348-4d08-45a3-80f7-7f391b6d0b6c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3ba2aefe-bed3-431c-b14a-cb3ef5c19871.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3ba2aefe-bed3-431c-b14a-cb3ef5c19871.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3ba2aefe-bed3-431c-b14a-cb3ef5c19871.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3ba2aefe-bed3-431c-b14a-cb3ef5c19871.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3bb778e2-14b7-4e62-b28e-5284c7e20736.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3bb778e2-14b7-4e62-b28e-5284c7e20736.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3bb778e2-14b7-4e62-b28e-5284c7e20736.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3bb778e2-14b7-4e62-b28e-5284c7e20736.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3bda7662-ad59-4985-b717-f823aa9dddfe.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3bda7662-ad59-4985-b717-f823aa9dddfe.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3bda7662-ad59-4985-b717-f823aa9dddfe.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3bda7662-ad59-4985-b717-f823aa9dddfe.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3be3303a-ec41-41f7-a430-c4852e2c70c3.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3be3303a-ec41-41f7-a430-c4852e2c70c3.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3be3303a-ec41-41f7-a430-c4852e2c70c3.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3be3303a-ec41-41f7-a430-c4852e2c70c3.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3c399e91-fc5e-4387-b471-a505df1dd7be.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3c399e91-fc5e-4387-b471-a505df1dd7be.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3c399e91-fc5e-4387-b471-a505df1dd7be.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3c399e91-fc5e-4387-b471-a505df1dd7be.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3c47a3d4-4357-4405-b753-da903d3ab3bb.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3c47a3d4-4357-4405-b753-da903d3ab3bb.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3c47a3d4-4357-4405-b753-da903d3ab3bb.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3c47a3d4-4357-4405-b753-da903d3ab3bb.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3c4b5296-4858-4f84-990d-d3ff0a7e404f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3c4b5296-4858-4f84-990d-d3ff0a7e404f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3c4b5296-4858-4f84-990d-d3ff0a7e404f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3c4b5296-4858-4f84-990d-d3ff0a7e404f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3c60a380-0361-4e18-a00f-aa89766aa8ca.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3c60a380-0361-4e18-a00f-aa89766aa8ca.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3c60a380-0361-4e18-a00f-aa89766aa8ca.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3c60a380-0361-4e18-a00f-aa89766aa8ca.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3c68ecb3-c96f-4f98-97d8-e2694fab13cb.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3c68ecb3-c96f-4f98-97d8-e2694fab13cb.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3c68ecb3-c96f-4f98-97d8-e2694fab13cb.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3c68ecb3-c96f-4f98-97d8-e2694fab13cb.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3caf8ce5-6b4e-427e-8b1f-4470fbede306.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3caf8ce5-6b4e-427e-8b1f-4470fbede306.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3caf8ce5-6b4e-427e-8b1f-4470fbede306.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3caf8ce5-6b4e-427e-8b1f-4470fbede306.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3ce6f846-7b19-4e2f-866d-13b23161494d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3ce6f846-7b19-4e2f-866d-13b23161494d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3ce6f846-7b19-4e2f-866d-13b23161494d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3ce6f846-7b19-4e2f-866d-13b23161494d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3d3b603f-3dc2-4a65-b8a5-46557df666cc.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3d3b603f-3dc2-4a65-b8a5-46557df666cc.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3d3b603f-3dc2-4a65-b8a5-46557df666cc.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3d3b603f-3dc2-4a65-b8a5-46557df666cc.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3d623558-75a3-4964-9498-7c5b617f068c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3d623558-75a3-4964-9498-7c5b617f068c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3d623558-75a3-4964-9498-7c5b617f068c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3d623558-75a3-4964-9498-7c5b617f068c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3d6f8c67-aa0a-462e-824c-fff4ab10197b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3d6f8c67-aa0a-462e-824c-fff4ab10197b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3d6f8c67-aa0a-462e-824c-fff4ab10197b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3d6f8c67-aa0a-462e-824c-fff4ab10197b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3d78a9a9-653d-4a46-9594-38ec07840ce1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3d78a9a9-653d-4a46-9594-38ec07840ce1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3d78a9a9-653d-4a46-9594-38ec07840ce1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3d78a9a9-653d-4a46-9594-38ec07840ce1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3d7c30fb-43eb-48aa-ba4f-c304321c3159.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3d7c30fb-43eb-48aa-ba4f-c304321c3159.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3d7c30fb-43eb-48aa-ba4f-c304321c3159.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3d7c30fb-43eb-48aa-ba4f-c304321c3159.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3d850c83-cf97-4924-ad09-77552188d562.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3d850c83-cf97-4924-ad09-77552188d562.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3d850c83-cf97-4924-ad09-77552188d562.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3d850c83-cf97-4924-ad09-77552188d562.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3d876956-8529-4457-83bf-b93c146caaa3.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3d876956-8529-4457-83bf-b93c146caaa3.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3d876956-8529-4457-83bf-b93c146caaa3.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3d876956-8529-4457-83bf-b93c146caaa3.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3d9546f7-0161-4cd3-9bb0-af72ade1dada.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3d9546f7-0161-4cd3-9bb0-af72ade1dada.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3d9546f7-0161-4cd3-9bb0-af72ade1dada.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3d9546f7-0161-4cd3-9bb0-af72ade1dada.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3da0c3ed-97cf-42d0-8999-4469ea707453.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3da0c3ed-97cf-42d0-8999-4469ea707453.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3da0c3ed-97cf-42d0-8999-4469ea707453.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3da0c3ed-97cf-42d0-8999-4469ea707453.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3db39d23-3b5c-4a0a-bd77-eb77006a9cce.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3db39d23-3b5c-4a0a-bd77-eb77006a9cce.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3db39d23-3b5c-4a0a-bd77-eb77006a9cce.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3db39d23-3b5c-4a0a-bd77-eb77006a9cce.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3dedcd9c-0a13-4fff-977d-43bb3499c54d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3dedcd9c-0a13-4fff-977d-43bb3499c54d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3dedcd9c-0a13-4fff-977d-43bb3499c54d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3dedcd9c-0a13-4fff-977d-43bb3499c54d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3e04a61c-baab-4463-8469-61d6e3e0ffcc.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3e04a61c-baab-4463-8469-61d6e3e0ffcc.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3e04a61c-baab-4463-8469-61d6e3e0ffcc.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3e04a61c-baab-4463-8469-61d6e3e0ffcc.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3e0b14e1-da41-4759-acd9-7f1dd0647fbb.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3e0b14e1-da41-4759-acd9-7f1dd0647fbb.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3e0b14e1-da41-4759-acd9-7f1dd0647fbb.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3e0b14e1-da41-4759-acd9-7f1dd0647fbb.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3e0d0512-69a4-4f0a-ab4c-7b64e10b1dd2.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3e0d0512-69a4-4f0a-ab4c-7b64e10b1dd2.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3e0d0512-69a4-4f0a-ab4c-7b64e10b1dd2.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3e0d0512-69a4-4f0a-ab4c-7b64e10b1dd2.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3e1e4b98-7b06-46da-8e65-c5445f8940ff.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3e1e4b98-7b06-46da-8e65-c5445f8940ff.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3e1e4b98-7b06-46da-8e65-c5445f8940ff.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3e1e4b98-7b06-46da-8e65-c5445f8940ff.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3e4e54f6-ba36-43dc-bd71-b0fc2112785d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3e4e54f6-ba36-43dc-bd71-b0fc2112785d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3e4e54f6-ba36-43dc-bd71-b0fc2112785d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3e4e54f6-ba36-43dc-bd71-b0fc2112785d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3e59ad1f-a418-4436-a339-22a8d7a649b0.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3e59ad1f-a418-4436-a339-22a8d7a649b0.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3e59ad1f-a418-4436-a339-22a8d7a649b0.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3e59ad1f-a418-4436-a339-22a8d7a649b0.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3e5ca74b-eca2-4444-8eb7-92702f5e27c0.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3e5ca74b-eca2-4444-8eb7-92702f5e27c0.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3e5ca74b-eca2-4444-8eb7-92702f5e27c0.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3e5ca74b-eca2-4444-8eb7-92702f5e27c0.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3e62662d-357e-4593-828e-a767c1c62f6b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3e62662d-357e-4593-828e-a767c1c62f6b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3e62662d-357e-4593-828e-a767c1c62f6b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3e62662d-357e-4593-828e-a767c1c62f6b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3ebd05ac-51fb-49b7-907b-8bed2612591e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3ebd05ac-51fb-49b7-907b-8bed2612591e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3ebd05ac-51fb-49b7-907b-8bed2612591e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3ebd05ac-51fb-49b7-907b-8bed2612591e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3eca78bc-30d3-42a5-a979-cfba6abbf313.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3eca78bc-30d3-42a5-a979-cfba6abbf313.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3eca78bc-30d3-42a5-a979-cfba6abbf313.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3eca78bc-30d3-42a5-a979-cfba6abbf313.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3effac5f-383a-4be5-9fb3-f5a90a8a9ea4.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3effac5f-383a-4be5-9fb3-f5a90a8a9ea4.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3effac5f-383a-4be5-9fb3-f5a90a8a9ea4.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3effac5f-383a-4be5-9fb3-f5a90a8a9ea4.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3f297867-8d43-435c-b9f9-000d949af931.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3f297867-8d43-435c-b9f9-000d949af931.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3f297867-8d43-435c-b9f9-000d949af931.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3f297867-8d43-435c-b9f9-000d949af931.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3f5289ab-2e89-4a91-a238-add4bbd0b0cb.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3f5289ab-2e89-4a91-a238-add4bbd0b0cb.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3f5289ab-2e89-4a91-a238-add4bbd0b0cb.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3f5289ab-2e89-4a91-a238-add4bbd0b0cb.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3fd4f94c-54f4-478f-adb7-0b1d2dad941f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3fd4f94c-54f4-478f-adb7-0b1d2dad941f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3fd4f94c-54f4-478f-adb7-0b1d2dad941f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3fd4f94c-54f4-478f-adb7-0b1d2dad941f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3ff027b7-d862-4cb2-a5bc-a45ef96e9168.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3ff027b7-d862-4cb2-a5bc-a45ef96e9168.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3ff027b7-d862-4cb2-a5bc-a45ef96e9168.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/3ff027b7-d862-4cb2-a5bc-a45ef96e9168.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4044ad30-23d6-4398-9ee1-2f9e1b302a8d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4044ad30-23d6-4398-9ee1-2f9e1b302a8d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4044ad30-23d6-4398-9ee1-2f9e1b302a8d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4044ad30-23d6-4398-9ee1-2f9e1b302a8d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/40530bfe-c8aa-4e32-a4c0-970198bb38f6.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/40530bfe-c8aa-4e32-a4c0-970198bb38f6.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/40530bfe-c8aa-4e32-a4c0-970198bb38f6.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/40530bfe-c8aa-4e32-a4c0-970198bb38f6.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/40552614-ba38-44b5-84e4-293aade92bf8.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/40552614-ba38-44b5-84e4-293aade92bf8.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/40552614-ba38-44b5-84e4-293aade92bf8.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/40552614-ba38-44b5-84e4-293aade92bf8.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/40598d33-5edc-4cc8-8c3f-522fea2cc3b5.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/40598d33-5edc-4cc8-8c3f-522fea2cc3b5.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/40598d33-5edc-4cc8-8c3f-522fea2cc3b5.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/40598d33-5edc-4cc8-8c3f-522fea2cc3b5.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/406a562f-e380-41dc-bcf9-06d302c82437.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/406a562f-e380-41dc-bcf9-06d302c82437.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/406a562f-e380-41dc-bcf9-06d302c82437.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/406a562f-e380-41dc-bcf9-06d302c82437.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/406b760d-3145-4582-ad69-bf691afb74da.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/406b760d-3145-4582-ad69-bf691afb74da.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/406b760d-3145-4582-ad69-bf691afb74da.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/406b760d-3145-4582-ad69-bf691afb74da.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/40974c23-8e3d-4a89-a342-5836574a6caf.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/40974c23-8e3d-4a89-a342-5836574a6caf.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/40974c23-8e3d-4a89-a342-5836574a6caf.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/40974c23-8e3d-4a89-a342-5836574a6caf.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/40b2b486-5d56-4926-afc1-e0a4abdf9829.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/40b2b486-5d56-4926-afc1-e0a4abdf9829.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/40b2b486-5d56-4926-afc1-e0a4abdf9829.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/40b2b486-5d56-4926-afc1-e0a4abdf9829.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/40ca7d20-09d6-47af-8662-9714551cd2f7.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/40ca7d20-09d6-47af-8662-9714551cd2f7.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/40ca7d20-09d6-47af-8662-9714551cd2f7.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/40ca7d20-09d6-47af-8662-9714551cd2f7.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/410fd908-5d33-4d4d-ac4f-7b8c655799f5.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/410fd908-5d33-4d4d-ac4f-7b8c655799f5.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/410fd908-5d33-4d4d-ac4f-7b8c655799f5.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/410fd908-5d33-4d4d-ac4f-7b8c655799f5.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/410ff3e0-fc97-4046-bd82-cc74609a9c01.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/410ff3e0-fc97-4046-bd82-cc74609a9c01.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/410ff3e0-fc97-4046-bd82-cc74609a9c01.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/410ff3e0-fc97-4046-bd82-cc74609a9c01.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/411b1e05-69eb-4302-8a71-587933c98828.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/411b1e05-69eb-4302-8a71-587933c98828.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/411b1e05-69eb-4302-8a71-587933c98828.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/411b1e05-69eb-4302-8a71-587933c98828.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/412a3d56-8761-4f51-9553-9dc56f99f10e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/412a3d56-8761-4f51-9553-9dc56f99f10e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/412a3d56-8761-4f51-9553-9dc56f99f10e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/412a3d56-8761-4f51-9553-9dc56f99f10e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/41343d36-1c57-4d29-8a95-d779985e1006.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/41343d36-1c57-4d29-8a95-d779985e1006.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/41343d36-1c57-4d29-8a95-d779985e1006.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/41343d36-1c57-4d29-8a95-d779985e1006.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/413f5099-cd92-4167-a65e-9962bc57639a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/413f5099-cd92-4167-a65e-9962bc57639a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/413f5099-cd92-4167-a65e-9962bc57639a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/413f5099-cd92-4167-a65e-9962bc57639a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/41686b45-bd75-498b-a1dc-e166e0f55c21.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/41686b45-bd75-498b-a1dc-e166e0f55c21.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/41686b45-bd75-498b-a1dc-e166e0f55c21.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/41686b45-bd75-498b-a1dc-e166e0f55c21.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/41971700-9d8a-4dff-8b3a-32de8ece5bd7.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/41971700-9d8a-4dff-8b3a-32de8ece5bd7.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/41971700-9d8a-4dff-8b3a-32de8ece5bd7.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/41971700-9d8a-4dff-8b3a-32de8ece5bd7.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/41fee9fb-9265-418b-a452-14d76f2ff46b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/41fee9fb-9265-418b-a452-14d76f2ff46b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/41fee9fb-9265-418b-a452-14d76f2ff46b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/41fee9fb-9265-418b-a452-14d76f2ff46b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/423115a3-41be-4f5c-9606-6fe705400447.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/423115a3-41be-4f5c-9606-6fe705400447.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/423115a3-41be-4f5c-9606-6fe705400447.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/423115a3-41be-4f5c-9606-6fe705400447.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/423e663f-fc6e-46b2-ad1f-3ecfe16ccbe1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/423e663f-fc6e-46b2-ad1f-3ecfe16ccbe1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/423e663f-fc6e-46b2-ad1f-3ecfe16ccbe1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/423e663f-fc6e-46b2-ad1f-3ecfe16ccbe1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/424a0839-cc05-442b-b8a1-f4ece73aafce.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/424a0839-cc05-442b-b8a1-f4ece73aafce.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/424a0839-cc05-442b-b8a1-f4ece73aafce.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/424a0839-cc05-442b-b8a1-f4ece73aafce.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/424fd4ab-62c9-4ee0-b246-c85264d36c8e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/424fd4ab-62c9-4ee0-b246-c85264d36c8e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/424fd4ab-62c9-4ee0-b246-c85264d36c8e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/424fd4ab-62c9-4ee0-b246-c85264d36c8e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/42599288-b3ba-4f4a-8c24-ac1aa55f6acb.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/42599288-b3ba-4f4a-8c24-ac1aa55f6acb.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/42599288-b3ba-4f4a-8c24-ac1aa55f6acb.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/42599288-b3ba-4f4a-8c24-ac1aa55f6acb.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/428820b4-e83a-4424-8942-fe89687ba7a2.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/428820b4-e83a-4424-8942-fe89687ba7a2.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/428820b4-e83a-4424-8942-fe89687ba7a2.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/428820b4-e83a-4424-8942-fe89687ba7a2.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/42abe59d-7648-4f31-8cae-787f4d34c0a1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/42abe59d-7648-4f31-8cae-787f4d34c0a1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/42abe59d-7648-4f31-8cae-787f4d34c0a1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/42abe59d-7648-4f31-8cae-787f4d34c0a1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/42ceb9ed-fcd4-4709-a3c2-9dc802f9b6af.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/42ceb9ed-fcd4-4709-a3c2-9dc802f9b6af.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/42ceb9ed-fcd4-4709-a3c2-9dc802f9b6af.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/42ceb9ed-fcd4-4709-a3c2-9dc802f9b6af.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/42cf8ad6-16f8-486f-8d13-2582e3f283df.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/42cf8ad6-16f8-486f-8d13-2582e3f283df.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/42cf8ad6-16f8-486f-8d13-2582e3f283df.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/42cf8ad6-16f8-486f-8d13-2582e3f283df.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4337dbf6-9814-458a-92fa-f4b36d99473a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4337dbf6-9814-458a-92fa-f4b36d99473a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4337dbf6-9814-458a-92fa-f4b36d99473a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4337dbf6-9814-458a-92fa-f4b36d99473a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/433fb7c8-dd56-4678-8769-81da461a0196.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/433fb7c8-dd56-4678-8769-81da461a0196.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/433fb7c8-dd56-4678-8769-81da461a0196.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/433fb7c8-dd56-4678-8769-81da461a0196.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4361b583-b359-4f05-8ee9-0f5a78bed298.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4361b583-b359-4f05-8ee9-0f5a78bed298.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4361b583-b359-4f05-8ee9-0f5a78bed298.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4361b583-b359-4f05-8ee9-0f5a78bed298.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4362d9ac-b46a-4c43-b7bc-b1c2d600e204.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4362d9ac-b46a-4c43-b7bc-b1c2d600e204.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4362d9ac-b46a-4c43-b7bc-b1c2d600e204.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4362d9ac-b46a-4c43-b7bc-b1c2d600e204.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4377212a-f623-456f-8216-2c4216635ec8.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4377212a-f623-456f-8216-2c4216635ec8.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4377212a-f623-456f-8216-2c4216635ec8.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4377212a-f623-456f-8216-2c4216635ec8.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/437b3e58-06fe-42e7-b4e9-11943c6e3a13.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/437b3e58-06fe-42e7-b4e9-11943c6e3a13.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/437b3e58-06fe-42e7-b4e9-11943c6e3a13.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/437b3e58-06fe-42e7-b4e9-11943c6e3a13.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/43981727-789a-4022-b3f0-26c773753ef3.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/43981727-789a-4022-b3f0-26c773753ef3.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/43981727-789a-4022-b3f0-26c773753ef3.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/43981727-789a-4022-b3f0-26c773753ef3.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/43c58105-f880-4dfc-81c9-81e7d82b3cb3.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/43c58105-f880-4dfc-81c9-81e7d82b3cb3.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/43c58105-f880-4dfc-81c9-81e7d82b3cb3.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/43c58105-f880-4dfc-81c9-81e7d82b3cb3.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/43eec41f-7b1f-40f6-83f8-a900b597303d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/43eec41f-7b1f-40f6-83f8-a900b597303d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/43eec41f-7b1f-40f6-83f8-a900b597303d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/43eec41f-7b1f-40f6-83f8-a900b597303d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/43f07ce8-af2a-4edc-b5c9-a7fa1f3735e9.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/43f07ce8-af2a-4edc-b5c9-a7fa1f3735e9.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/43f07ce8-af2a-4edc-b5c9-a7fa1f3735e9.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/43f07ce8-af2a-4edc-b5c9-a7fa1f3735e9.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4427ad46-e4a1-45f4-abe0-5cee8256649e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4427ad46-e4a1-45f4-abe0-5cee8256649e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4427ad46-e4a1-45f4-abe0-5cee8256649e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4427ad46-e4a1-45f4-abe0-5cee8256649e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4429f610-8944-42ac-8bba-33f5d058bade.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4429f610-8944-42ac-8bba-33f5d058bade.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4429f610-8944-42ac-8bba-33f5d058bade.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4429f610-8944-42ac-8bba-33f5d058bade.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/445b198b-fcda-4ae8-91d2-8b117b8ab232.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/445b198b-fcda-4ae8-91d2-8b117b8ab232.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/445b198b-fcda-4ae8-91d2-8b117b8ab232.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/445b198b-fcda-4ae8-91d2-8b117b8ab232.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/447d0d0c-eabc-4fee-ab11-7299000ef59d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/447d0d0c-eabc-4fee-ab11-7299000ef59d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/447d0d0c-eabc-4fee-ab11-7299000ef59d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/447d0d0c-eabc-4fee-ab11-7299000ef59d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4488e404-e91c-485d-aeae-de79a9e06782.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4488e404-e91c-485d-aeae-de79a9e06782.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4488e404-e91c-485d-aeae-de79a9e06782.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4488e404-e91c-485d-aeae-de79a9e06782.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/44a23048-9178-4b56-8405-f1e1990464cc.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/44a23048-9178-4b56-8405-f1e1990464cc.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/44a23048-9178-4b56-8405-f1e1990464cc.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/44a23048-9178-4b56-8405-f1e1990464cc.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/44b67bb9-e458-4cd0-b957-75088717410d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/44b67bb9-e458-4cd0-b957-75088717410d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/44b67bb9-e458-4cd0-b957-75088717410d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/44b67bb9-e458-4cd0-b957-75088717410d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/44b69b62-390e-48cd-98b4-62aac6cef575.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/44b69b62-390e-48cd-98b4-62aac6cef575.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/44b69b62-390e-48cd-98b4-62aac6cef575.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/44b69b62-390e-48cd-98b4-62aac6cef575.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/44bfbcf3-675c-4ea9-81ac-af9fcfd41113.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/44bfbcf3-675c-4ea9-81ac-af9fcfd41113.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/44bfbcf3-675c-4ea9-81ac-af9fcfd41113.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/44bfbcf3-675c-4ea9-81ac-af9fcfd41113.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/44d922e5-3460-4bd8-9807-7344290c8009.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/44d922e5-3460-4bd8-9807-7344290c8009.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/44d922e5-3460-4bd8-9807-7344290c8009.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/44d922e5-3460-4bd8-9807-7344290c8009.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/44e57901-6747-4876-a172-089336040c55.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/44e57901-6747-4876-a172-089336040c55.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/44e57901-6747-4876-a172-089336040c55.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/44e57901-6747-4876-a172-089336040c55.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/44f57d38-cdb9-4473-aed6-3d6b75856904.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/44f57d38-cdb9-4473-aed6-3d6b75856904.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/44f57d38-cdb9-4473-aed6-3d6b75856904.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/44f57d38-cdb9-4473-aed6-3d6b75856904.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/450e5f8b-12fa-4c39-879f-9ae7921f4504.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/450e5f8b-12fa-4c39-879f-9ae7921f4504.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/450e5f8b-12fa-4c39-879f-9ae7921f4504.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/450e5f8b-12fa-4c39-879f-9ae7921f4504.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/45215740-c0b2-4b9b-ae39-9654494c4a55.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/45215740-c0b2-4b9b-ae39-9654494c4a55.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/45215740-c0b2-4b9b-ae39-9654494c4a55.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/45215740-c0b2-4b9b-ae39-9654494c4a55.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/452f7e89-2c89-413a-91cd-5151c841b63d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/452f7e89-2c89-413a-91cd-5151c841b63d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/452f7e89-2c89-413a-91cd-5151c841b63d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/452f7e89-2c89-413a-91cd-5151c841b63d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4540863e-6d37-421b-8c1f-58a76a969221.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4540863e-6d37-421b-8c1f-58a76a969221.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4540863e-6d37-421b-8c1f-58a76a969221.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4540863e-6d37-421b-8c1f-58a76a969221.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/455729e0-5b98-4e40-9b45-61b75ba8f657.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/455729e0-5b98-4e40-9b45-61b75ba8f657.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/455729e0-5b98-4e40-9b45-61b75ba8f657.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/455729e0-5b98-4e40-9b45-61b75ba8f657.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/457a155b-4153-41fb-b195-767a57939644.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/457a155b-4153-41fb-b195-767a57939644.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/457a155b-4153-41fb-b195-767a57939644.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/457a155b-4153-41fb-b195-767a57939644.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4592e064-06cc-4b54-891e-3dc586a215d0.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4592e064-06cc-4b54-891e-3dc586a215d0.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4592e064-06cc-4b54-891e-3dc586a215d0.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4592e064-06cc-4b54-891e-3dc586a215d0.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/459a2f1d-4883-4246-b39e-d92678fe2789.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/459a2f1d-4883-4246-b39e-d92678fe2789.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/459a2f1d-4883-4246-b39e-d92678fe2789.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/459a2f1d-4883-4246-b39e-d92678fe2789.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/45a60d6b-6769-4833-a72d-5d3503479b69.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/45a60d6b-6769-4833-a72d-5d3503479b69.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/45a60d6b-6769-4833-a72d-5d3503479b69.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/45a60d6b-6769-4833-a72d-5d3503479b69.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/45cdd89a-82fa-417d-aded-e00e4a764001.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/45cdd89a-82fa-417d-aded-e00e4a764001.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/45cdd89a-82fa-417d-aded-e00e4a764001.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/45cdd89a-82fa-417d-aded-e00e4a764001.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/45de42f6-b255-471a-9824-df5cfebe763b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/45de42f6-b255-471a-9824-df5cfebe763b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/45de42f6-b255-471a-9824-df5cfebe763b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/45de42f6-b255-471a-9824-df5cfebe763b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/45e8d923-6edc-4130-954f-de43a774b6c4.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/45e8d923-6edc-4130-954f-de43a774b6c4.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/45e8d923-6edc-4130-954f-de43a774b6c4.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/45e8d923-6edc-4130-954f-de43a774b6c4.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4624894c-301e-4e82-b048-bb1f5d349c61.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4624894c-301e-4e82-b048-bb1f5d349c61.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4624894c-301e-4e82-b048-bb1f5d349c61.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4624894c-301e-4e82-b048-bb1f5d349c61.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/463ee9cf-fedf-45d6-950a-b6351514200c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/463ee9cf-fedf-45d6-950a-b6351514200c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/463ee9cf-fedf-45d6-950a-b6351514200c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/463ee9cf-fedf-45d6-950a-b6351514200c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/463f23ed-58ff-4ddd-af76-96a19362850a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/463f23ed-58ff-4ddd-af76-96a19362850a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/463f23ed-58ff-4ddd-af76-96a19362850a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/463f23ed-58ff-4ddd-af76-96a19362850a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/46af0ce4-c5b9-4e24-b2bc-8d839783511a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/46af0ce4-c5b9-4e24-b2bc-8d839783511a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/46af0ce4-c5b9-4e24-b2bc-8d839783511a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/46af0ce4-c5b9-4e24-b2bc-8d839783511a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/46bdc73b-00dd-46f8-9d1d-8667bd4e98d1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/46bdc73b-00dd-46f8-9d1d-8667bd4e98d1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/46bdc73b-00dd-46f8-9d1d-8667bd4e98d1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/46bdc73b-00dd-46f8-9d1d-8667bd4e98d1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/46bde59c-2d3e-4a54-88c0-5712c83973f8.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/46bde59c-2d3e-4a54-88c0-5712c83973f8.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/46bde59c-2d3e-4a54-88c0-5712c83973f8.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/46bde59c-2d3e-4a54-88c0-5712c83973f8.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/46bf3477-9283-4d2f-95d3-3152747a14ab.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/46bf3477-9283-4d2f-95d3-3152747a14ab.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/46bf3477-9283-4d2f-95d3-3152747a14ab.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/46bf3477-9283-4d2f-95d3-3152747a14ab.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/46f5f352-25a0-458f-83ac-2600e796f20a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/46f5f352-25a0-458f-83ac-2600e796f20a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/46f5f352-25a0-458f-83ac-2600e796f20a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/46f5f352-25a0-458f-83ac-2600e796f20a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/46f713aa-bf52-4f51-8cf6-33f646543643.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/46f713aa-bf52-4f51-8cf6-33f646543643.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/46f713aa-bf52-4f51-8cf6-33f646543643.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/46f713aa-bf52-4f51-8cf6-33f646543643.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/473431f8-47fc-4d90-b428-a85fd607e406.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/473431f8-47fc-4d90-b428-a85fd607e406.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/473431f8-47fc-4d90-b428-a85fd607e406.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/473431f8-47fc-4d90-b428-a85fd607e406.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/47630ef2-ec2b-4aa3-ab0c-e19a1066f841.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/47630ef2-ec2b-4aa3-ab0c-e19a1066f841.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/47630ef2-ec2b-4aa3-ab0c-e19a1066f841.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/47630ef2-ec2b-4aa3-ab0c-e19a1066f841.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4768cff5-1294-4555-9d7a-35fece1696e7.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4768cff5-1294-4555-9d7a-35fece1696e7.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4768cff5-1294-4555-9d7a-35fece1696e7.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4768cff5-1294-4555-9d7a-35fece1696e7.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/47740041-cc54-4fed-a1c6-e4432d27bc9c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/47740041-cc54-4fed-a1c6-e4432d27bc9c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/47740041-cc54-4fed-a1c6-e4432d27bc9c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/47740041-cc54-4fed-a1c6-e4432d27bc9c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4774afb2-2799-4e1d-86cf-71bc598a17a9.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4774afb2-2799-4e1d-86cf-71bc598a17a9.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4774afb2-2799-4e1d-86cf-71bc598a17a9.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4774afb2-2799-4e1d-86cf-71bc598a17a9.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/47a0904e-0879-4618-8572-a1d03ca341a4.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/47a0904e-0879-4618-8572-a1d03ca341a4.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/47a0904e-0879-4618-8572-a1d03ca341a4.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/47a0904e-0879-4618-8572-a1d03ca341a4.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/47b0d2bb-0100-404c-9f80-c6cbf2138b5d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/47b0d2bb-0100-404c-9f80-c6cbf2138b5d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/47b0d2bb-0100-404c-9f80-c6cbf2138b5d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/47b0d2bb-0100-404c-9f80-c6cbf2138b5d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/47d387b4-691a-4b89-8f5b-76cd13c4ad94.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/47d387b4-691a-4b89-8f5b-76cd13c4ad94.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/47d387b4-691a-4b89-8f5b-76cd13c4ad94.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/47d387b4-691a-4b89-8f5b-76cd13c4ad94.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/47d41cfe-28f6-446d-8c45-af96c8b9ae05.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/47d41cfe-28f6-446d-8c45-af96c8b9ae05.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/47d41cfe-28f6-446d-8c45-af96c8b9ae05.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/47d41cfe-28f6-446d-8c45-af96c8b9ae05.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/47fb3a1f-6128-41b4-9ca6-83a52b459b8e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/47fb3a1f-6128-41b4-9ca6-83a52b459b8e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/47fb3a1f-6128-41b4-9ca6-83a52b459b8e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/47fb3a1f-6128-41b4-9ca6-83a52b459b8e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4829e155-0b21-41a0-8cad-3a2e3bdec14c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4829e155-0b21-41a0-8cad-3a2e3bdec14c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4829e155-0b21-41a0-8cad-3a2e3bdec14c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4829e155-0b21-41a0-8cad-3a2e3bdec14c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/487f191b-ddcc-437c-bddd-c3044e843b44.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/487f191b-ddcc-437c-bddd-c3044e843b44.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/487f191b-ddcc-437c-bddd-c3044e843b44.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/487f191b-ddcc-437c-bddd-c3044e843b44.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4882dcf9-930c-4a88-bdca-f0f048ff89cf.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4882dcf9-930c-4a88-bdca-f0f048ff89cf.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4882dcf9-930c-4a88-bdca-f0f048ff89cf.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4882dcf9-930c-4a88-bdca-f0f048ff89cf.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/488e1a10-3d1e-4ba0-bb76-9eef40f16ebf.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/488e1a10-3d1e-4ba0-bb76-9eef40f16ebf.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/488e1a10-3d1e-4ba0-bb76-9eef40f16ebf.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/488e1a10-3d1e-4ba0-bb76-9eef40f16ebf.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/48aabc22-2836-46d8-812c-dddab3b804db.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/48aabc22-2836-46d8-812c-dddab3b804db.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/48aabc22-2836-46d8-812c-dddab3b804db.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/48aabc22-2836-46d8-812c-dddab3b804db.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/48b14924-23e6-43c5-8c4e-dec91c20c0ae.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/48b14924-23e6-43c5-8c4e-dec91c20c0ae.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/48b14924-23e6-43c5-8c4e-dec91c20c0ae.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/48b14924-23e6-43c5-8c4e-dec91c20c0ae.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/48bc05c4-8a10-4c6a-b93d-f9fb4befa66b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/48bc05c4-8a10-4c6a-b93d-f9fb4befa66b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/48bc05c4-8a10-4c6a-b93d-f9fb4befa66b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/48bc05c4-8a10-4c6a-b93d-f9fb4befa66b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/48f4da85-709d-4d98-aa39-d5463eeef594.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/48f4da85-709d-4d98-aa39-d5463eeef594.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/48f4da85-709d-4d98-aa39-d5463eeef594.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/48f4da85-709d-4d98-aa39-d5463eeef594.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4900609a-2fc0-4d0b-9e0f-70458d73ec5b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4900609a-2fc0-4d0b-9e0f-70458d73ec5b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4900609a-2fc0-4d0b-9e0f-70458d73ec5b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4900609a-2fc0-4d0b-9e0f-70458d73ec5b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4909e97b-b2f1-44d1-9e30-a7c51f11b19e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4909e97b-b2f1-44d1-9e30-a7c51f11b19e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4909e97b-b2f1-44d1-9e30-a7c51f11b19e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4909e97b-b2f1-44d1-9e30-a7c51f11b19e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/492166ea-c866-4d75-99a8-85849a48e428.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/492166ea-c866-4d75-99a8-85849a48e428.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/492166ea-c866-4d75-99a8-85849a48e428.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/492166ea-c866-4d75-99a8-85849a48e428.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/49294cb0-5fd6-4769-89a1-91d271a2abae.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/49294cb0-5fd6-4769-89a1-91d271a2abae.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/49294cb0-5fd6-4769-89a1-91d271a2abae.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/49294cb0-5fd6-4769-89a1-91d271a2abae.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/49305898-2431-4b6a-ab59-561077316525.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/49305898-2431-4b6a-ab59-561077316525.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/49305898-2431-4b6a-ab59-561077316525.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/49305898-2431-4b6a-ab59-561077316525.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/493b6db7-d053-4d6a-827c-9259e91e2527.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/493b6db7-d053-4d6a-827c-9259e91e2527.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/493b6db7-d053-4d6a-827c-9259e91e2527.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/493b6db7-d053-4d6a-827c-9259e91e2527.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/494e5350-f38d-4585-acfe-10a2695ca620.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/494e5350-f38d-4585-acfe-10a2695ca620.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/494e5350-f38d-4585-acfe-10a2695ca620.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/494e5350-f38d-4585-acfe-10a2695ca620.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/495bcc91-daae-490e-a75f-3cbf83477384.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/495bcc91-daae-490e-a75f-3cbf83477384.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/495bcc91-daae-490e-a75f-3cbf83477384.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/495bcc91-daae-490e-a75f-3cbf83477384.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/49618a5e-3a19-4f03-9ce8-6fe5d0e54a80.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/49618a5e-3a19-4f03-9ce8-6fe5d0e54a80.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/49618a5e-3a19-4f03-9ce8-6fe5d0e54a80.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/49618a5e-3a19-4f03-9ce8-6fe5d0e54a80.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/49622d46-1f35-4293-9ba7-121a753f068f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/49622d46-1f35-4293-9ba7-121a753f068f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/49622d46-1f35-4293-9ba7-121a753f068f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/49622d46-1f35-4293-9ba7-121a753f068f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/496576f6-4ba5-436d-83c0-2da0265f7741.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/496576f6-4ba5-436d-83c0-2da0265f7741.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/496576f6-4ba5-436d-83c0-2da0265f7741.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/496576f6-4ba5-436d-83c0-2da0265f7741.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4996e1fa-e049-41cd-b224-b1046472f32e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4996e1fa-e049-41cd-b224-b1046472f32e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4996e1fa-e049-41cd-b224-b1046472f32e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4996e1fa-e049-41cd-b224-b1046472f32e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/49b65eff-c325-400b-b8fc-c8af162e3857.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/49b65eff-c325-400b-b8fc-c8af162e3857.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/49b65eff-c325-400b-b8fc-c8af162e3857.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/49b65eff-c325-400b-b8fc-c8af162e3857.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/49cd7a27-bbfa-4995-a778-9888cb7bb4e2.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/49cd7a27-bbfa-4995-a778-9888cb7bb4e2.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/49cd7a27-bbfa-4995-a778-9888cb7bb4e2.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/49cd7a27-bbfa-4995-a778-9888cb7bb4e2.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/49e1d5d6-87ee-48d8-8553-1620c1079132.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/49e1d5d6-87ee-48d8-8553-1620c1079132.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/49e1d5d6-87ee-48d8-8553-1620c1079132.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/49e1d5d6-87ee-48d8-8553-1620c1079132.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/49f2fa45-0f81-4f48-b393-50abc05e3f75.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/49f2fa45-0f81-4f48-b393-50abc05e3f75.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/49f2fa45-0f81-4f48-b393-50abc05e3f75.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/49f2fa45-0f81-4f48-b393-50abc05e3f75.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4a10cb91-a388-420e-ae10-0b9cf38c34e3.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4a10cb91-a388-420e-ae10-0b9cf38c34e3.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4a10cb91-a388-420e-ae10-0b9cf38c34e3.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4a10cb91-a388-420e-ae10-0b9cf38c34e3.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4a2a2e28-92a6-4ee1-b6f6-0e8e919d634f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4a2a2e28-92a6-4ee1-b6f6-0e8e919d634f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4a2a2e28-92a6-4ee1-b6f6-0e8e919d634f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4a2a2e28-92a6-4ee1-b6f6-0e8e919d634f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4a3d5e9c-90c3-4ba4-b1b6-dee5698b5c04.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4a3d5e9c-90c3-4ba4-b1b6-dee5698b5c04.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4a3d5e9c-90c3-4ba4-b1b6-dee5698b5c04.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4a3d5e9c-90c3-4ba4-b1b6-dee5698b5c04.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4a5309dc-8ea2-47da-b544-11e00499370c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4a5309dc-8ea2-47da-b544-11e00499370c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4a5309dc-8ea2-47da-b544-11e00499370c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4a5309dc-8ea2-47da-b544-11e00499370c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4a705734-d740-43e3-b29f-39e50f455df0.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4a705734-d740-43e3-b29f-39e50f455df0.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4a705734-d740-43e3-b29f-39e50f455df0.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4a705734-d740-43e3-b29f-39e50f455df0.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4a872c55-5e1f-40bd-84e1-62efef230adc.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4a872c55-5e1f-40bd-84e1-62efef230adc.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4a872c55-5e1f-40bd-84e1-62efef230adc.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4a872c55-5e1f-40bd-84e1-62efef230adc.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4a969242-9f88-4efe-89b0-ede5772e5f94.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4a969242-9f88-4efe-89b0-ede5772e5f94.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4a969242-9f88-4efe-89b0-ede5772e5f94.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4a969242-9f88-4efe-89b0-ede5772e5f94.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4a97b48a-3309-4253-8bdb-6607b56d98cb.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4a97b48a-3309-4253-8bdb-6607b56d98cb.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4a97b48a-3309-4253-8bdb-6607b56d98cb.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4a97b48a-3309-4253-8bdb-6607b56d98cb.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4ab71322-4ebc-4865-907f-69087ff29706.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4ab71322-4ebc-4865-907f-69087ff29706.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4ab71322-4ebc-4865-907f-69087ff29706.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4ab71322-4ebc-4865-907f-69087ff29706.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4abff7fe-4853-4631-9461-50f0c3af0d0f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4abff7fe-4853-4631-9461-50f0c3af0d0f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4abff7fe-4853-4631-9461-50f0c3af0d0f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4abff7fe-4853-4631-9461-50f0c3af0d0f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4ae89df5-26e5-45c5-9ddd-b6f773bbd172.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4ae89df5-26e5-45c5-9ddd-b6f773bbd172.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4ae89df5-26e5-45c5-9ddd-b6f773bbd172.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4ae89df5-26e5-45c5-9ddd-b6f773bbd172.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4af2fade-5ac9-49d8-9c09-7846708025bb.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4af2fade-5ac9-49d8-9c09-7846708025bb.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4af2fade-5ac9-49d8-9c09-7846708025bb.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4af2fade-5ac9-49d8-9c09-7846708025bb.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4afcb92a-5a81-474c-88a6-135111bcc8e8.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4afcb92a-5a81-474c-88a6-135111bcc8e8.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4afcb92a-5a81-474c-88a6-135111bcc8e8.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4afcb92a-5a81-474c-88a6-135111bcc8e8.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4b1aeebf-8afb-4559-a099-0ee38e1c8cca.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4b1aeebf-8afb-4559-a099-0ee38e1c8cca.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4b1aeebf-8afb-4559-a099-0ee38e1c8cca.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4b1aeebf-8afb-4559-a099-0ee38e1c8cca.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4b1f4157-510e-4564-b3cd-b4b2106fea61.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4b1f4157-510e-4564-b3cd-b4b2106fea61.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4b1f4157-510e-4564-b3cd-b4b2106fea61.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4b1f4157-510e-4564-b3cd-b4b2106fea61.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4b2a6f86-6085-4a36-900c-5fd610b04f2b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4b2a6f86-6085-4a36-900c-5fd610b04f2b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4b2a6f86-6085-4a36-900c-5fd610b04f2b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4b2a6f86-6085-4a36-900c-5fd610b04f2b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4b6489fb-0987-4c8b-abdd-a99d024e828b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4b6489fb-0987-4c8b-abdd-a99d024e828b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4b6489fb-0987-4c8b-abdd-a99d024e828b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4b6489fb-0987-4c8b-abdd-a99d024e828b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4b783a6a-9f6d-4c8c-87ad-f612b82f180b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4b783a6a-9f6d-4c8c-87ad-f612b82f180b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4b783a6a-9f6d-4c8c-87ad-f612b82f180b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4b783a6a-9f6d-4c8c-87ad-f612b82f180b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4b8d23c2-b79f-4b2c-aa64-1a5d6d5d013a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4b8d23c2-b79f-4b2c-aa64-1a5d6d5d013a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4b8d23c2-b79f-4b2c-aa64-1a5d6d5d013a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4b8d23c2-b79f-4b2c-aa64-1a5d6d5d013a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4b96a42a-6226-4d2d-8902-cd4f48b887a6.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4b96a42a-6226-4d2d-8902-cd4f48b887a6.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4b96a42a-6226-4d2d-8902-cd4f48b887a6.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4b96a42a-6226-4d2d-8902-cd4f48b887a6.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4c1d30c0-2d15-4daa-9fb5-bf3244032813.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4c1d30c0-2d15-4daa-9fb5-bf3244032813.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4c1d30c0-2d15-4daa-9fb5-bf3244032813.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4c1d30c0-2d15-4daa-9fb5-bf3244032813.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4c2412f1-e077-43f3-8500-5a31d8172863.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4c2412f1-e077-43f3-8500-5a31d8172863.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4c2412f1-e077-43f3-8500-5a31d8172863.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4c2412f1-e077-43f3-8500-5a31d8172863.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4c54ca4f-a039-4ce1-8ff0-cafbdb80c3d6.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4c54ca4f-a039-4ce1-8ff0-cafbdb80c3d6.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4c54ca4f-a039-4ce1-8ff0-cafbdb80c3d6.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4c54ca4f-a039-4ce1-8ff0-cafbdb80c3d6.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4c6618e0-85d3-4fc6-922d-b7b5b39a4b5e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4c6618e0-85d3-4fc6-922d-b7b5b39a4b5e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4c6618e0-85d3-4fc6-922d-b7b5b39a4b5e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4c6618e0-85d3-4fc6-922d-b7b5b39a4b5e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4c8107e7-7a52-422c-a848-bc2d75242041.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4c8107e7-7a52-422c-a848-bc2d75242041.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4c8107e7-7a52-422c-a848-bc2d75242041.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4c8107e7-7a52-422c-a848-bc2d75242041.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4c891094-8c89-4ee5-a0bc-986f8c591d68.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4c891094-8c89-4ee5-a0bc-986f8c591d68.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4c891094-8c89-4ee5-a0bc-986f8c591d68.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4c891094-8c89-4ee5-a0bc-986f8c591d68.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4c8f9959-b613-48a0-96ed-ed8871a0a4b4.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4c8f9959-b613-48a0-96ed-ed8871a0a4b4.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4c8f9959-b613-48a0-96ed-ed8871a0a4b4.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4c8f9959-b613-48a0-96ed-ed8871a0a4b4.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4ca0059b-65db-4c84-b6db-dbd535562585.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4ca0059b-65db-4c84-b6db-dbd535562585.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4ca0059b-65db-4c84-b6db-dbd535562585.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4ca0059b-65db-4c84-b6db-dbd535562585.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4ca1c51c-36b9-4f30-80ef-92484b634101.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4ca1c51c-36b9-4f30-80ef-92484b634101.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4ca1c51c-36b9-4f30-80ef-92484b634101.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4ca1c51c-36b9-4f30-80ef-92484b634101.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4ca5608b-50aa-4c04-8b5d-2342c63a198c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4ca5608b-50aa-4c04-8b5d-2342c63a198c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4ca5608b-50aa-4c04-8b5d-2342c63a198c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4ca5608b-50aa-4c04-8b5d-2342c63a198c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4cb0376a-3e99-48d8-80e0-6833a0b7cdd2.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4cb0376a-3e99-48d8-80e0-6833a0b7cdd2.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4cb0376a-3e99-48d8-80e0-6833a0b7cdd2.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4cb0376a-3e99-48d8-80e0-6833a0b7cdd2.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4cc39a85-fa80-44e5-89b6-8177b7082f92.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4cc39a85-fa80-44e5-89b6-8177b7082f92.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4cc39a85-fa80-44e5-89b6-8177b7082f92.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4cc39a85-fa80-44e5-89b6-8177b7082f92.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4cc878e0-9054-435e-9306-396f373ff1ee.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4cc878e0-9054-435e-9306-396f373ff1ee.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4cc878e0-9054-435e-9306-396f373ff1ee.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4cc878e0-9054-435e-9306-396f373ff1ee.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4cd49822-e401-4513-b730-f7a51772547c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4cd49822-e401-4513-b730-f7a51772547c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4cd49822-e401-4513-b730-f7a51772547c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4cd49822-e401-4513-b730-f7a51772547c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4ce1ee5e-f954-499c-921c-d13e47c52fd7.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4ce1ee5e-f954-499c-921c-d13e47c52fd7.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4ce1ee5e-f954-499c-921c-d13e47c52fd7.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4ce1ee5e-f954-499c-921c-d13e47c52fd7.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4ce7e2a4-8378-4d88-b7c4-fc3fc698aeca.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4ce7e2a4-8378-4d88-b7c4-fc3fc698aeca.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4ce7e2a4-8378-4d88-b7c4-fc3fc698aeca.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4ce7e2a4-8378-4d88-b7c4-fc3fc698aeca.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4d0fdefe-8656-46c9-95a2-87ee644c57ce.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4d0fdefe-8656-46c9-95a2-87ee644c57ce.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4d0fdefe-8656-46c9-95a2-87ee644c57ce.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4d0fdefe-8656-46c9-95a2-87ee644c57ce.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4d30f823-a8dc-4cd8-a9b2-a13c9b7c33e3.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4d30f823-a8dc-4cd8-a9b2-a13c9b7c33e3.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4d30f823-a8dc-4cd8-a9b2-a13c9b7c33e3.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4d30f823-a8dc-4cd8-a9b2-a13c9b7c33e3.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4d4ed945-76f2-4868-b6ec-3e98d36f4a5e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4d4ed945-76f2-4868-b6ec-3e98d36f4a5e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4d4ed945-76f2-4868-b6ec-3e98d36f4a5e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4d4ed945-76f2-4868-b6ec-3e98d36f4a5e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4d573c05-8c61-4e91-a92e-38beef88e8d9.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4d573c05-8c61-4e91-a92e-38beef88e8d9.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4d573c05-8c61-4e91-a92e-38beef88e8d9.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4d573c05-8c61-4e91-a92e-38beef88e8d9.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4db4294c-5130-4ab9-bb6d-e16018854ab2.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4db4294c-5130-4ab9-bb6d-e16018854ab2.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4db4294c-5130-4ab9-bb6d-e16018854ab2.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4db4294c-5130-4ab9-bb6d-e16018854ab2.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4dc5106c-2ae2-422d-966d-0d7466c6ad51.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4dc5106c-2ae2-422d-966d-0d7466c6ad51.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4dc5106c-2ae2-422d-966d-0d7466c6ad51.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4dc5106c-2ae2-422d-966d-0d7466c6ad51.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4de107d2-1071-4b02-a873-72b6c8515280.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4de107d2-1071-4b02-a873-72b6c8515280.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4de107d2-1071-4b02-a873-72b6c8515280.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4de107d2-1071-4b02-a873-72b6c8515280.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4de308ff-f691-49d4-85b0-ee7a330cce2f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4de308ff-f691-49d4-85b0-ee7a330cce2f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4de308ff-f691-49d4-85b0-ee7a330cce2f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4de308ff-f691-49d4-85b0-ee7a330cce2f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4de9382c-c2c1-456f-9822-2f6f38f1a651.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4de9382c-c2c1-456f-9822-2f6f38f1a651.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4de9382c-c2c1-456f-9822-2f6f38f1a651.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4de9382c-c2c1-456f-9822-2f6f38f1a651.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4de94def-9e46-4d4e-beea-c4b3b9c328e5.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4de94def-9e46-4d4e-beea-c4b3b9c328e5.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4de94def-9e46-4d4e-beea-c4b3b9c328e5.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4de94def-9e46-4d4e-beea-c4b3b9c328e5.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4df50bba-7425-4103-8733-ac349af75997.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4df50bba-7425-4103-8733-ac349af75997.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4df50bba-7425-4103-8733-ac349af75997.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4df50bba-7425-4103-8733-ac349af75997.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4e0be864-15b9-4e6e-8e72-40a1df38914a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4e0be864-15b9-4e6e-8e72-40a1df38914a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4e0be864-15b9-4e6e-8e72-40a1df38914a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4e0be864-15b9-4e6e-8e72-40a1df38914a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4e246913-a51a-428f-b5ca-6548f9702b61.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4e246913-a51a-428f-b5ca-6548f9702b61.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4e246913-a51a-428f-b5ca-6548f9702b61.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4e246913-a51a-428f-b5ca-6548f9702b61.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4e331733-ac5a-470d-b925-111a441335bf.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4e331733-ac5a-470d-b925-111a441335bf.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4e331733-ac5a-470d-b925-111a441335bf.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4e331733-ac5a-470d-b925-111a441335bf.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4e845139-0257-4b12-b0ff-97636237c300.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4e845139-0257-4b12-b0ff-97636237c300.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4e845139-0257-4b12-b0ff-97636237c300.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4e845139-0257-4b12-b0ff-97636237c300.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4e931b06-a91a-425c-a1f4-4c90f999da31.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4e931b06-a91a-425c-a1f4-4c90f999da31.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4e931b06-a91a-425c-a1f4-4c90f999da31.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4e931b06-a91a-425c-a1f4-4c90f999da31.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4e9dac48-17a9-4e7f-91f7-dcdc162b21a0.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4e9dac48-17a9-4e7f-91f7-dcdc162b21a0.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4e9dac48-17a9-4e7f-91f7-dcdc162b21a0.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4e9dac48-17a9-4e7f-91f7-dcdc162b21a0.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4ea0945d-b57f-48ec-ae1e-1d85b79dc695.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4ea0945d-b57f-48ec-ae1e-1d85b79dc695.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4ea0945d-b57f-48ec-ae1e-1d85b79dc695.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4ea0945d-b57f-48ec-ae1e-1d85b79dc695.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4ea3e1aa-b3d3-44ec-b28b-6f9061b28367.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4ea3e1aa-b3d3-44ec-b28b-6f9061b28367.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4ea3e1aa-b3d3-44ec-b28b-6f9061b28367.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4ea3e1aa-b3d3-44ec-b28b-6f9061b28367.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4ebef52e-96c5-4769-9bac-8eb1024edf32.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4ebef52e-96c5-4769-9bac-8eb1024edf32.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4ebef52e-96c5-4769-9bac-8eb1024edf32.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4ebef52e-96c5-4769-9bac-8eb1024edf32.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4ed00558-12ec-4faf-ac8f-e58f371ca1e2.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4ed00558-12ec-4faf-ac8f-e58f371ca1e2.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4ed00558-12ec-4faf-ac8f-e58f371ca1e2.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4ed00558-12ec-4faf-ac8f-e58f371ca1e2.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4ed6232b-5629-41fb-97a1-8883ffb473c3.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4ed6232b-5629-41fb-97a1-8883ffb473c3.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4ed6232b-5629-41fb-97a1-8883ffb473c3.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4ed6232b-5629-41fb-97a1-8883ffb473c3.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4ed94ccd-c8ae-4364-937d-a7fcf614c146.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4ed94ccd-c8ae-4364-937d-a7fcf614c146.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4ed94ccd-c8ae-4364-937d-a7fcf614c146.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4ed94ccd-c8ae-4364-937d-a7fcf614c146.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4eebc286-1aa0-456a-b469-668cb4c549c9.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4eebc286-1aa0-456a-b469-668cb4c549c9.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4eebc286-1aa0-456a-b469-668cb4c549c9.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4eebc286-1aa0-456a-b469-668cb4c549c9.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4eec6004-8366-485d-9a8e-23f76e217468.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4eec6004-8366-485d-9a8e-23f76e217468.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4eec6004-8366-485d-9a8e-23f76e217468.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4eec6004-8366-485d-9a8e-23f76e217468.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4eeee538-ef0e-4125-938c-9f3a97db5a1e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4eeee538-ef0e-4125-938c-9f3a97db5a1e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4eeee538-ef0e-4125-938c-9f3a97db5a1e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4eeee538-ef0e-4125-938c-9f3a97db5a1e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4ef81ae4-abe9-42f6-ade3-fe3644e80c06.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4ef81ae4-abe9-42f6-ade3-fe3644e80c06.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4ef81ae4-abe9-42f6-ade3-fe3644e80c06.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4ef81ae4-abe9-42f6-ade3-fe3644e80c06.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4f1855f9-a060-438f-b7d2-bab2836b79c7.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4f1855f9-a060-438f-b7d2-bab2836b79c7.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4f1855f9-a060-438f-b7d2-bab2836b79c7.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4f1855f9-a060-438f-b7d2-bab2836b79c7.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4f25eebb-b862-4824-9ca7-c5ba96a4a28e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4f25eebb-b862-4824-9ca7-c5ba96a4a28e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4f25eebb-b862-4824-9ca7-c5ba96a4a28e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4f25eebb-b862-4824-9ca7-c5ba96a4a28e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4f28d63a-167c-4855-95d3-26785ae4bc5b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4f28d63a-167c-4855-95d3-26785ae4bc5b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4f28d63a-167c-4855-95d3-26785ae4bc5b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4f28d63a-167c-4855-95d3-26785ae4bc5b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4f2ac16b-9c63-4bf4-b99f-d8ab90ca2dc9.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4f2ac16b-9c63-4bf4-b99f-d8ab90ca2dc9.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4f2ac16b-9c63-4bf4-b99f-d8ab90ca2dc9.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4f2ac16b-9c63-4bf4-b99f-d8ab90ca2dc9.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4f3a8c5f-47da-48a0-a0f6-5bab3b6b6138.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4f3a8c5f-47da-48a0-a0f6-5bab3b6b6138.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4f3a8c5f-47da-48a0-a0f6-5bab3b6b6138.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4f3a8c5f-47da-48a0-a0f6-5bab3b6b6138.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4f6bcb75-8e9c-46fc-9116-469fda3ef75d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4f6bcb75-8e9c-46fc-9116-469fda3ef75d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4f6bcb75-8e9c-46fc-9116-469fda3ef75d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4f6bcb75-8e9c-46fc-9116-469fda3ef75d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4f73814a-1b43-4e5a-95af-9b58aaf7cbba.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4f73814a-1b43-4e5a-95af-9b58aaf7cbba.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4f73814a-1b43-4e5a-95af-9b58aaf7cbba.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4f73814a-1b43-4e5a-95af-9b58aaf7cbba.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4f772e11-76b6-4db5-a02d-b23fbb274e6e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4f772e11-76b6-4db5-a02d-b23fbb274e6e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4f772e11-76b6-4db5-a02d-b23fbb274e6e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4f772e11-76b6-4db5-a02d-b23fbb274e6e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4f9502e9-e855-4eba-9340-29f8fe140f9f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4f9502e9-e855-4eba-9340-29f8fe140f9f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4f9502e9-e855-4eba-9340-29f8fe140f9f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4f9502e9-e855-4eba-9340-29f8fe140f9f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4fc20e68-fdc5-458e-8c22-2b912ffa9309.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4fc20e68-fdc5-458e-8c22-2b912ffa9309.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4fc20e68-fdc5-458e-8c22-2b912ffa9309.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4fc20e68-fdc5-458e-8c22-2b912ffa9309.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4ff0413e-511f-423c-9a37-5d3e404e3491.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4ff0413e-511f-423c-9a37-5d3e404e3491.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4ff0413e-511f-423c-9a37-5d3e404e3491.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/4ff0413e-511f-423c-9a37-5d3e404e3491.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/50120a72-bf1b-459b-91f1-d4701607ba8a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/50120a72-bf1b-459b-91f1-d4701607ba8a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/50120a72-bf1b-459b-91f1-d4701607ba8a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/50120a72-bf1b-459b-91f1-d4701607ba8a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5020ad7a-e55a-40e7-94a1-d5fc3af81f73.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5020ad7a-e55a-40e7-94a1-d5fc3af81f73.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5020ad7a-e55a-40e7-94a1-d5fc3af81f73.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5020ad7a-e55a-40e7-94a1-d5fc3af81f73.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/50331086-bbe7-4c28-bddf-1f649fd0db9f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/50331086-bbe7-4c28-bddf-1f649fd0db9f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/50331086-bbe7-4c28-bddf-1f649fd0db9f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/50331086-bbe7-4c28-bddf-1f649fd0db9f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/505acefb-f4e2-495e-a63d-511231c7be7d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/505acefb-f4e2-495e-a63d-511231c7be7d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/505acefb-f4e2-495e-a63d-511231c7be7d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/505acefb-f4e2-495e-a63d-511231c7be7d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/506c5e70-8da9-4c28-8496-e1335ace193a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/506c5e70-8da9-4c28-8496-e1335ace193a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/506c5e70-8da9-4c28-8496-e1335ace193a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/506c5e70-8da9-4c28-8496-e1335ace193a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/507809d0-75a2-4a6f-94a0-79d2c6b41941.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/507809d0-75a2-4a6f-94a0-79d2c6b41941.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/507809d0-75a2-4a6f-94a0-79d2c6b41941.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/507809d0-75a2-4a6f-94a0-79d2c6b41941.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5095cb09-0202-45b6-bb3d-3a9b8f008952.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5095cb09-0202-45b6-bb3d-3a9b8f008952.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5095cb09-0202-45b6-bb3d-3a9b8f008952.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5095cb09-0202-45b6-bb3d-3a9b8f008952.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5095f115-1c2f-4389-b4fa-d0b4166bb864.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5095f115-1c2f-4389-b4fa-d0b4166bb864.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5095f115-1c2f-4389-b4fa-d0b4166bb864.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5095f115-1c2f-4389-b4fa-d0b4166bb864.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/50d12871-c6ae-4013-bdc6-2c76c04e9e07.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/50d12871-c6ae-4013-bdc6-2c76c04e9e07.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/50d12871-c6ae-4013-bdc6-2c76c04e9e07.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/50d12871-c6ae-4013-bdc6-2c76c04e9e07.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/50d3b798-d18b-4de8-bb7d-728f011f0ada.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/50d3b798-d18b-4de8-bb7d-728f011f0ada.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/50d3b798-d18b-4de8-bb7d-728f011f0ada.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/50d3b798-d18b-4de8-bb7d-728f011f0ada.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/50fde729-2146-4563-94f8-c46f72423124.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/50fde729-2146-4563-94f8-c46f72423124.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/50fde729-2146-4563-94f8-c46f72423124.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/50fde729-2146-4563-94f8-c46f72423124.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5119f68f-c735-42ef-b7c2-ea714e077375.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5119f68f-c735-42ef-b7c2-ea714e077375.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5119f68f-c735-42ef-b7c2-ea714e077375.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5119f68f-c735-42ef-b7c2-ea714e077375.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5145ad05-a097-4251-965d-95f6295c656d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5145ad05-a097-4251-965d-95f6295c656d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5145ad05-a097-4251-965d-95f6295c656d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5145ad05-a097-4251-965d-95f6295c656d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5145c02d-3ad9-482e-a942-0a07d775dbeb.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5145c02d-3ad9-482e-a942-0a07d775dbeb.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5145c02d-3ad9-482e-a942-0a07d775dbeb.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5145c02d-3ad9-482e-a942-0a07d775dbeb.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5162e9da-a511-4d3c-8534-0a588ee8deed.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5162e9da-a511-4d3c-8534-0a588ee8deed.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5162e9da-a511-4d3c-8534-0a588ee8deed.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5162e9da-a511-4d3c-8534-0a588ee8deed.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/51746061-71a2-48be-87fe-8b4b52a32e85.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/51746061-71a2-48be-87fe-8b4b52a32e85.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/51746061-71a2-48be-87fe-8b4b52a32e85.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/51746061-71a2-48be-87fe-8b4b52a32e85.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/518f1be3-f6f7-4516-b0d8-b945975ec463.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/518f1be3-f6f7-4516-b0d8-b945975ec463.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/518f1be3-f6f7-4516-b0d8-b945975ec463.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/518f1be3-f6f7-4516-b0d8-b945975ec463.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/519624e8-81b7-4ef9-bd5b-37c8a8fe1a78.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/519624e8-81b7-4ef9-bd5b-37c8a8fe1a78.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/519624e8-81b7-4ef9-bd5b-37c8a8fe1a78.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/519624e8-81b7-4ef9-bd5b-37c8a8fe1a78.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/51cb338d-cc9f-43b2-a4a0-bb379bdb7e90.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/51cb338d-cc9f-43b2-a4a0-bb379bdb7e90.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/51cb338d-cc9f-43b2-a4a0-bb379bdb7e90.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/51cb338d-cc9f-43b2-a4a0-bb379bdb7e90.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/51dc5fb7-c3e6-40ab-b4bc-bb40e46fc20d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/51dc5fb7-c3e6-40ab-b4bc-bb40e46fc20d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/51dc5fb7-c3e6-40ab-b4bc-bb40e46fc20d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/51dc5fb7-c3e6-40ab-b4bc-bb40e46fc20d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/51f79e4f-366c-4517-ab77-cf3718e9cca0.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/51f79e4f-366c-4517-ab77-cf3718e9cca0.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/51f79e4f-366c-4517-ab77-cf3718e9cca0.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/51f79e4f-366c-4517-ab77-cf3718e9cca0.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/522b2dd7-5d0e-433c-b5bb-73b2d1c5dd65.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/522b2dd7-5d0e-433c-b5bb-73b2d1c5dd65.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/522b2dd7-5d0e-433c-b5bb-73b2d1c5dd65.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/522b2dd7-5d0e-433c-b5bb-73b2d1c5dd65.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5255554d-d30d-410e-9aab-3539ee74e397.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5255554d-d30d-410e-9aab-3539ee74e397.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5255554d-d30d-410e-9aab-3539ee74e397.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5255554d-d30d-410e-9aab-3539ee74e397.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/52670cf4-0ba3-4b22-a744-fbd1dee03dce.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/52670cf4-0ba3-4b22-a744-fbd1dee03dce.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/52670cf4-0ba3-4b22-a744-fbd1dee03dce.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/52670cf4-0ba3-4b22-a744-fbd1dee03dce.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5273f92d-771d-41bc-886c-64fcc44432d9.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5273f92d-771d-41bc-886c-64fcc44432d9.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5273f92d-771d-41bc-886c-64fcc44432d9.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5273f92d-771d-41bc-886c-64fcc44432d9.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/528eb6c3-f83f-4b9c-993e-75d0f938f4bb.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/528eb6c3-f83f-4b9c-993e-75d0f938f4bb.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/528eb6c3-f83f-4b9c-993e-75d0f938f4bb.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/528eb6c3-f83f-4b9c-993e-75d0f938f4bb.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/52bf9a89-1e94-405a-a9d5-36e509b8d891.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/52bf9a89-1e94-405a-a9d5-36e509b8d891.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/52bf9a89-1e94-405a-a9d5-36e509b8d891.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/52bf9a89-1e94-405a-a9d5-36e509b8d891.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/52cd6a59-dd02-43e0-a823-c5061bc58ac8.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/52cd6a59-dd02-43e0-a823-c5061bc58ac8.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/52cd6a59-dd02-43e0-a823-c5061bc58ac8.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/52cd6a59-dd02-43e0-a823-c5061bc58ac8.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/52d9d5ee-9d5e-4571-ac28-98027d9aac26.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/52d9d5ee-9d5e-4571-ac28-98027d9aac26.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/52d9d5ee-9d5e-4571-ac28-98027d9aac26.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/52d9d5ee-9d5e-4571-ac28-98027d9aac26.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/52e10074-b586-4e68-bc5c-b39b6f3fd1dd.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/52e10074-b586-4e68-bc5c-b39b6f3fd1dd.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/52e10074-b586-4e68-bc5c-b39b6f3fd1dd.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/52e10074-b586-4e68-bc5c-b39b6f3fd1dd.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/53012bae-ff2a-48c2-b9ad-2d0edad2524c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/53012bae-ff2a-48c2-b9ad-2d0edad2524c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/53012bae-ff2a-48c2-b9ad-2d0edad2524c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/53012bae-ff2a-48c2-b9ad-2d0edad2524c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/530515bb-c000-4e10-96ae-610b72e5719c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/530515bb-c000-4e10-96ae-610b72e5719c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/530515bb-c000-4e10-96ae-610b72e5719c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/530515bb-c000-4e10-96ae-610b72e5719c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/532ab2b6-fca3-4560-a7ba-9ef188768edf.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/532ab2b6-fca3-4560-a7ba-9ef188768edf.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/532ab2b6-fca3-4560-a7ba-9ef188768edf.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/532ab2b6-fca3-4560-a7ba-9ef188768edf.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/534a8304-35c6-4918-8aa4-ec64bac05b80.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/534a8304-35c6-4918-8aa4-ec64bac05b80.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/534a8304-35c6-4918-8aa4-ec64bac05b80.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/534a8304-35c6-4918-8aa4-ec64bac05b80.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/53510c36-c8eb-44df-936e-91cbf3459797.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/53510c36-c8eb-44df-936e-91cbf3459797.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/53510c36-c8eb-44df-936e-91cbf3459797.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/53510c36-c8eb-44df-936e-91cbf3459797.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/536098c5-c0b8-421f-8140-27e86a6e984e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/536098c5-c0b8-421f-8140-27e86a6e984e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/536098c5-c0b8-421f-8140-27e86a6e984e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/536098c5-c0b8-421f-8140-27e86a6e984e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/538c01f0-17c9-44e7-b050-121d211c5108.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/538c01f0-17c9-44e7-b050-121d211c5108.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/538c01f0-17c9-44e7-b050-121d211c5108.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/538c01f0-17c9-44e7-b050-121d211c5108.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/538ee594-4403-4ddc-861e-8d6724abdc95.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/538ee594-4403-4ddc-861e-8d6724abdc95.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/538ee594-4403-4ddc-861e-8d6724abdc95.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/538ee594-4403-4ddc-861e-8d6724abdc95.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/53a03414-8ad8-490b-9886-5929760d68fa.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/53a03414-8ad8-490b-9886-5929760d68fa.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/53a03414-8ad8-490b-9886-5929760d68fa.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/53a03414-8ad8-490b-9886-5929760d68fa.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/53a3062b-4da9-4fb4-a356-e75025e97253.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/53a3062b-4da9-4fb4-a356-e75025e97253.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/53a3062b-4da9-4fb4-a356-e75025e97253.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/53a3062b-4da9-4fb4-a356-e75025e97253.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/53e4b533-5841-46f9-8518-c9b9bbcbc5d8.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/53e4b533-5841-46f9-8518-c9b9bbcbc5d8.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/53e4b533-5841-46f9-8518-c9b9bbcbc5d8.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/53e4b533-5841-46f9-8518-c9b9bbcbc5d8.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/543b2f64-f414-4f44-ac8c-d3f41611cccc.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/543b2f64-f414-4f44-ac8c-d3f41611cccc.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/543b2f64-f414-4f44-ac8c-d3f41611cccc.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/543b2f64-f414-4f44-ac8c-d3f41611cccc.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/544ae29e-104c-4ac2-81fd-e3ae4aeb34f6.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/544ae29e-104c-4ac2-81fd-e3ae4aeb34f6.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/544ae29e-104c-4ac2-81fd-e3ae4aeb34f6.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/544ae29e-104c-4ac2-81fd-e3ae4aeb34f6.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/545b2a14-7c86-4c31-81e8-247479f5d3ea.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/545b2a14-7c86-4c31-81e8-247479f5d3ea.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/545b2a14-7c86-4c31-81e8-247479f5d3ea.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/545b2a14-7c86-4c31-81e8-247479f5d3ea.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5485955d-60e4-44e3-b716-f366244929ca.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5485955d-60e4-44e3-b716-f366244929ca.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5485955d-60e4-44e3-b716-f366244929ca.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5485955d-60e4-44e3-b716-f366244929ca.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/549975f4-36f0-44f9-9e3b-f1020c4f4aed.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/549975f4-36f0-44f9-9e3b-f1020c4f4aed.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/549975f4-36f0-44f9-9e3b-f1020c4f4aed.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/549975f4-36f0-44f9-9e3b-f1020c4f4aed.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/549ebad3-e954-41d5-acb9-7ff6260ca555.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/549ebad3-e954-41d5-acb9-7ff6260ca555.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/549ebad3-e954-41d5-acb9-7ff6260ca555.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/549ebad3-e954-41d5-acb9-7ff6260ca555.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/54aa9a71-bbc9-4f73-9b28-bdcb1f4744a2.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/54aa9a71-bbc9-4f73-9b28-bdcb1f4744a2.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/54aa9a71-bbc9-4f73-9b28-bdcb1f4744a2.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/54aa9a71-bbc9-4f73-9b28-bdcb1f4744a2.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/54aaadb8-b49b-4665-b3d8-e9410a723d17.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/54aaadb8-b49b-4665-b3d8-e9410a723d17.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/54aaadb8-b49b-4665-b3d8-e9410a723d17.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/54aaadb8-b49b-4665-b3d8-e9410a723d17.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/54b73c71-d125-412b-bdc7-969878a949ab.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/54b73c71-d125-412b-bdc7-969878a949ab.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/54b73c71-d125-412b-bdc7-969878a949ab.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/54b73c71-d125-412b-bdc7-969878a949ab.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/54b7b297-bcc5-4bd2-843f-98b5c69c5218.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/54b7b297-bcc5-4bd2-843f-98b5c69c5218.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/54b7b297-bcc5-4bd2-843f-98b5c69c5218.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/54b7b297-bcc5-4bd2-843f-98b5c69c5218.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/54b9691f-1b54-4d7f-985e-34474bd52938.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/54b9691f-1b54-4d7f-985e-34474bd52938.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/54b9691f-1b54-4d7f-985e-34474bd52938.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/54b9691f-1b54-4d7f-985e-34474bd52938.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/54c653d5-7e02-4889-b648-56b1d9969130.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/54c653d5-7e02-4889-b648-56b1d9969130.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/54c653d5-7e02-4889-b648-56b1d9969130.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/54c653d5-7e02-4889-b648-56b1d9969130.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/54d5a6cd-4356-49b1-a7da-8285531a89c8.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/54d5a6cd-4356-49b1-a7da-8285531a89c8.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/54d5a6cd-4356-49b1-a7da-8285531a89c8.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/54d5a6cd-4356-49b1-a7da-8285531a89c8.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/552a9c11-180b-411a-afe9-11e1d8b6f168.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/552a9c11-180b-411a-afe9-11e1d8b6f168.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/552a9c11-180b-411a-afe9-11e1d8b6f168.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/552a9c11-180b-411a-afe9-11e1d8b6f168.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/552d81a0-204a-4a44-b746-f9ea1f2122cb.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/552d81a0-204a-4a44-b746-f9ea1f2122cb.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/552d81a0-204a-4a44-b746-f9ea1f2122cb.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/552d81a0-204a-4a44-b746-f9ea1f2122cb.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/55438ff0-6e2d-468c-9cf6-31b517bf4b37.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/55438ff0-6e2d-468c-9cf6-31b517bf4b37.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/55438ff0-6e2d-468c-9cf6-31b517bf4b37.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/55438ff0-6e2d-468c-9cf6-31b517bf4b37.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5543c3b2-9d08-4b3e-8c6b-8dc538f638d2.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5543c3b2-9d08-4b3e-8c6b-8dc538f638d2.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5543c3b2-9d08-4b3e-8c6b-8dc538f638d2.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5543c3b2-9d08-4b3e-8c6b-8dc538f638d2.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/55528aa2-cfcb-45b9-9f15-5bdbfdf43e1f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/55528aa2-cfcb-45b9-9f15-5bdbfdf43e1f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/55528aa2-cfcb-45b9-9f15-5bdbfdf43e1f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/55528aa2-cfcb-45b9-9f15-5bdbfdf43e1f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/555e702f-d41d-4dc6-8862-d30092964b51.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/555e702f-d41d-4dc6-8862-d30092964b51.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/555e702f-d41d-4dc6-8862-d30092964b51.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/555e702f-d41d-4dc6-8862-d30092964b51.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/556d508e-037d-4e79-af2e-784308766626.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/556d508e-037d-4e79-af2e-784308766626.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/556d508e-037d-4e79-af2e-784308766626.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/556d508e-037d-4e79-af2e-784308766626.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5576a4ba-d771-4ff2-be95-dbda8cf1a471.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5576a4ba-d771-4ff2-be95-dbda8cf1a471.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5576a4ba-d771-4ff2-be95-dbda8cf1a471.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5576a4ba-d771-4ff2-be95-dbda8cf1a471.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/558a124e-58ec-4824-900f-6d89e5d5f2a2.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/558a124e-58ec-4824-900f-6d89e5d5f2a2.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/558a124e-58ec-4824-900f-6d89e5d5f2a2.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/558a124e-58ec-4824-900f-6d89e5d5f2a2.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/55b8b423-3aa4-4b89-bce5-97479317c1c0.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/55b8b423-3aa4-4b89-bce5-97479317c1c0.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/55b8b423-3aa4-4b89-bce5-97479317c1c0.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/55b8b423-3aa4-4b89-bce5-97479317c1c0.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/55bad125-cb5f-4c93-9b21-f1f1e2212541.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/55bad125-cb5f-4c93-9b21-f1f1e2212541.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/55bad125-cb5f-4c93-9b21-f1f1e2212541.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/55bad125-cb5f-4c93-9b21-f1f1e2212541.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/55dac9bd-d79e-4735-82b0-6c519d6bf9b6.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/55dac9bd-d79e-4735-82b0-6c519d6bf9b6.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/55dac9bd-d79e-4735-82b0-6c519d6bf9b6.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/55dac9bd-d79e-4735-82b0-6c519d6bf9b6.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/55f11a40-ec7b-4704-b358-b157e0f01431.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/55f11a40-ec7b-4704-b358-b157e0f01431.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/55f11a40-ec7b-4704-b358-b157e0f01431.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/55f11a40-ec7b-4704-b358-b157e0f01431.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/56045a56-3926-4705-9a00-1f8d4894c3dd.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/56045a56-3926-4705-9a00-1f8d4894c3dd.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/56045a56-3926-4705-9a00-1f8d4894c3dd.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/56045a56-3926-4705-9a00-1f8d4894c3dd.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/561f5ea8-7720-43aa-86bc-66cc05d4e7f0.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/561f5ea8-7720-43aa-86bc-66cc05d4e7f0.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/561f5ea8-7720-43aa-86bc-66cc05d4e7f0.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/561f5ea8-7720-43aa-86bc-66cc05d4e7f0.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/563469cf-45b2-4130-9f55-2d47dd0b3fd1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/563469cf-45b2-4130-9f55-2d47dd0b3fd1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/563469cf-45b2-4130-9f55-2d47dd0b3fd1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/563469cf-45b2-4130-9f55-2d47dd0b3fd1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/563cd097-cfdd-4c3e-8ef4-a99114cbe9d7.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/563cd097-cfdd-4c3e-8ef4-a99114cbe9d7.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/563cd097-cfdd-4c3e-8ef4-a99114cbe9d7.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/563cd097-cfdd-4c3e-8ef4-a99114cbe9d7.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/56511f84-4897-4871-a1e1-1e26f801e001.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/56511f84-4897-4871-a1e1-1e26f801e001.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/56511f84-4897-4871-a1e1-1e26f801e001.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/56511f84-4897-4871-a1e1-1e26f801e001.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/566ab4cc-821f-405e-85b5-3b2b557a8803.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/566ab4cc-821f-405e-85b5-3b2b557a8803.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/566ab4cc-821f-405e-85b5-3b2b557a8803.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/566ab4cc-821f-405e-85b5-3b2b557a8803.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5681a510-92b7-4b52-8297-dc2ccca2b93f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5681a510-92b7-4b52-8297-dc2ccca2b93f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5681a510-92b7-4b52-8297-dc2ccca2b93f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5681a510-92b7-4b52-8297-dc2ccca2b93f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/56a16cf2-b5f7-4b0b-927b-38807e078139.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/56a16cf2-b5f7-4b0b-927b-38807e078139.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/56a16cf2-b5f7-4b0b-927b-38807e078139.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/56a16cf2-b5f7-4b0b-927b-38807e078139.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/56baa7ca-5e34-41ef-8063-7dcddfdd0576.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/56baa7ca-5e34-41ef-8063-7dcddfdd0576.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/56baa7ca-5e34-41ef-8063-7dcddfdd0576.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/56baa7ca-5e34-41ef-8063-7dcddfdd0576.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/56bc87e9-6fa2-4d26-9116-5ec47ac93614.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/56bc87e9-6fa2-4d26-9116-5ec47ac93614.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/56bc87e9-6fa2-4d26-9116-5ec47ac93614.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/56bc87e9-6fa2-4d26-9116-5ec47ac93614.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/56db8e88-4a1c-4cb5-8d30-f778bbe948a4.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/56db8e88-4a1c-4cb5-8d30-f778bbe948a4.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/56db8e88-4a1c-4cb5-8d30-f778bbe948a4.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/56db8e88-4a1c-4cb5-8d30-f778bbe948a4.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/56e14912-e683-4c54-9206-1d5bd15c21d7.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/56e14912-e683-4c54-9206-1d5bd15c21d7.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/56e14912-e683-4c54-9206-1d5bd15c21d7.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/56e14912-e683-4c54-9206-1d5bd15c21d7.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/56eaf8dc-3b39-4ad7-bafc-eccf7ffe0105.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/56eaf8dc-3b39-4ad7-bafc-eccf7ffe0105.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/56eaf8dc-3b39-4ad7-bafc-eccf7ffe0105.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/56eaf8dc-3b39-4ad7-bafc-eccf7ffe0105.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5701c09e-3618-4f5a-b17a-9350803bb76f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5701c09e-3618-4f5a-b17a-9350803bb76f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5701c09e-3618-4f5a-b17a-9350803bb76f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5701c09e-3618-4f5a-b17a-9350803bb76f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/570f2323-8083-477e-8b7b-c5f85b6b19c7.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/570f2323-8083-477e-8b7b-c5f85b6b19c7.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/570f2323-8083-477e-8b7b-c5f85b6b19c7.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/570f2323-8083-477e-8b7b-c5f85b6b19c7.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/572845c9-7918-46f4-8807-42fa496818a7.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/572845c9-7918-46f4-8807-42fa496818a7.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/572845c9-7918-46f4-8807-42fa496818a7.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/572845c9-7918-46f4-8807-42fa496818a7.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/572ab0cc-16d7-4831-a2ed-1f3d8c276a6b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/572ab0cc-16d7-4831-a2ed-1f3d8c276a6b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/572ab0cc-16d7-4831-a2ed-1f3d8c276a6b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/572ab0cc-16d7-4831-a2ed-1f3d8c276a6b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/57388536-e0e4-46c2-9761-4c14e6cdd059.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/57388536-e0e4-46c2-9761-4c14e6cdd059.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/57388536-e0e4-46c2-9761-4c14e6cdd059.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/57388536-e0e4-46c2-9761-4c14e6cdd059.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5787210f-a85d-4984-aa09-e0b6792b4f5b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5787210f-a85d-4984-aa09-e0b6792b4f5b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5787210f-a85d-4984-aa09-e0b6792b4f5b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5787210f-a85d-4984-aa09-e0b6792b4f5b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/57ad3238-4dc7-4fe4-bead-859a0b9be839.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/57ad3238-4dc7-4fe4-bead-859a0b9be839.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/57ad3238-4dc7-4fe4-bead-859a0b9be839.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/57ad3238-4dc7-4fe4-bead-859a0b9be839.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/57b4b4ee-a148-4b1a-b13a-a55907d75d04.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/57b4b4ee-a148-4b1a-b13a-a55907d75d04.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/57b4b4ee-a148-4b1a-b13a-a55907d75d04.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/57b4b4ee-a148-4b1a-b13a-a55907d75d04.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/57b79896-ded8-4a91-bb98-a73325fc2c6d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/57b79896-ded8-4a91-bb98-a73325fc2c6d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/57b79896-ded8-4a91-bb98-a73325fc2c6d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/57b79896-ded8-4a91-bb98-a73325fc2c6d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/57ca066a-5605-4284-95ea-aa025f8c8fa7.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/57ca066a-5605-4284-95ea-aa025f8c8fa7.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/57ca066a-5605-4284-95ea-aa025f8c8fa7.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/57ca066a-5605-4284-95ea-aa025f8c8fa7.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/57ddd4ab-2ec1-4c28-8337-8676fb4a142b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/57ddd4ab-2ec1-4c28-8337-8676fb4a142b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/57ddd4ab-2ec1-4c28-8337-8676fb4a142b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/57ddd4ab-2ec1-4c28-8337-8676fb4a142b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5800541d-83fb-4921-a9c1-1ad768fcadf6.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5800541d-83fb-4921-a9c1-1ad768fcadf6.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5800541d-83fb-4921-a9c1-1ad768fcadf6.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5800541d-83fb-4921-a9c1-1ad768fcadf6.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/581e027e-ca59-46ba-96b4-82cb6911b67f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/581e027e-ca59-46ba-96b4-82cb6911b67f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/581e027e-ca59-46ba-96b4-82cb6911b67f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/581e027e-ca59-46ba-96b4-82cb6911b67f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5837d2c0-83d3-4c63-b780-0b61f04c67fe.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5837d2c0-83d3-4c63-b780-0b61f04c67fe.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5837d2c0-83d3-4c63-b780-0b61f04c67fe.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5837d2c0-83d3-4c63-b780-0b61f04c67fe.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/583b065d-bb7f-4bdc-894a-d635778f00c0.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/583b065d-bb7f-4bdc-894a-d635778f00c0.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/583b065d-bb7f-4bdc-894a-d635778f00c0.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/583b065d-bb7f-4bdc-894a-d635778f00c0.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5841c584-7499-4b42-80fe-92fa2142813f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5841c584-7499-4b42-80fe-92fa2142813f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5841c584-7499-4b42-80fe-92fa2142813f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5841c584-7499-4b42-80fe-92fa2142813f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/584c33d4-cb49-49bb-bfc2-7a7c09a7e8b1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/584c33d4-cb49-49bb-bfc2-7a7c09a7e8b1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/584c33d4-cb49-49bb-bfc2-7a7c09a7e8b1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/584c33d4-cb49-49bb-bfc2-7a7c09a7e8b1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5869de9e-c242-4fa5-bc8b-455353ae1a15.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5869de9e-c242-4fa5-bc8b-455353ae1a15.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5869de9e-c242-4fa5-bc8b-455353ae1a15.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5869de9e-c242-4fa5-bc8b-455353ae1a15.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/587cda69-2cf6-4053-8d7d-71651e83b0b7.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/587cda69-2cf6-4053-8d7d-71651e83b0b7.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/587cda69-2cf6-4053-8d7d-71651e83b0b7.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/587cda69-2cf6-4053-8d7d-71651e83b0b7.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/58aec216-4406-4a17-b5ba-041b6c722fd9.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/58aec216-4406-4a17-b5ba-041b6c722fd9.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/58aec216-4406-4a17-b5ba-041b6c722fd9.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/58aec216-4406-4a17-b5ba-041b6c722fd9.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/58cae7fa-60f5-438f-8967-dbe1631b2af9.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/58cae7fa-60f5-438f-8967-dbe1631b2af9.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/58cae7fa-60f5-438f-8967-dbe1631b2af9.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/58cae7fa-60f5-438f-8967-dbe1631b2af9.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/58daeefd-8cb8-4dde-9549-ccf2796b5aad.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/58daeefd-8cb8-4dde-9549-ccf2796b5aad.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/58daeefd-8cb8-4dde-9549-ccf2796b5aad.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/58daeefd-8cb8-4dde-9549-ccf2796b5aad.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/58e138de-2ac7-40a4-88ac-61a9f4bcef54.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/58e138de-2ac7-40a4-88ac-61a9f4bcef54.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/58e138de-2ac7-40a4-88ac-61a9f4bcef54.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/58e138de-2ac7-40a4-88ac-61a9f4bcef54.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/58f2d865-0bb4-46a8-b9f7-6f546d281b85.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/58f2d865-0bb4-46a8-b9f7-6f546d281b85.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/58f2d865-0bb4-46a8-b9f7-6f546d281b85.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/58f2d865-0bb4-46a8-b9f7-6f546d281b85.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/58fd1837-9784-4f4e-9b13-bdef1675822e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/58fd1837-9784-4f4e-9b13-bdef1675822e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/58fd1837-9784-4f4e-9b13-bdef1675822e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/58fd1837-9784-4f4e-9b13-bdef1675822e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/590ca982-3902-45eb-8ec4-1ea6e1b5aeba.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/590ca982-3902-45eb-8ec4-1ea6e1b5aeba.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/590ca982-3902-45eb-8ec4-1ea6e1b5aeba.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/590ca982-3902-45eb-8ec4-1ea6e1b5aeba.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/59493ec6-da71-40db-a398-520b4e11fd5b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/59493ec6-da71-40db-a398-520b4e11fd5b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/59493ec6-da71-40db-a398-520b4e11fd5b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/59493ec6-da71-40db-a398-520b4e11fd5b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/595f9f00-5531-4d19-b9e4-297a626f9a7b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/595f9f00-5531-4d19-b9e4-297a626f9a7b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/595f9f00-5531-4d19-b9e4-297a626f9a7b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/595f9f00-5531-4d19-b9e4-297a626f9a7b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/59a493fd-440a-4d1c-a60a-e3072fec8012.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/59a493fd-440a-4d1c-a60a-e3072fec8012.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/59a493fd-440a-4d1c-a60a-e3072fec8012.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/59a493fd-440a-4d1c-a60a-e3072fec8012.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/59b6463d-5e12-45ed-8132-6362db72a819.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/59b6463d-5e12-45ed-8132-6362db72a819.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/59b6463d-5e12-45ed-8132-6362db72a819.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/59b6463d-5e12-45ed-8132-6362db72a819.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/59bddd1b-b25d-4e14-81f3-243834b99d20.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/59bddd1b-b25d-4e14-81f3-243834b99d20.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/59bddd1b-b25d-4e14-81f3-243834b99d20.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/59bddd1b-b25d-4e14-81f3-243834b99d20.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/59cae095-2f89-4e83-904d-fdc79f669a12.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/59cae095-2f89-4e83-904d-fdc79f669a12.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/59cae095-2f89-4e83-904d-fdc79f669a12.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/59cae095-2f89-4e83-904d-fdc79f669a12.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/59f11096-77eb-4d92-b50b-0529a16f3494.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/59f11096-77eb-4d92-b50b-0529a16f3494.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/59f11096-77eb-4d92-b50b-0529a16f3494.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/59f11096-77eb-4d92-b50b-0529a16f3494.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5a077929-ebc5-4d7d-a1f9-ce749257358d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5a077929-ebc5-4d7d-a1f9-ce749257358d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5a077929-ebc5-4d7d-a1f9-ce749257358d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5a077929-ebc5-4d7d-a1f9-ce749257358d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5a1b1938-6f25-46c8-aebb-9bfc79bde87e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5a1b1938-6f25-46c8-aebb-9bfc79bde87e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5a1b1938-6f25-46c8-aebb-9bfc79bde87e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5a1b1938-6f25-46c8-aebb-9bfc79bde87e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5a2e1a30-e408-420e-a326-5ce9ee863927.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5a2e1a30-e408-420e-a326-5ce9ee863927.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5a2e1a30-e408-420e-a326-5ce9ee863927.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5a2e1a30-e408-420e-a326-5ce9ee863927.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5a369bde-f8b8-4528-9a27-908127221b2a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5a369bde-f8b8-4528-9a27-908127221b2a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5a369bde-f8b8-4528-9a27-908127221b2a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5a369bde-f8b8-4528-9a27-908127221b2a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5a379691-367f-4469-a1d0-54f6e7535f60.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5a379691-367f-4469-a1d0-54f6e7535f60.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5a379691-367f-4469-a1d0-54f6e7535f60.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5a379691-367f-4469-a1d0-54f6e7535f60.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5a44356f-dc15-4562-88ba-2a894305efaa.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5a44356f-dc15-4562-88ba-2a894305efaa.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5a44356f-dc15-4562-88ba-2a894305efaa.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5a44356f-dc15-4562-88ba-2a894305efaa.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5a44c175-cb76-452c-ada8-3dbcac50d35f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5a44c175-cb76-452c-ada8-3dbcac50d35f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5a44c175-cb76-452c-ada8-3dbcac50d35f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5a44c175-cb76-452c-ada8-3dbcac50d35f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5a4819d4-4cb1-46e2-9a10-805078c65cbd.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5a4819d4-4cb1-46e2-9a10-805078c65cbd.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5a4819d4-4cb1-46e2-9a10-805078c65cbd.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5a4819d4-4cb1-46e2-9a10-805078c65cbd.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5a53ba2c-9a44-4dfc-9a36-08711bb4e0b3.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5a53ba2c-9a44-4dfc-9a36-08711bb4e0b3.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5a53ba2c-9a44-4dfc-9a36-08711bb4e0b3.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5a53ba2c-9a44-4dfc-9a36-08711bb4e0b3.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5a794013-4d05-4c6f-8f5c-502e7388d606.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5a794013-4d05-4c6f-8f5c-502e7388d606.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5a794013-4d05-4c6f-8f5c-502e7388d606.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5a794013-4d05-4c6f-8f5c-502e7388d606.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5a8a0f84-d253-413a-a403-a0c36a8a3d9b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5a8a0f84-d253-413a-a403-a0c36a8a3d9b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5a8a0f84-d253-413a-a403-a0c36a8a3d9b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5a8a0f84-d253-413a-a403-a0c36a8a3d9b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5ab06bd8-8236-40fa-bacb-037ca1f8ad97.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5ab06bd8-8236-40fa-bacb-037ca1f8ad97.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5ab06bd8-8236-40fa-bacb-037ca1f8ad97.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5ab06bd8-8236-40fa-bacb-037ca1f8ad97.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5abd6042-0bcd-4ad6-8fcd-89901a006e54.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5abd6042-0bcd-4ad6-8fcd-89901a006e54.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5abd6042-0bcd-4ad6-8fcd-89901a006e54.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5abd6042-0bcd-4ad6-8fcd-89901a006e54.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5abf35e2-87d9-4eed-8435-c0ba711e1985.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5abf35e2-87d9-4eed-8435-c0ba711e1985.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5abf35e2-87d9-4eed-8435-c0ba711e1985.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5abf35e2-87d9-4eed-8435-c0ba711e1985.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5acb6b6f-1e46-4021-afd2-4212e4723eb2.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5acb6b6f-1e46-4021-afd2-4212e4723eb2.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5acb6b6f-1e46-4021-afd2-4212e4723eb2.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5acb6b6f-1e46-4021-afd2-4212e4723eb2.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5afa310c-14ba-4021-b247-42061eb899df.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5afa310c-14ba-4021-b247-42061eb899df.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5afa310c-14ba-4021-b247-42061eb899df.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5afa310c-14ba-4021-b247-42061eb899df.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5aff711d-0a76-4a9a-b8fb-0b446edd88e9.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5aff711d-0a76-4a9a-b8fb-0b446edd88e9.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5aff711d-0a76-4a9a-b8fb-0b446edd88e9.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5aff711d-0a76-4a9a-b8fb-0b446edd88e9.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5b256e10-4015-412b-8ed9-0aff4dcada89.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5b256e10-4015-412b-8ed9-0aff4dcada89.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5b256e10-4015-412b-8ed9-0aff4dcada89.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5b256e10-4015-412b-8ed9-0aff4dcada89.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5b46fbb4-4cec-4229-9a53-161447956dae.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5b46fbb4-4cec-4229-9a53-161447956dae.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5b46fbb4-4cec-4229-9a53-161447956dae.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5b46fbb4-4cec-4229-9a53-161447956dae.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5b526450-1f95-44fc-9b5c-3f891157b305.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5b526450-1f95-44fc-9b5c-3f891157b305.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5b526450-1f95-44fc-9b5c-3f891157b305.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5b526450-1f95-44fc-9b5c-3f891157b305.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5b78a350-ac9e-4b9d-89ff-665f8eca486e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5b78a350-ac9e-4b9d-89ff-665f8eca486e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5b78a350-ac9e-4b9d-89ff-665f8eca486e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5b78a350-ac9e-4b9d-89ff-665f8eca486e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5b9b9481-76f2-4a12-bb68-5e6dd98796f0.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5b9b9481-76f2-4a12-bb68-5e6dd98796f0.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5b9b9481-76f2-4a12-bb68-5e6dd98796f0.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5b9b9481-76f2-4a12-bb68-5e6dd98796f0.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5bdc89f8-2e4b-4ec2-8825-be336a9a8620.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5bdc89f8-2e4b-4ec2-8825-be336a9a8620.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5bdc89f8-2e4b-4ec2-8825-be336a9a8620.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5bdc89f8-2e4b-4ec2-8825-be336a9a8620.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5bfc92d3-0272-48fa-a301-bac9e74c3450.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5bfc92d3-0272-48fa-a301-bac9e74c3450.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5bfc92d3-0272-48fa-a301-bac9e74c3450.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5bfc92d3-0272-48fa-a301-bac9e74c3450.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5c0fc772-536c-471c-93af-548b4740fff7.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5c0fc772-536c-471c-93af-548b4740fff7.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5c0fc772-536c-471c-93af-548b4740fff7.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5c0fc772-536c-471c-93af-548b4740fff7.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5c325c04-85c6-40fd-aed8-2f8b1d4afe5f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5c325c04-85c6-40fd-aed8-2f8b1d4afe5f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5c325c04-85c6-40fd-aed8-2f8b1d4afe5f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5c325c04-85c6-40fd-aed8-2f8b1d4afe5f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5c370b06-c60e-4155-b5b1-b52bf1fa7c15.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5c370b06-c60e-4155-b5b1-b52bf1fa7c15.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5c370b06-c60e-4155-b5b1-b52bf1fa7c15.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5c370b06-c60e-4155-b5b1-b52bf1fa7c15.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5c3b64d5-be06-4079-a44e-f424319cc2c4.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5c3b64d5-be06-4079-a44e-f424319cc2c4.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5c3b64d5-be06-4079-a44e-f424319cc2c4.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5c3b64d5-be06-4079-a44e-f424319cc2c4.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5c52f32a-631e-4891-8516-acec411c797d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5c52f32a-631e-4891-8516-acec411c797d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5c52f32a-631e-4891-8516-acec411c797d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5c52f32a-631e-4891-8516-acec411c797d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5c65312f-86a9-4d45-b57e-49673fd8a513.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5c65312f-86a9-4d45-b57e-49673fd8a513.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5c65312f-86a9-4d45-b57e-49673fd8a513.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5c65312f-86a9-4d45-b57e-49673fd8a513.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5c7a24ab-410d-4ab5-8eeb-185fe57b64a9.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5c7a24ab-410d-4ab5-8eeb-185fe57b64a9.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5c7a24ab-410d-4ab5-8eeb-185fe57b64a9.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5c7a24ab-410d-4ab5-8eeb-185fe57b64a9.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5c7ce289-8f86-4d22-9eb3-0d9a83bfa1d9.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5c7ce289-8f86-4d22-9eb3-0d9a83bfa1d9.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5c7ce289-8f86-4d22-9eb3-0d9a83bfa1d9.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5c7ce289-8f86-4d22-9eb3-0d9a83bfa1d9.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5c890dfc-c3cc-4173-81f5-e1274a043281.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5c890dfc-c3cc-4173-81f5-e1274a043281.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5c890dfc-c3cc-4173-81f5-e1274a043281.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5c890dfc-c3cc-4173-81f5-e1274a043281.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5c8c78a0-2d20-4f1a-a8c4-8a72d7f23a19.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5c8c78a0-2d20-4f1a-a8c4-8a72d7f23a19.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5c8c78a0-2d20-4f1a-a8c4-8a72d7f23a19.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5c8c78a0-2d20-4f1a-a8c4-8a72d7f23a19.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5c968f53-cd55-45b6-bf58-785331a53592.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5c968f53-cd55-45b6-bf58-785331a53592.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5c968f53-cd55-45b6-bf58-785331a53592.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5c968f53-cd55-45b6-bf58-785331a53592.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5cb524e7-0f22-4711-ae58-755d43360cd7.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5cb524e7-0f22-4711-ae58-755d43360cd7.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5cb524e7-0f22-4711-ae58-755d43360cd7.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5cb524e7-0f22-4711-ae58-755d43360cd7.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5cc7c7b9-35ab-4385-ae1e-752f9b4f51bc.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5cc7c7b9-35ab-4385-ae1e-752f9b4f51bc.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5cc7c7b9-35ab-4385-ae1e-752f9b4f51bc.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5cc7c7b9-35ab-4385-ae1e-752f9b4f51bc.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5cfa4c7d-207e-429f-bcc0-31a251041180.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5cfa4c7d-207e-429f-bcc0-31a251041180.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5cfa4c7d-207e-429f-bcc0-31a251041180.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5cfa4c7d-207e-429f-bcc0-31a251041180.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5d0e72fd-71b4-46b7-9fb3-a63a981b9f71.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5d0e72fd-71b4-46b7-9fb3-a63a981b9f71.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5d0e72fd-71b4-46b7-9fb3-a63a981b9f71.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5d0e72fd-71b4-46b7-9fb3-a63a981b9f71.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5d350bad-7ecb-4bbc-8ab8-6a1de3affaeb.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5d350bad-7ecb-4bbc-8ab8-6a1de3affaeb.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5d350bad-7ecb-4bbc-8ab8-6a1de3affaeb.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5d350bad-7ecb-4bbc-8ab8-6a1de3affaeb.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5d3ff718-ce9a-47ef-b6c3-d8a335e6994c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5d3ff718-ce9a-47ef-b6c3-d8a335e6994c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5d3ff718-ce9a-47ef-b6c3-d8a335e6994c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5d3ff718-ce9a-47ef-b6c3-d8a335e6994c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5d67390b-bd20-4a12-8fa9-5fee81a992ab.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5d67390b-bd20-4a12-8fa9-5fee81a992ab.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5d67390b-bd20-4a12-8fa9-5fee81a992ab.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5d67390b-bd20-4a12-8fa9-5fee81a992ab.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5d933d85-92e7-4a90-9d6f-22e6b450a32e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5d933d85-92e7-4a90-9d6f-22e6b450a32e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5d933d85-92e7-4a90-9d6f-22e6b450a32e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5d933d85-92e7-4a90-9d6f-22e6b450a32e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5dad76fe-0ed0-4816-99a1-df482bf60963.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5dad76fe-0ed0-4816-99a1-df482bf60963.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5dad76fe-0ed0-4816-99a1-df482bf60963.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5dad76fe-0ed0-4816-99a1-df482bf60963.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5dbbde73-b226-49a6-840e-a27774917ff3.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5dbbde73-b226-49a6-840e-a27774917ff3.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5dbbde73-b226-49a6-840e-a27774917ff3.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5dbbde73-b226-49a6-840e-a27774917ff3.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5dd3c6c5-8486-45f6-9f75-c5362fbdaf09.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5dd3c6c5-8486-45f6-9f75-c5362fbdaf09.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5dd3c6c5-8486-45f6-9f75-c5362fbdaf09.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5dd3c6c5-8486-45f6-9f75-c5362fbdaf09.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5ddce6c8-9810-4a19-a55e-ea3d21f9d1a5.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5ddce6c8-9810-4a19-a55e-ea3d21f9d1a5.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5ddce6c8-9810-4a19-a55e-ea3d21f9d1a5.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5ddce6c8-9810-4a19-a55e-ea3d21f9d1a5.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5de1106d-30c1-4e3e-9156-cee76dc98947.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5de1106d-30c1-4e3e-9156-cee76dc98947.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5de1106d-30c1-4e3e-9156-cee76dc98947.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5de1106d-30c1-4e3e-9156-cee76dc98947.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5e04f8f3-98fa-4c01-829c-0e8efd0f6974.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5e04f8f3-98fa-4c01-829c-0e8efd0f6974.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5e04f8f3-98fa-4c01-829c-0e8efd0f6974.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5e04f8f3-98fa-4c01-829c-0e8efd0f6974.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5e0b0376-d07a-4764-a008-1300f4d6b53b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5e0b0376-d07a-4764-a008-1300f4d6b53b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5e0b0376-d07a-4764-a008-1300f4d6b53b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5e0b0376-d07a-4764-a008-1300f4d6b53b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5e45b584-ec1b-475e-b1b9-4460dc6367af.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5e45b584-ec1b-475e-b1b9-4460dc6367af.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5e45b584-ec1b-475e-b1b9-4460dc6367af.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5e45b584-ec1b-475e-b1b9-4460dc6367af.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5e4ff5c2-bd74-47d5-baeb-dcc609783817.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5e4ff5c2-bd74-47d5-baeb-dcc609783817.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5e4ff5c2-bd74-47d5-baeb-dcc609783817.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5e4ff5c2-bd74-47d5-baeb-dcc609783817.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5e575b1b-53ee-4a4f-bbdf-e54ba45f78be.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5e575b1b-53ee-4a4f-bbdf-e54ba45f78be.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5e575b1b-53ee-4a4f-bbdf-e54ba45f78be.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5e575b1b-53ee-4a4f-bbdf-e54ba45f78be.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5e77b3c5-efdd-49f6-94b4-ed25c977cc76.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5e77b3c5-efdd-49f6-94b4-ed25c977cc76.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5e77b3c5-efdd-49f6-94b4-ed25c977cc76.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5e77b3c5-efdd-49f6-94b4-ed25c977cc76.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5e9282d2-77f3-4ffb-ad48-196c34627e0f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5e9282d2-77f3-4ffb-ad48-196c34627e0f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5e9282d2-77f3-4ffb-ad48-196c34627e0f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5e9282d2-77f3-4ffb-ad48-196c34627e0f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5e92a653-27f1-4c33-b1ed-0b74d7776b49.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5e92a653-27f1-4c33-b1ed-0b74d7776b49.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5e92a653-27f1-4c33-b1ed-0b74d7776b49.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5e92a653-27f1-4c33-b1ed-0b74d7776b49.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5ec422cb-94f0-4d24-b7f6-fcc173d93a91.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5ec422cb-94f0-4d24-b7f6-fcc173d93a91.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5ec422cb-94f0-4d24-b7f6-fcc173d93a91.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5ec422cb-94f0-4d24-b7f6-fcc173d93a91.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5ed31002-ccb2-4b86-9375-33d21b353acc.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5ed31002-ccb2-4b86-9375-33d21b353acc.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5ed31002-ccb2-4b86-9375-33d21b353acc.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5ed31002-ccb2-4b86-9375-33d21b353acc.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5ed87c8b-7ef7-41f6-8414-0910813015f9.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5ed87c8b-7ef7-41f6-8414-0910813015f9.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5ed87c8b-7ef7-41f6-8414-0910813015f9.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5ed87c8b-7ef7-41f6-8414-0910813015f9.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5f199ec3-4fca-43cf-b3a3-6011f6322ca0.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5f199ec3-4fca-43cf-b3a3-6011f6322ca0.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5f199ec3-4fca-43cf-b3a3-6011f6322ca0.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5f199ec3-4fca-43cf-b3a3-6011f6322ca0.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5f251b3d-bb09-4b96-8997-7f7648943d82.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5f251b3d-bb09-4b96-8997-7f7648943d82.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5f251b3d-bb09-4b96-8997-7f7648943d82.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5f251b3d-bb09-4b96-8997-7f7648943d82.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5f3949aa-ce18-4abb-a4ca-50d8ea81c6f3.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5f3949aa-ce18-4abb-a4ca-50d8ea81c6f3.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5f3949aa-ce18-4abb-a4ca-50d8ea81c6f3.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5f3949aa-ce18-4abb-a4ca-50d8ea81c6f3.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5f430770-776d-459a-85a6-4e175baaf7b0.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5f430770-776d-459a-85a6-4e175baaf7b0.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5f430770-776d-459a-85a6-4e175baaf7b0.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5f430770-776d-459a-85a6-4e175baaf7b0.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5fd97ef1-0f0f-4c91-8ef3-e0f24cfdfc42.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5fd97ef1-0f0f-4c91-8ef3-e0f24cfdfc42.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5fd97ef1-0f0f-4c91-8ef3-e0f24cfdfc42.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5fd97ef1-0f0f-4c91-8ef3-e0f24cfdfc42.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5fdee7ed-a7ad-463b-8fc3-709565251607.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5fdee7ed-a7ad-463b-8fc3-709565251607.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5fdee7ed-a7ad-463b-8fc3-709565251607.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5fdee7ed-a7ad-463b-8fc3-709565251607.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5fe58954-6712-4295-8e85-5f62b732bd6a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5fe58954-6712-4295-8e85-5f62b732bd6a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5fe58954-6712-4295-8e85-5f62b732bd6a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/5fe58954-6712-4295-8e85-5f62b732bd6a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6005fdce-8aac-4d43-a6ca-475f130fa750.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6005fdce-8aac-4d43-a6ca-475f130fa750.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6005fdce-8aac-4d43-a6ca-475f130fa750.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6005fdce-8aac-4d43-a6ca-475f130fa750.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/600736d0-3082-47b3-811f-7890e654b421.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/600736d0-3082-47b3-811f-7890e654b421.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/600736d0-3082-47b3-811f-7890e654b421.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/600736d0-3082-47b3-811f-7890e654b421.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6013615d-be0f-46d5-b170-9838c8934467.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6013615d-be0f-46d5-b170-9838c8934467.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6013615d-be0f-46d5-b170-9838c8934467.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6013615d-be0f-46d5-b170-9838c8934467.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6023c67f-e0b3-47f2-903c-329fc3455320.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6023c67f-e0b3-47f2-903c-329fc3455320.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6023c67f-e0b3-47f2-903c-329fc3455320.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6023c67f-e0b3-47f2-903c-329fc3455320.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/60729b9e-753c-4bce-bdf8-58840f23bf8a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/60729b9e-753c-4bce-bdf8-58840f23bf8a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/60729b9e-753c-4bce-bdf8-58840f23bf8a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/60729b9e-753c-4bce-bdf8-58840f23bf8a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/60a83cb5-2e87-435c-a51b-8bcf44585f3d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/60a83cb5-2e87-435c-a51b-8bcf44585f3d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/60a83cb5-2e87-435c-a51b-8bcf44585f3d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/60a83cb5-2e87-435c-a51b-8bcf44585f3d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/60e5ed5d-2f3e-48a9-8efd-f074e4438c87.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/60e5ed5d-2f3e-48a9-8efd-f074e4438c87.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/60e5ed5d-2f3e-48a9-8efd-f074e4438c87.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/60e5ed5d-2f3e-48a9-8efd-f074e4438c87.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/60fdbba7-c833-432a-8972-0b22f683cdb5.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/60fdbba7-c833-432a-8972-0b22f683cdb5.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/60fdbba7-c833-432a-8972-0b22f683cdb5.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/60fdbba7-c833-432a-8972-0b22f683cdb5.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/61143a0e-0fde-435e-b036-7c17ae70cecd.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/61143a0e-0fde-435e-b036-7c17ae70cecd.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/61143a0e-0fde-435e-b036-7c17ae70cecd.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/61143a0e-0fde-435e-b036-7c17ae70cecd.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/61211431-3f4b-45df-a76f-da74ad72ea66.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/61211431-3f4b-45df-a76f-da74ad72ea66.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/61211431-3f4b-45df-a76f-da74ad72ea66.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/61211431-3f4b-45df-a76f-da74ad72ea66.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6121ce35-a94e-44c3-9275-9313528364cd.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6121ce35-a94e-44c3-9275-9313528364cd.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6121ce35-a94e-44c3-9275-9313528364cd.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6121ce35-a94e-44c3-9275-9313528364cd.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/612a7a00-b75d-4531-85ff-22d60a4e08b8.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/612a7a00-b75d-4531-85ff-22d60a4e08b8.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/612a7a00-b75d-4531-85ff-22d60a4e08b8.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/612a7a00-b75d-4531-85ff-22d60a4e08b8.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/612ef3b0-fde1-4fab-8240-70b8ac491c83.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/612ef3b0-fde1-4fab-8240-70b8ac491c83.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/612ef3b0-fde1-4fab-8240-70b8ac491c83.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/612ef3b0-fde1-4fab-8240-70b8ac491c83.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/614c2940-ca97-44b2-be9f-fa882f9cc4b2.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/614c2940-ca97-44b2-be9f-fa882f9cc4b2.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/614c2940-ca97-44b2-be9f-fa882f9cc4b2.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/614c2940-ca97-44b2-be9f-fa882f9cc4b2.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/614eb841-21fa-4f66-8ea7-1bec2faf28f5.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/614eb841-21fa-4f66-8ea7-1bec2faf28f5.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/614eb841-21fa-4f66-8ea7-1bec2faf28f5.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/614eb841-21fa-4f66-8ea7-1bec2faf28f5.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/615772f3-9095-43f1-9a57-9c03a4baa202.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/615772f3-9095-43f1-9a57-9c03a4baa202.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/615772f3-9095-43f1-9a57-9c03a4baa202.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/615772f3-9095-43f1-9a57-9c03a4baa202.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6190df1d-9633-4df1-ba3d-6a4a541fe1ba.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6190df1d-9633-4df1-ba3d-6a4a541fe1ba.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6190df1d-9633-4df1-ba3d-6a4a541fe1ba.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6190df1d-9633-4df1-ba3d-6a4a541fe1ba.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6192b24c-2633-4e00-8183-e73a8a0d2f0d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6192b24c-2633-4e00-8183-e73a8a0d2f0d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6192b24c-2633-4e00-8183-e73a8a0d2f0d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6192b24c-2633-4e00-8183-e73a8a0d2f0d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/61a9e2e0-15ca-4085-89d0-b39ca185cb36.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/61a9e2e0-15ca-4085-89d0-b39ca185cb36.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/61a9e2e0-15ca-4085-89d0-b39ca185cb36.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/61a9e2e0-15ca-4085-89d0-b39ca185cb36.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/61c3ca2d-ad31-4102-aa7b-a948c53867aa.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/61c3ca2d-ad31-4102-aa7b-a948c53867aa.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/61c3ca2d-ad31-4102-aa7b-a948c53867aa.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/61c3ca2d-ad31-4102-aa7b-a948c53867aa.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/61d86d4f-03ae-47fb-9417-e3a6e9a4f7da.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/61d86d4f-03ae-47fb-9417-e3a6e9a4f7da.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/61d86d4f-03ae-47fb-9417-e3a6e9a4f7da.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/61d86d4f-03ae-47fb-9417-e3a6e9a4f7da.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/61dde111-7d4b-422f-b85b-e6fa8768c83a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/61dde111-7d4b-422f-b85b-e6fa8768c83a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/61dde111-7d4b-422f-b85b-e6fa8768c83a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/61dde111-7d4b-422f-b85b-e6fa8768c83a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/62061d48-e64c-4689-92b2-bdfdea65846a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/62061d48-e64c-4689-92b2-bdfdea65846a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/62061d48-e64c-4689-92b2-bdfdea65846a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/62061d48-e64c-4689-92b2-bdfdea65846a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/622273f5-5552-4709-97d1-156a468bb128.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/622273f5-5552-4709-97d1-156a468bb128.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/622273f5-5552-4709-97d1-156a468bb128.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/622273f5-5552-4709-97d1-156a468bb128.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6241ff8b-17f9-4e49-9fae-df1959275eac.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6241ff8b-17f9-4e49-9fae-df1959275eac.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6241ff8b-17f9-4e49-9fae-df1959275eac.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6241ff8b-17f9-4e49-9fae-df1959275eac.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/62470fa6-694b-47c8-9f09-7aa05fe5e3db.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/62470fa6-694b-47c8-9f09-7aa05fe5e3db.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/62470fa6-694b-47c8-9f09-7aa05fe5e3db.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/62470fa6-694b-47c8-9f09-7aa05fe5e3db.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/625453d2-d776-4f80-aa59-d07b734124b1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/625453d2-d776-4f80-aa59-d07b734124b1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/625453d2-d776-4f80-aa59-d07b734124b1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/625453d2-d776-4f80-aa59-d07b734124b1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6260342b-5e62-42fe-9e99-ed5e221115e7.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6260342b-5e62-42fe-9e99-ed5e221115e7.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6260342b-5e62-42fe-9e99-ed5e221115e7.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6260342b-5e62-42fe-9e99-ed5e221115e7.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/62605a01-a522-49bb-bf27-23cf4bf14c9c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/62605a01-a522-49bb-bf27-23cf4bf14c9c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/62605a01-a522-49bb-bf27-23cf4bf14c9c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/62605a01-a522-49bb-bf27-23cf4bf14c9c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/627cbd8d-7d16-44d2-b923-0cfea6e5aef6.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/627cbd8d-7d16-44d2-b923-0cfea6e5aef6.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/627cbd8d-7d16-44d2-b923-0cfea6e5aef6.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/627cbd8d-7d16-44d2-b923-0cfea6e5aef6.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/628584a1-85df-47e5-a0ac-87844eedc3e4.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/628584a1-85df-47e5-a0ac-87844eedc3e4.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/628584a1-85df-47e5-a0ac-87844eedc3e4.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/628584a1-85df-47e5-a0ac-87844eedc3e4.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/62dca4ff-f60c-46e7-9d74-a9ab22daede2.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/62dca4ff-f60c-46e7-9d74-a9ab22daede2.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/62dca4ff-f60c-46e7-9d74-a9ab22daede2.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/62dca4ff-f60c-46e7-9d74-a9ab22daede2.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/62fcda04-51e2-4faa-9a49-eb0c68ef4b52.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/62fcda04-51e2-4faa-9a49-eb0c68ef4b52.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/62fcda04-51e2-4faa-9a49-eb0c68ef4b52.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/62fcda04-51e2-4faa-9a49-eb0c68ef4b52.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/63021166-0e4e-4582-9431-3af4aae3878a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/63021166-0e4e-4582-9431-3af4aae3878a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/63021166-0e4e-4582-9431-3af4aae3878a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/63021166-0e4e-4582-9431-3af4aae3878a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/630f388f-859f-40d2-ab3f-655bb50ad366.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/630f388f-859f-40d2-ab3f-655bb50ad366.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/630f388f-859f-40d2-ab3f-655bb50ad366.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/630f388f-859f-40d2-ab3f-655bb50ad366.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6338011b-e44e-4ef6-be5f-df7bf3f0ecd8.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6338011b-e44e-4ef6-be5f-df7bf3f0ecd8.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6338011b-e44e-4ef6-be5f-df7bf3f0ecd8.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6338011b-e44e-4ef6-be5f-df7bf3f0ecd8.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6348d96d-02ba-4aea-96db-e27302bbd10d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6348d96d-02ba-4aea-96db-e27302bbd10d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6348d96d-02ba-4aea-96db-e27302bbd10d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6348d96d-02ba-4aea-96db-e27302bbd10d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6350cbe3-ba42-4fb1-b9bb-78ac181b45d1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6350cbe3-ba42-4fb1-b9bb-78ac181b45d1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6350cbe3-ba42-4fb1-b9bb-78ac181b45d1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6350cbe3-ba42-4fb1-b9bb-78ac181b45d1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6355e740-1883-48f8-aa1a-b71c5a48ad33.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6355e740-1883-48f8-aa1a-b71c5a48ad33.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6355e740-1883-48f8-aa1a-b71c5a48ad33.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6355e740-1883-48f8-aa1a-b71c5a48ad33.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/635b9ac3-862f-43cc-9e9c-86df53b6cc1a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/635b9ac3-862f-43cc-9e9c-86df53b6cc1a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/635b9ac3-862f-43cc-9e9c-86df53b6cc1a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/635b9ac3-862f-43cc-9e9c-86df53b6cc1a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/63604a20-e4e6-4079-aac0-09fd59fb87c2.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/63604a20-e4e6-4079-aac0-09fd59fb87c2.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/63604a20-e4e6-4079-aac0-09fd59fb87c2.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/63604a20-e4e6-4079-aac0-09fd59fb87c2.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/636ade19-e611-49d5-9828-6fef268c502c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/636ade19-e611-49d5-9828-6fef268c502c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/636ade19-e611-49d5-9828-6fef268c502c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/636ade19-e611-49d5-9828-6fef268c502c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/63715cc2-356c-4d7d-a201-2c1417a64b53.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/63715cc2-356c-4d7d-a201-2c1417a64b53.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/63715cc2-356c-4d7d-a201-2c1417a64b53.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/63715cc2-356c-4d7d-a201-2c1417a64b53.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/63e7d3de-7202-4564-b829-e7448783a680.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/63e7d3de-7202-4564-b829-e7448783a680.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/63e7d3de-7202-4564-b829-e7448783a680.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/63e7d3de-7202-4564-b829-e7448783a680.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6412d308-5fd9-4351-b4b3-cbf45d362d1b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6412d308-5fd9-4351-b4b3-cbf45d362d1b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6412d308-5fd9-4351-b4b3-cbf45d362d1b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6412d308-5fd9-4351-b4b3-cbf45d362d1b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/642217f7-e106-4258-84c4-0b845cbb95de.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/642217f7-e106-4258-84c4-0b845cbb95de.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/642217f7-e106-4258-84c4-0b845cbb95de.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/642217f7-e106-4258-84c4-0b845cbb95de.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/643379d6-2f99-45d2-98a8-32c3878cc342.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/643379d6-2f99-45d2-98a8-32c3878cc342.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/643379d6-2f99-45d2-98a8-32c3878cc342.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/643379d6-2f99-45d2-98a8-32c3878cc342.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/64adc9ba-3311-44d7-ba82-16b444ca432a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/64adc9ba-3311-44d7-ba82-16b444ca432a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/64adc9ba-3311-44d7-ba82-16b444ca432a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/64adc9ba-3311-44d7-ba82-16b444ca432a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/64d40e8d-47fd-46d9-ab27-2354d6f360e1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/64d40e8d-47fd-46d9-ab27-2354d6f360e1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/64d40e8d-47fd-46d9-ab27-2354d6f360e1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/64d40e8d-47fd-46d9-ab27-2354d6f360e1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/64dbcb32-1dce-443b-b808-4288eadca6ee.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/64dbcb32-1dce-443b-b808-4288eadca6ee.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/64dbcb32-1dce-443b-b808-4288eadca6ee.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/64dbcb32-1dce-443b-b808-4288eadca6ee.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/650a7740-56fc-43d3-b730-2ab869cfb017.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/650a7740-56fc-43d3-b730-2ab869cfb017.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/650a7740-56fc-43d3-b730-2ab869cfb017.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/650a7740-56fc-43d3-b730-2ab869cfb017.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/654e74af-1650-43b1-9264-a2247dcb272e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/654e74af-1650-43b1-9264-a2247dcb272e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/654e74af-1650-43b1-9264-a2247dcb272e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/654e74af-1650-43b1-9264-a2247dcb272e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/65533e1b-c3ae-431f-bfda-272473b6a9b2.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/65533e1b-c3ae-431f-bfda-272473b6a9b2.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/65533e1b-c3ae-431f-bfda-272473b6a9b2.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/65533e1b-c3ae-431f-bfda-272473b6a9b2.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/65647add-eb5e-4723-999e-41977072c6b8.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/65647add-eb5e-4723-999e-41977072c6b8.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/65647add-eb5e-4723-999e-41977072c6b8.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/65647add-eb5e-4723-999e-41977072c6b8.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/659e0743-dbf1-491b-ab69-91dd09527b57.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/659e0743-dbf1-491b-ab69-91dd09527b57.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/659e0743-dbf1-491b-ab69-91dd09527b57.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/659e0743-dbf1-491b-ab69-91dd09527b57.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/65a0e30c-522e-48e0-bb5f-df9b98400b06.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/65a0e30c-522e-48e0-bb5f-df9b98400b06.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/65a0e30c-522e-48e0-bb5f-df9b98400b06.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/65a0e30c-522e-48e0-bb5f-df9b98400b06.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/65a5a1da-5ddd-4d8a-95c1-a70c5e7dde53.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/65a5a1da-5ddd-4d8a-95c1-a70c5e7dde53.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/65a5a1da-5ddd-4d8a-95c1-a70c5e7dde53.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/65a5a1da-5ddd-4d8a-95c1-a70c5e7dde53.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/65b8015e-3d2f-4ceb-a1ac-edfe60c02a44.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/65b8015e-3d2f-4ceb-a1ac-edfe60c02a44.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/65b8015e-3d2f-4ceb-a1ac-edfe60c02a44.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/65b8015e-3d2f-4ceb-a1ac-edfe60c02a44.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/65c7c8e8-f52d-411c-85e2-3a0340356859.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/65c7c8e8-f52d-411c-85e2-3a0340356859.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/65c7c8e8-f52d-411c-85e2-3a0340356859.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/65c7c8e8-f52d-411c-85e2-3a0340356859.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/65ca3b70-af4c-4848-b2b9-4eca22c3a313.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/65ca3b70-af4c-4848-b2b9-4eca22c3a313.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/65ca3b70-af4c-4848-b2b9-4eca22c3a313.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/65ca3b70-af4c-4848-b2b9-4eca22c3a313.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/66149ca5-b8ff-4c2e-9a99-3821a377fe9d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/66149ca5-b8ff-4c2e-9a99-3821a377fe9d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/66149ca5-b8ff-4c2e-9a99-3821a377fe9d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/66149ca5-b8ff-4c2e-9a99-3821a377fe9d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/667da828-e1e1-4430-b4b7-8a81ea2939b5.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/667da828-e1e1-4430-b4b7-8a81ea2939b5.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/667da828-e1e1-4430-b4b7-8a81ea2939b5.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/667da828-e1e1-4430-b4b7-8a81ea2939b5.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6690914b-5c8f-4ad2-a50c-a5bb5a21ffb1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6690914b-5c8f-4ad2-a50c-a5bb5a21ffb1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6690914b-5c8f-4ad2-a50c-a5bb5a21ffb1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6690914b-5c8f-4ad2-a50c-a5bb5a21ffb1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/66c02ea2-f079-439b-b635-94cf8dad2f78.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/66c02ea2-f079-439b-b635-94cf8dad2f78.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/66c02ea2-f079-439b-b635-94cf8dad2f78.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/66c02ea2-f079-439b-b635-94cf8dad2f78.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/66f54c2c-20d6-4a43-8801-8d086c2cac84.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/66f54c2c-20d6-4a43-8801-8d086c2cac84.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/66f54c2c-20d6-4a43-8801-8d086c2cac84.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/66f54c2c-20d6-4a43-8801-8d086c2cac84.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/671ec8a1-1a6f-4cec-b2e9-7616514f79e6.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/671ec8a1-1a6f-4cec-b2e9-7616514f79e6.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/671ec8a1-1a6f-4cec-b2e9-7616514f79e6.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/671ec8a1-1a6f-4cec-b2e9-7616514f79e6.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/672be36c-77b3-4236-ad5c-fce65570e481.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/672be36c-77b3-4236-ad5c-fce65570e481.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/672be36c-77b3-4236-ad5c-fce65570e481.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/672be36c-77b3-4236-ad5c-fce65570e481.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/67345781-45cb-4a88-94ad-199985f8cc1b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/67345781-45cb-4a88-94ad-199985f8cc1b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/67345781-45cb-4a88-94ad-199985f8cc1b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/67345781-45cb-4a88-94ad-199985f8cc1b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/676d922f-5696-41cf-be99-6531210d6825.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/676d922f-5696-41cf-be99-6531210d6825.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/676d922f-5696-41cf-be99-6531210d6825.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/676d922f-5696-41cf-be99-6531210d6825.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/67793f28-ff85-4072-b859-8950a157ef8e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/67793f28-ff85-4072-b859-8950a157ef8e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/67793f28-ff85-4072-b859-8950a157ef8e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/67793f28-ff85-4072-b859-8950a157ef8e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6799aade-0433-4e1f-ba60-86ad2aab4d32.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6799aade-0433-4e1f-ba60-86ad2aab4d32.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6799aade-0433-4e1f-ba60-86ad2aab4d32.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6799aade-0433-4e1f-ba60-86ad2aab4d32.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/67b2fe61-5ee0-48a3-9f89-3ffdb50f508d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/67b2fe61-5ee0-48a3-9f89-3ffdb50f508d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/67b2fe61-5ee0-48a3-9f89-3ffdb50f508d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/67b2fe61-5ee0-48a3-9f89-3ffdb50f508d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6805e29f-efa1-4269-98f3-7ac48cba5bfd.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6805e29f-efa1-4269-98f3-7ac48cba5bfd.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6805e29f-efa1-4269-98f3-7ac48cba5bfd.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6805e29f-efa1-4269-98f3-7ac48cba5bfd.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/683c336c-78fd-436a-b6fe-58f299788d15.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/683c336c-78fd-436a-b6fe-58f299788d15.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/683c336c-78fd-436a-b6fe-58f299788d15.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/683c336c-78fd-436a-b6fe-58f299788d15.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6863321b-d4ac-4a2b-8ea7-e69b563328e3.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6863321b-d4ac-4a2b-8ea7-e69b563328e3.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6863321b-d4ac-4a2b-8ea7-e69b563328e3.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6863321b-d4ac-4a2b-8ea7-e69b563328e3.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/688c4b8d-468c-4318-8a17-7595ece8d9d6.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/688c4b8d-468c-4318-8a17-7595ece8d9d6.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/688c4b8d-468c-4318-8a17-7595ece8d9d6.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/688c4b8d-468c-4318-8a17-7595ece8d9d6.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/68b00601-5ffb-401c-b550-ef7de132928a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/68b00601-5ffb-401c-b550-ef7de132928a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/68b00601-5ffb-401c-b550-ef7de132928a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/68b00601-5ffb-401c-b550-ef7de132928a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/68ece873-57cc-4e40-bd81-380a337b0a38.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/68ece873-57cc-4e40-bd81-380a337b0a38.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/68ece873-57cc-4e40-bd81-380a337b0a38.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/68ece873-57cc-4e40-bd81-380a337b0a38.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/68f66411-b93e-4e22-b808-ba9d121db139.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/68f66411-b93e-4e22-b808-ba9d121db139.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/68f66411-b93e-4e22-b808-ba9d121db139.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/68f66411-b93e-4e22-b808-ba9d121db139.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/690015ae-1257-4f6d-96e3-61300d201adb.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/690015ae-1257-4f6d-96e3-61300d201adb.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/690015ae-1257-4f6d-96e3-61300d201adb.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/690015ae-1257-4f6d-96e3-61300d201adb.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/69045eda-11d3-42e2-8d1f-3e31272c7ac7.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/69045eda-11d3-42e2-8d1f-3e31272c7ac7.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/69045eda-11d3-42e2-8d1f-3e31272c7ac7.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/69045eda-11d3-42e2-8d1f-3e31272c7ac7.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/694b92df-b89d-4774-a9be-48d939c755d6.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/694b92df-b89d-4774-a9be-48d939c755d6.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/694b92df-b89d-4774-a9be-48d939c755d6.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/694b92df-b89d-4774-a9be-48d939c755d6.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/698392d5-97a3-4531-8055-785f87217391.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/698392d5-97a3-4531-8055-785f87217391.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/698392d5-97a3-4531-8055-785f87217391.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/698392d5-97a3-4531-8055-785f87217391.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/69848a93-8d00-4fd0-a8dc-0f813d549d01.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/69848a93-8d00-4fd0-a8dc-0f813d549d01.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/69848a93-8d00-4fd0-a8dc-0f813d549d01.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/69848a93-8d00-4fd0-a8dc-0f813d549d01.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/698727c7-bcbb-4183-a0f6-c6c1a72b562a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/698727c7-bcbb-4183-a0f6-c6c1a72b562a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/698727c7-bcbb-4183-a0f6-c6c1a72b562a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/698727c7-bcbb-4183-a0f6-c6c1a72b562a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/698a47a2-5558-4010-852d-b01e11a59fdc.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/698a47a2-5558-4010-852d-b01e11a59fdc.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/698a47a2-5558-4010-852d-b01e11a59fdc.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/698a47a2-5558-4010-852d-b01e11a59fdc.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/69df5fdf-e42d-4ee3-908c-75e4f3ae29f5.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/69df5fdf-e42d-4ee3-908c-75e4f3ae29f5.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/69df5fdf-e42d-4ee3-908c-75e4f3ae29f5.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/69df5fdf-e42d-4ee3-908c-75e4f3ae29f5.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6a133a06-b68c-467e-8d1d-efaae4b34f2d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6a133a06-b68c-467e-8d1d-efaae4b34f2d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6a133a06-b68c-467e-8d1d-efaae4b34f2d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6a133a06-b68c-467e-8d1d-efaae4b34f2d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6a18597e-204e-4534-a2f6-abdddb30caed.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6a18597e-204e-4534-a2f6-abdddb30caed.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6a18597e-204e-4534-a2f6-abdddb30caed.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6a18597e-204e-4534-a2f6-abdddb30caed.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6a311a1f-7471-4dcc-918b-9b312f11a547.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6a311a1f-7471-4dcc-918b-9b312f11a547.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6a311a1f-7471-4dcc-918b-9b312f11a547.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6a311a1f-7471-4dcc-918b-9b312f11a547.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6a3b2dc4-5ef7-486f-9b70-5f5f021f069e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6a3b2dc4-5ef7-486f-9b70-5f5f021f069e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6a3b2dc4-5ef7-486f-9b70-5f5f021f069e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6a3b2dc4-5ef7-486f-9b70-5f5f021f069e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6a4e0542-4459-4215-a9a1-aaaed1b47b8d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6a4e0542-4459-4215-a9a1-aaaed1b47b8d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6a4e0542-4459-4215-a9a1-aaaed1b47b8d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6a4e0542-4459-4215-a9a1-aaaed1b47b8d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6a603f8b-c3e2-4654-8d89-93dfe61ed38c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6a603f8b-c3e2-4654-8d89-93dfe61ed38c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6a603f8b-c3e2-4654-8d89-93dfe61ed38c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6a603f8b-c3e2-4654-8d89-93dfe61ed38c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6a649085-a9dd-4bbe-a254-ba9cb8ff7bf2.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6a649085-a9dd-4bbe-a254-ba9cb8ff7bf2.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6a649085-a9dd-4bbe-a254-ba9cb8ff7bf2.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6a649085-a9dd-4bbe-a254-ba9cb8ff7bf2.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6a8070f1-8f25-4cd4-9178-10a03099deec.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6a8070f1-8f25-4cd4-9178-10a03099deec.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6a8070f1-8f25-4cd4-9178-10a03099deec.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6a8070f1-8f25-4cd4-9178-10a03099deec.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6a872d2f-5904-4c8d-9a83-b2e9c68849fa.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6a872d2f-5904-4c8d-9a83-b2e9c68849fa.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6a872d2f-5904-4c8d-9a83-b2e9c68849fa.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6a872d2f-5904-4c8d-9a83-b2e9c68849fa.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6a8dadf9-fff4-4a77-9222-5fca6b29bb4b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6a8dadf9-fff4-4a77-9222-5fca6b29bb4b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6a8dadf9-fff4-4a77-9222-5fca6b29bb4b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6a8dadf9-fff4-4a77-9222-5fca6b29bb4b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6a96c0a0-84a9-401a-ae08-6b800e63f3bb.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6a96c0a0-84a9-401a-ae08-6b800e63f3bb.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6a96c0a0-84a9-401a-ae08-6b800e63f3bb.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6a96c0a0-84a9-401a-ae08-6b800e63f3bb.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6a9d40f8-e3ef-4347-8df2-989ee512bf5c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6a9d40f8-e3ef-4347-8df2-989ee512bf5c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6a9d40f8-e3ef-4347-8df2-989ee512bf5c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6a9d40f8-e3ef-4347-8df2-989ee512bf5c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6ab418b7-4cf5-47ee-b7da-adebab1275d5.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6ab418b7-4cf5-47ee-b7da-adebab1275d5.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6ab418b7-4cf5-47ee-b7da-adebab1275d5.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6ab418b7-4cf5-47ee-b7da-adebab1275d5.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6ab834d2-3d62-4a38-9776-d1c76f9d5933.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6ab834d2-3d62-4a38-9776-d1c76f9d5933.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6ab834d2-3d62-4a38-9776-d1c76f9d5933.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6ab834d2-3d62-4a38-9776-d1c76f9d5933.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6ac6a9a1-2eee-44a5-a130-f0379d70429a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6ac6a9a1-2eee-44a5-a130-f0379d70429a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6ac6a9a1-2eee-44a5-a130-f0379d70429a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6ac6a9a1-2eee-44a5-a130-f0379d70429a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6ad371be-066d-4153-9004-82bbdec390a7.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6ad371be-066d-4153-9004-82bbdec390a7.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6ad371be-066d-4153-9004-82bbdec390a7.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6ad371be-066d-4153-9004-82bbdec390a7.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6ad9da56-87d8-4ce8-a84b-f316541057c4.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6ad9da56-87d8-4ce8-a84b-f316541057c4.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6ad9da56-87d8-4ce8-a84b-f316541057c4.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6ad9da56-87d8-4ce8-a84b-f316541057c4.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6aede364-15f8-40c9-acba-7f2addf9e6c1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6aede364-15f8-40c9-acba-7f2addf9e6c1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6aede364-15f8-40c9-acba-7f2addf9e6c1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6aede364-15f8-40c9-acba-7f2addf9e6c1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6b366e3e-b5e3-4eec-8694-68c28f270e6e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6b366e3e-b5e3-4eec-8694-68c28f270e6e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6b366e3e-b5e3-4eec-8694-68c28f270e6e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6b366e3e-b5e3-4eec-8694-68c28f270e6e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6b46c36b-6213-429a-810f-1bb2c7736302.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6b46c36b-6213-429a-810f-1bb2c7736302.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6b46c36b-6213-429a-810f-1bb2c7736302.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6b46c36b-6213-429a-810f-1bb2c7736302.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6b61ed70-afab-4ab3-b6db-e37a46f534d3.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6b61ed70-afab-4ab3-b6db-e37a46f534d3.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6b61ed70-afab-4ab3-b6db-e37a46f534d3.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6b61ed70-afab-4ab3-b6db-e37a46f534d3.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6b85ea41-8f87-4645-a459-ef1a50658a08.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6b85ea41-8f87-4645-a459-ef1a50658a08.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6b85ea41-8f87-4645-a459-ef1a50658a08.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6b85ea41-8f87-4645-a459-ef1a50658a08.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6b8732bc-e810-4f44-94e5-610f15ed855a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6b8732bc-e810-4f44-94e5-610f15ed855a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6b8732bc-e810-4f44-94e5-610f15ed855a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6b8732bc-e810-4f44-94e5-610f15ed855a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6ba4e212-5e20-4fae-b2f7-4257515c8ff6.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6ba4e212-5e20-4fae-b2f7-4257515c8ff6.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6ba4e212-5e20-4fae-b2f7-4257515c8ff6.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6ba4e212-5e20-4fae-b2f7-4257515c8ff6.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6bb97f58-9f2b-4b1b-94a2-e40c0d650057.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6bb97f58-9f2b-4b1b-94a2-e40c0d650057.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6bb97f58-9f2b-4b1b-94a2-e40c0d650057.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6bb97f58-9f2b-4b1b-94a2-e40c0d650057.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6bbd0eed-484c-475b-a982-9d198e992503.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6bbd0eed-484c-475b-a982-9d198e992503.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6bbd0eed-484c-475b-a982-9d198e992503.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6bbd0eed-484c-475b-a982-9d198e992503.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6bc39668-e9f0-4908-99bc-6df7962bf1d5.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6bc39668-e9f0-4908-99bc-6df7962bf1d5.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6bc39668-e9f0-4908-99bc-6df7962bf1d5.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6bc39668-e9f0-4908-99bc-6df7962bf1d5.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6bd7c308-1e33-43ca-a1ca-0b30b1e1d717.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6bd7c308-1e33-43ca-a1ca-0b30b1e1d717.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6bd7c308-1e33-43ca-a1ca-0b30b1e1d717.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6bd7c308-1e33-43ca-a1ca-0b30b1e1d717.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6bd8d368-85f0-4575-816f-2a2fee8733be.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6bd8d368-85f0-4575-816f-2a2fee8733be.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6bd8d368-85f0-4575-816f-2a2fee8733be.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6bd8d368-85f0-4575-816f-2a2fee8733be.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6bed8a09-e693-4d37-a0c5-9b30ca9af4fb.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6bed8a09-e693-4d37-a0c5-9b30ca9af4fb.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6bed8a09-e693-4d37-a0c5-9b30ca9af4fb.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6bed8a09-e693-4d37-a0c5-9b30ca9af4fb.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6bf27381-600c-4290-9ab7-4dace79f9a1a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6bf27381-600c-4290-9ab7-4dace79f9a1a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6bf27381-600c-4290-9ab7-4dace79f9a1a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6bf27381-600c-4290-9ab7-4dace79f9a1a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6bf8cd8b-9a2a-4e83-97be-1f20e6805ef5.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6bf8cd8b-9a2a-4e83-97be-1f20e6805ef5.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6bf8cd8b-9a2a-4e83-97be-1f20e6805ef5.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6bf8cd8b-9a2a-4e83-97be-1f20e6805ef5.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6c0e081d-d15d-418c-b5ba-66d569dee771.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6c0e081d-d15d-418c-b5ba-66d569dee771.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6c0e081d-d15d-418c-b5ba-66d569dee771.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6c0e081d-d15d-418c-b5ba-66d569dee771.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6c1dd6bf-bb7d-4b1d-b4aa-bd3ee8e32561.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6c1dd6bf-bb7d-4b1d-b4aa-bd3ee8e32561.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6c1dd6bf-bb7d-4b1d-b4aa-bd3ee8e32561.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6c1dd6bf-bb7d-4b1d-b4aa-bd3ee8e32561.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6c1f5b51-7b83-4ffe-8100-394bc2ba1af4.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6c1f5b51-7b83-4ffe-8100-394bc2ba1af4.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6c1f5b51-7b83-4ffe-8100-394bc2ba1af4.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6c1f5b51-7b83-4ffe-8100-394bc2ba1af4.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6c213a37-e876-49bc-ae8b-2e0b834a966e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6c213a37-e876-49bc-ae8b-2e0b834a966e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6c213a37-e876-49bc-ae8b-2e0b834a966e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6c213a37-e876-49bc-ae8b-2e0b834a966e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6c3b3cc6-2460-4491-a59f-f8b856ab913d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6c3b3cc6-2460-4491-a59f-f8b856ab913d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6c3b3cc6-2460-4491-a59f-f8b856ab913d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6c3b3cc6-2460-4491-a59f-f8b856ab913d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6c608ea2-5ea7-4020-a69b-8ed5000ed8fa.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6c608ea2-5ea7-4020-a69b-8ed5000ed8fa.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6c608ea2-5ea7-4020-a69b-8ed5000ed8fa.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6c608ea2-5ea7-4020-a69b-8ed5000ed8fa.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6c64605f-1709-4edb-be3a-4248038fbb74.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6c64605f-1709-4edb-be3a-4248038fbb74.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6c64605f-1709-4edb-be3a-4248038fbb74.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6c64605f-1709-4edb-be3a-4248038fbb74.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6c68a2db-189a-4dc0-9466-d5efa36d1cfe.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6c68a2db-189a-4dc0-9466-d5efa36d1cfe.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6c68a2db-189a-4dc0-9466-d5efa36d1cfe.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6c68a2db-189a-4dc0-9466-d5efa36d1cfe.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6c6b1064-2110-4553-9221-aa9679b7cd38.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6c6b1064-2110-4553-9221-aa9679b7cd38.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6c6b1064-2110-4553-9221-aa9679b7cd38.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6c6b1064-2110-4553-9221-aa9679b7cd38.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6c9e515a-c5bd-4cc8-aa9f-ce89ebdc07be.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6c9e515a-c5bd-4cc8-aa9f-ce89ebdc07be.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6c9e515a-c5bd-4cc8-aa9f-ce89ebdc07be.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6c9e515a-c5bd-4cc8-aa9f-ce89ebdc07be.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6cb10b21-8b2a-4d0f-9b88-aa241392b558.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6cb10b21-8b2a-4d0f-9b88-aa241392b558.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6cb10b21-8b2a-4d0f-9b88-aa241392b558.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6cb10b21-8b2a-4d0f-9b88-aa241392b558.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6cb2101d-2f1c-45ce-abf3-fd714d3af917.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6cb2101d-2f1c-45ce-abf3-fd714d3af917.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6cb2101d-2f1c-45ce-abf3-fd714d3af917.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6cb2101d-2f1c-45ce-abf3-fd714d3af917.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6cbf4281-6f83-4819-9a3c-6a3674e93d69.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6cbf4281-6f83-4819-9a3c-6a3674e93d69.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6cbf4281-6f83-4819-9a3c-6a3674e93d69.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6cbf4281-6f83-4819-9a3c-6a3674e93d69.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6cc1f174-95c1-4762-8427-a0d4d33164a9.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6cc1f174-95c1-4762-8427-a0d4d33164a9.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6cc1f174-95c1-4762-8427-a0d4d33164a9.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6cc1f174-95c1-4762-8427-a0d4d33164a9.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6cd4bf4c-b973-4b4c-8047-1887915613f7.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6cd4bf4c-b973-4b4c-8047-1887915613f7.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6cd4bf4c-b973-4b4c-8047-1887915613f7.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6cd4bf4c-b973-4b4c-8047-1887915613f7.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6d0662f3-888a-49e6-b442-f4adb699422f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6d0662f3-888a-49e6-b442-f4adb699422f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6d0662f3-888a-49e6-b442-f4adb699422f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6d0662f3-888a-49e6-b442-f4adb699422f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6d278b51-8fa1-4743-8c60-12a06b6a151c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6d278b51-8fa1-4743-8c60-12a06b6a151c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6d278b51-8fa1-4743-8c60-12a06b6a151c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6d278b51-8fa1-4743-8c60-12a06b6a151c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6d34d8ce-5844-44c1-afd1-757658bb35fa.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6d34d8ce-5844-44c1-afd1-757658bb35fa.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6d34d8ce-5844-44c1-afd1-757658bb35fa.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6d34d8ce-5844-44c1-afd1-757658bb35fa.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6d5566d8-8091-4d98-86a5-867d4e4e0321.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6d5566d8-8091-4d98-86a5-867d4e4e0321.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6d5566d8-8091-4d98-86a5-867d4e4e0321.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6d5566d8-8091-4d98-86a5-867d4e4e0321.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6d5a3748-1ea4-4006-a54e-3089ebc71a0a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6d5a3748-1ea4-4006-a54e-3089ebc71a0a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6d5a3748-1ea4-4006-a54e-3089ebc71a0a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6d5a3748-1ea4-4006-a54e-3089ebc71a0a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6d95dcd1-46dd-4f50-bf6f-6d3157880e00.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6d95dcd1-46dd-4f50-bf6f-6d3157880e00.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6d95dcd1-46dd-4f50-bf6f-6d3157880e00.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6d95dcd1-46dd-4f50-bf6f-6d3157880e00.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6db11900-8df2-4470-a9ec-d2b5227c0006.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6db11900-8df2-4470-a9ec-d2b5227c0006.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6db11900-8df2-4470-a9ec-d2b5227c0006.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6db11900-8df2-4470-a9ec-d2b5227c0006.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6dd4953b-bf48-4cb8-a6a6-3892cce9a71a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6dd4953b-bf48-4cb8-a6a6-3892cce9a71a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6dd4953b-bf48-4cb8-a6a6-3892cce9a71a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6dd4953b-bf48-4cb8-a6a6-3892cce9a71a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6e3fc856-abcf-464e-8cc6-b9721c14546c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6e3fc856-abcf-464e-8cc6-b9721c14546c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6e3fc856-abcf-464e-8cc6-b9721c14546c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6e3fc856-abcf-464e-8cc6-b9721c14546c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6e631512-fb58-4090-8b43-28dfb876195b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6e631512-fb58-4090-8b43-28dfb876195b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6e631512-fb58-4090-8b43-28dfb876195b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6e631512-fb58-4090-8b43-28dfb876195b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6e929f69-49dc-48cf-b56e-a14e777e08c8.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6e929f69-49dc-48cf-b56e-a14e777e08c8.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6e929f69-49dc-48cf-b56e-a14e777e08c8.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6e929f69-49dc-48cf-b56e-a14e777e08c8.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6eab3eb6-63db-4ce5-8d62-1ec109e1af5a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6eab3eb6-63db-4ce5-8d62-1ec109e1af5a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6eab3eb6-63db-4ce5-8d62-1ec109e1af5a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6eab3eb6-63db-4ce5-8d62-1ec109e1af5a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6ed41abb-3221-4e00-8ff4-f5a58e1bf48c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6ed41abb-3221-4e00-8ff4-f5a58e1bf48c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6ed41abb-3221-4e00-8ff4-f5a58e1bf48c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6ed41abb-3221-4e00-8ff4-f5a58e1bf48c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6ed511fb-2baa-4e2d-801d-0427de329539.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6ed511fb-2baa-4e2d-801d-0427de329539.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6ed511fb-2baa-4e2d-801d-0427de329539.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6ed511fb-2baa-4e2d-801d-0427de329539.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6edcd82b-2a93-4809-b47a-cce947b30804.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6edcd82b-2a93-4809-b47a-cce947b30804.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6edcd82b-2a93-4809-b47a-cce947b30804.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6edcd82b-2a93-4809-b47a-cce947b30804.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6ee002a3-10f4-479a-97f6-68daa08c9537.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6ee002a3-10f4-479a-97f6-68daa08c9537.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6ee002a3-10f4-479a-97f6-68daa08c9537.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6ee002a3-10f4-479a-97f6-68daa08c9537.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6f3998ab-fb52-4c29-863e-e6594c656429.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6f3998ab-fb52-4c29-863e-e6594c656429.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6f3998ab-fb52-4c29-863e-e6594c656429.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6f3998ab-fb52-4c29-863e-e6594c656429.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6f493ee8-40dd-41fa-8675-150396039460.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6f493ee8-40dd-41fa-8675-150396039460.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6f493ee8-40dd-41fa-8675-150396039460.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6f493ee8-40dd-41fa-8675-150396039460.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6f53848e-7e6e-4f33-9588-e45d0870b5e4.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6f53848e-7e6e-4f33-9588-e45d0870b5e4.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6f53848e-7e6e-4f33-9588-e45d0870b5e4.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6f53848e-7e6e-4f33-9588-e45d0870b5e4.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6f6d45c7-77b8-4926-a6c6-7485424e2c6b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6f6d45c7-77b8-4926-a6c6-7485424e2c6b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6f6d45c7-77b8-4926-a6c6-7485424e2c6b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6f6d45c7-77b8-4926-a6c6-7485424e2c6b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6f8b51d9-d2c2-4fbc-a1dd-320f41e1a1e7.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6f8b51d9-d2c2-4fbc-a1dd-320f41e1a1e7.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6f8b51d9-d2c2-4fbc-a1dd-320f41e1a1e7.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6f8b51d9-d2c2-4fbc-a1dd-320f41e1a1e7.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6f8e8e3d-cbe0-4640-a85a-a534cdbe4d30.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6f8e8e3d-cbe0-4640-a85a-a534cdbe4d30.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6f8e8e3d-cbe0-4640-a85a-a534cdbe4d30.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6f8e8e3d-cbe0-4640-a85a-a534cdbe4d30.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6fb27709-1cba-46cf-b8b0-650da61df1da.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6fb27709-1cba-46cf-b8b0-650da61df1da.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6fb27709-1cba-46cf-b8b0-650da61df1da.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6fb27709-1cba-46cf-b8b0-650da61df1da.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6fdde70b-56d7-4d56-aab8-e9ef5b709a07.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6fdde70b-56d7-4d56-aab8-e9ef5b709a07.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6fdde70b-56d7-4d56-aab8-e9ef5b709a07.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6fdde70b-56d7-4d56-aab8-e9ef5b709a07.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6fedf950-cd3a-481e-b369-d0fa31fba1c5.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6fedf950-cd3a-481e-b369-d0fa31fba1c5.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6fedf950-cd3a-481e-b369-d0fa31fba1c5.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6fedf950-cd3a-481e-b369-d0fa31fba1c5.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6fef4564-1aa9-476e-b331-51effa976ce3.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6fef4564-1aa9-476e-b331-51effa976ce3.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6fef4564-1aa9-476e-b331-51effa976ce3.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6fef4564-1aa9-476e-b331-51effa976ce3.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6ff04e69-e3be-4b73-99f2-226b2725c5c0.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6ff04e69-e3be-4b73-99f2-226b2725c5c0.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6ff04e69-e3be-4b73-99f2-226b2725c5c0.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/6ff04e69-e3be-4b73-99f2-226b2725c5c0.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7001c336-b3a9-4249-ae15-7a32de318b25.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7001c336-b3a9-4249-ae15-7a32de318b25.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7001c336-b3a9-4249-ae15-7a32de318b25.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7001c336-b3a9-4249-ae15-7a32de318b25.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/701b4b28-c5e4-4858-bca6-e17de4f630f9.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/701b4b28-c5e4-4858-bca6-e17de4f630f9.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/701b4b28-c5e4-4858-bca6-e17de4f630f9.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/701b4b28-c5e4-4858-bca6-e17de4f630f9.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/701f1e90-b54c-42b4-ae19-f9499fb215ec.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/701f1e90-b54c-42b4-ae19-f9499fb215ec.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/701f1e90-b54c-42b4-ae19-f9499fb215ec.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/701f1e90-b54c-42b4-ae19-f9499fb215ec.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/70636f99-f3b2-496f-8898-974fd1c310ec.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/70636f99-f3b2-496f-8898-974fd1c310ec.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/70636f99-f3b2-496f-8898-974fd1c310ec.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/70636f99-f3b2-496f-8898-974fd1c310ec.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/707083f7-04bb-4deb-b314-f0c586fc3b73.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/707083f7-04bb-4deb-b314-f0c586fc3b73.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/707083f7-04bb-4deb-b314-f0c586fc3b73.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/707083f7-04bb-4deb-b314-f0c586fc3b73.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7079edb5-c00f-4029-b4be-cef1f200963d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7079edb5-c00f-4029-b4be-cef1f200963d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7079edb5-c00f-4029-b4be-cef1f200963d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7079edb5-c00f-4029-b4be-cef1f200963d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7081a0e5-899d-4ee3-a95f-69443e8a6d86.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7081a0e5-899d-4ee3-a95f-69443e8a6d86.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7081a0e5-899d-4ee3-a95f-69443e8a6d86.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7081a0e5-899d-4ee3-a95f-69443e8a6d86.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7084e2b6-86bd-4e74-a875-ca21a34abb3a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7084e2b6-86bd-4e74-a875-ca21a34abb3a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7084e2b6-86bd-4e74-a875-ca21a34abb3a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7084e2b6-86bd-4e74-a875-ca21a34abb3a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/709db0aa-e0ea-4f4e-b76a-214d80431c20.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/709db0aa-e0ea-4f4e-b76a-214d80431c20.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/709db0aa-e0ea-4f4e-b76a-214d80431c20.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/709db0aa-e0ea-4f4e-b76a-214d80431c20.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/70b04c25-d8c8-4476-b490-fbb20cef0949.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/70b04c25-d8c8-4476-b490-fbb20cef0949.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/70b04c25-d8c8-4476-b490-fbb20cef0949.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/70b04c25-d8c8-4476-b490-fbb20cef0949.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/70bd6c46-1a7f-4c66-bb8d-bf420983f38e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/70bd6c46-1a7f-4c66-bb8d-bf420983f38e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/70bd6c46-1a7f-4c66-bb8d-bf420983f38e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/70bd6c46-1a7f-4c66-bb8d-bf420983f38e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/70cb05f9-42ad-4aa0-8f75-f7980936f0b9.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/70cb05f9-42ad-4aa0-8f75-f7980936f0b9.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/70cb05f9-42ad-4aa0-8f75-f7980936f0b9.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/70cb05f9-42ad-4aa0-8f75-f7980936f0b9.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/70cb470d-4a58-4bd2-8e9d-dd78a2ca3501.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/70cb470d-4a58-4bd2-8e9d-dd78a2ca3501.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/70cb470d-4a58-4bd2-8e9d-dd78a2ca3501.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/70cb470d-4a58-4bd2-8e9d-dd78a2ca3501.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/70d8613a-72d4-4730-9fbd-ed6941aa2ca1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/70d8613a-72d4-4730-9fbd-ed6941aa2ca1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/70d8613a-72d4-4730-9fbd-ed6941aa2ca1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/70d8613a-72d4-4730-9fbd-ed6941aa2ca1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/70fc02e4-a115-4983-8cd8-b147d5530790.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/70fc02e4-a115-4983-8cd8-b147d5530790.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/70fc02e4-a115-4983-8cd8-b147d5530790.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/70fc02e4-a115-4983-8cd8-b147d5530790.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/710d4039-2c05-482d-985b-7412f03bcc32.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/710d4039-2c05-482d-985b-7412f03bcc32.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/710d4039-2c05-482d-985b-7412f03bcc32.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/710d4039-2c05-482d-985b-7412f03bcc32.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7131508b-110f-41ba-b1e1-d1d8ded7a734.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7131508b-110f-41ba-b1e1-d1d8ded7a734.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7131508b-110f-41ba-b1e1-d1d8ded7a734.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7131508b-110f-41ba-b1e1-d1d8ded7a734.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/71376460-4cbb-4a29-92e3-441429820e3c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/71376460-4cbb-4a29-92e3-441429820e3c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/71376460-4cbb-4a29-92e3-441429820e3c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/71376460-4cbb-4a29-92e3-441429820e3c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/713ed22f-7233-437d-9f28-40944a404015.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/713ed22f-7233-437d-9f28-40944a404015.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/713ed22f-7233-437d-9f28-40944a404015.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/713ed22f-7233-437d-9f28-40944a404015.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/717adc1d-6835-475a-a673-b39029774b63.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/717adc1d-6835-475a-a673-b39029774b63.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/717adc1d-6835-475a-a673-b39029774b63.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/717adc1d-6835-475a-a673-b39029774b63.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/717e08d7-ed19-4058-9eca-43f0905b65c7.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/717e08d7-ed19-4058-9eca-43f0905b65c7.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/717e08d7-ed19-4058-9eca-43f0905b65c7.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/717e08d7-ed19-4058-9eca-43f0905b65c7.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/718509f5-0feb-4613-a1e9-9813ad913264.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/718509f5-0feb-4613-a1e9-9813ad913264.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/718509f5-0feb-4613-a1e9-9813ad913264.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/718509f5-0feb-4613-a1e9-9813ad913264.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/71aa7cb4-10c1-43b0-9367-18c55681afd1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/71aa7cb4-10c1-43b0-9367-18c55681afd1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/71aa7cb4-10c1-43b0-9367-18c55681afd1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/71aa7cb4-10c1-43b0-9367-18c55681afd1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/71c2ca3e-13e1-4250-b710-510b8dc828d1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/71c2ca3e-13e1-4250-b710-510b8dc828d1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/71c2ca3e-13e1-4250-b710-510b8dc828d1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/71c2ca3e-13e1-4250-b710-510b8dc828d1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/720b6fa8-bc18-4c09-aaa3-7cd420a3b499.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/720b6fa8-bc18-4c09-aaa3-7cd420a3b499.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/720b6fa8-bc18-4c09-aaa3-7cd420a3b499.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/720b6fa8-bc18-4c09-aaa3-7cd420a3b499.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/725e6855-b53e-4305-a57d-594f2acfe6a7.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/725e6855-b53e-4305-a57d-594f2acfe6a7.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/725e6855-b53e-4305-a57d-594f2acfe6a7.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/725e6855-b53e-4305-a57d-594f2acfe6a7.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/725e737b-c7a5-44bc-9a24-a88e6226a23a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/725e737b-c7a5-44bc-9a24-a88e6226a23a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/725e737b-c7a5-44bc-9a24-a88e6226a23a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/725e737b-c7a5-44bc-9a24-a88e6226a23a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/729165ac-9da9-487e-8024-702707a378b6.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/729165ac-9da9-487e-8024-702707a378b6.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/729165ac-9da9-487e-8024-702707a378b6.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/729165ac-9da9-487e-8024-702707a378b6.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/72c10b89-ed4d-4acc-be6d-a20bc4ead7c3.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/72c10b89-ed4d-4acc-be6d-a20bc4ead7c3.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/72c10b89-ed4d-4acc-be6d-a20bc4ead7c3.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/72c10b89-ed4d-4acc-be6d-a20bc4ead7c3.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/72cb33d7-ee4e-4639-b379-b4504f669d46.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/72cb33d7-ee4e-4639-b379-b4504f669d46.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/72cb33d7-ee4e-4639-b379-b4504f669d46.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/72cb33d7-ee4e-4639-b379-b4504f669d46.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/72d1117b-0bd3-4b59-a5c9-7c7ad206b6f3.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/72d1117b-0bd3-4b59-a5c9-7c7ad206b6f3.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/72d1117b-0bd3-4b59-a5c9-7c7ad206b6f3.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/72d1117b-0bd3-4b59-a5c9-7c7ad206b6f3.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/72d26a30-82bc-459e-a675-97e8f2689f97.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/72d26a30-82bc-459e-a675-97e8f2689f97.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/72d26a30-82bc-459e-a675-97e8f2689f97.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/72d26a30-82bc-459e-a675-97e8f2689f97.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/72d66006-86f1-4138-9fea-9b72fa4e33b1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/72d66006-86f1-4138-9fea-9b72fa4e33b1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/72d66006-86f1-4138-9fea-9b72fa4e33b1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/72d66006-86f1-4138-9fea-9b72fa4e33b1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/72e3422f-6c8d-4b95-b650-8c34703f5583.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/72e3422f-6c8d-4b95-b650-8c34703f5583.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/72e3422f-6c8d-4b95-b650-8c34703f5583.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/72e3422f-6c8d-4b95-b650-8c34703f5583.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/72f28dd5-3a76-47f0-a212-cfd189319d7e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/72f28dd5-3a76-47f0-a212-cfd189319d7e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/72f28dd5-3a76-47f0-a212-cfd189319d7e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/72f28dd5-3a76-47f0-a212-cfd189319d7e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/730dd1d3-a655-4daa-ac09-68abdb42cafc.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/730dd1d3-a655-4daa-ac09-68abdb42cafc.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/730dd1d3-a655-4daa-ac09-68abdb42cafc.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/730dd1d3-a655-4daa-ac09-68abdb42cafc.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/732a917d-fa49-40d0-bb6b-eef450e60190.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/732a917d-fa49-40d0-bb6b-eef450e60190.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/732a917d-fa49-40d0-bb6b-eef450e60190.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/732a917d-fa49-40d0-bb6b-eef450e60190.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/732b639b-3051-4a43-8528-56a6dc66cb44.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/732b639b-3051-4a43-8528-56a6dc66cb44.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/732b639b-3051-4a43-8528-56a6dc66cb44.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/732b639b-3051-4a43-8528-56a6dc66cb44.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7335324b-58de-4b12-9687-0a59d26ff1df.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7335324b-58de-4b12-9687-0a59d26ff1df.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7335324b-58de-4b12-9687-0a59d26ff1df.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7335324b-58de-4b12-9687-0a59d26ff1df.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7399e9d0-1e94-4627-861a-990847438f11.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7399e9d0-1e94-4627-861a-990847438f11.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7399e9d0-1e94-4627-861a-990847438f11.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7399e9d0-1e94-4627-861a-990847438f11.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/73a93f0b-43ad-4fd8-94d1-127f1125687a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/73a93f0b-43ad-4fd8-94d1-127f1125687a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/73a93f0b-43ad-4fd8-94d1-127f1125687a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/73a93f0b-43ad-4fd8-94d1-127f1125687a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/73bf18be-d84e-4f42-869b-b2896c9ae3bb.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/73bf18be-d84e-4f42-869b-b2896c9ae3bb.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/73bf18be-d84e-4f42-869b-b2896c9ae3bb.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/73bf18be-d84e-4f42-869b-b2896c9ae3bb.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/73cc7c75-0d7e-431c-9d2f-9556e999fb9c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/73cc7c75-0d7e-431c-9d2f-9556e999fb9c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/73cc7c75-0d7e-431c-9d2f-9556e999fb9c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/73cc7c75-0d7e-431c-9d2f-9556e999fb9c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7407beea-9249-47e1-81d1-e8335874febe.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7407beea-9249-47e1-81d1-e8335874febe.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7407beea-9249-47e1-81d1-e8335874febe.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7407beea-9249-47e1-81d1-e8335874febe.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/74120c32-2eee-4774-81d7-37c14407212e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/74120c32-2eee-4774-81d7-37c14407212e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/74120c32-2eee-4774-81d7-37c14407212e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/74120c32-2eee-4774-81d7-37c14407212e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/741ff466-a6be-40c7-bd90-b80f714f6b2c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/741ff466-a6be-40c7-bd90-b80f714f6b2c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/741ff466-a6be-40c7-bd90-b80f714f6b2c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/741ff466-a6be-40c7-bd90-b80f714f6b2c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/743a7c0c-1db4-4096-ad2e-c52e393227f4.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/743a7c0c-1db4-4096-ad2e-c52e393227f4.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/743a7c0c-1db4-4096-ad2e-c52e393227f4.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/743a7c0c-1db4-4096-ad2e-c52e393227f4.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/743d46b7-3986-4411-a82f-aa6969186bbd.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/743d46b7-3986-4411-a82f-aa6969186bbd.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/743d46b7-3986-4411-a82f-aa6969186bbd.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/743d46b7-3986-4411-a82f-aa6969186bbd.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7467cbdb-2ac6-4045-b3f5-92b0999cfe26.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7467cbdb-2ac6-4045-b3f5-92b0999cfe26.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7467cbdb-2ac6-4045-b3f5-92b0999cfe26.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7467cbdb-2ac6-4045-b3f5-92b0999cfe26.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/74b651ca-639f-4ee1-a4a6-d38726ea3a8f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/74b651ca-639f-4ee1-a4a6-d38726ea3a8f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/74b651ca-639f-4ee1-a4a6-d38726ea3a8f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/74b651ca-639f-4ee1-a4a6-d38726ea3a8f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/74ef1492-b574-428d-8f50-2ce657bf5651.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/74ef1492-b574-428d-8f50-2ce657bf5651.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/74ef1492-b574-428d-8f50-2ce657bf5651.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/74ef1492-b574-428d-8f50-2ce657bf5651.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/74f653b7-40c4-4f24-8b8f-c13ca74cb351.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/74f653b7-40c4-4f24-8b8f-c13ca74cb351.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/74f653b7-40c4-4f24-8b8f-c13ca74cb351.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/74f653b7-40c4-4f24-8b8f-c13ca74cb351.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/753447f1-58ff-4397-8677-d866a90f1499.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/753447f1-58ff-4397-8677-d866a90f1499.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/753447f1-58ff-4397-8677-d866a90f1499.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/753447f1-58ff-4397-8677-d866a90f1499.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/754b33f4-7229-4952-a59b-e9e6109f9ba9.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/754b33f4-7229-4952-a59b-e9e6109f9ba9.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/754b33f4-7229-4952-a59b-e9e6109f9ba9.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/754b33f4-7229-4952-a59b-e9e6109f9ba9.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/755c04c1-9edd-4224-85cf-9fbb3ac6c53a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/755c04c1-9edd-4224-85cf-9fbb3ac6c53a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/755c04c1-9edd-4224-85cf-9fbb3ac6c53a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/755c04c1-9edd-4224-85cf-9fbb3ac6c53a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/75822214-6b54-4e95-944f-2c0c91170dec.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/75822214-6b54-4e95-944f-2c0c91170dec.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/75822214-6b54-4e95-944f-2c0c91170dec.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/75822214-6b54-4e95-944f-2c0c91170dec.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7598b9b6-def2-4779-9078-37c859f4d1ed.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7598b9b6-def2-4779-9078-37c859f4d1ed.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7598b9b6-def2-4779-9078-37c859f4d1ed.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7598b9b6-def2-4779-9078-37c859f4d1ed.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/75a40da8-e65b-41de-8f1b-9d139a3d9bf0.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/75a40da8-e65b-41de-8f1b-9d139a3d9bf0.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/75a40da8-e65b-41de-8f1b-9d139a3d9bf0.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/75a40da8-e65b-41de-8f1b-9d139a3d9bf0.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/75b54088-1aa1-4190-a044-08883017e1fa.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/75b54088-1aa1-4190-a044-08883017e1fa.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/75b54088-1aa1-4190-a044-08883017e1fa.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/75b54088-1aa1-4190-a044-08883017e1fa.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/75baa641-27d2-44c9-84b5-8b210d7b5094.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/75baa641-27d2-44c9-84b5-8b210d7b5094.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/75baa641-27d2-44c9-84b5-8b210d7b5094.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/75baa641-27d2-44c9-84b5-8b210d7b5094.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/75c61e2e-f7e3-4f12-831f-48881a9a562b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/75c61e2e-f7e3-4f12-831f-48881a9a562b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/75c61e2e-f7e3-4f12-831f-48881a9a562b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/75c61e2e-f7e3-4f12-831f-48881a9a562b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/75fdfd12-c2ff-48c8-bca9-52d14b7f5bc5.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/75fdfd12-c2ff-48c8-bca9-52d14b7f5bc5.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/75fdfd12-c2ff-48c8-bca9-52d14b7f5bc5.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/75fdfd12-c2ff-48c8-bca9-52d14b7f5bc5.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/75fe2825-a60b-401e-8d75-69a2ddf9ae45.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/75fe2825-a60b-401e-8d75-69a2ddf9ae45.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/75fe2825-a60b-401e-8d75-69a2ddf9ae45.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/75fe2825-a60b-401e-8d75-69a2ddf9ae45.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/760de84f-076f-4a5b-b787-896f25ba1c9b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/760de84f-076f-4a5b-b787-896f25ba1c9b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/760de84f-076f-4a5b-b787-896f25ba1c9b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/760de84f-076f-4a5b-b787-896f25ba1c9b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7623aa53-79c8-4f75-9cca-261f7fb4f0e0.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7623aa53-79c8-4f75-9cca-261f7fb4f0e0.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7623aa53-79c8-4f75-9cca-261f7fb4f0e0.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7623aa53-79c8-4f75-9cca-261f7fb4f0e0.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/76640611-9309-4964-a6c2-8315374e5dd0.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/76640611-9309-4964-a6c2-8315374e5dd0.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/76640611-9309-4964-a6c2-8315374e5dd0.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/76640611-9309-4964-a6c2-8315374e5dd0.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/76940a26-0a0a-4949-b724-d62c791afdae.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/76940a26-0a0a-4949-b724-d62c791afdae.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/76940a26-0a0a-4949-b724-d62c791afdae.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/76940a26-0a0a-4949-b724-d62c791afdae.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/769b071a-9ca0-4bbb-bb8f-e95449cf23fa.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/769b071a-9ca0-4bbb-bb8f-e95449cf23fa.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/769b071a-9ca0-4bbb-bb8f-e95449cf23fa.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/769b071a-9ca0-4bbb-bb8f-e95449cf23fa.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/76a3d5fb-4604-4999-9e91-816be2b61dfe.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/76a3d5fb-4604-4999-9e91-816be2b61dfe.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/76a3d5fb-4604-4999-9e91-816be2b61dfe.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/76a3d5fb-4604-4999-9e91-816be2b61dfe.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/76d5aee5-22d5-4bde-b425-3dbf2bbf1c1e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/76d5aee5-22d5-4bde-b425-3dbf2bbf1c1e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/76d5aee5-22d5-4bde-b425-3dbf2bbf1c1e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/76d5aee5-22d5-4bde-b425-3dbf2bbf1c1e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/76ed6aea-cb02-436b-8962-e5c453fd24e2.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/76ed6aea-cb02-436b-8962-e5c453fd24e2.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/76ed6aea-cb02-436b-8962-e5c453fd24e2.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/76ed6aea-cb02-436b-8962-e5c453fd24e2.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7732504b-e92a-478c-a845-ed46374feea2.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7732504b-e92a-478c-a845-ed46374feea2.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7732504b-e92a-478c-a845-ed46374feea2.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7732504b-e92a-478c-a845-ed46374feea2.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/77444a80-6a6b-44f3-803c-f4716681f120.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/77444a80-6a6b-44f3-803c-f4716681f120.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/77444a80-6a6b-44f3-803c-f4716681f120.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/77444a80-6a6b-44f3-803c-f4716681f120.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/77603d1a-a21b-431f-a00b-2953a0517032.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/77603d1a-a21b-431f-a00b-2953a0517032.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/77603d1a-a21b-431f-a00b-2953a0517032.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/77603d1a-a21b-431f-a00b-2953a0517032.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7785afdb-ce0a-499c-9b74-935f60911fc4.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7785afdb-ce0a-499c-9b74-935f60911fc4.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7785afdb-ce0a-499c-9b74-935f60911fc4.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7785afdb-ce0a-499c-9b74-935f60911fc4.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/778b919c-a317-4fa7-91a9-99b147a562ff.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/778b919c-a317-4fa7-91a9-99b147a562ff.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/778b919c-a317-4fa7-91a9-99b147a562ff.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/778b919c-a317-4fa7-91a9-99b147a562ff.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7792aa6a-8081-4b61-95d4-60f5227a082e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7792aa6a-8081-4b61-95d4-60f5227a082e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7792aa6a-8081-4b61-95d4-60f5227a082e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7792aa6a-8081-4b61-95d4-60f5227a082e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/77c269e6-0ac7-44d7-9a32-6860d00ca53a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/77c269e6-0ac7-44d7-9a32-6860d00ca53a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/77c269e6-0ac7-44d7-9a32-6860d00ca53a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/77c269e6-0ac7-44d7-9a32-6860d00ca53a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/77ddda3f-a034-438e-bd27-313608cedda4.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/77ddda3f-a034-438e-bd27-313608cedda4.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/77ddda3f-a034-438e-bd27-313608cedda4.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/77ddda3f-a034-438e-bd27-313608cedda4.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/780c1f05-7119-4ea0-a208-83fed7c01ed4.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/780c1f05-7119-4ea0-a208-83fed7c01ed4.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/780c1f05-7119-4ea0-a208-83fed7c01ed4.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/780c1f05-7119-4ea0-a208-83fed7c01ed4.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/782e72a8-48d9-4aeb-8d4c-6334a9454983.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/782e72a8-48d9-4aeb-8d4c-6334a9454983.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/782e72a8-48d9-4aeb-8d4c-6334a9454983.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/782e72a8-48d9-4aeb-8d4c-6334a9454983.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/78449488-ccec-410f-b944-253bc1fbf18c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/78449488-ccec-410f-b944-253bc1fbf18c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/78449488-ccec-410f-b944-253bc1fbf18c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/78449488-ccec-410f-b944-253bc1fbf18c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/784b4f86-5b88-4dda-8e06-a7d24ac80672.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/784b4f86-5b88-4dda-8e06-a7d24ac80672.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/784b4f86-5b88-4dda-8e06-a7d24ac80672.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/784b4f86-5b88-4dda-8e06-a7d24ac80672.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/786a73f8-1a22-4b74-b869-8b2403004165.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/786a73f8-1a22-4b74-b869-8b2403004165.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/786a73f8-1a22-4b74-b869-8b2403004165.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/786a73f8-1a22-4b74-b869-8b2403004165.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/786f9c4e-96a9-4960-981b-157b1f95c3a6.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/786f9c4e-96a9-4960-981b-157b1f95c3a6.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/786f9c4e-96a9-4960-981b-157b1f95c3a6.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/786f9c4e-96a9-4960-981b-157b1f95c3a6.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/787d92a5-21e9-4525-9df7-9051432d982d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/787d92a5-21e9-4525-9df7-9051432d982d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/787d92a5-21e9-4525-9df7-9051432d982d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/787d92a5-21e9-4525-9df7-9051432d982d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/787dbc66-9d6d-4936-baf5-3e7c12c29df3.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/787dbc66-9d6d-4936-baf5-3e7c12c29df3.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/787dbc66-9d6d-4936-baf5-3e7c12c29df3.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/787dbc66-9d6d-4936-baf5-3e7c12c29df3.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/78954c05-f523-4038-87b1-74f611aaa8b8.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/78954c05-f523-4038-87b1-74f611aaa8b8.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/78954c05-f523-4038-87b1-74f611aaa8b8.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/78954c05-f523-4038-87b1-74f611aaa8b8.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/78af6847-9f85-46d6-a683-97069b09d685.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/78af6847-9f85-46d6-a683-97069b09d685.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/78af6847-9f85-46d6-a683-97069b09d685.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/78af6847-9f85-46d6-a683-97069b09d685.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/78b7ff71-cd35-4468-bff8-1c61ed30a5fb.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/78b7ff71-cd35-4468-bff8-1c61ed30a5fb.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/78b7ff71-cd35-4468-bff8-1c61ed30a5fb.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/78b7ff71-cd35-4468-bff8-1c61ed30a5fb.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/792158df-e3e0-456a-8fbb-aa916c5b4c6b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/792158df-e3e0-456a-8fbb-aa916c5b4c6b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/792158df-e3e0-456a-8fbb-aa916c5b4c6b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/792158df-e3e0-456a-8fbb-aa916c5b4c6b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/79267d6b-c452-4aa4-af7c-c99bd4af0b3e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/79267d6b-c452-4aa4-af7c-c99bd4af0b3e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/79267d6b-c452-4aa4-af7c-c99bd4af0b3e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/79267d6b-c452-4aa4-af7c-c99bd4af0b3e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/792d2478-d878-4793-a21d-53d79c7e0564.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/792d2478-d878-4793-a21d-53d79c7e0564.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/792d2478-d878-4793-a21d-53d79c7e0564.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/792d2478-d878-4793-a21d-53d79c7e0564.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7939b041-4fea-4550-96c8-a0f702c5b8f8.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7939b041-4fea-4550-96c8-a0f702c5b8f8.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7939b041-4fea-4550-96c8-a0f702c5b8f8.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7939b041-4fea-4550-96c8-a0f702c5b8f8.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/795ef5cc-a823-4f5a-86d3-bc55944dd3bf.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/795ef5cc-a823-4f5a-86d3-bc55944dd3bf.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/795ef5cc-a823-4f5a-86d3-bc55944dd3bf.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/795ef5cc-a823-4f5a-86d3-bc55944dd3bf.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/79696b51-5b80-4bad-876c-c4cb64d30c46.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/79696b51-5b80-4bad-876c-c4cb64d30c46.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/79696b51-5b80-4bad-876c-c4cb64d30c46.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/79696b51-5b80-4bad-876c-c4cb64d30c46.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/798580da-06fe-4beb-b654-73701e3e6e11.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/798580da-06fe-4beb-b654-73701e3e6e11.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/798580da-06fe-4beb-b654-73701e3e6e11.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/798580da-06fe-4beb-b654-73701e3e6e11.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/79b7c720-2536-4bd4-9713-a848894888e9.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/79b7c720-2536-4bd4-9713-a848894888e9.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/79b7c720-2536-4bd4-9713-a848894888e9.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/79b7c720-2536-4bd4-9713-a848894888e9.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/79c4c504-de72-49ee-b702-09b1c83a53ed.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/79c4c504-de72-49ee-b702-09b1c83a53ed.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/79c4c504-de72-49ee-b702-09b1c83a53ed.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/79c4c504-de72-49ee-b702-09b1c83a53ed.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/79d3ed6d-8953-43a0-b88f-dda39a503517.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/79d3ed6d-8953-43a0-b88f-dda39a503517.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/79d3ed6d-8953-43a0-b88f-dda39a503517.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/79d3ed6d-8953-43a0-b88f-dda39a503517.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/79ec60c5-e4aa-414f-80b8-114f0409e546.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/79ec60c5-e4aa-414f-80b8-114f0409e546.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/79ec60c5-e4aa-414f-80b8-114f0409e546.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/79ec60c5-e4aa-414f-80b8-114f0409e546.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7a466117-f71f-4522-8902-a4542173fcd5.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7a466117-f71f-4522-8902-a4542173fcd5.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7a466117-f71f-4522-8902-a4542173fcd5.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7a466117-f71f-4522-8902-a4542173fcd5.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7a4834c3-d53c-4886-ac3d-076424e4bafd.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7a4834c3-d53c-4886-ac3d-076424e4bafd.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7a4834c3-d53c-4886-ac3d-076424e4bafd.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7a4834c3-d53c-4886-ac3d-076424e4bafd.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7a4b78ec-d809-4452-b9de-40610cbef645.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7a4b78ec-d809-4452-b9de-40610cbef645.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7a4b78ec-d809-4452-b9de-40610cbef645.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7a4b78ec-d809-4452-b9de-40610cbef645.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7a5e5e6e-1304-49f7-92c3-7acac4187ec5.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7a5e5e6e-1304-49f7-92c3-7acac4187ec5.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7a5e5e6e-1304-49f7-92c3-7acac4187ec5.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7a5e5e6e-1304-49f7-92c3-7acac4187ec5.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7a6be3a4-6d13-470f-ab49-8a132d230bb1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7a6be3a4-6d13-470f-ab49-8a132d230bb1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7a6be3a4-6d13-470f-ab49-8a132d230bb1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7a6be3a4-6d13-470f-ab49-8a132d230bb1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7a861750-9066-441d-a2be-f0c66550b493.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7a861750-9066-441d-a2be-f0c66550b493.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7a861750-9066-441d-a2be-f0c66550b493.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7a861750-9066-441d-a2be-f0c66550b493.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7a998687-9edf-462d-a83e-ec1389ea0e0a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7a998687-9edf-462d-a83e-ec1389ea0e0a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7a998687-9edf-462d-a83e-ec1389ea0e0a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7a998687-9edf-462d-a83e-ec1389ea0e0a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7a99f005-a6d1-4e0b-a656-9759e38b8b59.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7a99f005-a6d1-4e0b-a656-9759e38b8b59.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7a99f005-a6d1-4e0b-a656-9759e38b8b59.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7a99f005-a6d1-4e0b-a656-9759e38b8b59.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7a9bcd48-5c9f-44b8-ab4c-6e60162a7aef.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7a9bcd48-5c9f-44b8-ab4c-6e60162a7aef.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7a9bcd48-5c9f-44b8-ab4c-6e60162a7aef.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7a9bcd48-5c9f-44b8-ab4c-6e60162a7aef.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7a9cd837-bd0f-45cd-bf41-ddd6df04e47b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7a9cd837-bd0f-45cd-bf41-ddd6df04e47b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7a9cd837-bd0f-45cd-bf41-ddd6df04e47b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7a9cd837-bd0f-45cd-bf41-ddd6df04e47b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7aa63544-c4b4-4e29-8c24-dc9f678da57d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7aa63544-c4b4-4e29-8c24-dc9f678da57d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7aa63544-c4b4-4e29-8c24-dc9f678da57d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7aa63544-c4b4-4e29-8c24-dc9f678da57d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7aac0914-8b30-404f-855f-f641c58aed5a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7aac0914-8b30-404f-855f-f641c58aed5a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7aac0914-8b30-404f-855f-f641c58aed5a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7aac0914-8b30-404f-855f-f641c58aed5a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7ad4173b-075c-472f-8dbb-e13a050c696a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7ad4173b-075c-472f-8dbb-e13a050c696a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7ad4173b-075c-472f-8dbb-e13a050c696a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7ad4173b-075c-472f-8dbb-e13a050c696a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7ad8d2bb-4481-4551-ac00-6007e2a6d073.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7ad8d2bb-4481-4551-ac00-6007e2a6d073.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7ad8d2bb-4481-4551-ac00-6007e2a6d073.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7ad8d2bb-4481-4551-ac00-6007e2a6d073.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7b0613c4-07be-4a38-98e0-41a390fc1db6.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7b0613c4-07be-4a38-98e0-41a390fc1db6.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7b0613c4-07be-4a38-98e0-41a390fc1db6.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7b0613c4-07be-4a38-98e0-41a390fc1db6.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7b0777e5-97f6-4122-81dd-9069813b9139.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7b0777e5-97f6-4122-81dd-9069813b9139.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7b0777e5-97f6-4122-81dd-9069813b9139.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7b0777e5-97f6-4122-81dd-9069813b9139.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7b3be635-e9d9-45af-90e6-7d2f6b3c48b2.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7b3be635-e9d9-45af-90e6-7d2f6b3c48b2.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7b3be635-e9d9-45af-90e6-7d2f6b3c48b2.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7b3be635-e9d9-45af-90e6-7d2f6b3c48b2.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7b5a460b-5565-43af-9925-9837f5f6afc5.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7b5a460b-5565-43af-9925-9837f5f6afc5.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7b5a460b-5565-43af-9925-9837f5f6afc5.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7b5a460b-5565-43af-9925-9837f5f6afc5.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7b674efe-743b-4a05-b299-fb035bc3e12b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7b674efe-743b-4a05-b299-fb035bc3e12b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7b674efe-743b-4a05-b299-fb035bc3e12b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7b674efe-743b-4a05-b299-fb035bc3e12b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7b84db37-a615-4869-bfa9-0d38dc511be2.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7b84db37-a615-4869-bfa9-0d38dc511be2.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7b84db37-a615-4869-bfa9-0d38dc511be2.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7b84db37-a615-4869-bfa9-0d38dc511be2.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7b86e9b9-613c-49d1-8a82-e553ca7b125c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7b86e9b9-613c-49d1-8a82-e553ca7b125c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7b86e9b9-613c-49d1-8a82-e553ca7b125c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7b86e9b9-613c-49d1-8a82-e553ca7b125c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7b98f288-adac-484f-b219-0d7df8ca0dd8.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7b98f288-adac-484f-b219-0d7df8ca0dd8.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7b98f288-adac-484f-b219-0d7df8ca0dd8.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7b98f288-adac-484f-b219-0d7df8ca0dd8.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7ba5f2f4-db75-4ba2-943e-5e316a142acc.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7ba5f2f4-db75-4ba2-943e-5e316a142acc.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7ba5f2f4-db75-4ba2-943e-5e316a142acc.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7ba5f2f4-db75-4ba2-943e-5e316a142acc.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7bb2ffd6-202d-4a56-8ea9-ddd2a351d89b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7bb2ffd6-202d-4a56-8ea9-ddd2a351d89b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7bb2ffd6-202d-4a56-8ea9-ddd2a351d89b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7bb2ffd6-202d-4a56-8ea9-ddd2a351d89b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7bb5b921-78da-4b09-8d87-50c89de1dc02.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7bb5b921-78da-4b09-8d87-50c89de1dc02.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7bb5b921-78da-4b09-8d87-50c89de1dc02.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7bb5b921-78da-4b09-8d87-50c89de1dc02.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7bb75f26-97a9-4af4-a298-5c4cc43d0c31.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7bb75f26-97a9-4af4-a298-5c4cc43d0c31.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7bb75f26-97a9-4af4-a298-5c4cc43d0c31.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7bb75f26-97a9-4af4-a298-5c4cc43d0c31.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7bbedf1a-fef5-414a-926e-6e2a0591a7d5.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7bbedf1a-fef5-414a-926e-6e2a0591a7d5.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7bbedf1a-fef5-414a-926e-6e2a0591a7d5.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7bbedf1a-fef5-414a-926e-6e2a0591a7d5.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7bcabbd9-3762-481a-9c4a-06967992ebba.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7bcabbd9-3762-481a-9c4a-06967992ebba.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7bcabbd9-3762-481a-9c4a-06967992ebba.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7bcabbd9-3762-481a-9c4a-06967992ebba.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7bcdc0fc-704e-4156-8719-16631355b5bb.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7bcdc0fc-704e-4156-8719-16631355b5bb.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7bcdc0fc-704e-4156-8719-16631355b5bb.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7bcdc0fc-704e-4156-8719-16631355b5bb.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7bdf966b-1fc1-487d-a552-b120cda9c246.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7bdf966b-1fc1-487d-a552-b120cda9c246.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7bdf966b-1fc1-487d-a552-b120cda9c246.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7bdf966b-1fc1-487d-a552-b120cda9c246.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7bf0eb8f-15a3-4b46-9407-08902dd2f8bc.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7bf0eb8f-15a3-4b46-9407-08902dd2f8bc.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7bf0eb8f-15a3-4b46-9407-08902dd2f8bc.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7bf0eb8f-15a3-4b46-9407-08902dd2f8bc.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7c05cca0-d1c6-450f-a1e7-a84973e7208f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7c05cca0-d1c6-450f-a1e7-a84973e7208f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7c05cca0-d1c6-450f-a1e7-a84973e7208f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7c05cca0-d1c6-450f-a1e7-a84973e7208f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7c3bfdc7-d991-4421-9c79-6e7b608d6620.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7c3bfdc7-d991-4421-9c79-6e7b608d6620.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7c3bfdc7-d991-4421-9c79-6e7b608d6620.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7c3bfdc7-d991-4421-9c79-6e7b608d6620.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7c479aa5-f2f3-4ff6-bc3f-831d3f70fdee.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7c479aa5-f2f3-4ff6-bc3f-831d3f70fdee.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7c479aa5-f2f3-4ff6-bc3f-831d3f70fdee.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7c479aa5-f2f3-4ff6-bc3f-831d3f70fdee.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7c62c9d7-2a12-42e4-87aa-08c58e785228.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7c62c9d7-2a12-42e4-87aa-08c58e785228.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7c62c9d7-2a12-42e4-87aa-08c58e785228.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7c62c9d7-2a12-42e4-87aa-08c58e785228.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7cb08c6a-1a26-4634-ad7f-497de8508e9f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7cb08c6a-1a26-4634-ad7f-497de8508e9f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7cb08c6a-1a26-4634-ad7f-497de8508e9f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7cb08c6a-1a26-4634-ad7f-497de8508e9f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7cb6ccd9-b690-4455-b043-fdc14e6c4ab6.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7cb6ccd9-b690-4455-b043-fdc14e6c4ab6.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7cb6ccd9-b690-4455-b043-fdc14e6c4ab6.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7cb6ccd9-b690-4455-b043-fdc14e6c4ab6.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7cf0999c-4c6a-4743-a036-3db22509e409.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7cf0999c-4c6a-4743-a036-3db22509e409.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7cf0999c-4c6a-4743-a036-3db22509e409.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7cf0999c-4c6a-4743-a036-3db22509e409.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7cf572bb-d827-45d2-a3eb-b825b32420b8.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7cf572bb-d827-45d2-a3eb-b825b32420b8.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7cf572bb-d827-45d2-a3eb-b825b32420b8.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7cf572bb-d827-45d2-a3eb-b825b32420b8.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7d53a85e-1096-4124-93d5-033bbdd23f36.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7d53a85e-1096-4124-93d5-033bbdd23f36.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7d53a85e-1096-4124-93d5-033bbdd23f36.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7d53a85e-1096-4124-93d5-033bbdd23f36.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7d8b2e58-5361-4a6c-8219-fe3d9737bf8b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7d8b2e58-5361-4a6c-8219-fe3d9737bf8b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7d8b2e58-5361-4a6c-8219-fe3d9737bf8b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7d8b2e58-5361-4a6c-8219-fe3d9737bf8b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7de41c03-81c5-428d-aa85-758c6baff37c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7de41c03-81c5-428d-aa85-758c6baff37c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7de41c03-81c5-428d-aa85-758c6baff37c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7de41c03-81c5-428d-aa85-758c6baff37c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7e2d281b-de44-40bd-9a2f-94b3a031abc5.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7e2d281b-de44-40bd-9a2f-94b3a031abc5.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7e2d281b-de44-40bd-9a2f-94b3a031abc5.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7e2d281b-de44-40bd-9a2f-94b3a031abc5.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7e3c13be-ced6-4b99-b5e3-68558192d5b1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7e3c13be-ced6-4b99-b5e3-68558192d5b1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7e3c13be-ced6-4b99-b5e3-68558192d5b1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7e3c13be-ced6-4b99-b5e3-68558192d5b1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7e6a522c-03cf-465c-b96e-77f40258cecb.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7e6a522c-03cf-465c-b96e-77f40258cecb.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7e6a522c-03cf-465c-b96e-77f40258cecb.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7e6a522c-03cf-465c-b96e-77f40258cecb.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7e9ad6d7-6488-4308-94b0-5f69512dd4b0.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7e9ad6d7-6488-4308-94b0-5f69512dd4b0.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7e9ad6d7-6488-4308-94b0-5f69512dd4b0.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7e9ad6d7-6488-4308-94b0-5f69512dd4b0.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7e9aef2b-5ff2-4df1-8a95-b786ec487ca0.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7e9aef2b-5ff2-4df1-8a95-b786ec487ca0.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7e9aef2b-5ff2-4df1-8a95-b786ec487ca0.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7e9aef2b-5ff2-4df1-8a95-b786ec487ca0.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7ebd3731-fcdd-4d74-8f37-ddfc03d2ae89.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7ebd3731-fcdd-4d74-8f37-ddfc03d2ae89.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7ebd3731-fcdd-4d74-8f37-ddfc03d2ae89.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7ebd3731-fcdd-4d74-8f37-ddfc03d2ae89.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7ee4f379-36e6-4c62-b628-2c217c6e14f4.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7ee4f379-36e6-4c62-b628-2c217c6e14f4.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7ee4f379-36e6-4c62-b628-2c217c6e14f4.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7ee4f379-36e6-4c62-b628-2c217c6e14f4.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7f066eaa-8f13-42e6-93fc-5bdd2fafa513.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7f066eaa-8f13-42e6-93fc-5bdd2fafa513.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7f066eaa-8f13-42e6-93fc-5bdd2fafa513.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7f066eaa-8f13-42e6-93fc-5bdd2fafa513.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7f19db87-48d0-4423-a361-c331697e8b02.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7f19db87-48d0-4423-a361-c331697e8b02.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7f19db87-48d0-4423-a361-c331697e8b02.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7f19db87-48d0-4423-a361-c331697e8b02.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7f7acd56-3325-4443-a7da-8f47af0a729a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7f7acd56-3325-4443-a7da-8f47af0a729a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7f7acd56-3325-4443-a7da-8f47af0a729a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7f7acd56-3325-4443-a7da-8f47af0a729a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7f908501-48d8-4ea9-afa4-04eb90baffb8.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7f908501-48d8-4ea9-afa4-04eb90baffb8.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7f908501-48d8-4ea9-afa4-04eb90baffb8.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7f908501-48d8-4ea9-afa4-04eb90baffb8.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7fccef99-2f26-4f8f-a0da-aae4f4502fc6.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7fccef99-2f26-4f8f-a0da-aae4f4502fc6.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7fccef99-2f26-4f8f-a0da-aae4f4502fc6.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7fccef99-2f26-4f8f-a0da-aae4f4502fc6.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7feeecce-1a55-4405-9f71-76bafb994de5.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7feeecce-1a55-4405-9f71-76bafb994de5.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7feeecce-1a55-4405-9f71-76bafb994de5.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/7feeecce-1a55-4405-9f71-76bafb994de5.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/80455dce-a7bb-4180-8f29-87ccd171fa98.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/80455dce-a7bb-4180-8f29-87ccd171fa98.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/80455dce-a7bb-4180-8f29-87ccd171fa98.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/80455dce-a7bb-4180-8f29-87ccd171fa98.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/805c1096-a96c-4993-935d-8121445b7d40.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/805c1096-a96c-4993-935d-8121445b7d40.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/805c1096-a96c-4993-935d-8121445b7d40.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/805c1096-a96c-4993-935d-8121445b7d40.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8060987a-13cb-4544-a309-6653f4db997a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8060987a-13cb-4544-a309-6653f4db997a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8060987a-13cb-4544-a309-6653f4db997a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8060987a-13cb-4544-a309-6653f4db997a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/807e037f-0729-440d-a898-a938092d7058.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/807e037f-0729-440d-a898-a938092d7058.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/807e037f-0729-440d-a898-a938092d7058.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/807e037f-0729-440d-a898-a938092d7058.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/808cdec8-47b6-4b8e-95be-12a129498ebe.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/808cdec8-47b6-4b8e-95be-12a129498ebe.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/808cdec8-47b6-4b8e-95be-12a129498ebe.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/808cdec8-47b6-4b8e-95be-12a129498ebe.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/80956356-4ea6-4356-a437-b0fa73e7e6d6.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/80956356-4ea6-4356-a437-b0fa73e7e6d6.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/80956356-4ea6-4356-a437-b0fa73e7e6d6.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/80956356-4ea6-4356-a437-b0fa73e7e6d6.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/809b1ccd-04ab-4e20-a026-594981cee164.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/809b1ccd-04ab-4e20-a026-594981cee164.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/809b1ccd-04ab-4e20-a026-594981cee164.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/809b1ccd-04ab-4e20-a026-594981cee164.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/80a78905-abcf-4737-bfbd-416619634a06.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/80a78905-abcf-4737-bfbd-416619634a06.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/80a78905-abcf-4737-bfbd-416619634a06.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/80a78905-abcf-4737-bfbd-416619634a06.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/80c87a8f-ec39-45c2-8631-8ad9380b9979.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/80c87a8f-ec39-45c2-8631-8ad9380b9979.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/80c87a8f-ec39-45c2-8631-8ad9380b9979.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/80c87a8f-ec39-45c2-8631-8ad9380b9979.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/80df8c88-7e2b-4ef8-801f-1acb7712e6ad.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/80df8c88-7e2b-4ef8-801f-1acb7712e6ad.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/80df8c88-7e2b-4ef8-801f-1acb7712e6ad.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/80df8c88-7e2b-4ef8-801f-1acb7712e6ad.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/80e63175-a800-4ffc-af40-fbd426b5b79e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/80e63175-a800-4ffc-af40-fbd426b5b79e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/80e63175-a800-4ffc-af40-fbd426b5b79e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/80e63175-a800-4ffc-af40-fbd426b5b79e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/80e67490-1522-4d22-a725-7d79623dc635.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/80e67490-1522-4d22-a725-7d79623dc635.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/80e67490-1522-4d22-a725-7d79623dc635.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/80e67490-1522-4d22-a725-7d79623dc635.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/80ec529a-94d3-422c-82d6-13809d5d02f8.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/80ec529a-94d3-422c-82d6-13809d5d02f8.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/80ec529a-94d3-422c-82d6-13809d5d02f8.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/80ec529a-94d3-422c-82d6-13809d5d02f8.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/81013ace-64ce-4eef-847b-b99586ef799c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/81013ace-64ce-4eef-847b-b99586ef799c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/81013ace-64ce-4eef-847b-b99586ef799c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/81013ace-64ce-4eef-847b-b99586ef799c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/81078e50-6e20-4cc8-b3ae-6827fe40f341.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/81078e50-6e20-4cc8-b3ae-6827fe40f341.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/81078e50-6e20-4cc8-b3ae-6827fe40f341.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/81078e50-6e20-4cc8-b3ae-6827fe40f341.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/81367423-4165-4495-8632-a53d984b1a94.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/81367423-4165-4495-8632-a53d984b1a94.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/81367423-4165-4495-8632-a53d984b1a94.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/81367423-4165-4495-8632-a53d984b1a94.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/813e6bbe-7698-421a-82f2-a346c71cbe83.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/813e6bbe-7698-421a-82f2-a346c71cbe83.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/813e6bbe-7698-421a-82f2-a346c71cbe83.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/813e6bbe-7698-421a-82f2-a346c71cbe83.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/814c2e3a-b7c6-455b-a166-bf7f54778022.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/814c2e3a-b7c6-455b-a166-bf7f54778022.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/814c2e3a-b7c6-455b-a166-bf7f54778022.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/814c2e3a-b7c6-455b-a166-bf7f54778022.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8161692a-a922-4881-8b8e-c44b1e529fe3.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8161692a-a922-4881-8b8e-c44b1e529fe3.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8161692a-a922-4881-8b8e-c44b1e529fe3.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8161692a-a922-4881-8b8e-c44b1e529fe3.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/819e1f33-ce6c-48c4-a75f-209ef2e245ad.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/819e1f33-ce6c-48c4-a75f-209ef2e245ad.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/819e1f33-ce6c-48c4-a75f-209ef2e245ad.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/819e1f33-ce6c-48c4-a75f-209ef2e245ad.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/81aae19a-d61c-40fd-970f-df500dc6d0ef.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/81aae19a-d61c-40fd-970f-df500dc6d0ef.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/81aae19a-d61c-40fd-970f-df500dc6d0ef.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/81aae19a-d61c-40fd-970f-df500dc6d0ef.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/81c666da-32ca-4b39-953d-68cf252847ca.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/81c666da-32ca-4b39-953d-68cf252847ca.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/81c666da-32ca-4b39-953d-68cf252847ca.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/81c666da-32ca-4b39-953d-68cf252847ca.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/81d6be25-ff91-4c42-b895-2a3ea9fef5cd.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/81d6be25-ff91-4c42-b895-2a3ea9fef5cd.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/81d6be25-ff91-4c42-b895-2a3ea9fef5cd.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/81d6be25-ff91-4c42-b895-2a3ea9fef5cd.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/81e54fb2-cb70-4c20-94fd-86987d35eed1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/81e54fb2-cb70-4c20-94fd-86987d35eed1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/81e54fb2-cb70-4c20-94fd-86987d35eed1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/81e54fb2-cb70-4c20-94fd-86987d35eed1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/81e5c11e-e050-4932-8134-577ce1adfdc0.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/81e5c11e-e050-4932-8134-577ce1adfdc0.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/81e5c11e-e050-4932-8134-577ce1adfdc0.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/81e5c11e-e050-4932-8134-577ce1adfdc0.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/81e5c995-25a8-45f7-872f-8c73c16a4416.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/81e5c995-25a8-45f7-872f-8c73c16a4416.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/81e5c995-25a8-45f7-872f-8c73c16a4416.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/81e5c995-25a8-45f7-872f-8c73c16a4416.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/81f3a567-fc87-46fa-b868-2452e0b9b499.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/81f3a567-fc87-46fa-b868-2452e0b9b499.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/81f3a567-fc87-46fa-b868-2452e0b9b499.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/81f3a567-fc87-46fa-b868-2452e0b9b499.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/81fa20df-31d9-45cc-9d85-dd181273c4d3.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/81fa20df-31d9-45cc-9d85-dd181273c4d3.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/81fa20df-31d9-45cc-9d85-dd181273c4d3.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/81fa20df-31d9-45cc-9d85-dd181273c4d3.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/81fd6800-7287-4ef0-8717-57943bee3168.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/81fd6800-7287-4ef0-8717-57943bee3168.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/81fd6800-7287-4ef0-8717-57943bee3168.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/81fd6800-7287-4ef0-8717-57943bee3168.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/823f0fce-d895-4465-b558-b83ee014b6c1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/823f0fce-d895-4465-b558-b83ee014b6c1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/823f0fce-d895-4465-b558-b83ee014b6c1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/823f0fce-d895-4465-b558-b83ee014b6c1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/824dcb4c-e91d-46ca-9588-cf5a7d8b2f24.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/824dcb4c-e91d-46ca-9588-cf5a7d8b2f24.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/824dcb4c-e91d-46ca-9588-cf5a7d8b2f24.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/824dcb4c-e91d-46ca-9588-cf5a7d8b2f24.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/825529fd-b67a-46b7-89b2-96bb5cf52f76.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/825529fd-b67a-46b7-89b2-96bb5cf52f76.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/825529fd-b67a-46b7-89b2-96bb5cf52f76.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/825529fd-b67a-46b7-89b2-96bb5cf52f76.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/825a2f6b-3e57-4ddc-94ce-cade4366c261.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/825a2f6b-3e57-4ddc-94ce-cade4366c261.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/825a2f6b-3e57-4ddc-94ce-cade4366c261.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/825a2f6b-3e57-4ddc-94ce-cade4366c261.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/825fa90c-b7c3-4591-8c70-f5033b6efa1d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/825fa90c-b7c3-4591-8c70-f5033b6efa1d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/825fa90c-b7c3-4591-8c70-f5033b6efa1d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/825fa90c-b7c3-4591-8c70-f5033b6efa1d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/826957c7-0543-4e5b-89ea-37752e535265.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/826957c7-0543-4e5b-89ea-37752e535265.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/826957c7-0543-4e5b-89ea-37752e535265.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/826957c7-0543-4e5b-89ea-37752e535265.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/826d14a6-6913-431b-9f07-d7b64ea9d48e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/826d14a6-6913-431b-9f07-d7b64ea9d48e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/826d14a6-6913-431b-9f07-d7b64ea9d48e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/826d14a6-6913-431b-9f07-d7b64ea9d48e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8285521f-dfab-4ef4-8a88-dde1cf197c43.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8285521f-dfab-4ef4-8a88-dde1cf197c43.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8285521f-dfab-4ef4-8a88-dde1cf197c43.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8285521f-dfab-4ef4-8a88-dde1cf197c43.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/82b77d59-719c-4901-af9e-f9aacb38ef55.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/82b77d59-719c-4901-af9e-f9aacb38ef55.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/82b77d59-719c-4901-af9e-f9aacb38ef55.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/82b77d59-719c-4901-af9e-f9aacb38ef55.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/82e2ad3e-f802-4fef-8267-1dfc71f8cb77.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/82e2ad3e-f802-4fef-8267-1dfc71f8cb77.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/82e2ad3e-f802-4fef-8267-1dfc71f8cb77.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/82e2ad3e-f802-4fef-8267-1dfc71f8cb77.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/82fb2b67-cdab-45e3-9e93-251e551abd01.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/82fb2b67-cdab-45e3-9e93-251e551abd01.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/82fb2b67-cdab-45e3-9e93-251e551abd01.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/82fb2b67-cdab-45e3-9e93-251e551abd01.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8309ed90-6391-4fd5-bc55-e3957d90e2d8.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8309ed90-6391-4fd5-bc55-e3957d90e2d8.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8309ed90-6391-4fd5-bc55-e3957d90e2d8.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8309ed90-6391-4fd5-bc55-e3957d90e2d8.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8315d59d-8040-47e9-9817-b80d6ae70dd4.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8315d59d-8040-47e9-9817-b80d6ae70dd4.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8315d59d-8040-47e9-9817-b80d6ae70dd4.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8315d59d-8040-47e9-9817-b80d6ae70dd4.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8347ae1b-ab39-42c3-b126-b005f2ef8068.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8347ae1b-ab39-42c3-b126-b005f2ef8068.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8347ae1b-ab39-42c3-b126-b005f2ef8068.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8347ae1b-ab39-42c3-b126-b005f2ef8068.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/834f3a28-4c91-4ec1-a33c-8d084114cd66.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/834f3a28-4c91-4ec1-a33c-8d084114cd66.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/834f3a28-4c91-4ec1-a33c-8d084114cd66.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/834f3a28-4c91-4ec1-a33c-8d084114cd66.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8368b01e-4272-4cc1-977f-be3ca9f3c3af.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8368b01e-4272-4cc1-977f-be3ca9f3c3af.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8368b01e-4272-4cc1-977f-be3ca9f3c3af.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8368b01e-4272-4cc1-977f-be3ca9f3c3af.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/836ef196-86af-456c-b2ac-a1f85391d84b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/836ef196-86af-456c-b2ac-a1f85391d84b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/836ef196-86af-456c-b2ac-a1f85391d84b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/836ef196-86af-456c-b2ac-a1f85391d84b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/83762849-58fe-4f46-8af4-741af08cd82f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/83762849-58fe-4f46-8af4-741af08cd82f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/83762849-58fe-4f46-8af4-741af08cd82f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/83762849-58fe-4f46-8af4-741af08cd82f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/841db655-228d-4ccc-8efb-fcbb60b54049.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/841db655-228d-4ccc-8efb-fcbb60b54049.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/841db655-228d-4ccc-8efb-fcbb60b54049.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/841db655-228d-4ccc-8efb-fcbb60b54049.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/84208203-83bd-4690-9e0f-86fc05411a18.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/84208203-83bd-4690-9e0f-86fc05411a18.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/84208203-83bd-4690-9e0f-86fc05411a18.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/84208203-83bd-4690-9e0f-86fc05411a18.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/842357da-4642-416e-a37d-ebe3764b206b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/842357da-4642-416e-a37d-ebe3764b206b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/842357da-4642-416e-a37d-ebe3764b206b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/842357da-4642-416e-a37d-ebe3764b206b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8441fe4b-7bdc-4f4b-9797-92a69ea79d40.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8441fe4b-7bdc-4f4b-9797-92a69ea79d40.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8441fe4b-7bdc-4f4b-9797-92a69ea79d40.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8441fe4b-7bdc-4f4b-9797-92a69ea79d40.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/845af5e9-0104-41da-8bd7-21464a22affd.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/845af5e9-0104-41da-8bd7-21464a22affd.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/845af5e9-0104-41da-8bd7-21464a22affd.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/845af5e9-0104-41da-8bd7-21464a22affd.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8497373e-9286-4ad7-9659-0cece9a886d6.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8497373e-9286-4ad7-9659-0cece9a886d6.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8497373e-9286-4ad7-9659-0cece9a886d6.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8497373e-9286-4ad7-9659-0cece9a886d6.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/84a257ab-2190-4bdf-91ea-f77632c83f39.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/84a257ab-2190-4bdf-91ea-f77632c83f39.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/84a257ab-2190-4bdf-91ea-f77632c83f39.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/84a257ab-2190-4bdf-91ea-f77632c83f39.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/84e6a41b-65c5-480e-a591-2544fcaeb60f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/84e6a41b-65c5-480e-a591-2544fcaeb60f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/84e6a41b-65c5-480e-a591-2544fcaeb60f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/84e6a41b-65c5-480e-a591-2544fcaeb60f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/84fcd39f-26fa-4b1a-8b2f-f9e6fa3061ea.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/84fcd39f-26fa-4b1a-8b2f-f9e6fa3061ea.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/84fcd39f-26fa-4b1a-8b2f-f9e6fa3061ea.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/84fcd39f-26fa-4b1a-8b2f-f9e6fa3061ea.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8506003c-ee4a-4318-bef9-841e980b8315.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8506003c-ee4a-4318-bef9-841e980b8315.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8506003c-ee4a-4318-bef9-841e980b8315.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8506003c-ee4a-4318-bef9-841e980b8315.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8543921d-5cd3-4135-8b9d-365e9531a212.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8543921d-5cd3-4135-8b9d-365e9531a212.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8543921d-5cd3-4135-8b9d-365e9531a212.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8543921d-5cd3-4135-8b9d-365e9531a212.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8562dd50-4b39-4b5c-94df-884e97a2f482.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8562dd50-4b39-4b5c-94df-884e97a2f482.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8562dd50-4b39-4b5c-94df-884e97a2f482.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8562dd50-4b39-4b5c-94df-884e97a2f482.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/856edaaa-0a0b-49d4-8f70-71ecc25c1477.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/856edaaa-0a0b-49d4-8f70-71ecc25c1477.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/856edaaa-0a0b-49d4-8f70-71ecc25c1477.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/856edaaa-0a0b-49d4-8f70-71ecc25c1477.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/856fe98e-5370-4d46-b5d1-8bc406b90a22.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/856fe98e-5370-4d46-b5d1-8bc406b90a22.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/856fe98e-5370-4d46-b5d1-8bc406b90a22.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/856fe98e-5370-4d46-b5d1-8bc406b90a22.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/859081c4-c5ea-4867-af65-fb1387ca1b78.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/859081c4-c5ea-4867-af65-fb1387ca1b78.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/859081c4-c5ea-4867-af65-fb1387ca1b78.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/859081c4-c5ea-4867-af65-fb1387ca1b78.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/85ae5af9-347c-495e-8182-22f607694a13.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/85ae5af9-347c-495e-8182-22f607694a13.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/85ae5af9-347c-495e-8182-22f607694a13.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/85ae5af9-347c-495e-8182-22f607694a13.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/85c29c72-4bfe-4a15-b46e-7047980cc274.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/85c29c72-4bfe-4a15-b46e-7047980cc274.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/85c29c72-4bfe-4a15-b46e-7047980cc274.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/85c29c72-4bfe-4a15-b46e-7047980cc274.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/85ee6177-9c02-4aa5-9763-2a7cd112f64a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/85ee6177-9c02-4aa5-9763-2a7cd112f64a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/85ee6177-9c02-4aa5-9763-2a7cd112f64a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/85ee6177-9c02-4aa5-9763-2a7cd112f64a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/861af0b2-5737-44c1-b86e-3780fd400d00.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/861af0b2-5737-44c1-b86e-3780fd400d00.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/861af0b2-5737-44c1-b86e-3780fd400d00.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/861af0b2-5737-44c1-b86e-3780fd400d00.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/86247d00-e214-4bd1-bb67-c38297098d7f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/86247d00-e214-4bd1-bb67-c38297098d7f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/86247d00-e214-4bd1-bb67-c38297098d7f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/86247d00-e214-4bd1-bb67-c38297098d7f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8630160d-c84a-49c1-84ed-a42663e079f3.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8630160d-c84a-49c1-84ed-a42663e079f3.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8630160d-c84a-49c1-84ed-a42663e079f3.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8630160d-c84a-49c1-84ed-a42663e079f3.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/86447c5b-d428-48ab-aef0-c0683826c184.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/86447c5b-d428-48ab-aef0-c0683826c184.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/86447c5b-d428-48ab-aef0-c0683826c184.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/86447c5b-d428-48ab-aef0-c0683826c184.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8667b9f9-013f-461d-b3bd-6d2fddd4865c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8667b9f9-013f-461d-b3bd-6d2fddd4865c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8667b9f9-013f-461d-b3bd-6d2fddd4865c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8667b9f9-013f-461d-b3bd-6d2fddd4865c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/86741569-fea8-4655-954b-4c2d718b61c9.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/86741569-fea8-4655-954b-4c2d718b61c9.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/86741569-fea8-4655-954b-4c2d718b61c9.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/86741569-fea8-4655-954b-4c2d718b61c9.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8683dfdd-7231-4ff3-9f82-dc4149590e83.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8683dfdd-7231-4ff3-9f82-dc4149590e83.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8683dfdd-7231-4ff3-9f82-dc4149590e83.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8683dfdd-7231-4ff3-9f82-dc4149590e83.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/86af082c-5425-4181-a2a9-59d5ee14abbb.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/86af082c-5425-4181-a2a9-59d5ee14abbb.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/86af082c-5425-4181-a2a9-59d5ee14abbb.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/86af082c-5425-4181-a2a9-59d5ee14abbb.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/86bd5052-c048-4a38-a582-582af93edec7.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/86bd5052-c048-4a38-a582-582af93edec7.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/86bd5052-c048-4a38-a582-582af93edec7.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/86bd5052-c048-4a38-a582-582af93edec7.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/86cac03f-124b-42b9-84a0-fc059458bfeb.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/86cac03f-124b-42b9-84a0-fc059458bfeb.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/86cac03f-124b-42b9-84a0-fc059458bfeb.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/86cac03f-124b-42b9-84a0-fc059458bfeb.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/86d1b2be-1a87-4a42-a8c1-0896a6ab1ebd.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/86d1b2be-1a87-4a42-a8c1-0896a6ab1ebd.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/86d1b2be-1a87-4a42-a8c1-0896a6ab1ebd.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/86d1b2be-1a87-4a42-a8c1-0896a6ab1ebd.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/86f188c1-97fd-4fe5-b4b4-e6816f56ab6a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/86f188c1-97fd-4fe5-b4b4-e6816f56ab6a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/86f188c1-97fd-4fe5-b4b4-e6816f56ab6a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/86f188c1-97fd-4fe5-b4b4-e6816f56ab6a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/870de64e-552c-4946-978b-7500f8928858.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/870de64e-552c-4946-978b-7500f8928858.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/870de64e-552c-4946-978b-7500f8928858.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/870de64e-552c-4946-978b-7500f8928858.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/875149ca-d1a5-41d9-a556-cc893ba56c2b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/875149ca-d1a5-41d9-a556-cc893ba56c2b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/875149ca-d1a5-41d9-a556-cc893ba56c2b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/875149ca-d1a5-41d9-a556-cc893ba56c2b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/87814675-e0b1-4633-8eaf-dc1be9576cac.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/87814675-e0b1-4633-8eaf-dc1be9576cac.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/87814675-e0b1-4633-8eaf-dc1be9576cac.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/87814675-e0b1-4633-8eaf-dc1be9576cac.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8793d284-828b-49df-9b49-689094a71a11.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8793d284-828b-49df-9b49-689094a71a11.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8793d284-828b-49df-9b49-689094a71a11.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8793d284-828b-49df-9b49-689094a71a11.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/87c548d5-dd47-432a-beea-eb3b9222faff.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/87c548d5-dd47-432a-beea-eb3b9222faff.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/87c548d5-dd47-432a-beea-eb3b9222faff.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/87c548d5-dd47-432a-beea-eb3b9222faff.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/87cb2873-d1c0-430e-9289-4e227224ecc5.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/87cb2873-d1c0-430e-9289-4e227224ecc5.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/87cb2873-d1c0-430e-9289-4e227224ecc5.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/87cb2873-d1c0-430e-9289-4e227224ecc5.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/87d4512e-fa17-454c-bc03-c94b2f1c5933.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/87d4512e-fa17-454c-bc03-c94b2f1c5933.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/87d4512e-fa17-454c-bc03-c94b2f1c5933.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/87d4512e-fa17-454c-bc03-c94b2f1c5933.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/87d81775-d18f-4ded-ad98-62d358d75abb.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/87d81775-d18f-4ded-ad98-62d358d75abb.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/87d81775-d18f-4ded-ad98-62d358d75abb.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/87d81775-d18f-4ded-ad98-62d358d75abb.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/87eaf295-c646-4071-8a1f-94e30f03c94a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/87eaf295-c646-4071-8a1f-94e30f03c94a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/87eaf295-c646-4071-8a1f-94e30f03c94a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/87eaf295-c646-4071-8a1f-94e30f03c94a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/87ef8cbd-e3da-4c73-8c17-a433d3874881.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/87ef8cbd-e3da-4c73-8c17-a433d3874881.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/87ef8cbd-e3da-4c73-8c17-a433d3874881.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/87ef8cbd-e3da-4c73-8c17-a433d3874881.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8828357a-60e3-4e04-9a6c-ae350935036c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8828357a-60e3-4e04-9a6c-ae350935036c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8828357a-60e3-4e04-9a6c-ae350935036c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8828357a-60e3-4e04-9a6c-ae350935036c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8828de28-5ca8-4b67-addf-578c8a3e3ce9.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8828de28-5ca8-4b67-addf-578c8a3e3ce9.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8828de28-5ca8-4b67-addf-578c8a3e3ce9.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8828de28-5ca8-4b67-addf-578c8a3e3ce9.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/88465e9c-c9a5-45e7-9d21-9b6e3f68643b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/88465e9c-c9a5-45e7-9d21-9b6e3f68643b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/88465e9c-c9a5-45e7-9d21-9b6e3f68643b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/88465e9c-c9a5-45e7-9d21-9b6e3f68643b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8857d1f2-28c7-4472-b86b-49841518a886.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8857d1f2-28c7-4472-b86b-49841518a886.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8857d1f2-28c7-4472-b86b-49841518a886.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8857d1f2-28c7-4472-b86b-49841518a886.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8888ea72-ddec-48ac-b0cf-5191ac1f4907.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8888ea72-ddec-48ac-b0cf-5191ac1f4907.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8888ea72-ddec-48ac-b0cf-5191ac1f4907.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8888ea72-ddec-48ac-b0cf-5191ac1f4907.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8889e311-8a48-4715-a786-993ed08727f8.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8889e311-8a48-4715-a786-993ed08727f8.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8889e311-8a48-4715-a786-993ed08727f8.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8889e311-8a48-4715-a786-993ed08727f8.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/888a162b-595f-4ec5-9766-f9dad395faa5.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/888a162b-595f-4ec5-9766-f9dad395faa5.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/888a162b-595f-4ec5-9766-f9dad395faa5.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/888a162b-595f-4ec5-9766-f9dad395faa5.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8894c03c-a8f0-478a-8c0c-0f2c05515182.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8894c03c-a8f0-478a-8c0c-0f2c05515182.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8894c03c-a8f0-478a-8c0c-0f2c05515182.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8894c03c-a8f0-478a-8c0c-0f2c05515182.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/88bd4073-37c3-42a7-ab43-2bdc31cdcf90.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/88bd4073-37c3-42a7-ab43-2bdc31cdcf90.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/88bd4073-37c3-42a7-ab43-2bdc31cdcf90.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/88bd4073-37c3-42a7-ab43-2bdc31cdcf90.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/88c7834c-7ef3-414f-a937-721d9da900ec.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/88c7834c-7ef3-414f-a937-721d9da900ec.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/88c7834c-7ef3-414f-a937-721d9da900ec.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/88c7834c-7ef3-414f-a937-721d9da900ec.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8902aa9d-08b9-42ca-bbe6-5af94f28006f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8902aa9d-08b9-42ca-bbe6-5af94f28006f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8902aa9d-08b9-42ca-bbe6-5af94f28006f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8902aa9d-08b9-42ca-bbe6-5af94f28006f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/89079f28-cb67-47da-aae4-62de1b9d458e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/89079f28-cb67-47da-aae4-62de1b9d458e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/89079f28-cb67-47da-aae4-62de1b9d458e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/89079f28-cb67-47da-aae4-62de1b9d458e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/891ecfb4-3f1d-4284-8a9d-b1eb6d54b3e8.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/891ecfb4-3f1d-4284-8a9d-b1eb6d54b3e8.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/891ecfb4-3f1d-4284-8a9d-b1eb6d54b3e8.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/891ecfb4-3f1d-4284-8a9d-b1eb6d54b3e8.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/891f26c2-a2dc-4d83-9c40-c181bd0cf03e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/891f26c2-a2dc-4d83-9c40-c181bd0cf03e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/891f26c2-a2dc-4d83-9c40-c181bd0cf03e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/891f26c2-a2dc-4d83-9c40-c181bd0cf03e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/89285df5-0cda-477f-b728-cc0df13a2b94.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/89285df5-0cda-477f-b728-cc0df13a2b94.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/89285df5-0cda-477f-b728-cc0df13a2b94.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/89285df5-0cda-477f-b728-cc0df13a2b94.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/89322ae2-63c5-4d86-b85d-43c8f31c7663.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/89322ae2-63c5-4d86-b85d-43c8f31c7663.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/89322ae2-63c5-4d86-b85d-43c8f31c7663.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/89322ae2-63c5-4d86-b85d-43c8f31c7663.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8947a986-0eb6-455d-a0c2-bf591386c7a2.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8947a986-0eb6-455d-a0c2-bf591386c7a2.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8947a986-0eb6-455d-a0c2-bf591386c7a2.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8947a986-0eb6-455d-a0c2-bf591386c7a2.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/895db6df-444a-4c05-a108-c75d4fefb13d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/895db6df-444a-4c05-a108-c75d4fefb13d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/895db6df-444a-4c05-a108-c75d4fefb13d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/895db6df-444a-4c05-a108-c75d4fefb13d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/897904a0-8908-4fb4-9d57-0a5d351a2e1b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/897904a0-8908-4fb4-9d57-0a5d351a2e1b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/897904a0-8908-4fb4-9d57-0a5d351a2e1b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/897904a0-8908-4fb4-9d57-0a5d351a2e1b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/89b08627-572e-4de3-a6ad-c06763c7187f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/89b08627-572e-4de3-a6ad-c06763c7187f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/89b08627-572e-4de3-a6ad-c06763c7187f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/89b08627-572e-4de3-a6ad-c06763c7187f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/89b268f6-4b7c-496d-9105-0179d9cfd5cc.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/89b268f6-4b7c-496d-9105-0179d9cfd5cc.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/89b268f6-4b7c-496d-9105-0179d9cfd5cc.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/89b268f6-4b7c-496d-9105-0179d9cfd5cc.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/89c6d18e-2520-4f45-9491-2e06df7a111e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/89c6d18e-2520-4f45-9491-2e06df7a111e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/89c6d18e-2520-4f45-9491-2e06df7a111e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/89c6d18e-2520-4f45-9491-2e06df7a111e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8a034075-2434-46eb-956c-de96bc9f0a1c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8a034075-2434-46eb-956c-de96bc9f0a1c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8a034075-2434-46eb-956c-de96bc9f0a1c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8a034075-2434-46eb-956c-de96bc9f0a1c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8a12d7c8-d8b9-43bf-85bf-70f63adae291.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8a12d7c8-d8b9-43bf-85bf-70f63adae291.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8a12d7c8-d8b9-43bf-85bf-70f63adae291.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8a12d7c8-d8b9-43bf-85bf-70f63adae291.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8a1f9b9b-e921-4151-99fb-3be622d78dc8.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8a1f9b9b-e921-4151-99fb-3be622d78dc8.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8a1f9b9b-e921-4151-99fb-3be622d78dc8.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8a1f9b9b-e921-4151-99fb-3be622d78dc8.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8a20a68b-0efe-4a8c-99b3-7392fac45bfa.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8a20a68b-0efe-4a8c-99b3-7392fac45bfa.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8a20a68b-0efe-4a8c-99b3-7392fac45bfa.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8a20a68b-0efe-4a8c-99b3-7392fac45bfa.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8a2c30e2-8a0f-405c-a845-be7647db431b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8a2c30e2-8a0f-405c-a845-be7647db431b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8a2c30e2-8a0f-405c-a845-be7647db431b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8a2c30e2-8a0f-405c-a845-be7647db431b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8a5afee5-57d3-4754-b5e4-b7fc05a2e371.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8a5afee5-57d3-4754-b5e4-b7fc05a2e371.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8a5afee5-57d3-4754-b5e4-b7fc05a2e371.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8a5afee5-57d3-4754-b5e4-b7fc05a2e371.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8a61eb2f-1855-443a-8721-eeedeac3539e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8a61eb2f-1855-443a-8721-eeedeac3539e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8a61eb2f-1855-443a-8721-eeedeac3539e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8a61eb2f-1855-443a-8721-eeedeac3539e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8a8655d0-94a8-44e8-90e8-f314837da334.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8a8655d0-94a8-44e8-90e8-f314837da334.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8a8655d0-94a8-44e8-90e8-f314837da334.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8a8655d0-94a8-44e8-90e8-f314837da334.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8a8e1f4e-9b48-486b-bee9-82b630780ca7.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8a8e1f4e-9b48-486b-bee9-82b630780ca7.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8a8e1f4e-9b48-486b-bee9-82b630780ca7.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8a8e1f4e-9b48-486b-bee9-82b630780ca7.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8ab3499e-6282-48b0-a762-148c61832653.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8ab3499e-6282-48b0-a762-148c61832653.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8ab3499e-6282-48b0-a762-148c61832653.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8ab3499e-6282-48b0-a762-148c61832653.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8add3e54-7cbb-44ea-9b84-0d9f4f032782.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8add3e54-7cbb-44ea-9b84-0d9f4f032782.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8add3e54-7cbb-44ea-9b84-0d9f4f032782.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8add3e54-7cbb-44ea-9b84-0d9f4f032782.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8aebd491-cc9b-48e0-9db5-ff2471f7f164.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8aebd491-cc9b-48e0-9db5-ff2471f7f164.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8aebd491-cc9b-48e0-9db5-ff2471f7f164.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8aebd491-cc9b-48e0-9db5-ff2471f7f164.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8aede6db-a131-4600-8d56-416d816e8bd0.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8aede6db-a131-4600-8d56-416d816e8bd0.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8aede6db-a131-4600-8d56-416d816e8bd0.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8aede6db-a131-4600-8d56-416d816e8bd0.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8b0d8d09-4055-4a8d-a9d7-1866d9253592.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8b0d8d09-4055-4a8d-a9d7-1866d9253592.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8b0d8d09-4055-4a8d-a9d7-1866d9253592.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8b0d8d09-4055-4a8d-a9d7-1866d9253592.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8b248485-df7a-4efd-bdd1-b3f1cafd92bb.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8b248485-df7a-4efd-bdd1-b3f1cafd92bb.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8b248485-df7a-4efd-bdd1-b3f1cafd92bb.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8b248485-df7a-4efd-bdd1-b3f1cafd92bb.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8b4fa802-3aa8-4302-a18a-ddb8df771d1e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8b4fa802-3aa8-4302-a18a-ddb8df771d1e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8b4fa802-3aa8-4302-a18a-ddb8df771d1e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8b4fa802-3aa8-4302-a18a-ddb8df771d1e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8b6ec273-ba28-44bc-81af-8bd15350549e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8b6ec273-ba28-44bc-81af-8bd15350549e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8b6ec273-ba28-44bc-81af-8bd15350549e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8b6ec273-ba28-44bc-81af-8bd15350549e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8baf539d-65e5-44d8-a8ec-c1753aa289dc.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8baf539d-65e5-44d8-a8ec-c1753aa289dc.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8baf539d-65e5-44d8-a8ec-c1753aa289dc.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8baf539d-65e5-44d8-a8ec-c1753aa289dc.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8bb3d6ae-a2e2-4364-a353-bfb9e5c876a2.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8bb3d6ae-a2e2-4364-a353-bfb9e5c876a2.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8bb3d6ae-a2e2-4364-a353-bfb9e5c876a2.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8bb3d6ae-a2e2-4364-a353-bfb9e5c876a2.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8bc284bd-2e13-4889-819a-dea81e2140a6.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8bc284bd-2e13-4889-819a-dea81e2140a6.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8bc284bd-2e13-4889-819a-dea81e2140a6.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8bc284bd-2e13-4889-819a-dea81e2140a6.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8bc7e39a-cb68-4da4-97e9-a180cccfc1c7.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8bc7e39a-cb68-4da4-97e9-a180cccfc1c7.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8bc7e39a-cb68-4da4-97e9-a180cccfc1c7.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8bc7e39a-cb68-4da4-97e9-a180cccfc1c7.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8bfe9437-ba1f-4683-817e-037ed595d10d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8bfe9437-ba1f-4683-817e-037ed595d10d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8bfe9437-ba1f-4683-817e-037ed595d10d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8bfe9437-ba1f-4683-817e-037ed595d10d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8c062917-7faa-47ee-a1e9-58dc87f09283.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8c062917-7faa-47ee-a1e9-58dc87f09283.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8c062917-7faa-47ee-a1e9-58dc87f09283.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8c062917-7faa-47ee-a1e9-58dc87f09283.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8c23583e-9138-4d37-872e-db7a8bca85ee.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8c23583e-9138-4d37-872e-db7a8bca85ee.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8c23583e-9138-4d37-872e-db7a8bca85ee.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8c23583e-9138-4d37-872e-db7a8bca85ee.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8c2df815-1faa-4972-87e1-d3fd3bfc9d09.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8c2df815-1faa-4972-87e1-d3fd3bfc9d09.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8c2df815-1faa-4972-87e1-d3fd3bfc9d09.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8c2df815-1faa-4972-87e1-d3fd3bfc9d09.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8c37908d-bfa6-4003-93aa-0d57d0e95a3e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8c37908d-bfa6-4003-93aa-0d57d0e95a3e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8c37908d-bfa6-4003-93aa-0d57d0e95a3e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8c37908d-bfa6-4003-93aa-0d57d0e95a3e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8c3a6edc-708b-4911-8232-a77a1ba965be.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8c3a6edc-708b-4911-8232-a77a1ba965be.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8c3a6edc-708b-4911-8232-a77a1ba965be.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8c3a6edc-708b-4911-8232-a77a1ba965be.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8c480ce8-acb2-40bf-9281-de37ee5db87e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8c480ce8-acb2-40bf-9281-de37ee5db87e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8c480ce8-acb2-40bf-9281-de37ee5db87e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8c480ce8-acb2-40bf-9281-de37ee5db87e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8c837b6f-1422-49a8-913d-67481f6f21f4.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8c837b6f-1422-49a8-913d-67481f6f21f4.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8c837b6f-1422-49a8-913d-67481f6f21f4.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8c837b6f-1422-49a8-913d-67481f6f21f4.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8ca79c0f-fe24-4196-86a1-c4014fd5639c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8ca79c0f-fe24-4196-86a1-c4014fd5639c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8ca79c0f-fe24-4196-86a1-c4014fd5639c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8ca79c0f-fe24-4196-86a1-c4014fd5639c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8ccf579e-d069-48df-ae93-fa669dbf02cc.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8ccf579e-d069-48df-ae93-fa669dbf02cc.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8ccf579e-d069-48df-ae93-fa669dbf02cc.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8ccf579e-d069-48df-ae93-fa669dbf02cc.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8cd92c8c-6378-4940-912b-0ae70583521e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8cd92c8c-6378-4940-912b-0ae70583521e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8cd92c8c-6378-4940-912b-0ae70583521e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8cd92c8c-6378-4940-912b-0ae70583521e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8cdd4a94-8214-49b1-9be4-3cac2b8f7dc8.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8cdd4a94-8214-49b1-9be4-3cac2b8f7dc8.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8cdd4a94-8214-49b1-9be4-3cac2b8f7dc8.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8cdd4a94-8214-49b1-9be4-3cac2b8f7dc8.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8d04b6b4-b2ae-4d83-b250-3251b02c6fd7.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8d04b6b4-b2ae-4d83-b250-3251b02c6fd7.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8d04b6b4-b2ae-4d83-b250-3251b02c6fd7.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8d04b6b4-b2ae-4d83-b250-3251b02c6fd7.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8d243eb3-9205-4b50-a653-c53c0479adb6.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8d243eb3-9205-4b50-a653-c53c0479adb6.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8d243eb3-9205-4b50-a653-c53c0479adb6.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8d243eb3-9205-4b50-a653-c53c0479adb6.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8d407704-0b48-4dac-b6c6-747af7c9a130.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8d407704-0b48-4dac-b6c6-747af7c9a130.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8d407704-0b48-4dac-b6c6-747af7c9a130.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8d407704-0b48-4dac-b6c6-747af7c9a130.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8d82b6cb-1828-483b-a09e-74cc03d483e4.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8d82b6cb-1828-483b-a09e-74cc03d483e4.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8d82b6cb-1828-483b-a09e-74cc03d483e4.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8d82b6cb-1828-483b-a09e-74cc03d483e4.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8ddc515a-8dab-4a37-ac0b-5a959a23626c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8ddc515a-8dab-4a37-ac0b-5a959a23626c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8ddc515a-8dab-4a37-ac0b-5a959a23626c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8ddc515a-8dab-4a37-ac0b-5a959a23626c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8e2097aa-4424-498e-9176-b3ac526c81db.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8e2097aa-4424-498e-9176-b3ac526c81db.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8e2097aa-4424-498e-9176-b3ac526c81db.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8e2097aa-4424-498e-9176-b3ac526c81db.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8e260166-5c34-4450-aa0c-054e224a265b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8e260166-5c34-4450-aa0c-054e224a265b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8e260166-5c34-4450-aa0c-054e224a265b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8e260166-5c34-4450-aa0c-054e224a265b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8e3faeb2-f38f-44d3-9c37-f7471de50c69.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8e3faeb2-f38f-44d3-9c37-f7471de50c69.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8e3faeb2-f38f-44d3-9c37-f7471de50c69.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8e3faeb2-f38f-44d3-9c37-f7471de50c69.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8e47a8f1-e72a-4fd3-8ec2-d2cc26c49a30.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8e47a8f1-e72a-4fd3-8ec2-d2cc26c49a30.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8e47a8f1-e72a-4fd3-8ec2-d2cc26c49a30.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8e47a8f1-e72a-4fd3-8ec2-d2cc26c49a30.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8e5b42ff-d5a0-40f8-88c5-25f0464464d9.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8e5b42ff-d5a0-40f8-88c5-25f0464464d9.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8e5b42ff-d5a0-40f8-88c5-25f0464464d9.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8e5b42ff-d5a0-40f8-88c5-25f0464464d9.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8e631974-3ff4-4342-a629-6e90852018c6.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8e631974-3ff4-4342-a629-6e90852018c6.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8e631974-3ff4-4342-a629-6e90852018c6.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8e631974-3ff4-4342-a629-6e90852018c6.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8e696b51-47f5-44eb-83be-ba4bf68e3570.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8e696b51-47f5-44eb-83be-ba4bf68e3570.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8e696b51-47f5-44eb-83be-ba4bf68e3570.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8e696b51-47f5-44eb-83be-ba4bf68e3570.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8e9544b5-77bb-4204-9220-537d219df1c4.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8e9544b5-77bb-4204-9220-537d219df1c4.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8e9544b5-77bb-4204-9220-537d219df1c4.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8e9544b5-77bb-4204-9220-537d219df1c4.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8eab5c07-9306-4202-91fb-3eff46b80620.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8eab5c07-9306-4202-91fb-3eff46b80620.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8eab5c07-9306-4202-91fb-3eff46b80620.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8eab5c07-9306-4202-91fb-3eff46b80620.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8eb71372-f9bc-4787-931f-0166c46d6651.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8eb71372-f9bc-4787-931f-0166c46d6651.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8eb71372-f9bc-4787-931f-0166c46d6651.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8eb71372-f9bc-4787-931f-0166c46d6651.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8ebd66ae-d314-4595-b57f-62019a6610a4.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8ebd66ae-d314-4595-b57f-62019a6610a4.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8ebd66ae-d314-4595-b57f-62019a6610a4.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8ebd66ae-d314-4595-b57f-62019a6610a4.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8ecf49d9-97a1-4a05-a48f-29f102bedeb3.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8ecf49d9-97a1-4a05-a48f-29f102bedeb3.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8ecf49d9-97a1-4a05-a48f-29f102bedeb3.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8ecf49d9-97a1-4a05-a48f-29f102bedeb3.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8ed97981-581b-4787-bda0-10856b9ff86d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8ed97981-581b-4787-bda0-10856b9ff86d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8ed97981-581b-4787-bda0-10856b9ff86d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8ed97981-581b-4787-bda0-10856b9ff86d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8edb1e15-1f80-4432-b012-6cd4383b0742.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8edb1e15-1f80-4432-b012-6cd4383b0742.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8edb1e15-1f80-4432-b012-6cd4383b0742.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8edb1e15-1f80-4432-b012-6cd4383b0742.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8efef66e-1ebc-4d44-b316-5e1536d196b6.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8efef66e-1ebc-4d44-b316-5e1536d196b6.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8efef66e-1ebc-4d44-b316-5e1536d196b6.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8efef66e-1ebc-4d44-b316-5e1536d196b6.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8f1ad1e6-ed79-4056-ab53-58101323fdef.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8f1ad1e6-ed79-4056-ab53-58101323fdef.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8f1ad1e6-ed79-4056-ab53-58101323fdef.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8f1ad1e6-ed79-4056-ab53-58101323fdef.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8f370c8d-3cf6-4612-9bb0-3cc9143e01c2.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8f370c8d-3cf6-4612-9bb0-3cc9143e01c2.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8f370c8d-3cf6-4612-9bb0-3cc9143e01c2.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8f370c8d-3cf6-4612-9bb0-3cc9143e01c2.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8f3757d6-f764-4aa9-a2da-2d8ffc0ac2ef.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8f3757d6-f764-4aa9-a2da-2d8ffc0ac2ef.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8f3757d6-f764-4aa9-a2da-2d8ffc0ac2ef.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8f3757d6-f764-4aa9-a2da-2d8ffc0ac2ef.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8f5cc296-f020-4d06-b9b6-1d19b180df37.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8f5cc296-f020-4d06-b9b6-1d19b180df37.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8f5cc296-f020-4d06-b9b6-1d19b180df37.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8f5cc296-f020-4d06-b9b6-1d19b180df37.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8f616a60-ee38-4ad4-a667-23dc795fd08c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8f616a60-ee38-4ad4-a667-23dc795fd08c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8f616a60-ee38-4ad4-a667-23dc795fd08c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8f616a60-ee38-4ad4-a667-23dc795fd08c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8f7541c4-57d1-4d1d-accb-1dade7a77712.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8f7541c4-57d1-4d1d-accb-1dade7a77712.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8f7541c4-57d1-4d1d-accb-1dade7a77712.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8f7541c4-57d1-4d1d-accb-1dade7a77712.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8f86a80a-69f2-4d96-8d67-a25101b7f7e6.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8f86a80a-69f2-4d96-8d67-a25101b7f7e6.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8f86a80a-69f2-4d96-8d67-a25101b7f7e6.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8f86a80a-69f2-4d96-8d67-a25101b7f7e6.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8fbcdc5c-73fe-4af1-be8d-e9a54ec44421.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8fbcdc5c-73fe-4af1-be8d-e9a54ec44421.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8fbcdc5c-73fe-4af1-be8d-e9a54ec44421.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8fbcdc5c-73fe-4af1-be8d-e9a54ec44421.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8fd0bf88-0450-4c34-951b-c71513a9769d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8fd0bf88-0450-4c34-951b-c71513a9769d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8fd0bf88-0450-4c34-951b-c71513a9769d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8fd0bf88-0450-4c34-951b-c71513a9769d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8fd943f2-df4c-43e0-b6fe-6233578c6b5d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8fd943f2-df4c-43e0-b6fe-6233578c6b5d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8fd943f2-df4c-43e0-b6fe-6233578c6b5d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8fd943f2-df4c-43e0-b6fe-6233578c6b5d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8fe2f5da-bf26-4273-b8f5-d3bc99f05872.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8fe2f5da-bf26-4273-b8f5-d3bc99f05872.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8fe2f5da-bf26-4273-b8f5-d3bc99f05872.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8fe2f5da-bf26-4273-b8f5-d3bc99f05872.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8ff97e17-eed8-4498-9a4c-4cf76d7c794c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8ff97e17-eed8-4498-9a4c-4cf76d7c794c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8ff97e17-eed8-4498-9a4c-4cf76d7c794c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/8ff97e17-eed8-4498-9a4c-4cf76d7c794c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9002e88d-287d-48b8-8975-4bb9ff3ae541.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9002e88d-287d-48b8-8975-4bb9ff3ae541.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9002e88d-287d-48b8-8975-4bb9ff3ae541.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9002e88d-287d-48b8-8975-4bb9ff3ae541.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/90205bbb-917d-4493-ab55-b19397a48dac.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/90205bbb-917d-4493-ab55-b19397a48dac.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/90205bbb-917d-4493-ab55-b19397a48dac.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/90205bbb-917d-4493-ab55-b19397a48dac.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/90344fd2-fce2-4dbc-8d07-c5fd0e867a1e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/90344fd2-fce2-4dbc-8d07-c5fd0e867a1e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/90344fd2-fce2-4dbc-8d07-c5fd0e867a1e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/90344fd2-fce2-4dbc-8d07-c5fd0e867a1e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/90512fae-0b56-4b33-a318-fc9156bc4c91.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/90512fae-0b56-4b33-a318-fc9156bc4c91.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/90512fae-0b56-4b33-a318-fc9156bc4c91.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/90512fae-0b56-4b33-a318-fc9156bc4c91.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9055fc04-6a25-4f37-95e4-693436b0ac3d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9055fc04-6a25-4f37-95e4-693436b0ac3d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9055fc04-6a25-4f37-95e4-693436b0ac3d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9055fc04-6a25-4f37-95e4-693436b0ac3d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9078a5a0-4ac8-4743-8320-2336f1daa7ec.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9078a5a0-4ac8-4743-8320-2336f1daa7ec.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9078a5a0-4ac8-4743-8320-2336f1daa7ec.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9078a5a0-4ac8-4743-8320-2336f1daa7ec.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9080b3f0-fce4-4942-bc38-8f016368656c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9080b3f0-fce4-4942-bc38-8f016368656c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9080b3f0-fce4-4942-bc38-8f016368656c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9080b3f0-fce4-4942-bc38-8f016368656c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/90a8511a-8400-4d9e-9239-cdf7fc08b2df.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/90a8511a-8400-4d9e-9239-cdf7fc08b2df.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/90a8511a-8400-4d9e-9239-cdf7fc08b2df.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/90a8511a-8400-4d9e-9239-cdf7fc08b2df.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/90ab50ac-9b2c-44f2-b006-f2e9bb61d2db.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/90ab50ac-9b2c-44f2-b006-f2e9bb61d2db.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/90ab50ac-9b2c-44f2-b006-f2e9bb61d2db.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/90ab50ac-9b2c-44f2-b006-f2e9bb61d2db.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/90bebc78-52f6-443c-aa16-af04152bd363.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/90bebc78-52f6-443c-aa16-af04152bd363.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/90bebc78-52f6-443c-aa16-af04152bd363.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/90bebc78-52f6-443c-aa16-af04152bd363.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/90f3e4ec-21de-4424-ab8b-d443a3f31c71.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/90f3e4ec-21de-4424-ab8b-d443a3f31c71.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/90f3e4ec-21de-4424-ab8b-d443a3f31c71.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/90f3e4ec-21de-4424-ab8b-d443a3f31c71.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/90f81a61-6704-44ae-9a20-4dda3cea0f81.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/90f81a61-6704-44ae-9a20-4dda3cea0f81.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/90f81a61-6704-44ae-9a20-4dda3cea0f81.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/90f81a61-6704-44ae-9a20-4dda3cea0f81.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/90f969aa-7624-404e-91d1-fdc7ed35173c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/90f969aa-7624-404e-91d1-fdc7ed35173c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/90f969aa-7624-404e-91d1-fdc7ed35173c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/90f969aa-7624-404e-91d1-fdc7ed35173c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/90fbf985-bd22-4ff6-a6b6-568e9803b1ef.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/90fbf985-bd22-4ff6-a6b6-568e9803b1ef.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/90fbf985-bd22-4ff6-a6b6-568e9803b1ef.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/90fbf985-bd22-4ff6-a6b6-568e9803b1ef.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/91053a51-ab88-40c9-8fee-f6d898a435b4.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/91053a51-ab88-40c9-8fee-f6d898a435b4.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/91053a51-ab88-40c9-8fee-f6d898a435b4.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/91053a51-ab88-40c9-8fee-f6d898a435b4.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/910a7fda-4a0d-4369-82ef-719894e26b1a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/910a7fda-4a0d-4369-82ef-719894e26b1a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/910a7fda-4a0d-4369-82ef-719894e26b1a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/910a7fda-4a0d-4369-82ef-719894e26b1a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/91131194-7933-4e13-9251-d0f85a7456da.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/91131194-7933-4e13-9251-d0f85a7456da.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/91131194-7933-4e13-9251-d0f85a7456da.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/91131194-7933-4e13-9251-d0f85a7456da.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9116224f-3b3c-421b-b76d-997f398385e5.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9116224f-3b3c-421b-b76d-997f398385e5.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9116224f-3b3c-421b-b76d-997f398385e5.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9116224f-3b3c-421b-b76d-997f398385e5.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/911d8714-6713-48a8-bd61-42164c17a499.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/911d8714-6713-48a8-bd61-42164c17a499.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/911d8714-6713-48a8-bd61-42164c17a499.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/911d8714-6713-48a8-bd61-42164c17a499.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/91221919-e9ee-41cd-b6f9-1639d64bb8f2.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/91221919-e9ee-41cd-b6f9-1639d64bb8f2.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/91221919-e9ee-41cd-b6f9-1639d64bb8f2.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/91221919-e9ee-41cd-b6f9-1639d64bb8f2.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/913f4172-4594-4942-864b-4b3d5ff446bf.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/913f4172-4594-4942-864b-4b3d5ff446bf.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/913f4172-4594-4942-864b-4b3d5ff446bf.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/913f4172-4594-4942-864b-4b3d5ff446bf.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9151983b-f166-4e82-a9a4-472ffc4b68b8.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9151983b-f166-4e82-a9a4-472ffc4b68b8.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9151983b-f166-4e82-a9a4-472ffc4b68b8.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9151983b-f166-4e82-a9a4-472ffc4b68b8.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/916c10b9-7547-4d25-9214-e29cb701d4ff.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/916c10b9-7547-4d25-9214-e29cb701d4ff.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/916c10b9-7547-4d25-9214-e29cb701d4ff.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/916c10b9-7547-4d25-9214-e29cb701d4ff.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9170a200-f388-46cb-bcf2-59018ffded31.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9170a200-f388-46cb-bcf2-59018ffded31.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9170a200-f388-46cb-bcf2-59018ffded31.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9170a200-f388-46cb-bcf2-59018ffded31.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/917feb22-21b0-44c6-a359-50277c3837a4.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/917feb22-21b0-44c6-a359-50277c3837a4.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/917feb22-21b0-44c6-a359-50277c3837a4.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/917feb22-21b0-44c6-a359-50277c3837a4.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/91882d66-658c-41f1-a991-351a04976417.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/91882d66-658c-41f1-a991-351a04976417.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/91882d66-658c-41f1-a991-351a04976417.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/91882d66-658c-41f1-a991-351a04976417.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/919d5882-8da0-4765-aefa-0a44d1d6dff7.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/919d5882-8da0-4765-aefa-0a44d1d6dff7.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/919d5882-8da0-4765-aefa-0a44d1d6dff7.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/919d5882-8da0-4765-aefa-0a44d1d6dff7.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/91b85673-be4c-470d-b13a-871599fbae5d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/91b85673-be4c-470d-b13a-871599fbae5d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/91b85673-be4c-470d-b13a-871599fbae5d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/91b85673-be4c-470d-b13a-871599fbae5d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/91f9731d-e8aa-4043-9bbc-49a731e206a2.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/91f9731d-e8aa-4043-9bbc-49a731e206a2.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/91f9731d-e8aa-4043-9bbc-49a731e206a2.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/91f9731d-e8aa-4043-9bbc-49a731e206a2.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/92103a9e-255b-4a08-b410-bdf26a408d3f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/92103a9e-255b-4a08-b410-bdf26a408d3f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/92103a9e-255b-4a08-b410-bdf26a408d3f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/92103a9e-255b-4a08-b410-bdf26a408d3f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9218c53b-cbc4-4566-a950-251b2f2095f8.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9218c53b-cbc4-4566-a950-251b2f2095f8.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9218c53b-cbc4-4566-a950-251b2f2095f8.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9218c53b-cbc4-4566-a950-251b2f2095f8.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9239bc4d-1345-44d7-a485-cf2e30dc1fe8.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9239bc4d-1345-44d7-a485-cf2e30dc1fe8.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9239bc4d-1345-44d7-a485-cf2e30dc1fe8.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9239bc4d-1345-44d7-a485-cf2e30dc1fe8.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/923bedf8-9db4-4b5f-aee8-fcacfdf53363.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/923bedf8-9db4-4b5f-aee8-fcacfdf53363.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/923bedf8-9db4-4b5f-aee8-fcacfdf53363.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/923bedf8-9db4-4b5f-aee8-fcacfdf53363.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/926229d3-2446-4de8-827e-c3ac6a16d6cd.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/926229d3-2446-4de8-827e-c3ac6a16d6cd.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/926229d3-2446-4de8-827e-c3ac6a16d6cd.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/926229d3-2446-4de8-827e-c3ac6a16d6cd.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9270c500-7696-464f-b09f-0bdb4686a6bd.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9270c500-7696-464f-b09f-0bdb4686a6bd.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9270c500-7696-464f-b09f-0bdb4686a6bd.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9270c500-7696-464f-b09f-0bdb4686a6bd.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/92a853f7-3860-42b7-9e31-69ae0822013f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/92a853f7-3860-42b7-9e31-69ae0822013f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/92a853f7-3860-42b7-9e31-69ae0822013f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/92a853f7-3860-42b7-9e31-69ae0822013f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/92ab9581-b3dc-496e-9441-839e7ce207f3.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/92ab9581-b3dc-496e-9441-839e7ce207f3.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/92ab9581-b3dc-496e-9441-839e7ce207f3.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/92ab9581-b3dc-496e-9441-839e7ce207f3.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/92efdc9d-b6f0-43d0-8ab8-ede0a7b0414d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/92efdc9d-b6f0-43d0-8ab8-ede0a7b0414d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/92efdc9d-b6f0-43d0-8ab8-ede0a7b0414d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/92efdc9d-b6f0-43d0-8ab8-ede0a7b0414d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/92f27a6f-e836-4b11-b8d4-6a22a4987596.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/92f27a6f-e836-4b11-b8d4-6a22a4987596.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/92f27a6f-e836-4b11-b8d4-6a22a4987596.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/92f27a6f-e836-4b11-b8d4-6a22a4987596.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9316b64b-a367-4dae-bdab-8e9edb9327a5.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9316b64b-a367-4dae-bdab-8e9edb9327a5.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9316b64b-a367-4dae-bdab-8e9edb9327a5.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9316b64b-a367-4dae-bdab-8e9edb9327a5.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/933dc857-b8c2-470d-ae6c-03d18b4d0207.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/933dc857-b8c2-470d-ae6c-03d18b4d0207.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/933dc857-b8c2-470d-ae6c-03d18b4d0207.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/933dc857-b8c2-470d-ae6c-03d18b4d0207.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/934f7dba-b0b7-448c-a71e-4c4c0e56dcc3.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/934f7dba-b0b7-448c-a71e-4c4c0e56dcc3.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/934f7dba-b0b7-448c-a71e-4c4c0e56dcc3.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/934f7dba-b0b7-448c-a71e-4c4c0e56dcc3.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/93a1ba76-cc9f-4bf3-b5d6-b49fa898a8ea.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/93a1ba76-cc9f-4bf3-b5d6-b49fa898a8ea.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/93a1ba76-cc9f-4bf3-b5d6-b49fa898a8ea.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/93a1ba76-cc9f-4bf3-b5d6-b49fa898a8ea.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/93af6756-1e23-4ee1-9eca-d7538da0a436.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/93af6756-1e23-4ee1-9eca-d7538da0a436.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/93af6756-1e23-4ee1-9eca-d7538da0a436.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/93af6756-1e23-4ee1-9eca-d7538da0a436.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/93c2b53f-136b-40d7-8214-e73d16d34939.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/93c2b53f-136b-40d7-8214-e73d16d34939.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/93c2b53f-136b-40d7-8214-e73d16d34939.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/93c2b53f-136b-40d7-8214-e73d16d34939.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/93c97900-c35b-4094-a94e-1601d21c7424.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/93c97900-c35b-4094-a94e-1601d21c7424.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/93c97900-c35b-4094-a94e-1601d21c7424.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/93c97900-c35b-4094-a94e-1601d21c7424.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/93ccfdb3-4fe2-4e9a-8883-fcff1ecceba9.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/93ccfdb3-4fe2-4e9a-8883-fcff1ecceba9.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/93ccfdb3-4fe2-4e9a-8883-fcff1ecceba9.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/93ccfdb3-4fe2-4e9a-8883-fcff1ecceba9.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/93de2fb3-2390-4566-a8d4-13cc5316ba44.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/93de2fb3-2390-4566-a8d4-13cc5316ba44.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/93de2fb3-2390-4566-a8d4-13cc5316ba44.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/93de2fb3-2390-4566-a8d4-13cc5316ba44.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/93e5531f-8885-46b9-9199-336b92165190.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/93e5531f-8885-46b9-9199-336b92165190.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/93e5531f-8885-46b9-9199-336b92165190.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/93e5531f-8885-46b9-9199-336b92165190.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/93fba3aa-0c5f-4836-87dd-e667dadd5d06.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/93fba3aa-0c5f-4836-87dd-e667dadd5d06.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/93fba3aa-0c5f-4836-87dd-e667dadd5d06.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/93fba3aa-0c5f-4836-87dd-e667dadd5d06.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9410c242-8321-4841-b05c-473ea39d30bc.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9410c242-8321-4841-b05c-473ea39d30bc.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9410c242-8321-4841-b05c-473ea39d30bc.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9410c242-8321-4841-b05c-473ea39d30bc.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/941b3515-5aad-4ae0-aefd-10a6e16df4e8.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/941b3515-5aad-4ae0-aefd-10a6e16df4e8.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/941b3515-5aad-4ae0-aefd-10a6e16df4e8.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/941b3515-5aad-4ae0-aefd-10a6e16df4e8.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/942bbac4-713b-4726-b184-3790fddf9926.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/942bbac4-713b-4726-b184-3790fddf9926.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/942bbac4-713b-4726-b184-3790fddf9926.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/942bbac4-713b-4726-b184-3790fddf9926.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9437a537-d998-45ad-b439-fc5d11b3bd99.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9437a537-d998-45ad-b439-fc5d11b3bd99.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9437a537-d998-45ad-b439-fc5d11b3bd99.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9437a537-d998-45ad-b439-fc5d11b3bd99.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/94683288-52bd-4031-b8f9-8a23eeb8cf46.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/94683288-52bd-4031-b8f9-8a23eeb8cf46.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/94683288-52bd-4031-b8f9-8a23eeb8cf46.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/94683288-52bd-4031-b8f9-8a23eeb8cf46.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/946e45cf-aab3-4a21-98d1-ba659e6ec177.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/946e45cf-aab3-4a21-98d1-ba659e6ec177.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/946e45cf-aab3-4a21-98d1-ba659e6ec177.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/946e45cf-aab3-4a21-98d1-ba659e6ec177.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9488520a-da5c-49a7-88bb-c22056f33a8b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9488520a-da5c-49a7-88bb-c22056f33a8b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9488520a-da5c-49a7-88bb-c22056f33a8b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9488520a-da5c-49a7-88bb-c22056f33a8b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9490ac39-6f0f-46de-baea-33997f01d05b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9490ac39-6f0f-46de-baea-33997f01d05b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9490ac39-6f0f-46de-baea-33997f01d05b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9490ac39-6f0f-46de-baea-33997f01d05b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/94a5121f-c9d2-46e6-878e-94407917f9b7.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/94a5121f-c9d2-46e6-878e-94407917f9b7.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/94a5121f-c9d2-46e6-878e-94407917f9b7.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/94a5121f-c9d2-46e6-878e-94407917f9b7.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/94a77d36-5893-46cb-a498-981c8cb65d03.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/94a77d36-5893-46cb-a498-981c8cb65d03.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/94a77d36-5893-46cb-a498-981c8cb65d03.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/94a77d36-5893-46cb-a498-981c8cb65d03.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/94b22aab-f0f0-44ba-870a-8de895a5ba78.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/94b22aab-f0f0-44ba-870a-8de895a5ba78.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/94b22aab-f0f0-44ba-870a-8de895a5ba78.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/94b22aab-f0f0-44ba-870a-8de895a5ba78.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/94fd2291-2c4a-4edb-9de4-b8a83d885333.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/94fd2291-2c4a-4edb-9de4-b8a83d885333.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/94fd2291-2c4a-4edb-9de4-b8a83d885333.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/94fd2291-2c4a-4edb-9de4-b8a83d885333.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/95070291-832f-48cd-8645-fd00c173ac3d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/95070291-832f-48cd-8645-fd00c173ac3d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/95070291-832f-48cd-8645-fd00c173ac3d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/95070291-832f-48cd-8645-fd00c173ac3d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/95216d5e-44fd-4c46-a970-fd7af9398838.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/95216d5e-44fd-4c46-a970-fd7af9398838.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/95216d5e-44fd-4c46-a970-fd7af9398838.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/95216d5e-44fd-4c46-a970-fd7af9398838.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9575fa8a-be55-4965-9d26-65eeac46958d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9575fa8a-be55-4965-9d26-65eeac46958d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9575fa8a-be55-4965-9d26-65eeac46958d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9575fa8a-be55-4965-9d26-65eeac46958d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9584d012-2f78-4d53-92c3-9198de3b73ba.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9584d012-2f78-4d53-92c3-9198de3b73ba.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9584d012-2f78-4d53-92c3-9198de3b73ba.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9584d012-2f78-4d53-92c3-9198de3b73ba.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/959de485-7dc8-4f10-bb12-c812bf827413.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/959de485-7dc8-4f10-bb12-c812bf827413.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/959de485-7dc8-4f10-bb12-c812bf827413.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/959de485-7dc8-4f10-bb12-c812bf827413.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/95ae001e-9c6b-48f1-b7ba-358bafc7b26d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/95ae001e-9c6b-48f1-b7ba-358bafc7b26d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/95ae001e-9c6b-48f1-b7ba-358bafc7b26d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/95ae001e-9c6b-48f1-b7ba-358bafc7b26d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/95be64dc-e95b-4585-8079-46c1463668bc.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/95be64dc-e95b-4585-8079-46c1463668bc.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/95be64dc-e95b-4585-8079-46c1463668bc.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/95be64dc-e95b-4585-8079-46c1463668bc.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/95ebfda3-427f-4a5a-90b2-74213cf48235.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/95ebfda3-427f-4a5a-90b2-74213cf48235.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/95ebfda3-427f-4a5a-90b2-74213cf48235.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/95ebfda3-427f-4a5a-90b2-74213cf48235.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/964ecf20-76ec-4dbb-ad9e-449db209eb5f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/964ecf20-76ec-4dbb-ad9e-449db209eb5f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/964ecf20-76ec-4dbb-ad9e-449db209eb5f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/964ecf20-76ec-4dbb-ad9e-449db209eb5f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/965e520c-836a-4e89-8325-62ed13dcd0ed.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/965e520c-836a-4e89-8325-62ed13dcd0ed.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/965e520c-836a-4e89-8325-62ed13dcd0ed.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/965e520c-836a-4e89-8325-62ed13dcd0ed.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9661d872-eaed-4537-ade3-dcaf899063ec.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9661d872-eaed-4537-ade3-dcaf899063ec.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9661d872-eaed-4537-ade3-dcaf899063ec.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9661d872-eaed-4537-ade3-dcaf899063ec.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/966d8f81-d2ee-4dcd-bc52-e7f2f6d9724d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/966d8f81-d2ee-4dcd-bc52-e7f2f6d9724d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/966d8f81-d2ee-4dcd-bc52-e7f2f6d9724d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/966d8f81-d2ee-4dcd-bc52-e7f2f6d9724d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/968d2d0e-f085-4df1-ab38-3bba78c51f34.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/968d2d0e-f085-4df1-ab38-3bba78c51f34.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/968d2d0e-f085-4df1-ab38-3bba78c51f34.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/968d2d0e-f085-4df1-ab38-3bba78c51f34.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/96980ee5-6d70-424d-9141-88387ebe2397.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/96980ee5-6d70-424d-9141-88387ebe2397.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/96980ee5-6d70-424d-9141-88387ebe2397.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/96980ee5-6d70-424d-9141-88387ebe2397.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/96a2b54f-4e32-4684-9fef-8db7962f0eec.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/96a2b54f-4e32-4684-9fef-8db7962f0eec.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/96a2b54f-4e32-4684-9fef-8db7962f0eec.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/96a2b54f-4e32-4684-9fef-8db7962f0eec.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/96b64ca4-ea7f-48e7-8bad-82e0c05faf46.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/96b64ca4-ea7f-48e7-8bad-82e0c05faf46.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/96b64ca4-ea7f-48e7-8bad-82e0c05faf46.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/96b64ca4-ea7f-48e7-8bad-82e0c05faf46.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/96deddfa-77a6-4fcb-bd42-3a529cd58562.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/96deddfa-77a6-4fcb-bd42-3a529cd58562.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/96deddfa-77a6-4fcb-bd42-3a529cd58562.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/96deddfa-77a6-4fcb-bd42-3a529cd58562.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/96f86301-9eee-4426-83a8-92e3e0dff8f3.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/96f86301-9eee-4426-83a8-92e3e0dff8f3.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/96f86301-9eee-4426-83a8-92e3e0dff8f3.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/96f86301-9eee-4426-83a8-92e3e0dff8f3.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/97126d22-f3a3-4566-894e-944526b2ad88.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/97126d22-f3a3-4566-894e-944526b2ad88.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/97126d22-f3a3-4566-894e-944526b2ad88.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/97126d22-f3a3-4566-894e-944526b2ad88.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/972ed3af-c0f4-4829-9c26-adf6ff9889da.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/972ed3af-c0f4-4829-9c26-adf6ff9889da.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/972ed3af-c0f4-4829-9c26-adf6ff9889da.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/972ed3af-c0f4-4829-9c26-adf6ff9889da.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/97824d55-3bd8-4c73-ac41-3543b5891b04.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/97824d55-3bd8-4c73-ac41-3543b5891b04.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/97824d55-3bd8-4c73-ac41-3543b5891b04.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/97824d55-3bd8-4c73-ac41-3543b5891b04.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9797d84a-1b72-44fc-87d3-191e774069d4.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9797d84a-1b72-44fc-87d3-191e774069d4.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9797d84a-1b72-44fc-87d3-191e774069d4.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9797d84a-1b72-44fc-87d3-191e774069d4.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/97ac092d-38d5-4032-9955-f6025d166ddc.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/97ac092d-38d5-4032-9955-f6025d166ddc.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/97ac092d-38d5-4032-9955-f6025d166ddc.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/97ac092d-38d5-4032-9955-f6025d166ddc.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/97ac9884-8bb0-4516-a850-5744b91173fa.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/97ac9884-8bb0-4516-a850-5744b91173fa.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/97ac9884-8bb0-4516-a850-5744b91173fa.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/97ac9884-8bb0-4516-a850-5744b91173fa.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/97b68dc0-cea2-4fa7-b171-61bc85dd0ab6.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/97b68dc0-cea2-4fa7-b171-61bc85dd0ab6.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/97b68dc0-cea2-4fa7-b171-61bc85dd0ab6.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/97b68dc0-cea2-4fa7-b171-61bc85dd0ab6.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/97bee671-474e-49bf-ab85-6fd7e91e709b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/97bee671-474e-49bf-ab85-6fd7e91e709b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/97bee671-474e-49bf-ab85-6fd7e91e709b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/97bee671-474e-49bf-ab85-6fd7e91e709b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/97e45705-4d94-4047-9007-fd7c4911547d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/97e45705-4d94-4047-9007-fd7c4911547d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/97e45705-4d94-4047-9007-fd7c4911547d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/97e45705-4d94-4047-9007-fd7c4911547d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/97ffcefb-513c-4146-845e-2a321676292b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/97ffcefb-513c-4146-845e-2a321676292b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/97ffcefb-513c-4146-845e-2a321676292b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/97ffcefb-513c-4146-845e-2a321676292b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9834e17e-7654-46b5-ba73-c1f31fa69a3d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9834e17e-7654-46b5-ba73-c1f31fa69a3d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9834e17e-7654-46b5-ba73-c1f31fa69a3d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9834e17e-7654-46b5-ba73-c1f31fa69a3d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/984de1d8-ab3f-4b44-9313-795b32c78f71.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/984de1d8-ab3f-4b44-9313-795b32c78f71.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/984de1d8-ab3f-4b44-9313-795b32c78f71.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/984de1d8-ab3f-4b44-9313-795b32c78f71.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/98704f9f-98c5-4e63-b5df-5d47fe79b16a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/98704f9f-98c5-4e63-b5df-5d47fe79b16a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/98704f9f-98c5-4e63-b5df-5d47fe79b16a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/98704f9f-98c5-4e63-b5df-5d47fe79b16a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9878f364-c695-4f38-9464-588ebcdb322a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9878f364-c695-4f38-9464-588ebcdb322a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9878f364-c695-4f38-9464-588ebcdb322a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9878f364-c695-4f38-9464-588ebcdb322a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/988b328c-ddf6-4c52-9681-467e92b11989.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/988b328c-ddf6-4c52-9681-467e92b11989.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/988b328c-ddf6-4c52-9681-467e92b11989.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/988b328c-ddf6-4c52-9681-467e92b11989.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/98ab18b1-1449-4aca-bcf9-19e9cafb59d8.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/98ab18b1-1449-4aca-bcf9-19e9cafb59d8.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/98ab18b1-1449-4aca-bcf9-19e9cafb59d8.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/98ab18b1-1449-4aca-bcf9-19e9cafb59d8.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/98dd4f14-a3d8-4fac-b13e-01fcaca8d9fd.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/98dd4f14-a3d8-4fac-b13e-01fcaca8d9fd.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/98dd4f14-a3d8-4fac-b13e-01fcaca8d9fd.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/98dd4f14-a3d8-4fac-b13e-01fcaca8d9fd.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/990a59e8-7860-4b32-9e70-b4535e10d2f8.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/990a59e8-7860-4b32-9e70-b4535e10d2f8.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/990a59e8-7860-4b32-9e70-b4535e10d2f8.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/990a59e8-7860-4b32-9e70-b4535e10d2f8.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9931d758-d493-4bd2-90fd-222fc0dc306d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9931d758-d493-4bd2-90fd-222fc0dc306d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9931d758-d493-4bd2-90fd-222fc0dc306d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9931d758-d493-4bd2-90fd-222fc0dc306d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/99627bee-6595-48ec-9959-3ecf23cf1609.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/99627bee-6595-48ec-9959-3ecf23cf1609.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/99627bee-6595-48ec-9959-3ecf23cf1609.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/99627bee-6595-48ec-9959-3ecf23cf1609.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/997f3cab-0782-4c99-be6c-a1b807af2173.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/997f3cab-0782-4c99-be6c-a1b807af2173.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/997f3cab-0782-4c99-be6c-a1b807af2173.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/997f3cab-0782-4c99-be6c-a1b807af2173.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9981ec9a-3b00-4fab-902c-0fd37bb48571.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9981ec9a-3b00-4fab-902c-0fd37bb48571.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9981ec9a-3b00-4fab-902c-0fd37bb48571.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9981ec9a-3b00-4fab-902c-0fd37bb48571.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/998e602c-577c-4f2e-802e-da6323d46e90.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/998e602c-577c-4f2e-802e-da6323d46e90.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/998e602c-577c-4f2e-802e-da6323d46e90.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/998e602c-577c-4f2e-802e-da6323d46e90.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/99ab2e1f-1b97-4e2b-9bde-243305d2e7e6.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/99ab2e1f-1b97-4e2b-9bde-243305d2e7e6.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/99ab2e1f-1b97-4e2b-9bde-243305d2e7e6.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/99ab2e1f-1b97-4e2b-9bde-243305d2e7e6.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/99c1a4c6-3c53-409c-8dd6-a3cdced9db63.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/99c1a4c6-3c53-409c-8dd6-a3cdced9db63.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/99c1a4c6-3c53-409c-8dd6-a3cdced9db63.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/99c1a4c6-3c53-409c-8dd6-a3cdced9db63.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/99e746ea-5144-4263-8a0a-10f47db986da.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/99e746ea-5144-4263-8a0a-10f47db986da.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/99e746ea-5144-4263-8a0a-10f47db986da.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/99e746ea-5144-4263-8a0a-10f47db986da.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9a2dfb89-11b7-4485-b5ba-82c5ce168181.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9a2dfb89-11b7-4485-b5ba-82c5ce168181.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9a2dfb89-11b7-4485-b5ba-82c5ce168181.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9a2dfb89-11b7-4485-b5ba-82c5ce168181.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9a648e24-ec5d-41bd-aa17-23d8628d8c01.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9a648e24-ec5d-41bd-aa17-23d8628d8c01.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9a648e24-ec5d-41bd-aa17-23d8628d8c01.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9a648e24-ec5d-41bd-aa17-23d8628d8c01.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9a8868ec-1603-4f82-afa1-949ea27bcfc7.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9a8868ec-1603-4f82-afa1-949ea27bcfc7.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9a8868ec-1603-4f82-afa1-949ea27bcfc7.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9a8868ec-1603-4f82-afa1-949ea27bcfc7.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9a9599ea-4f0b-482b-94d1-f7a93574e280.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9a9599ea-4f0b-482b-94d1-f7a93574e280.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9a9599ea-4f0b-482b-94d1-f7a93574e280.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9a9599ea-4f0b-482b-94d1-f7a93574e280.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9aaa61d3-8ca8-4706-94e5-40777ef2dd7c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9aaa61d3-8ca8-4706-94e5-40777ef2dd7c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9aaa61d3-8ca8-4706-94e5-40777ef2dd7c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9aaa61d3-8ca8-4706-94e5-40777ef2dd7c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9aad3865-abcb-4d26-9cf3-00842d33b9e2.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9aad3865-abcb-4d26-9cf3-00842d33b9e2.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9aad3865-abcb-4d26-9cf3-00842d33b9e2.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9aad3865-abcb-4d26-9cf3-00842d33b9e2.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9afee447-c517-4f62-8d75-05ad5a70bb92.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9afee447-c517-4f62-8d75-05ad5a70bb92.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9afee447-c517-4f62-8d75-05ad5a70bb92.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9afee447-c517-4f62-8d75-05ad5a70bb92.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9b31f83a-1f0c-455a-a0e9-0a0b1146a477.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9b31f83a-1f0c-455a-a0e9-0a0b1146a477.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9b31f83a-1f0c-455a-a0e9-0a0b1146a477.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9b31f83a-1f0c-455a-a0e9-0a0b1146a477.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9b5e6151-627b-4a52-a054-cf69075dde36.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9b5e6151-627b-4a52-a054-cf69075dde36.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9b5e6151-627b-4a52-a054-cf69075dde36.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9b5e6151-627b-4a52-a054-cf69075dde36.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9bc03469-3937-4864-a0d3-7fed7c86f1c3.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9bc03469-3937-4864-a0d3-7fed7c86f1c3.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9bc03469-3937-4864-a0d3-7fed7c86f1c3.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9bc03469-3937-4864-a0d3-7fed7c86f1c3.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9be259a5-d2a6-4b95-aece-3d51889e2551.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9be259a5-d2a6-4b95-aece-3d51889e2551.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9be259a5-d2a6-4b95-aece-3d51889e2551.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9be259a5-d2a6-4b95-aece-3d51889e2551.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9c2c9618-db51-421a-b139-bb01ad96f379.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9c2c9618-db51-421a-b139-bb01ad96f379.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9c2c9618-db51-421a-b139-bb01ad96f379.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9c2c9618-db51-421a-b139-bb01ad96f379.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9c44dcd9-bc6a-4af5-be49-6758f4079d00.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9c44dcd9-bc6a-4af5-be49-6758f4079d00.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9c44dcd9-bc6a-4af5-be49-6758f4079d00.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9c44dcd9-bc6a-4af5-be49-6758f4079d00.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9c60e61f-bbae-4875-b51d-6054f17248d0.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9c60e61f-bbae-4875-b51d-6054f17248d0.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9c60e61f-bbae-4875-b51d-6054f17248d0.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9c60e61f-bbae-4875-b51d-6054f17248d0.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9c6f0bd5-bd4e-499c-beec-1e1a18705387.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9c6f0bd5-bd4e-499c-beec-1e1a18705387.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9c6f0bd5-bd4e-499c-beec-1e1a18705387.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9c6f0bd5-bd4e-499c-beec-1e1a18705387.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9c7aecb5-e436-40f6-8916-d64bd8c53dac.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9c7aecb5-e436-40f6-8916-d64bd8c53dac.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9c7aecb5-e436-40f6-8916-d64bd8c53dac.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9c7aecb5-e436-40f6-8916-d64bd8c53dac.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9c88e0da-2808-4350-8419-4c2b461904f0.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9c88e0da-2808-4350-8419-4c2b461904f0.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9c88e0da-2808-4350-8419-4c2b461904f0.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9c88e0da-2808-4350-8419-4c2b461904f0.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9cba9a8e-d592-4486-86e3-ad71ab6b651b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9cba9a8e-d592-4486-86e3-ad71ab6b651b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9cba9a8e-d592-4486-86e3-ad71ab6b651b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9cba9a8e-d592-4486-86e3-ad71ab6b651b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9cbc7240-ac9d-4c4d-8fd1-8769fefe7cbf.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9cbc7240-ac9d-4c4d-8fd1-8769fefe7cbf.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9cbc7240-ac9d-4c4d-8fd1-8769fefe7cbf.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9cbc7240-ac9d-4c4d-8fd1-8769fefe7cbf.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9cc492cb-ca90-4eee-afad-dc50658251b1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9cc492cb-ca90-4eee-afad-dc50658251b1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9cc492cb-ca90-4eee-afad-dc50658251b1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9cc492cb-ca90-4eee-afad-dc50658251b1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9ce86356-833c-4dc7-b410-3652cbe2f23c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9ce86356-833c-4dc7-b410-3652cbe2f23c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9ce86356-833c-4dc7-b410-3652cbe2f23c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9ce86356-833c-4dc7-b410-3652cbe2f23c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9d26db8e-c802-4ccc-adbb-1c658d84bee7.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9d26db8e-c802-4ccc-adbb-1c658d84bee7.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9d26db8e-c802-4ccc-adbb-1c658d84bee7.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9d26db8e-c802-4ccc-adbb-1c658d84bee7.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9d377cc0-8af4-4891-a51c-89a3df803f79.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9d377cc0-8af4-4891-a51c-89a3df803f79.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9d377cc0-8af4-4891-a51c-89a3df803f79.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9d377cc0-8af4-4891-a51c-89a3df803f79.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9d3a917a-ad94-4b61-a7a8-106d4c164755.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9d3a917a-ad94-4b61-a7a8-106d4c164755.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9d3a917a-ad94-4b61-a7a8-106d4c164755.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9d3a917a-ad94-4b61-a7a8-106d4c164755.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9d4a7691-63c3-4cac-8ddf-9c33a9197600.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9d4a7691-63c3-4cac-8ddf-9c33a9197600.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9d4a7691-63c3-4cac-8ddf-9c33a9197600.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9d4a7691-63c3-4cac-8ddf-9c33a9197600.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9d543f3d-a984-444d-99d0-342f712ad312.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9d543f3d-a984-444d-99d0-342f712ad312.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9d543f3d-a984-444d-99d0-342f712ad312.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9d543f3d-a984-444d-99d0-342f712ad312.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9db2ca91-68e2-41ce-830c-f63c7031f066.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9db2ca91-68e2-41ce-830c-f63c7031f066.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9db2ca91-68e2-41ce-830c-f63c7031f066.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9db2ca91-68e2-41ce-830c-f63c7031f066.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9dd350d6-07ea-4569-95ec-c777eb006808.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9dd350d6-07ea-4569-95ec-c777eb006808.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9dd350d6-07ea-4569-95ec-c777eb006808.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9dd350d6-07ea-4569-95ec-c777eb006808.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9de452ed-9086-48cf-ad4c-d7ab92877c82.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9de452ed-9086-48cf-ad4c-d7ab92877c82.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9de452ed-9086-48cf-ad4c-d7ab92877c82.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9de452ed-9086-48cf-ad4c-d7ab92877c82.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9e156fc7-a124-4031-800f-f699a2d77f82.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9e156fc7-a124-4031-800f-f699a2d77f82.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9e156fc7-a124-4031-800f-f699a2d77f82.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9e156fc7-a124-4031-800f-f699a2d77f82.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9e23df1b-d2cd-4890-a19f-5cba398958fa.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9e23df1b-d2cd-4890-a19f-5cba398958fa.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9e23df1b-d2cd-4890-a19f-5cba398958fa.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9e23df1b-d2cd-4890-a19f-5cba398958fa.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9e4323b2-d1e3-49b9-9405-b6a127e86b51.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9e4323b2-d1e3-49b9-9405-b6a127e86b51.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9e4323b2-d1e3-49b9-9405-b6a127e86b51.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9e4323b2-d1e3-49b9-9405-b6a127e86b51.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9e4f6bef-5110-402f-ae93-ed0da52e04d1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9e4f6bef-5110-402f-ae93-ed0da52e04d1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9e4f6bef-5110-402f-ae93-ed0da52e04d1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9e4f6bef-5110-402f-ae93-ed0da52e04d1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9e5d6379-33e9-408f-b840-15aa786e6e3c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9e5d6379-33e9-408f-b840-15aa786e6e3c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9e5d6379-33e9-408f-b840-15aa786e6e3c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9e5d6379-33e9-408f-b840-15aa786e6e3c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9eb47456-6719-4c30-a9bb-8b1b871ca11c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9eb47456-6719-4c30-a9bb-8b1b871ca11c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9eb47456-6719-4c30-a9bb-8b1b871ca11c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9eb47456-6719-4c30-a9bb-8b1b871ca11c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9eb83067-96a5-490e-bab0-c59847b0127c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9eb83067-96a5-490e-bab0-c59847b0127c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9eb83067-96a5-490e-bab0-c59847b0127c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9eb83067-96a5-490e-bab0-c59847b0127c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9ebf6db6-b429-40dc-b0e6-c7a75bea3d9d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9ebf6db6-b429-40dc-b0e6-c7a75bea3d9d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9ebf6db6-b429-40dc-b0e6-c7a75bea3d9d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9ebf6db6-b429-40dc-b0e6-c7a75bea3d9d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9ec17728-2df3-40ff-a7b4-597dd7031c45.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9ec17728-2df3-40ff-a7b4-597dd7031c45.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9ec17728-2df3-40ff-a7b4-597dd7031c45.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9ec17728-2df3-40ff-a7b4-597dd7031c45.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9ec5f7ed-d370-4e0b-bde9-1ed8b88bc21a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9ec5f7ed-d370-4e0b-bde9-1ed8b88bc21a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9ec5f7ed-d370-4e0b-bde9-1ed8b88bc21a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9ec5f7ed-d370-4e0b-bde9-1ed8b88bc21a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9ec8d91e-3ef8-407d-9064-570b1c3c6890.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9ec8d91e-3ef8-407d-9064-570b1c3c6890.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9ec8d91e-3ef8-407d-9064-570b1c3c6890.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9ec8d91e-3ef8-407d-9064-570b1c3c6890.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9eea69fc-1468-4fe2-b650-b7767d7006e6.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9eea69fc-1468-4fe2-b650-b7767d7006e6.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9eea69fc-1468-4fe2-b650-b7767d7006e6.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9eea69fc-1468-4fe2-b650-b7767d7006e6.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9f344eb1-8f1a-4030-ba81-f0c2616ed8b4.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9f344eb1-8f1a-4030-ba81-f0c2616ed8b4.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9f344eb1-8f1a-4030-ba81-f0c2616ed8b4.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9f344eb1-8f1a-4030-ba81-f0c2616ed8b4.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9f34ebc4-0f31-41be-86e9-59a5b1957a11.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9f34ebc4-0f31-41be-86e9-59a5b1957a11.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9f34ebc4-0f31-41be-86e9-59a5b1957a11.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9f34ebc4-0f31-41be-86e9-59a5b1957a11.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9f47d022-0e74-433d-ba19-923bed3a98f6.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9f47d022-0e74-433d-ba19-923bed3a98f6.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9f47d022-0e74-433d-ba19-923bed3a98f6.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9f47d022-0e74-433d-ba19-923bed3a98f6.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9f5e6c2c-0ed8-4d62-a043-bdb1ce691ec3.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9f5e6c2c-0ed8-4d62-a043-bdb1ce691ec3.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9f5e6c2c-0ed8-4d62-a043-bdb1ce691ec3.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9f5e6c2c-0ed8-4d62-a043-bdb1ce691ec3.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9fa0c2b8-6c14-46e8-a941-f73665391cf6.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9fa0c2b8-6c14-46e8-a941-f73665391cf6.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9fa0c2b8-6c14-46e8-a941-f73665391cf6.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9fa0c2b8-6c14-46e8-a941-f73665391cf6.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9fbef629-a900-4162-bc61-363c20d5595c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9fbef629-a900-4162-bc61-363c20d5595c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9fbef629-a900-4162-bc61-363c20d5595c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9fbef629-a900-4162-bc61-363c20d5595c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9fd2e9e2-8b11-47fb-a080-64c1291d5159.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9fd2e9e2-8b11-47fb-a080-64c1291d5159.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9fd2e9e2-8b11-47fb-a080-64c1291d5159.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9fd2e9e2-8b11-47fb-a080-64c1291d5159.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9ffc6537-e565-48b4-819d-e78b70d58188.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9ffc6537-e565-48b4-819d-e78b70d58188.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9ffc6537-e565-48b4-819d-e78b70d58188.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/9ffc6537-e565-48b4-819d-e78b70d58188.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a0121826-6100-475e-a6e4-e45db681f13c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a0121826-6100-475e-a6e4-e45db681f13c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a0121826-6100-475e-a6e4-e45db681f13c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a0121826-6100-475e-a6e4-e45db681f13c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a016445b-242a-4d4b-9a33-50d37d0fe53c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a016445b-242a-4d4b-9a33-50d37d0fe53c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a016445b-242a-4d4b-9a33-50d37d0fe53c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a016445b-242a-4d4b-9a33-50d37d0fe53c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a06ca9b5-cb31-4f08-99fc-e33c8475e0d3.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a06ca9b5-cb31-4f08-99fc-e33c8475e0d3.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a06ca9b5-cb31-4f08-99fc-e33c8475e0d3.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a06ca9b5-cb31-4f08-99fc-e33c8475e0d3.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a07d156a-a1f6-4a64-96a7-d94772f8cda2.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a07d156a-a1f6-4a64-96a7-d94772f8cda2.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a07d156a-a1f6-4a64-96a7-d94772f8cda2.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a07d156a-a1f6-4a64-96a7-d94772f8cda2.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a092d2ef-4e6d-4343-80d5-675a2e824fb0.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a092d2ef-4e6d-4343-80d5-675a2e824fb0.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a092d2ef-4e6d-4343-80d5-675a2e824fb0.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a092d2ef-4e6d-4343-80d5-675a2e824fb0.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a09cb8ba-7a1f-45c3-8e32-5097aef8adf5.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a09cb8ba-7a1f-45c3-8e32-5097aef8adf5.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a09cb8ba-7a1f-45c3-8e32-5097aef8adf5.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a09cb8ba-7a1f-45c3-8e32-5097aef8adf5.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a0da8a3d-8e4e-427f-aa2b-b2c8d2df5219.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a0da8a3d-8e4e-427f-aa2b-b2c8d2df5219.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a0da8a3d-8e4e-427f-aa2b-b2c8d2df5219.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a0da8a3d-8e4e-427f-aa2b-b2c8d2df5219.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a0dc147a-8986-4e3a-b22d-9d50576f7f74.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a0dc147a-8986-4e3a-b22d-9d50576f7f74.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a0dc147a-8986-4e3a-b22d-9d50576f7f74.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a0dc147a-8986-4e3a-b22d-9d50576f7f74.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a0e50aa9-412b-4f25-9719-cab2250a25b5.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a0e50aa9-412b-4f25-9719-cab2250a25b5.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a0e50aa9-412b-4f25-9719-cab2250a25b5.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a0e50aa9-412b-4f25-9719-cab2250a25b5.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a0e56976-9bef-4ca7-a33f-5f37973824d1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a0e56976-9bef-4ca7-a33f-5f37973824d1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a0e56976-9bef-4ca7-a33f-5f37973824d1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a0e56976-9bef-4ca7-a33f-5f37973824d1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a11d2814-5cdc-410a-8543-2179a38efbdc.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a11d2814-5cdc-410a-8543-2179a38efbdc.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a11d2814-5cdc-410a-8543-2179a38efbdc.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a11d2814-5cdc-410a-8543-2179a38efbdc.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a12ead85-f228-47e4-9603-601574a06207.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a12ead85-f228-47e4-9603-601574a06207.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a12ead85-f228-47e4-9603-601574a06207.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a12ead85-f228-47e4-9603-601574a06207.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a13d88e3-f28e-4a5e-bef0-a02c7aa7dbf0.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a13d88e3-f28e-4a5e-bef0-a02c7aa7dbf0.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a13d88e3-f28e-4a5e-bef0-a02c7aa7dbf0.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a13d88e3-f28e-4a5e-bef0-a02c7aa7dbf0.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a152cfcb-b774-433e-a950-9b3dae6d8294.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a152cfcb-b774-433e-a950-9b3dae6d8294.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a152cfcb-b774-433e-a950-9b3dae6d8294.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a152cfcb-b774-433e-a950-9b3dae6d8294.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a164595b-8952-45b0-8d4c-e56b9b1fe224.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a164595b-8952-45b0-8d4c-e56b9b1fe224.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a164595b-8952-45b0-8d4c-e56b9b1fe224.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a164595b-8952-45b0-8d4c-e56b9b1fe224.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a175eeff-6c89-406e-ad27-41ca6e0eb903.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a175eeff-6c89-406e-ad27-41ca6e0eb903.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a175eeff-6c89-406e-ad27-41ca6e0eb903.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a175eeff-6c89-406e-ad27-41ca6e0eb903.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a18436af-437f-4a5e-a760-9aa6d3bbf5cd.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a18436af-437f-4a5e-a760-9aa6d3bbf5cd.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a18436af-437f-4a5e-a760-9aa6d3bbf5cd.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a18436af-437f-4a5e-a760-9aa6d3bbf5cd.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a1b6b8ee-7770-48eb-ae2a-a36edf4a5321.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a1b6b8ee-7770-48eb-ae2a-a36edf4a5321.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a1b6b8ee-7770-48eb-ae2a-a36edf4a5321.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a1b6b8ee-7770-48eb-ae2a-a36edf4a5321.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a1d545d6-b24a-444c-8b68-50d3d1204b81.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a1d545d6-b24a-444c-8b68-50d3d1204b81.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a1d545d6-b24a-444c-8b68-50d3d1204b81.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a1d545d6-b24a-444c-8b68-50d3d1204b81.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a1f20189-90ba-4c05-8269-64117e3aefac.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a1f20189-90ba-4c05-8269-64117e3aefac.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a1f20189-90ba-4c05-8269-64117e3aefac.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a1f20189-90ba-4c05-8269-64117e3aefac.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a1fb8e7d-194d-4611-9bb4-ffc5741fbf9d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a1fb8e7d-194d-4611-9bb4-ffc5741fbf9d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a1fb8e7d-194d-4611-9bb4-ffc5741fbf9d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a1fb8e7d-194d-4611-9bb4-ffc5741fbf9d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a22f9704-6b55-4a7f-a4c3-60dd462a3cf3.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a22f9704-6b55-4a7f-a4c3-60dd462a3cf3.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a22f9704-6b55-4a7f-a4c3-60dd462a3cf3.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a22f9704-6b55-4a7f-a4c3-60dd462a3cf3.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a23234ed-a2c0-4562-b05a-605d6c7f94f8.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a23234ed-a2c0-4562-b05a-605d6c7f94f8.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a23234ed-a2c0-4562-b05a-605d6c7f94f8.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a23234ed-a2c0-4562-b05a-605d6c7f94f8.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a271f9e7-f497-411e-8b17-395fd16cc560.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a271f9e7-f497-411e-8b17-395fd16cc560.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a271f9e7-f497-411e-8b17-395fd16cc560.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a271f9e7-f497-411e-8b17-395fd16cc560.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a2724bf9-0830-4377-9bd6-6149d9b43946.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a2724bf9-0830-4377-9bd6-6149d9b43946.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a2724bf9-0830-4377-9bd6-6149d9b43946.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a2724bf9-0830-4377-9bd6-6149d9b43946.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a28b524f-ff48-4db6-a3d5-e532f98f9080.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a28b524f-ff48-4db6-a3d5-e532f98f9080.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a28b524f-ff48-4db6-a3d5-e532f98f9080.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a28b524f-ff48-4db6-a3d5-e532f98f9080.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a28d0ba7-ff81-4135-8e2f-c1c23ecdd023.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a28d0ba7-ff81-4135-8e2f-c1c23ecdd023.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a28d0ba7-ff81-4135-8e2f-c1c23ecdd023.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a28d0ba7-ff81-4135-8e2f-c1c23ecdd023.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a29a7ac2-acc2-423e-8b9e-e0f2f1958d7c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a29a7ac2-acc2-423e-8b9e-e0f2f1958d7c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a29a7ac2-acc2-423e-8b9e-e0f2f1958d7c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a29a7ac2-acc2-423e-8b9e-e0f2f1958d7c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a2a49fa5-8edc-4356-8659-7dbc0c7eb671.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a2a49fa5-8edc-4356-8659-7dbc0c7eb671.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a2a49fa5-8edc-4356-8659-7dbc0c7eb671.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a2a49fa5-8edc-4356-8659-7dbc0c7eb671.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a2c9644d-f263-4b7e-b1df-2018debca6f7.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a2c9644d-f263-4b7e-b1df-2018debca6f7.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a2c9644d-f263-4b7e-b1df-2018debca6f7.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a2c9644d-f263-4b7e-b1df-2018debca6f7.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a2d133f4-7bbc-4d3c-8e2b-137f4111a8bc.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a2d133f4-7bbc-4d3c-8e2b-137f4111a8bc.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a2d133f4-7bbc-4d3c-8e2b-137f4111a8bc.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a2d133f4-7bbc-4d3c-8e2b-137f4111a8bc.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a2f3c3ab-5e64-40a4-8b7c-eee4557f8722.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a2f3c3ab-5e64-40a4-8b7c-eee4557f8722.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a2f3c3ab-5e64-40a4-8b7c-eee4557f8722.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a2f3c3ab-5e64-40a4-8b7c-eee4557f8722.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a2f55225-ea90-495c-9431-5dbd56540e4b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a2f55225-ea90-495c-9431-5dbd56540e4b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a2f55225-ea90-495c-9431-5dbd56540e4b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a2f55225-ea90-495c-9431-5dbd56540e4b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a319e40c-ad5f-4754-91c6-bab115b7a738.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a319e40c-ad5f-4754-91c6-bab115b7a738.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a319e40c-ad5f-4754-91c6-bab115b7a738.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a319e40c-ad5f-4754-91c6-bab115b7a738.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a32d5c47-1bd9-4788-b8e9-c3145d06b13b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a32d5c47-1bd9-4788-b8e9-c3145d06b13b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a32d5c47-1bd9-4788-b8e9-c3145d06b13b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a32d5c47-1bd9-4788-b8e9-c3145d06b13b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a34d1336-4946-4ba9-b707-fbb4fc97e207.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a34d1336-4946-4ba9-b707-fbb4fc97e207.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a34d1336-4946-4ba9-b707-fbb4fc97e207.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a34d1336-4946-4ba9-b707-fbb4fc97e207.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a35380e1-5acb-4914-b611-9475603a72fe.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a35380e1-5acb-4914-b611-9475603a72fe.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a35380e1-5acb-4914-b611-9475603a72fe.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a35380e1-5acb-4914-b611-9475603a72fe.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a3637f44-f9c9-4cc8-8793-5c66edf10370.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a3637f44-f9c9-4cc8-8793-5c66edf10370.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a3637f44-f9c9-4cc8-8793-5c66edf10370.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a3637f44-f9c9-4cc8-8793-5c66edf10370.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a393b4d4-4bd3-4558-bb1e-a34d13307b44.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a393b4d4-4bd3-4558-bb1e-a34d13307b44.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a393b4d4-4bd3-4558-bb1e-a34d13307b44.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a393b4d4-4bd3-4558-bb1e-a34d13307b44.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a39e1fc6-c3bf-46d9-ae6a-0248001c71e5.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a39e1fc6-c3bf-46d9-ae6a-0248001c71e5.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a39e1fc6-c3bf-46d9-ae6a-0248001c71e5.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a39e1fc6-c3bf-46d9-ae6a-0248001c71e5.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a3eec76e-8a85-4d88-9220-fe0ad2590980.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a3eec76e-8a85-4d88-9220-fe0ad2590980.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a3eec76e-8a85-4d88-9220-fe0ad2590980.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a3eec76e-8a85-4d88-9220-fe0ad2590980.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a4102d02-3b65-441c-969a-b930b46187a4.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a4102d02-3b65-441c-969a-b930b46187a4.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a4102d02-3b65-441c-969a-b930b46187a4.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a4102d02-3b65-441c-969a-b930b46187a4.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a42b4fbe-b3dc-469f-bfef-b55bdd4e3968.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a42b4fbe-b3dc-469f-bfef-b55bdd4e3968.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a42b4fbe-b3dc-469f-bfef-b55bdd4e3968.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a42b4fbe-b3dc-469f-bfef-b55bdd4e3968.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a42df817-2a5c-47e2-8b57-e08a1e710635.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a42df817-2a5c-47e2-8b57-e08a1e710635.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a42df817-2a5c-47e2-8b57-e08a1e710635.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a42df817-2a5c-47e2-8b57-e08a1e710635.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a4687834-a6c5-49ab-81df-00bc9611cdb5.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a4687834-a6c5-49ab-81df-00bc9611cdb5.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a4687834-a6c5-49ab-81df-00bc9611cdb5.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a4687834-a6c5-49ab-81df-00bc9611cdb5.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a482ccd4-4913-4f0d-8239-cc6dcb48404f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a482ccd4-4913-4f0d-8239-cc6dcb48404f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a482ccd4-4913-4f0d-8239-cc6dcb48404f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a482ccd4-4913-4f0d-8239-cc6dcb48404f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a494a819-b278-4fec-bd03-8d3d7c204a52.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a494a819-b278-4fec-bd03-8d3d7c204a52.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a494a819-b278-4fec-bd03-8d3d7c204a52.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a494a819-b278-4fec-bd03-8d3d7c204a52.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a495b448-a682-4ce5-90e6-e45c448671ac.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a495b448-a682-4ce5-90e6-e45c448671ac.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a495b448-a682-4ce5-90e6-e45c448671ac.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a495b448-a682-4ce5-90e6-e45c448671ac.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a4c9784a-a4d5-45cb-890e-c91df1d68208.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a4c9784a-a4d5-45cb-890e-c91df1d68208.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a4c9784a-a4d5-45cb-890e-c91df1d68208.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a4c9784a-a4d5-45cb-890e-c91df1d68208.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a4e640d9-ad23-44e0-9c0e-ac3b969378cf.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a4e640d9-ad23-44e0-9c0e-ac3b969378cf.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a4e640d9-ad23-44e0-9c0e-ac3b969378cf.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a4e640d9-ad23-44e0-9c0e-ac3b969378cf.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a4f2930a-ed68-4d8b-bfcf-baa757045f26.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a4f2930a-ed68-4d8b-bfcf-baa757045f26.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a4f2930a-ed68-4d8b-bfcf-baa757045f26.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a4f2930a-ed68-4d8b-bfcf-baa757045f26.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a50c774a-0939-476b-9c09-05f1739ae0af.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a50c774a-0939-476b-9c09-05f1739ae0af.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a50c774a-0939-476b-9c09-05f1739ae0af.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a50c774a-0939-476b-9c09-05f1739ae0af.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a52cd566-4056-4667-9f46-1db191d540f3.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a52cd566-4056-4667-9f46-1db191d540f3.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a52cd566-4056-4667-9f46-1db191d540f3.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a52cd566-4056-4667-9f46-1db191d540f3.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a5357017-6ad5-4e39-a5ee-63dc262fd899.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a5357017-6ad5-4e39-a5ee-63dc262fd899.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a5357017-6ad5-4e39-a5ee-63dc262fd899.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a5357017-6ad5-4e39-a5ee-63dc262fd899.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a545e155-d6d6-4503-904b-60384598518a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a545e155-d6d6-4503-904b-60384598518a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a545e155-d6d6-4503-904b-60384598518a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a545e155-d6d6-4503-904b-60384598518a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a55a01d1-de36-43c4-b6fb-a9bb3d9045fd.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a55a01d1-de36-43c4-b6fb-a9bb3d9045fd.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a55a01d1-de36-43c4-b6fb-a9bb3d9045fd.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a55a01d1-de36-43c4-b6fb-a9bb3d9045fd.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a5610799-6167-4011-947d-c09ad38392ae.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a5610799-6167-4011-947d-c09ad38392ae.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a5610799-6167-4011-947d-c09ad38392ae.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a5610799-6167-4011-947d-c09ad38392ae.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a5701240-b375-40e3-ba09-56db3f1921d9.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a5701240-b375-40e3-ba09-56db3f1921d9.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a5701240-b375-40e3-ba09-56db3f1921d9.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a5701240-b375-40e3-ba09-56db3f1921d9.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a57177ad-77b1-4b86-80b9-6392aafa2831.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a57177ad-77b1-4b86-80b9-6392aafa2831.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a57177ad-77b1-4b86-80b9-6392aafa2831.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a57177ad-77b1-4b86-80b9-6392aafa2831.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a59b5bf3-13af-412c-97cd-26ec45d6c3db.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a59b5bf3-13af-412c-97cd-26ec45d6c3db.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a59b5bf3-13af-412c-97cd-26ec45d6c3db.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a59b5bf3-13af-412c-97cd-26ec45d6c3db.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a5be3404-0dc5-46b2-a369-a83a4c1b8367.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a5be3404-0dc5-46b2-a369-a83a4c1b8367.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a5be3404-0dc5-46b2-a369-a83a4c1b8367.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a5be3404-0dc5-46b2-a369-a83a4c1b8367.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a5beb84e-2590-4cf0-87b0-92cff9596168.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a5beb84e-2590-4cf0-87b0-92cff9596168.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a5beb84e-2590-4cf0-87b0-92cff9596168.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a5beb84e-2590-4cf0-87b0-92cff9596168.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a5d19590-8164-4ff8-8adb-d9c81618410b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a5d19590-8164-4ff8-8adb-d9c81618410b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a5d19590-8164-4ff8-8adb-d9c81618410b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a5d19590-8164-4ff8-8adb-d9c81618410b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a5df9616-59e4-4811-9aa4-fa059001eef3.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a5df9616-59e4-4811-9aa4-fa059001eef3.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a5df9616-59e4-4811-9aa4-fa059001eef3.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a5df9616-59e4-4811-9aa4-fa059001eef3.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a5e0534b-b08b-467c-a068-fcdbdafb0ebe.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a5e0534b-b08b-467c-a068-fcdbdafb0ebe.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a5e0534b-b08b-467c-a068-fcdbdafb0ebe.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a5e0534b-b08b-467c-a068-fcdbdafb0ebe.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a5e8150b-64e9-439a-b408-c5f0954fcbad.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a5e8150b-64e9-439a-b408-c5f0954fcbad.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a5e8150b-64e9-439a-b408-c5f0954fcbad.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a5e8150b-64e9-439a-b408-c5f0954fcbad.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a5ecf3dc-b1c5-44f2-8310-c4ec4b06b677.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a5ecf3dc-b1c5-44f2-8310-c4ec4b06b677.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a5ecf3dc-b1c5-44f2-8310-c4ec4b06b677.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a5ecf3dc-b1c5-44f2-8310-c4ec4b06b677.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a5ed4b11-1e6a-4d03-a07d-e7f8eb5aea92.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a5ed4b11-1e6a-4d03-a07d-e7f8eb5aea92.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a5ed4b11-1e6a-4d03-a07d-e7f8eb5aea92.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a5ed4b11-1e6a-4d03-a07d-e7f8eb5aea92.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a620c723-fb77-462d-bfc2-95009fa4f149.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a620c723-fb77-462d-bfc2-95009fa4f149.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a620c723-fb77-462d-bfc2-95009fa4f149.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a620c723-fb77-462d-bfc2-95009fa4f149.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a62ec71d-9620-4c01-a04e-680b401148a2.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a62ec71d-9620-4c01-a04e-680b401148a2.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a62ec71d-9620-4c01-a04e-680b401148a2.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a62ec71d-9620-4c01-a04e-680b401148a2.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a644487c-74bf-46c9-91aa-50edc2d0f9a1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a644487c-74bf-46c9-91aa-50edc2d0f9a1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a644487c-74bf-46c9-91aa-50edc2d0f9a1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a644487c-74bf-46c9-91aa-50edc2d0f9a1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a65bf103-6911-4050-a3cf-e2b28a83b3d0.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a65bf103-6911-4050-a3cf-e2b28a83b3d0.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a65bf103-6911-4050-a3cf-e2b28a83b3d0.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a65bf103-6911-4050-a3cf-e2b28a83b3d0.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a65f8929-95d2-4624-a63d-db0cc3471a22.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a65f8929-95d2-4624-a63d-db0cc3471a22.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a65f8929-95d2-4624-a63d-db0cc3471a22.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a65f8929-95d2-4624-a63d-db0cc3471a22.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a66fe17c-3bff-4a53-8212-e4145d350a36.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a66fe17c-3bff-4a53-8212-e4145d350a36.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a66fe17c-3bff-4a53-8212-e4145d350a36.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a66fe17c-3bff-4a53-8212-e4145d350a36.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a689bc01-ba0d-43b8-ae3e-5dbffe7df3fc.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a689bc01-ba0d-43b8-ae3e-5dbffe7df3fc.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a689bc01-ba0d-43b8-ae3e-5dbffe7df3fc.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a689bc01-ba0d-43b8-ae3e-5dbffe7df3fc.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a6a7cf7f-a540-4c3a-b787-eab6bd0aa843.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a6a7cf7f-a540-4c3a-b787-eab6bd0aa843.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a6a7cf7f-a540-4c3a-b787-eab6bd0aa843.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a6a7cf7f-a540-4c3a-b787-eab6bd0aa843.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a6b51fbf-7408-4701-befe-4ae20fd0cfdf.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a6b51fbf-7408-4701-befe-4ae20fd0cfdf.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a6b51fbf-7408-4701-befe-4ae20fd0cfdf.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a6b51fbf-7408-4701-befe-4ae20fd0cfdf.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a6c4c8a7-13e9-4295-b3b0-a4eb15f0cbfa.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a6c4c8a7-13e9-4295-b3b0-a4eb15f0cbfa.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a6c4c8a7-13e9-4295-b3b0-a4eb15f0cbfa.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a6c4c8a7-13e9-4295-b3b0-a4eb15f0cbfa.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a6cffc5c-097e-42d0-b74c-3f54a2529040.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a6cffc5c-097e-42d0-b74c-3f54a2529040.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a6cffc5c-097e-42d0-b74c-3f54a2529040.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a6cffc5c-097e-42d0-b74c-3f54a2529040.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a6d5a5fd-f174-42cb-8b67-5cda1315fe2b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a6d5a5fd-f174-42cb-8b67-5cda1315fe2b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a6d5a5fd-f174-42cb-8b67-5cda1315fe2b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a6d5a5fd-f174-42cb-8b67-5cda1315fe2b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a704c590-060a-4fd8-9331-e47b22e39d52.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a704c590-060a-4fd8-9331-e47b22e39d52.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a704c590-060a-4fd8-9331-e47b22e39d52.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a704c590-060a-4fd8-9331-e47b22e39d52.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a7248fab-24c0-4ad1-a146-abb72ba40c53.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a7248fab-24c0-4ad1-a146-abb72ba40c53.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a7248fab-24c0-4ad1-a146-abb72ba40c53.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a7248fab-24c0-4ad1-a146-abb72ba40c53.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a72743c4-2bb2-4607-8cab-73ca06870eb1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a72743c4-2bb2-4607-8cab-73ca06870eb1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a72743c4-2bb2-4607-8cab-73ca06870eb1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a72743c4-2bb2-4607-8cab-73ca06870eb1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a7296ed9-a2ed-4ac4-bd05-ef9b82580b1f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a7296ed9-a2ed-4ac4-bd05-ef9b82580b1f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a7296ed9-a2ed-4ac4-bd05-ef9b82580b1f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a7296ed9-a2ed-4ac4-bd05-ef9b82580b1f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a7311ce2-137c-4f6a-90a8-e41b32d3b75a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a7311ce2-137c-4f6a-90a8-e41b32d3b75a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a7311ce2-137c-4f6a-90a8-e41b32d3b75a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a7311ce2-137c-4f6a-90a8-e41b32d3b75a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a76653ac-844e-4b45-8bc1-5704b6830d46.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a76653ac-844e-4b45-8bc1-5704b6830d46.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a76653ac-844e-4b45-8bc1-5704b6830d46.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a76653ac-844e-4b45-8bc1-5704b6830d46.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a76afaa6-6382-4a2e-bb95-25740324f7c6.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a76afaa6-6382-4a2e-bb95-25740324f7c6.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a76afaa6-6382-4a2e-bb95-25740324f7c6.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a76afaa6-6382-4a2e-bb95-25740324f7c6.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a771a4f7-3d48-4d70-821f-52c2892354f0.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a771a4f7-3d48-4d70-821f-52c2892354f0.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a771a4f7-3d48-4d70-821f-52c2892354f0.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a771a4f7-3d48-4d70-821f-52c2892354f0.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a7750389-f9da-4f37-b6b7-9a2893a1115b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a7750389-f9da-4f37-b6b7-9a2893a1115b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a7750389-f9da-4f37-b6b7-9a2893a1115b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a7750389-f9da-4f37-b6b7-9a2893a1115b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a7aef4d5-24a1-478e-8fa4-f8e88d656212.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a7aef4d5-24a1-478e-8fa4-f8e88d656212.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a7aef4d5-24a1-478e-8fa4-f8e88d656212.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a7aef4d5-24a1-478e-8fa4-f8e88d656212.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a7b31fb4-0129-4fa4-9251-92366d70cfb8.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a7b31fb4-0129-4fa4-9251-92366d70cfb8.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a7b31fb4-0129-4fa4-9251-92366d70cfb8.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a7b31fb4-0129-4fa4-9251-92366d70cfb8.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a7c6d58e-228d-4d05-be19-dcd2827f80d4.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a7c6d58e-228d-4d05-be19-dcd2827f80d4.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a7c6d58e-228d-4d05-be19-dcd2827f80d4.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a7c6d58e-228d-4d05-be19-dcd2827f80d4.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a7c904ae-ccfe-4480-86d7-605a2595a148.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a7c904ae-ccfe-4480-86d7-605a2595a148.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a7c904ae-ccfe-4480-86d7-605a2595a148.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a7c904ae-ccfe-4480-86d7-605a2595a148.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a7c9d691-6dcc-42f4-82d4-4efe324c63bf.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a7c9d691-6dcc-42f4-82d4-4efe324c63bf.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a7c9d691-6dcc-42f4-82d4-4efe324c63bf.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a7c9d691-6dcc-42f4-82d4-4efe324c63bf.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a7e5ffde-9f26-43fc-ae9e-6bbb50e6a8b2.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a7e5ffde-9f26-43fc-ae9e-6bbb50e6a8b2.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a7e5ffde-9f26-43fc-ae9e-6bbb50e6a8b2.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a7e5ffde-9f26-43fc-ae9e-6bbb50e6a8b2.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a805ce64-68aa-47e0-95f9-52014738dc45.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a805ce64-68aa-47e0-95f9-52014738dc45.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a805ce64-68aa-47e0-95f9-52014738dc45.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a805ce64-68aa-47e0-95f9-52014738dc45.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a8212497-a221-4d36-8abb-24e11c02968b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a8212497-a221-4d36-8abb-24e11c02968b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a8212497-a221-4d36-8abb-24e11c02968b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a8212497-a221-4d36-8abb-24e11c02968b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a850835f-204b-4229-a7ed-5ccadcf1690a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a850835f-204b-4229-a7ed-5ccadcf1690a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a850835f-204b-4229-a7ed-5ccadcf1690a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a850835f-204b-4229-a7ed-5ccadcf1690a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a8595f6f-3a0a-4710-acfa-d379d733e145.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a8595f6f-3a0a-4710-acfa-d379d733e145.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a8595f6f-3a0a-4710-acfa-d379d733e145.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a8595f6f-3a0a-4710-acfa-d379d733e145.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a8608fdf-aaad-4b1c-940b-acd4f329a2b9.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a8608fdf-aaad-4b1c-940b-acd4f329a2b9.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a8608fdf-aaad-4b1c-940b-acd4f329a2b9.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a8608fdf-aaad-4b1c-940b-acd4f329a2b9.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a865f654-12c5-4680-ad60-81ae451c011b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a865f654-12c5-4680-ad60-81ae451c011b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a865f654-12c5-4680-ad60-81ae451c011b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a865f654-12c5-4680-ad60-81ae451c011b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a86e6153-41fe-406f-8729-be8259a6b72a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a86e6153-41fe-406f-8729-be8259a6b72a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a86e6153-41fe-406f-8729-be8259a6b72a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a86e6153-41fe-406f-8729-be8259a6b72a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a8972c36-fc18-4e87-a7ed-560ad038e319.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a8972c36-fc18-4e87-a7ed-560ad038e319.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a8972c36-fc18-4e87-a7ed-560ad038e319.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a8972c36-fc18-4e87-a7ed-560ad038e319.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a8980501-ef70-4d5e-b14d-6bc5beb4c019.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a8980501-ef70-4d5e-b14d-6bc5beb4c019.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a8980501-ef70-4d5e-b14d-6bc5beb4c019.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a8980501-ef70-4d5e-b14d-6bc5beb4c019.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a8aa8182-8af1-476a-a4e4-54ed0f214a23.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a8aa8182-8af1-476a-a4e4-54ed0f214a23.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a8aa8182-8af1-476a-a4e4-54ed0f214a23.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a8aa8182-8af1-476a-a4e4-54ed0f214a23.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a8b89a84-be0c-4a85-885c-9c2b8d04e1a8.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a8b89a84-be0c-4a85-885c-9c2b8d04e1a8.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a8b89a84-be0c-4a85-885c-9c2b8d04e1a8.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a8b89a84-be0c-4a85-885c-9c2b8d04e1a8.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a8c53e12-3a76-4a60-9ab6-70745e1cd049.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a8c53e12-3a76-4a60-9ab6-70745e1cd049.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a8c53e12-3a76-4a60-9ab6-70745e1cd049.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a8c53e12-3a76-4a60-9ab6-70745e1cd049.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a8c64c33-a126-459a-bb8d-a29c0a5af61b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a8c64c33-a126-459a-bb8d-a29c0a5af61b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a8c64c33-a126-459a-bb8d-a29c0a5af61b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a8c64c33-a126-459a-bb8d-a29c0a5af61b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a8d7d2d2-cfd3-48e9-b28b-42efafd0c60b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a8d7d2d2-cfd3-48e9-b28b-42efafd0c60b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a8d7d2d2-cfd3-48e9-b28b-42efafd0c60b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a8d7d2d2-cfd3-48e9-b28b-42efafd0c60b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a9116365-9959-48e7-b686-9c4c517c56d4.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a9116365-9959-48e7-b686-9c4c517c56d4.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a9116365-9959-48e7-b686-9c4c517c56d4.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a9116365-9959-48e7-b686-9c4c517c56d4.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a938c95f-7f13-4d36-b1a9-eac3cdf410a4.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a938c95f-7f13-4d36-b1a9-eac3cdf410a4.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a938c95f-7f13-4d36-b1a9-eac3cdf410a4.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a938c95f-7f13-4d36-b1a9-eac3cdf410a4.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a957190c-a943-4b07-bfc3-301276fdd418.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a957190c-a943-4b07-bfc3-301276fdd418.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a957190c-a943-4b07-bfc3-301276fdd418.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a957190c-a943-4b07-bfc3-301276fdd418.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a95797df-c40b-4e9c-b6ff-4e4f3d401e40.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a95797df-c40b-4e9c-b6ff-4e4f3d401e40.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a95797df-c40b-4e9c-b6ff-4e4f3d401e40.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a95797df-c40b-4e9c-b6ff-4e4f3d401e40.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a962b2e0-c822-486f-b33a-50413ce9a233.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a962b2e0-c822-486f-b33a-50413ce9a233.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a962b2e0-c822-486f-b33a-50413ce9a233.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a962b2e0-c822-486f-b33a-50413ce9a233.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a98d6f3c-52be-4c00-a3b3-44d685736b88.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a98d6f3c-52be-4c00-a3b3-44d685736b88.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a98d6f3c-52be-4c00-a3b3-44d685736b88.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a98d6f3c-52be-4c00-a3b3-44d685736b88.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a9ab24cf-7984-48fa-8740-43a410cec8de.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a9ab24cf-7984-48fa-8740-43a410cec8de.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a9ab24cf-7984-48fa-8740-43a410cec8de.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a9ab24cf-7984-48fa-8740-43a410cec8de.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a9b893a2-9598-4b15-911f-8b4c71afad77.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a9b893a2-9598-4b15-911f-8b4c71afad77.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a9b893a2-9598-4b15-911f-8b4c71afad77.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a9b893a2-9598-4b15-911f-8b4c71afad77.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a9bbcc1f-9fed-4c8e-a205-661158c3dbf1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a9bbcc1f-9fed-4c8e-a205-661158c3dbf1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a9bbcc1f-9fed-4c8e-a205-661158c3dbf1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a9bbcc1f-9fed-4c8e-a205-661158c3dbf1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a9f5752d-1528-4466-a0a3-95e24a62fa27.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a9f5752d-1528-4466-a0a3-95e24a62fa27.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a9f5752d-1528-4466-a0a3-95e24a62fa27.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/a9f5752d-1528-4466-a0a3-95e24a62fa27.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/aa19f60d-bfb6-4079-a0bd-6b9f0a776a5e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/aa19f60d-bfb6-4079-a0bd-6b9f0a776a5e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/aa19f60d-bfb6-4079-a0bd-6b9f0a776a5e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/aa19f60d-bfb6-4079-a0bd-6b9f0a776a5e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/aa34dadb-813f-49aa-8706-0ee37f199ef3.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/aa34dadb-813f-49aa-8706-0ee37f199ef3.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/aa34dadb-813f-49aa-8706-0ee37f199ef3.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/aa34dadb-813f-49aa-8706-0ee37f199ef3.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/aa5148b4-3fa5-46dc-8116-823e49509abf.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/aa5148b4-3fa5-46dc-8116-823e49509abf.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/aa5148b4-3fa5-46dc-8116-823e49509abf.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/aa5148b4-3fa5-46dc-8116-823e49509abf.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/aa761afb-8002-48f6-8d9a-c93fcc36caca.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/aa761afb-8002-48f6-8d9a-c93fcc36caca.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/aa761afb-8002-48f6-8d9a-c93fcc36caca.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/aa761afb-8002-48f6-8d9a-c93fcc36caca.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/aa8abd3a-4ecc-4aca-aa2c-11058d4eb7a9.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/aa8abd3a-4ecc-4aca-aa2c-11058d4eb7a9.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/aa8abd3a-4ecc-4aca-aa2c-11058d4eb7a9.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/aa8abd3a-4ecc-4aca-aa2c-11058d4eb7a9.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/aa8b42f0-99a2-4ae0-9498-8198052bf396.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/aa8b42f0-99a2-4ae0-9498-8198052bf396.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/aa8b42f0-99a2-4ae0-9498-8198052bf396.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/aa8b42f0-99a2-4ae0-9498-8198052bf396.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/aa977d85-3526-4c9b-bf41-ce0a1c6ec547.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/aa977d85-3526-4c9b-bf41-ce0a1c6ec547.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/aa977d85-3526-4c9b-bf41-ce0a1c6ec547.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/aa977d85-3526-4c9b-bf41-ce0a1c6ec547.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/aab27b3e-b9a7-40d6-a111-49d256ccf4a3.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/aab27b3e-b9a7-40d6-a111-49d256ccf4a3.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/aab27b3e-b9a7-40d6-a111-49d256ccf4a3.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/aab27b3e-b9a7-40d6-a111-49d256ccf4a3.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/aab894dd-4c7e-4113-bde9-3851fde04302.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/aab894dd-4c7e-4113-bde9-3851fde04302.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/aab894dd-4c7e-4113-bde9-3851fde04302.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/aab894dd-4c7e-4113-bde9-3851fde04302.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/aabd271c-43f7-418a-88bb-ad662fa8338d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/aabd271c-43f7-418a-88bb-ad662fa8338d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/aabd271c-43f7-418a-88bb-ad662fa8338d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/aabd271c-43f7-418a-88bb-ad662fa8338d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/aad57129-7682-469e-9e37-a5596f074a2b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/aad57129-7682-469e-9e37-a5596f074a2b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/aad57129-7682-469e-9e37-a5596f074a2b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/aad57129-7682-469e-9e37-a5596f074a2b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/aaf97045-d091-4e54-bbd8-a2d4be808c13.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/aaf97045-d091-4e54-bbd8-a2d4be808c13.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/aaf97045-d091-4e54-bbd8-a2d4be808c13.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/aaf97045-d091-4e54-bbd8-a2d4be808c13.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ab1ae78a-c283-4363-b88b-39d6977ea9e3.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ab1ae78a-c283-4363-b88b-39d6977ea9e3.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ab1ae78a-c283-4363-b88b-39d6977ea9e3.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ab1ae78a-c283-4363-b88b-39d6977ea9e3.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ab33e663-0d24-4b86-bc82-72bafe95420f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ab33e663-0d24-4b86-bc82-72bafe95420f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ab33e663-0d24-4b86-bc82-72bafe95420f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ab33e663-0d24-4b86-bc82-72bafe95420f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ab403f3e-61bd-41d6-9d1f-3e5d6a730e52.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ab403f3e-61bd-41d6-9d1f-3e5d6a730e52.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ab403f3e-61bd-41d6-9d1f-3e5d6a730e52.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ab403f3e-61bd-41d6-9d1f-3e5d6a730e52.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ab4ec647-13c9-42ce-900c-cb8335811eda.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ab4ec647-13c9-42ce-900c-cb8335811eda.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ab4ec647-13c9-42ce-900c-cb8335811eda.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ab4ec647-13c9-42ce-900c-cb8335811eda.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ab759c2e-9d6a-4175-af0e-987bc02b6558.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ab759c2e-9d6a-4175-af0e-987bc02b6558.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ab759c2e-9d6a-4175-af0e-987bc02b6558.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ab759c2e-9d6a-4175-af0e-987bc02b6558.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ab89a97a-c4b4-4b9a-8d1f-981e5773b94c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ab89a97a-c4b4-4b9a-8d1f-981e5773b94c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ab89a97a-c4b4-4b9a-8d1f-981e5773b94c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ab89a97a-c4b4-4b9a-8d1f-981e5773b94c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ab8be325-95f4-4d47-bae7-d2f07796f8d9.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ab8be325-95f4-4d47-bae7-d2f07796f8d9.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ab8be325-95f4-4d47-bae7-d2f07796f8d9.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ab8be325-95f4-4d47-bae7-d2f07796f8d9.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ab8e1501-3589-477a-a765-8039bb6cc1eb.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ab8e1501-3589-477a-a765-8039bb6cc1eb.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ab8e1501-3589-477a-a765-8039bb6cc1eb.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ab8e1501-3589-477a-a765-8039bb6cc1eb.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/abba84eb-996b-4773-96e0-10fe90174ffa.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/abba84eb-996b-4773-96e0-10fe90174ffa.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/abba84eb-996b-4773-96e0-10fe90174ffa.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/abba84eb-996b-4773-96e0-10fe90174ffa.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/abd44140-1e5f-4ce8-8280-09064a7f9875.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/abd44140-1e5f-4ce8-8280-09064a7f9875.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/abd44140-1e5f-4ce8-8280-09064a7f9875.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/abd44140-1e5f-4ce8-8280-09064a7f9875.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/abe8dee2-88ba-40bd-abae-21da20b8ca26.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/abe8dee2-88ba-40bd-abae-21da20b8ca26.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/abe8dee2-88ba-40bd-abae-21da20b8ca26.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/abe8dee2-88ba-40bd-abae-21da20b8ca26.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/abfe2a36-e854-43a2-932e-a97f35917698.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/abfe2a36-e854-43a2-932e-a97f35917698.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/abfe2a36-e854-43a2-932e-a97f35917698.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/abfe2a36-e854-43a2-932e-a97f35917698.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ac3757b2-f003-4cc0-9ddc-82c15207635a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ac3757b2-f003-4cc0-9ddc-82c15207635a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ac3757b2-f003-4cc0-9ddc-82c15207635a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ac3757b2-f003-4cc0-9ddc-82c15207635a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ac407fe4-54e6-4d8b-80e9-4681a1b14ac5.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ac407fe4-54e6-4d8b-80e9-4681a1b14ac5.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ac407fe4-54e6-4d8b-80e9-4681a1b14ac5.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ac407fe4-54e6-4d8b-80e9-4681a1b14ac5.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ac4bb0b6-3feb-42be-b132-8f3a6aef032d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ac4bb0b6-3feb-42be-b132-8f3a6aef032d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ac4bb0b6-3feb-42be-b132-8f3a6aef032d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ac4bb0b6-3feb-42be-b132-8f3a6aef032d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ac4f291f-82d8-44c8-901d-c27a4e4f5a84.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ac4f291f-82d8-44c8-901d-c27a4e4f5a84.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ac4f291f-82d8-44c8-901d-c27a4e4f5a84.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ac4f291f-82d8-44c8-901d-c27a4e4f5a84.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ac566643-1c64-41a8-b2a8-bb52c8f0cbe2.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ac566643-1c64-41a8-b2a8-bb52c8f0cbe2.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ac566643-1c64-41a8-b2a8-bb52c8f0cbe2.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ac566643-1c64-41a8-b2a8-bb52c8f0cbe2.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ac5c2871-5cd8-4a2c-843b-7ce2d7c53400.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ac5c2871-5cd8-4a2c-843b-7ce2d7c53400.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ac5c2871-5cd8-4a2c-843b-7ce2d7c53400.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ac5c2871-5cd8-4a2c-843b-7ce2d7c53400.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ac9f33c7-a5ca-465d-93b2-5714267c1178.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ac9f33c7-a5ca-465d-93b2-5714267c1178.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ac9f33c7-a5ca-465d-93b2-5714267c1178.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ac9f33c7-a5ca-465d-93b2-5714267c1178.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/aca5f798-a6dd-4bae-989f-2cd12213d86a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/aca5f798-a6dd-4bae-989f-2cd12213d86a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/aca5f798-a6dd-4bae-989f-2cd12213d86a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/aca5f798-a6dd-4bae-989f-2cd12213d86a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/acaae198-32c1-431f-ba21-55446c5cc78e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/acaae198-32c1-431f-ba21-55446c5cc78e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/acaae198-32c1-431f-ba21-55446c5cc78e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/acaae198-32c1-431f-ba21-55446c5cc78e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ace763d0-151c-4447-8b81-f052ad372e3e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ace763d0-151c-4447-8b81-f052ad372e3e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ace763d0-151c-4447-8b81-f052ad372e3e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ace763d0-151c-4447-8b81-f052ad372e3e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/acf6b8b2-586d-405f-aeed-d1ca7a5b5c58.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/acf6b8b2-586d-405f-aeed-d1ca7a5b5c58.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/acf6b8b2-586d-405f-aeed-d1ca7a5b5c58.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/acf6b8b2-586d-405f-aeed-d1ca7a5b5c58.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/acffc725-13c8-4bf1-8106-d9ea33dfcaee.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/acffc725-13c8-4bf1-8106-d9ea33dfcaee.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/acffc725-13c8-4bf1-8106-d9ea33dfcaee.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/acffc725-13c8-4bf1-8106-d9ea33dfcaee.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ad34cfb9-c133-483d-934d-23350d8ec782.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ad34cfb9-c133-483d-934d-23350d8ec782.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ad34cfb9-c133-483d-934d-23350d8ec782.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ad34cfb9-c133-483d-934d-23350d8ec782.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ad8f3fe0-5ff0-4339-9344-0e647394da63.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ad8f3fe0-5ff0-4339-9344-0e647394da63.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ad8f3fe0-5ff0-4339-9344-0e647394da63.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ad8f3fe0-5ff0-4339-9344-0e647394da63.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ad97bbee-3f33-422e-93b5-5b690205e35b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ad97bbee-3f33-422e-93b5-5b690205e35b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ad97bbee-3f33-422e-93b5-5b690205e35b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ad97bbee-3f33-422e-93b5-5b690205e35b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ad9a6f21-3838-4d61-92ae-ec062d9c8144.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ad9a6f21-3838-4d61-92ae-ec062d9c8144.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ad9a6f21-3838-4d61-92ae-ec062d9c8144.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ad9a6f21-3838-4d61-92ae-ec062d9c8144.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/adb05419-22e8-4413-beaa-e5ca733ca03e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/adb05419-22e8-4413-beaa-e5ca733ca03e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/adb05419-22e8-4413-beaa-e5ca733ca03e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/adb05419-22e8-4413-beaa-e5ca733ca03e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/adcb38ef-ff12-4c91-8e50-fee73bbdc9c1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/adcb38ef-ff12-4c91-8e50-fee73bbdc9c1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/adcb38ef-ff12-4c91-8e50-fee73bbdc9c1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/adcb38ef-ff12-4c91-8e50-fee73bbdc9c1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/add72e3e-c16f-43ec-9d0b-80af83b007cf.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/add72e3e-c16f-43ec-9d0b-80af83b007cf.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/add72e3e-c16f-43ec-9d0b-80af83b007cf.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/add72e3e-c16f-43ec-9d0b-80af83b007cf.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ae06a6ff-4f2b-45af-a02c-823678850257.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ae06a6ff-4f2b-45af-a02c-823678850257.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ae06a6ff-4f2b-45af-a02c-823678850257.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ae06a6ff-4f2b-45af-a02c-823678850257.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ae12efce-4bd2-421d-90f1-0a9f20c20707.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ae12efce-4bd2-421d-90f1-0a9f20c20707.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ae12efce-4bd2-421d-90f1-0a9f20c20707.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ae12efce-4bd2-421d-90f1-0a9f20c20707.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ae2337f5-04d0-41b2-bcff-68fb8fe9ee66.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ae2337f5-04d0-41b2-bcff-68fb8fe9ee66.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ae2337f5-04d0-41b2-bcff-68fb8fe9ee66.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ae2337f5-04d0-41b2-bcff-68fb8fe9ee66.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ae4be312-a906-4e61-bb7a-623be861bb1b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ae4be312-a906-4e61-bb7a-623be861bb1b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ae4be312-a906-4e61-bb7a-623be861bb1b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ae4be312-a906-4e61-bb7a-623be861bb1b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ae6db195-75ee-4b79-8b0b-8253b5cc188d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ae6db195-75ee-4b79-8b0b-8253b5cc188d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ae6db195-75ee-4b79-8b0b-8253b5cc188d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ae6db195-75ee-4b79-8b0b-8253b5cc188d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ae797c16-589e-43f5-9827-7d963bd17a6a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ae797c16-589e-43f5-9827-7d963bd17a6a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ae797c16-589e-43f5-9827-7d963bd17a6a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ae797c16-589e-43f5-9827-7d963bd17a6a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ae7d1a89-a9a9-47cf-99bc-4343d53d8c6c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ae7d1a89-a9a9-47cf-99bc-4343d53d8c6c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ae7d1a89-a9a9-47cf-99bc-4343d53d8c6c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ae7d1a89-a9a9-47cf-99bc-4343d53d8c6c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ae7de933-66e5-49e1-8e06-00a40669c69c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ae7de933-66e5-49e1-8e06-00a40669c69c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ae7de933-66e5-49e1-8e06-00a40669c69c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ae7de933-66e5-49e1-8e06-00a40669c69c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ae85e8bb-946f-4c36-a9ca-fd831d166182.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ae85e8bb-946f-4c36-a9ca-fd831d166182.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ae85e8bb-946f-4c36-a9ca-fd831d166182.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ae85e8bb-946f-4c36-a9ca-fd831d166182.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/aeb4f092-a733-4133-94da-32ed06158220.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/aeb4f092-a733-4133-94da-32ed06158220.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/aeb4f092-a733-4133-94da-32ed06158220.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/aeb4f092-a733-4133-94da-32ed06158220.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/aebd240f-ac7a-4e12-ad5e-45c393995aad.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/aebd240f-ac7a-4e12-ad5e-45c393995aad.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/aebd240f-ac7a-4e12-ad5e-45c393995aad.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/aebd240f-ac7a-4e12-ad5e-45c393995aad.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/aece3171-0d26-4e2c-a6a7-4850cd875ada.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/aece3171-0d26-4e2c-a6a7-4850cd875ada.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/aece3171-0d26-4e2c-a6a7-4850cd875ada.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/aece3171-0d26-4e2c-a6a7-4850cd875ada.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/aede84d3-c261-4ae8-b401-c12ea994a1d0.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/aede84d3-c261-4ae8-b401-c12ea994a1d0.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/aede84d3-c261-4ae8-b401-c12ea994a1d0.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/aede84d3-c261-4ae8-b401-c12ea994a1d0.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/aeeec053-e817-4e74-b5ca-5aaf549e38e5.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/aeeec053-e817-4e74-b5ca-5aaf549e38e5.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/aeeec053-e817-4e74-b5ca-5aaf549e38e5.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/aeeec053-e817-4e74-b5ca-5aaf549e38e5.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/af09ed18-1b24-4576-9693-56a7b85133e2.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/af09ed18-1b24-4576-9693-56a7b85133e2.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/af09ed18-1b24-4576-9693-56a7b85133e2.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/af09ed18-1b24-4576-9693-56a7b85133e2.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/af13cd7f-c79f-487a-ab98-a1b009f8bcbd.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/af13cd7f-c79f-487a-ab98-a1b009f8bcbd.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/af13cd7f-c79f-487a-ab98-a1b009f8bcbd.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/af13cd7f-c79f-487a-ab98-a1b009f8bcbd.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/af1a50a5-63cf-4cf7-87ad-80960a33cc4e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/af1a50a5-63cf-4cf7-87ad-80960a33cc4e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/af1a50a5-63cf-4cf7-87ad-80960a33cc4e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/af1a50a5-63cf-4cf7-87ad-80960a33cc4e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/af28d8db-36c4-4238-999f-1bf5dee77462.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/af28d8db-36c4-4238-999f-1bf5dee77462.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/af28d8db-36c4-4238-999f-1bf5dee77462.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/af28d8db-36c4-4238-999f-1bf5dee77462.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/af36f4ff-2e8c-49d8-b370-700de322aa92.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/af36f4ff-2e8c-49d8-b370-700de322aa92.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/af36f4ff-2e8c-49d8-b370-700de322aa92.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/af36f4ff-2e8c-49d8-b370-700de322aa92.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/af58eb58-13a6-4363-93f4-a496eaa1cea6.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/af58eb58-13a6-4363-93f4-a496eaa1cea6.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/af58eb58-13a6-4363-93f4-a496eaa1cea6.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/af58eb58-13a6-4363-93f4-a496eaa1cea6.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/af5971c0-6b04-478d-bcd7-4b9f21af82ec.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/af5971c0-6b04-478d-bcd7-4b9f21af82ec.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/af5971c0-6b04-478d-bcd7-4b9f21af82ec.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/af5971c0-6b04-478d-bcd7-4b9f21af82ec.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/af5eef1d-65ba-41b0-ac2b-1d9545a74802.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/af5eef1d-65ba-41b0-ac2b-1d9545a74802.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/af5eef1d-65ba-41b0-ac2b-1d9545a74802.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/af5eef1d-65ba-41b0-ac2b-1d9545a74802.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/af6ed493-c12d-4586-877d-48acf085273f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/af6ed493-c12d-4586-877d-48acf085273f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/af6ed493-c12d-4586-877d-48acf085273f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/af6ed493-c12d-4586-877d-48acf085273f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/afaccdb6-de91-40d3-9709-e100fb17aeb1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/afaccdb6-de91-40d3-9709-e100fb17aeb1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/afaccdb6-de91-40d3-9709-e100fb17aeb1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/afaccdb6-de91-40d3-9709-e100fb17aeb1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/afcac19e-a18b-4e83-adf9-ec5b64592ce6.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/afcac19e-a18b-4e83-adf9-ec5b64592ce6.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/afcac19e-a18b-4e83-adf9-ec5b64592ce6.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/afcac19e-a18b-4e83-adf9-ec5b64592ce6.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/afe07bb6-734c-4a49-8b7d-5953a5896477.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/afe07bb6-734c-4a49-8b7d-5953a5896477.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/afe07bb6-734c-4a49-8b7d-5953a5896477.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/afe07bb6-734c-4a49-8b7d-5953a5896477.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/afe3d2aa-ad67-46ec-abde-cc7213a6d43d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/afe3d2aa-ad67-46ec-abde-cc7213a6d43d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/afe3d2aa-ad67-46ec-abde-cc7213a6d43d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/afe3d2aa-ad67-46ec-abde-cc7213a6d43d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/aff04b8d-6b63-431c-8cd5-3dd1590a516a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/aff04b8d-6b63-431c-8cd5-3dd1590a516a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/aff04b8d-6b63-431c-8cd5-3dd1590a516a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/aff04b8d-6b63-431c-8cd5-3dd1590a516a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b00690f4-e124-44e1-84ab-485f88a6c27d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b00690f4-e124-44e1-84ab-485f88a6c27d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b00690f4-e124-44e1-84ab-485f88a6c27d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b00690f4-e124-44e1-84ab-485f88a6c27d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b026764e-0552-4f87-a6ca-7bd822133745.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b026764e-0552-4f87-a6ca-7bd822133745.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b026764e-0552-4f87-a6ca-7bd822133745.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b026764e-0552-4f87-a6ca-7bd822133745.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b0368d73-e955-4894-b9d7-0123c23c87d1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b0368d73-e955-4894-b9d7-0123c23c87d1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b0368d73-e955-4894-b9d7-0123c23c87d1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b0368d73-e955-4894-b9d7-0123c23c87d1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b044c5aa-ce50-497f-9741-0f807f9e46ea.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b044c5aa-ce50-497f-9741-0f807f9e46ea.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b044c5aa-ce50-497f-9741-0f807f9e46ea.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b044c5aa-ce50-497f-9741-0f807f9e46ea.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b064aa69-0a6f-4ef2-b640-b8e715cf26e9.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b064aa69-0a6f-4ef2-b640-b8e715cf26e9.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b064aa69-0a6f-4ef2-b640-b8e715cf26e9.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b064aa69-0a6f-4ef2-b640-b8e715cf26e9.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b0855e7b-05a4-4d03-98dd-029e61011379.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b0855e7b-05a4-4d03-98dd-029e61011379.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b0855e7b-05a4-4d03-98dd-029e61011379.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b0855e7b-05a4-4d03-98dd-029e61011379.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b095df6f-26f6-4ff1-baea-c1a4cda84fd1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b095df6f-26f6-4ff1-baea-c1a4cda84fd1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b095df6f-26f6-4ff1-baea-c1a4cda84fd1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b095df6f-26f6-4ff1-baea-c1a4cda84fd1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b0b51348-a1da-498c-b1fa-73005fa3296c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b0b51348-a1da-498c-b1fa-73005fa3296c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b0b51348-a1da-498c-b1fa-73005fa3296c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b0b51348-a1da-498c-b1fa-73005fa3296c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b125cce3-5422-4e77-947b-f131e22f221f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b125cce3-5422-4e77-947b-f131e22f221f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b125cce3-5422-4e77-947b-f131e22f221f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b125cce3-5422-4e77-947b-f131e22f221f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b12ef104-b15f-4e2b-bad5-6a4ebe27c867.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b12ef104-b15f-4e2b-bad5-6a4ebe27c867.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b12ef104-b15f-4e2b-bad5-6a4ebe27c867.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b12ef104-b15f-4e2b-bad5-6a4ebe27c867.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b16dfcf5-b060-4ffe-9cb4-960933a6be07.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b16dfcf5-b060-4ffe-9cb4-960933a6be07.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b16dfcf5-b060-4ffe-9cb4-960933a6be07.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b16dfcf5-b060-4ffe-9cb4-960933a6be07.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b178dbdd-430a-44e0-be1e-e026a3d7a08e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b178dbdd-430a-44e0-be1e-e026a3d7a08e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b178dbdd-430a-44e0-be1e-e026a3d7a08e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b178dbdd-430a-44e0-be1e-e026a3d7a08e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b18f6aab-1d20-4585-a9fe-0de4dda6e1a3.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b18f6aab-1d20-4585-a9fe-0de4dda6e1a3.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b18f6aab-1d20-4585-a9fe-0de4dda6e1a3.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b18f6aab-1d20-4585-a9fe-0de4dda6e1a3.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b19cd7f1-6968-4eaa-b261-325096d33763.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b19cd7f1-6968-4eaa-b261-325096d33763.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b19cd7f1-6968-4eaa-b261-325096d33763.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b19cd7f1-6968-4eaa-b261-325096d33763.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b19d726f-8ab1-44e6-98b4-08d50bb34b14.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b19d726f-8ab1-44e6-98b4-08d50bb34b14.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b19d726f-8ab1-44e6-98b4-08d50bb34b14.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b19d726f-8ab1-44e6-98b4-08d50bb34b14.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b1b73dda-c1a9-42d3-a922-e475f3551043.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b1b73dda-c1a9-42d3-a922-e475f3551043.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b1b73dda-c1a9-42d3-a922-e475f3551043.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b1b73dda-c1a9-42d3-a922-e475f3551043.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b1b87a8a-1ce4-44e7-b6cf-e05a4ccc8a0f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b1b87a8a-1ce4-44e7-b6cf-e05a4ccc8a0f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b1b87a8a-1ce4-44e7-b6cf-e05a4ccc8a0f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b1b87a8a-1ce4-44e7-b6cf-e05a4ccc8a0f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b1c16f2e-c198-42af-b46d-17a6bef970e8.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b1c16f2e-c198-42af-b46d-17a6bef970e8.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b1c16f2e-c198-42af-b46d-17a6bef970e8.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b1c16f2e-c198-42af-b46d-17a6bef970e8.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b1d98c7e-ae93-4a44-9771-8956ed20bc7e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b1d98c7e-ae93-4a44-9771-8956ed20bc7e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b1d98c7e-ae93-4a44-9771-8956ed20bc7e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b1d98c7e-ae93-4a44-9771-8956ed20bc7e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b1dbd913-ce2b-41a9-8851-2e73e8b644b3.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b1dbd913-ce2b-41a9-8851-2e73e8b644b3.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b1dbd913-ce2b-41a9-8851-2e73e8b644b3.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b1dbd913-ce2b-41a9-8851-2e73e8b644b3.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b1f50883-2034-413b-b7c7-0f6dc093aec5.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b1f50883-2034-413b-b7c7-0f6dc093aec5.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b1f50883-2034-413b-b7c7-0f6dc093aec5.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b1f50883-2034-413b-b7c7-0f6dc093aec5.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b1f5b9a4-14f1-49ac-b30a-eb05d376a839.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b1f5b9a4-14f1-49ac-b30a-eb05d376a839.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b1f5b9a4-14f1-49ac-b30a-eb05d376a839.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b1f5b9a4-14f1-49ac-b30a-eb05d376a839.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b1f5d338-5749-4724-aec0-4f5bc636838a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b1f5d338-5749-4724-aec0-4f5bc636838a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b1f5d338-5749-4724-aec0-4f5bc636838a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b1f5d338-5749-4724-aec0-4f5bc636838a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b20498c5-f345-48c4-a2fb-5e942b6e6014.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b20498c5-f345-48c4-a2fb-5e942b6e6014.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b20498c5-f345-48c4-a2fb-5e942b6e6014.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b20498c5-f345-48c4-a2fb-5e942b6e6014.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b21c7e83-603d-48e4-8f95-6cd5fe450a5e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b21c7e83-603d-48e4-8f95-6cd5fe450a5e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b21c7e83-603d-48e4-8f95-6cd5fe450a5e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b21c7e83-603d-48e4-8f95-6cd5fe450a5e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b2220f93-713f-486d-9162-d15799babbf4.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b2220f93-713f-486d-9162-d15799babbf4.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b2220f93-713f-486d-9162-d15799babbf4.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b2220f93-713f-486d-9162-d15799babbf4.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b246bc2d-608e-48fc-b434-051517cbc79d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b246bc2d-608e-48fc-b434-051517cbc79d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b246bc2d-608e-48fc-b434-051517cbc79d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b246bc2d-608e-48fc-b434-051517cbc79d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b25eccb4-c0f9-4495-8926-218c735dd2d4.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b25eccb4-c0f9-4495-8926-218c735dd2d4.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b25eccb4-c0f9-4495-8926-218c735dd2d4.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b25eccb4-c0f9-4495-8926-218c735dd2d4.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b2879896-9483-496a-8b64-b4efda32b422.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b2879896-9483-496a-8b64-b4efda32b422.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b2879896-9483-496a-8b64-b4efda32b422.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b2879896-9483-496a-8b64-b4efda32b422.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b2925fb9-81b1-448f-9f06-04c7760d64f5.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b2925fb9-81b1-448f-9f06-04c7760d64f5.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b2925fb9-81b1-448f-9f06-04c7760d64f5.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b2925fb9-81b1-448f-9f06-04c7760d64f5.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b2c4c592-6ec9-4be0-9a90-c9ad9da5c4e2.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b2c4c592-6ec9-4be0-9a90-c9ad9da5c4e2.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b2c4c592-6ec9-4be0-9a90-c9ad9da5c4e2.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b2c4c592-6ec9-4be0-9a90-c9ad9da5c4e2.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b3294079-35c9-4b22-a0a8-1932b0c01d6f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b3294079-35c9-4b22-a0a8-1932b0c01d6f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b3294079-35c9-4b22-a0a8-1932b0c01d6f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b3294079-35c9-4b22-a0a8-1932b0c01d6f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b329ebad-69ec-488c-8d66-9d59a92ed092.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b329ebad-69ec-488c-8d66-9d59a92ed092.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b329ebad-69ec-488c-8d66-9d59a92ed092.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b329ebad-69ec-488c-8d66-9d59a92ed092.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b334d061-e77d-4d3e-8c10-af68ec56b772.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b334d061-e77d-4d3e-8c10-af68ec56b772.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b334d061-e77d-4d3e-8c10-af68ec56b772.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b334d061-e77d-4d3e-8c10-af68ec56b772.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b350c583-035e-4bde-b5ff-3e8759d30d9b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b350c583-035e-4bde-b5ff-3e8759d30d9b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b350c583-035e-4bde-b5ff-3e8759d30d9b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b350c583-035e-4bde-b5ff-3e8759d30d9b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b356716e-1496-40d4-bc6b-6687b8fd4cb8.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b356716e-1496-40d4-bc6b-6687b8fd4cb8.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b356716e-1496-40d4-bc6b-6687b8fd4cb8.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b356716e-1496-40d4-bc6b-6687b8fd4cb8.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b35b3d22-f38f-49a2-88b1-e4cefc373461.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b35b3d22-f38f-49a2-88b1-e4cefc373461.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b35b3d22-f38f-49a2-88b1-e4cefc373461.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b35b3d22-f38f-49a2-88b1-e4cefc373461.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b388fef0-3110-4c63-b869-17ef8d0eb9c8.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b388fef0-3110-4c63-b869-17ef8d0eb9c8.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b388fef0-3110-4c63-b869-17ef8d0eb9c8.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b388fef0-3110-4c63-b869-17ef8d0eb9c8.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b3bea2d2-134e-4250-9a17-222a2e389401.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b3bea2d2-134e-4250-9a17-222a2e389401.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b3bea2d2-134e-4250-9a17-222a2e389401.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b3bea2d2-134e-4250-9a17-222a2e389401.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b3e7b1e8-205f-45b2-ab7f-a4d33b68d8ac.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b3e7b1e8-205f-45b2-ab7f-a4d33b68d8ac.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b3e7b1e8-205f-45b2-ab7f-a4d33b68d8ac.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b3e7b1e8-205f-45b2-ab7f-a4d33b68d8ac.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b3f9d099-17f6-49cc-94ca-fe305e45a076.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b3f9d099-17f6-49cc-94ca-fe305e45a076.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b3f9d099-17f6-49cc-94ca-fe305e45a076.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b3f9d099-17f6-49cc-94ca-fe305e45a076.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b4317cd8-1270-4b9e-939c-ee60cbc6f01c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b4317cd8-1270-4b9e-939c-ee60cbc6f01c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b4317cd8-1270-4b9e-939c-ee60cbc6f01c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b4317cd8-1270-4b9e-939c-ee60cbc6f01c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b43188a9-2529-4d1f-b880-8158bf0a606c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b43188a9-2529-4d1f-b880-8158bf0a606c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b43188a9-2529-4d1f-b880-8158bf0a606c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b43188a9-2529-4d1f-b880-8158bf0a606c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b47412bb-b3e0-4401-bcb1-42d17734fe74.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b47412bb-b3e0-4401-bcb1-42d17734fe74.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b47412bb-b3e0-4401-bcb1-42d17734fe74.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b47412bb-b3e0-4401-bcb1-42d17734fe74.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b47ef0c5-7690-48c6-8d68-7437f78c8e5c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b47ef0c5-7690-48c6-8d68-7437f78c8e5c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b47ef0c5-7690-48c6-8d68-7437f78c8e5c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b47ef0c5-7690-48c6-8d68-7437f78c8e5c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b4b5bec1-2aa9-4198-ad34-6bf10cad3376.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b4b5bec1-2aa9-4198-ad34-6bf10cad3376.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b4b5bec1-2aa9-4198-ad34-6bf10cad3376.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b4b5bec1-2aa9-4198-ad34-6bf10cad3376.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b4b8b9de-441f-4232-8167-51c47c0c8b5a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b4b8b9de-441f-4232-8167-51c47c0c8b5a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b4b8b9de-441f-4232-8167-51c47c0c8b5a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b4b8b9de-441f-4232-8167-51c47c0c8b5a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b4dd584c-7875-46b0-a8fe-83c2defb7c5e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b4dd584c-7875-46b0-a8fe-83c2defb7c5e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b4dd584c-7875-46b0-a8fe-83c2defb7c5e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b4dd584c-7875-46b0-a8fe-83c2defb7c5e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b518d0fd-049b-443d-af6e-642154a06d3b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b518d0fd-049b-443d-af6e-642154a06d3b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b518d0fd-049b-443d-af6e-642154a06d3b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b518d0fd-049b-443d-af6e-642154a06d3b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b52307c5-07b6-43a0-8322-f64ef2ce9814.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b52307c5-07b6-43a0-8322-f64ef2ce9814.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b52307c5-07b6-43a0-8322-f64ef2ce9814.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b52307c5-07b6-43a0-8322-f64ef2ce9814.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b52f9e2a-3efa-48ba-a5f7-380b4061325b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b52f9e2a-3efa-48ba-a5f7-380b4061325b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b52f9e2a-3efa-48ba-a5f7-380b4061325b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b52f9e2a-3efa-48ba-a5f7-380b4061325b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b545ef2d-5f02-43c8-91da-5b63dfbb7a27.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b545ef2d-5f02-43c8-91da-5b63dfbb7a27.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b545ef2d-5f02-43c8-91da-5b63dfbb7a27.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b545ef2d-5f02-43c8-91da-5b63dfbb7a27.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b548d5fb-3b20-4474-8df7-5989e1d84f1e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b548d5fb-3b20-4474-8df7-5989e1d84f1e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b548d5fb-3b20-4474-8df7-5989e1d84f1e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b548d5fb-3b20-4474-8df7-5989e1d84f1e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b55ac2d1-9024-4647-bce8-8a552662823c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b55ac2d1-9024-4647-bce8-8a552662823c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b55ac2d1-9024-4647-bce8-8a552662823c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b55ac2d1-9024-4647-bce8-8a552662823c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b5924bec-3aa0-4b95-8060-b660ccfdefef.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b5924bec-3aa0-4b95-8060-b660ccfdefef.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b5924bec-3aa0-4b95-8060-b660ccfdefef.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b5924bec-3aa0-4b95-8060-b660ccfdefef.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b59feec5-5745-45ab-aa2a-6401873abbc1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b59feec5-5745-45ab-aa2a-6401873abbc1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b59feec5-5745-45ab-aa2a-6401873abbc1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b59feec5-5745-45ab-aa2a-6401873abbc1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b5aae249-c3f3-4464-8fd7-86ad5443b8bf.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b5aae249-c3f3-4464-8fd7-86ad5443b8bf.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b5aae249-c3f3-4464-8fd7-86ad5443b8bf.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b5aae249-c3f3-4464-8fd7-86ad5443b8bf.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b5ac7e93-bb06-4f4a-a883-27335b66a54c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b5ac7e93-bb06-4f4a-a883-27335b66a54c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b5ac7e93-bb06-4f4a-a883-27335b66a54c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b5ac7e93-bb06-4f4a-a883-27335b66a54c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b5aff2c5-b269-4687-8904-ebfea52bdf8d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b5aff2c5-b269-4687-8904-ebfea52bdf8d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b5aff2c5-b269-4687-8904-ebfea52bdf8d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b5aff2c5-b269-4687-8904-ebfea52bdf8d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b5e2cfe3-0521-46ac-8dde-2c92e23341f7.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b5e2cfe3-0521-46ac-8dde-2c92e23341f7.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b5e2cfe3-0521-46ac-8dde-2c92e23341f7.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b5e2cfe3-0521-46ac-8dde-2c92e23341f7.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b5e50cbb-f7d2-4b01-8325-cfa006f3b4fd.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b5e50cbb-f7d2-4b01-8325-cfa006f3b4fd.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b5e50cbb-f7d2-4b01-8325-cfa006f3b4fd.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b5e50cbb-f7d2-4b01-8325-cfa006f3b4fd.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b5ee850c-5fd7-4b01-8320-88f975cc43a6.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b5ee850c-5fd7-4b01-8320-88f975cc43a6.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b5ee850c-5fd7-4b01-8320-88f975cc43a6.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b5ee850c-5fd7-4b01-8320-88f975cc43a6.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b627d667-d7d2-465a-a066-f2cb9c7381ad.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b627d667-d7d2-465a-a066-f2cb9c7381ad.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b627d667-d7d2-465a-a066-f2cb9c7381ad.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b627d667-d7d2-465a-a066-f2cb9c7381ad.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b63331cf-7034-49d1-9507-a2eb9f11d652.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b63331cf-7034-49d1-9507-a2eb9f11d652.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b63331cf-7034-49d1-9507-a2eb9f11d652.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b63331cf-7034-49d1-9507-a2eb9f11d652.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b6396140-822c-4359-99e1-057d9db328ab.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b6396140-822c-4359-99e1-057d9db328ab.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b6396140-822c-4359-99e1-057d9db328ab.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b6396140-822c-4359-99e1-057d9db328ab.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b6514ca9-6ded-46c4-b660-31e733a12799.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b6514ca9-6ded-46c4-b660-31e733a12799.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b6514ca9-6ded-46c4-b660-31e733a12799.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b6514ca9-6ded-46c4-b660-31e733a12799.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b675ee31-dd1e-43c9-b413-24dd27c338f3.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b675ee31-dd1e-43c9-b413-24dd27c338f3.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b675ee31-dd1e-43c9-b413-24dd27c338f3.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b675ee31-dd1e-43c9-b413-24dd27c338f3.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b6787dfe-5eb0-4eda-8640-861660ffd0b8.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b6787dfe-5eb0-4eda-8640-861660ffd0b8.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b6787dfe-5eb0-4eda-8640-861660ffd0b8.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b6787dfe-5eb0-4eda-8640-861660ffd0b8.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b67fec34-a2cb-41d4-8836-e22d9919dd3b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b67fec34-a2cb-41d4-8836-e22d9919dd3b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b67fec34-a2cb-41d4-8836-e22d9919dd3b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b67fec34-a2cb-41d4-8836-e22d9919dd3b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b680e8db-3704-4851-9bac-dcf1a7609954.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b680e8db-3704-4851-9bac-dcf1a7609954.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b680e8db-3704-4851-9bac-dcf1a7609954.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b680e8db-3704-4851-9bac-dcf1a7609954.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b687138c-b5ce-4141-bb44-557b38197663.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b687138c-b5ce-4141-bb44-557b38197663.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b687138c-b5ce-4141-bb44-557b38197663.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b687138c-b5ce-4141-bb44-557b38197663.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b6a21336-f525-4725-b0ef-f7798b503b62.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b6a21336-f525-4725-b0ef-f7798b503b62.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b6a21336-f525-4725-b0ef-f7798b503b62.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b6a21336-f525-4725-b0ef-f7798b503b62.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b6c6a671-d7a1-4599-9ac1-d06a81911a6a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b6c6a671-d7a1-4599-9ac1-d06a81911a6a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b6c6a671-d7a1-4599-9ac1-d06a81911a6a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b6c6a671-d7a1-4599-9ac1-d06a81911a6a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b6d34c8f-d932-43fb-b2d7-21910f0b4588.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b6d34c8f-d932-43fb-b2d7-21910f0b4588.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b6d34c8f-d932-43fb-b2d7-21910f0b4588.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b6d34c8f-d932-43fb-b2d7-21910f0b4588.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b6e9cf4b-3a28-477e-a39c-70f945a5a806.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b6e9cf4b-3a28-477e-a39c-70f945a5a806.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b6e9cf4b-3a28-477e-a39c-70f945a5a806.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b6e9cf4b-3a28-477e-a39c-70f945a5a806.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b6fff448-6dfc-4152-8b9b-814b28e15f4b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b6fff448-6dfc-4152-8b9b-814b28e15f4b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b6fff448-6dfc-4152-8b9b-814b28e15f4b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b6fff448-6dfc-4152-8b9b-814b28e15f4b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b70c29a7-2dee-48a9-918f-c77f80ff6e0d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b70c29a7-2dee-48a9-918f-c77f80ff6e0d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b70c29a7-2dee-48a9-918f-c77f80ff6e0d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b70c29a7-2dee-48a9-918f-c77f80ff6e0d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b7276fc7-4868-4b0e-b5c1-ba99937f58da.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b7276fc7-4868-4b0e-b5c1-ba99937f58da.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b7276fc7-4868-4b0e-b5c1-ba99937f58da.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b7276fc7-4868-4b0e-b5c1-ba99937f58da.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b7457d94-ba61-4a67-827f-75abebf7efe6.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b7457d94-ba61-4a67-827f-75abebf7efe6.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b7457d94-ba61-4a67-827f-75abebf7efe6.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b7457d94-ba61-4a67-827f-75abebf7efe6.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b80e5c82-2976-43d9-a83c-3a9d153b8a72.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b80e5c82-2976-43d9-a83c-3a9d153b8a72.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b80e5c82-2976-43d9-a83c-3a9d153b8a72.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b80e5c82-2976-43d9-a83c-3a9d153b8a72.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b8387c9b-6bbb-433d-9959-0c971a7f11df.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b8387c9b-6bbb-433d-9959-0c971a7f11df.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b8387c9b-6bbb-433d-9959-0c971a7f11df.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b8387c9b-6bbb-433d-9959-0c971a7f11df.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b856e877-9ff0-426a-8ccb-9391c0cbfb49.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b856e877-9ff0-426a-8ccb-9391c0cbfb49.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b856e877-9ff0-426a-8ccb-9391c0cbfb49.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b856e877-9ff0-426a-8ccb-9391c0cbfb49.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b85a1210-786a-4bff-95a3-3dd7e555069b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b85a1210-786a-4bff-95a3-3dd7e555069b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b85a1210-786a-4bff-95a3-3dd7e555069b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b85a1210-786a-4bff-95a3-3dd7e555069b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b8633a6d-c93e-4610-bce0-118da57d6bce.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b8633a6d-c93e-4610-bce0-118da57d6bce.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b8633a6d-c93e-4610-bce0-118da57d6bce.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b8633a6d-c93e-4610-bce0-118da57d6bce.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b8831ac5-bd8c-43aa-b575-942d110e2406.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b8831ac5-bd8c-43aa-b575-942d110e2406.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b8831ac5-bd8c-43aa-b575-942d110e2406.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b8831ac5-bd8c-43aa-b575-942d110e2406.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b89e5fdb-3981-4a00-b0ef-736faecd2b79.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b89e5fdb-3981-4a00-b0ef-736faecd2b79.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b89e5fdb-3981-4a00-b0ef-736faecd2b79.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b89e5fdb-3981-4a00-b0ef-736faecd2b79.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b8bf0871-9f95-4a65-b527-380c49010497.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b8bf0871-9f95-4a65-b527-380c49010497.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b8bf0871-9f95-4a65-b527-380c49010497.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b8bf0871-9f95-4a65-b527-380c49010497.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b8c923c8-37c3-4246-afeb-9ed925dbeffc.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b8c923c8-37c3-4246-afeb-9ed925dbeffc.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b8c923c8-37c3-4246-afeb-9ed925dbeffc.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b8c923c8-37c3-4246-afeb-9ed925dbeffc.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b8d4ad65-5dbc-4c45-a92b-30e95946507f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b8d4ad65-5dbc-4c45-a92b-30e95946507f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b8d4ad65-5dbc-4c45-a92b-30e95946507f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b8d4ad65-5dbc-4c45-a92b-30e95946507f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b8df246e-b1b7-4ce9-8b03-4ee0932944e9.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b8df246e-b1b7-4ce9-8b03-4ee0932944e9.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b8df246e-b1b7-4ce9-8b03-4ee0932944e9.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b8df246e-b1b7-4ce9-8b03-4ee0932944e9.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b90e2898-0c51-49f4-80fe-02df0f1703b5.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b90e2898-0c51-49f4-80fe-02df0f1703b5.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b90e2898-0c51-49f4-80fe-02df0f1703b5.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b90e2898-0c51-49f4-80fe-02df0f1703b5.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b9210dc6-1e81-4d41-866f-43a406aa5680.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b9210dc6-1e81-4d41-866f-43a406aa5680.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b9210dc6-1e81-4d41-866f-43a406aa5680.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b9210dc6-1e81-4d41-866f-43a406aa5680.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b92c8c52-846d-4a69-8250-e3f6aff9308b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b92c8c52-846d-4a69-8250-e3f6aff9308b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b92c8c52-846d-4a69-8250-e3f6aff9308b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b92c8c52-846d-4a69-8250-e3f6aff9308b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b9334ae0-4011-4ce8-86ff-f8e62d19e12b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b9334ae0-4011-4ce8-86ff-f8e62d19e12b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b9334ae0-4011-4ce8-86ff-f8e62d19e12b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b9334ae0-4011-4ce8-86ff-f8e62d19e12b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b95c3b8c-9495-4c68-9153-96c22f2992cb.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b95c3b8c-9495-4c68-9153-96c22f2992cb.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b95c3b8c-9495-4c68-9153-96c22f2992cb.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b95c3b8c-9495-4c68-9153-96c22f2992cb.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b95febc6-ca61-488b-a7f2-548ac8a969c2.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b95febc6-ca61-488b-a7f2-548ac8a969c2.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b95febc6-ca61-488b-a7f2-548ac8a969c2.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b95febc6-ca61-488b-a7f2-548ac8a969c2.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b9759c3f-8f23-4070-9dca-72c4525e4b3f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b9759c3f-8f23-4070-9dca-72c4525e4b3f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b9759c3f-8f23-4070-9dca-72c4525e4b3f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b9759c3f-8f23-4070-9dca-72c4525e4b3f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b98aef07-ae47-42e8-85e7-87ac98e2b485.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b98aef07-ae47-42e8-85e7-87ac98e2b485.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b98aef07-ae47-42e8-85e7-87ac98e2b485.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b98aef07-ae47-42e8-85e7-87ac98e2b485.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b9940717-360b-4f72-b90d-bae94d82c2db.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b9940717-360b-4f72-b90d-bae94d82c2db.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b9940717-360b-4f72-b90d-bae94d82c2db.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b9940717-360b-4f72-b90d-bae94d82c2db.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b9bf17de-4311-4720-bc66-56fcc7a00fe3.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b9bf17de-4311-4720-bc66-56fcc7a00fe3.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b9bf17de-4311-4720-bc66-56fcc7a00fe3.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b9bf17de-4311-4720-bc66-56fcc7a00fe3.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b9cf471d-2a18-4e74-b396-83f8d9966b4f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b9cf471d-2a18-4e74-b396-83f8d9966b4f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b9cf471d-2a18-4e74-b396-83f8d9966b4f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b9cf471d-2a18-4e74-b396-83f8d9966b4f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b9e1d0a1-d182-4606-a1c4-2a8b5503b1e6.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b9e1d0a1-d182-4606-a1c4-2a8b5503b1e6.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b9e1d0a1-d182-4606-a1c4-2a8b5503b1e6.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b9e1d0a1-d182-4606-a1c4-2a8b5503b1e6.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b9e9aa9f-5602-4371-8285-c128b95c77fe.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b9e9aa9f-5602-4371-8285-c128b95c77fe.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b9e9aa9f-5602-4371-8285-c128b95c77fe.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/b9e9aa9f-5602-4371-8285-c128b95c77fe.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ba0d617a-97e9-40e7-860b-14373c457427.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ba0d617a-97e9-40e7-860b-14373c457427.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ba0d617a-97e9-40e7-860b-14373c457427.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ba0d617a-97e9-40e7-860b-14373c457427.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ba6f5ca0-81f9-4d15-8560-d10f1ee1e7f2.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ba6f5ca0-81f9-4d15-8560-d10f1ee1e7f2.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ba6f5ca0-81f9-4d15-8560-d10f1ee1e7f2.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ba6f5ca0-81f9-4d15-8560-d10f1ee1e7f2.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ba8f912c-1e24-45fd-92cc-e42eb9756282.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ba8f912c-1e24-45fd-92cc-e42eb9756282.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ba8f912c-1e24-45fd-92cc-e42eb9756282.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ba8f912c-1e24-45fd-92cc-e42eb9756282.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/baa20e5a-d80e-49ed-aa54-d3051b159ff1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/baa20e5a-d80e-49ed-aa54-d3051b159ff1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/baa20e5a-d80e-49ed-aa54-d3051b159ff1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/baa20e5a-d80e-49ed-aa54-d3051b159ff1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bac6aa8b-069a-4fc5-b4a9-fbd8f9b865fa.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bac6aa8b-069a-4fc5-b4a9-fbd8f9b865fa.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bac6aa8b-069a-4fc5-b4a9-fbd8f9b865fa.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bac6aa8b-069a-4fc5-b4a9-fbd8f9b865fa.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bad5bc02-b513-41ce-a684-05f3d562ae76.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bad5bc02-b513-41ce-a684-05f3d562ae76.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bad5bc02-b513-41ce-a684-05f3d562ae76.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bad5bc02-b513-41ce-a684-05f3d562ae76.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bb018b36-c3ee-42b8-85d8-66f1b6a82d73.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bb018b36-c3ee-42b8-85d8-66f1b6a82d73.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bb018b36-c3ee-42b8-85d8-66f1b6a82d73.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bb018b36-c3ee-42b8-85d8-66f1b6a82d73.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bb4eb59e-11c7-44bb-9347-30f5f7ebafc5.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bb4eb59e-11c7-44bb-9347-30f5f7ebafc5.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bb4eb59e-11c7-44bb-9347-30f5f7ebafc5.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bb4eb59e-11c7-44bb-9347-30f5f7ebafc5.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bb54a799-2354-4f83-8c51-62bc4fb73919.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bb54a799-2354-4f83-8c51-62bc4fb73919.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bb54a799-2354-4f83-8c51-62bc4fb73919.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bb54a799-2354-4f83-8c51-62bc4fb73919.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bb5a9d3f-b312-41f3-985a-579049378997.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bb5a9d3f-b312-41f3-985a-579049378997.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bb5a9d3f-b312-41f3-985a-579049378997.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bb5a9d3f-b312-41f3-985a-579049378997.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bb62d96c-1e92-46bd-83f6-06b2f09a477d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bb62d96c-1e92-46bd-83f6-06b2f09a477d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bb62d96c-1e92-46bd-83f6-06b2f09a477d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bb62d96c-1e92-46bd-83f6-06b2f09a477d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bb756a32-7d38-4916-90ef-0402964c978d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bb756a32-7d38-4916-90ef-0402964c978d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bb756a32-7d38-4916-90ef-0402964c978d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bb756a32-7d38-4916-90ef-0402964c978d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bb8b56c2-e42a-4d72-a7cd-38209fd97054.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bb8b56c2-e42a-4d72-a7cd-38209fd97054.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bb8b56c2-e42a-4d72-a7cd-38209fd97054.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bb8b56c2-e42a-4d72-a7cd-38209fd97054.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bba5dc7d-3c2a-41e0-a4a8-91ae95b82182.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bba5dc7d-3c2a-41e0-a4a8-91ae95b82182.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bba5dc7d-3c2a-41e0-a4a8-91ae95b82182.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bba5dc7d-3c2a-41e0-a4a8-91ae95b82182.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bbc44c89-1c07-493f-81f0-9e245b88eb0b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bbc44c89-1c07-493f-81f0-9e245b88eb0b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bbc44c89-1c07-493f-81f0-9e245b88eb0b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bbc44c89-1c07-493f-81f0-9e245b88eb0b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bc09939f-9ced-4d15-9380-2c1f183045d8.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bc09939f-9ced-4d15-9380-2c1f183045d8.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bc09939f-9ced-4d15-9380-2c1f183045d8.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bc09939f-9ced-4d15-9380-2c1f183045d8.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bc34a88d-80fe-4a4e-b77a-235e9b6ca4e4.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bc34a88d-80fe-4a4e-b77a-235e9b6ca4e4.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bc34a88d-80fe-4a4e-b77a-235e9b6ca4e4.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bc34a88d-80fe-4a4e-b77a-235e9b6ca4e4.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bc3dd539-8e1b-478c-a9ab-877c8fac11c5.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bc3dd539-8e1b-478c-a9ab-877c8fac11c5.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bc3dd539-8e1b-478c-a9ab-877c8fac11c5.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bc3dd539-8e1b-478c-a9ab-877c8fac11c5.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bc46a864-64c2-45e6-958d-c4976db9337b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bc46a864-64c2-45e6-958d-c4976db9337b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bc46a864-64c2-45e6-958d-c4976db9337b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bc46a864-64c2-45e6-958d-c4976db9337b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bc6da01e-ea56-4200-8455-0451bfa08fb9.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bc6da01e-ea56-4200-8455-0451bfa08fb9.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bc6da01e-ea56-4200-8455-0451bfa08fb9.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bc6da01e-ea56-4200-8455-0451bfa08fb9.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bc9e23f0-e23d-49c0-bb66-07885a56348e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bc9e23f0-e23d-49c0-bb66-07885a56348e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bc9e23f0-e23d-49c0-bb66-07885a56348e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bc9e23f0-e23d-49c0-bb66-07885a56348e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bcb55196-fddb-4807-9603-edf08257d5e2.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bcb55196-fddb-4807-9603-edf08257d5e2.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bcb55196-fddb-4807-9603-edf08257d5e2.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bcb55196-fddb-4807-9603-edf08257d5e2.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bcc99b62-7623-4377-a1ba-2dc808a915c5.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bcc99b62-7623-4377-a1ba-2dc808a915c5.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bcc99b62-7623-4377-a1ba-2dc808a915c5.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bcc99b62-7623-4377-a1ba-2dc808a915c5.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bcdf04b6-c95a-4331-a6a9-9a65cbb1fc63.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bcdf04b6-c95a-4331-a6a9-9a65cbb1fc63.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bcdf04b6-c95a-4331-a6a9-9a65cbb1fc63.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bcdf04b6-c95a-4331-a6a9-9a65cbb1fc63.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bce1d5c7-059b-42ee-a01a-13e0f1a315a1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bce1d5c7-059b-42ee-a01a-13e0f1a315a1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bce1d5c7-059b-42ee-a01a-13e0f1a315a1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bce1d5c7-059b-42ee-a01a-13e0f1a315a1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bcf3ea13-b40c-4fc4-a501-162756fd1acc.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bcf3ea13-b40c-4fc4-a501-162756fd1acc.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bcf3ea13-b40c-4fc4-a501-162756fd1acc.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bcf3ea13-b40c-4fc4-a501-162756fd1acc.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bcf3f51d-0054-4bec-8bf2-6e5c2f441b90.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bcf3f51d-0054-4bec-8bf2-6e5c2f441b90.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bcf3f51d-0054-4bec-8bf2-6e5c2f441b90.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bcf3f51d-0054-4bec-8bf2-6e5c2f441b90.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bd0d5438-ca23-4f2b-bbd3-9daf16dc4752.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bd0d5438-ca23-4f2b-bbd3-9daf16dc4752.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bd0d5438-ca23-4f2b-bbd3-9daf16dc4752.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bd0d5438-ca23-4f2b-bbd3-9daf16dc4752.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bd1fca25-aba5-4fbe-9514-9f4fe73d3f00.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bd1fca25-aba5-4fbe-9514-9f4fe73d3f00.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bd1fca25-aba5-4fbe-9514-9f4fe73d3f00.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bd1fca25-aba5-4fbe-9514-9f4fe73d3f00.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bd3c23a4-d6b4-4e7e-b71f-a3ae9aab490d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bd3c23a4-d6b4-4e7e-b71f-a3ae9aab490d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bd3c23a4-d6b4-4e7e-b71f-a3ae9aab490d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bd3c23a4-d6b4-4e7e-b71f-a3ae9aab490d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bd4df421-7775-42ce-b186-b738f91a0999.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bd4df421-7775-42ce-b186-b738f91a0999.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bd4df421-7775-42ce-b186-b738f91a0999.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bd4df421-7775-42ce-b186-b738f91a0999.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bd56a69a-6f37-4a46-bc9c-444fe4b1a3de.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bd56a69a-6f37-4a46-bc9c-444fe4b1a3de.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bd56a69a-6f37-4a46-bc9c-444fe4b1a3de.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bd56a69a-6f37-4a46-bc9c-444fe4b1a3de.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bd5ed50d-7dd6-445a-b4b0-e1294459c231.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bd5ed50d-7dd6-445a-b4b0-e1294459c231.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bd5ed50d-7dd6-445a-b4b0-e1294459c231.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bd5ed50d-7dd6-445a-b4b0-e1294459c231.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bd625222-0b05-45ee-a246-8646be3f0d86.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bd625222-0b05-45ee-a246-8646be3f0d86.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bd625222-0b05-45ee-a246-8646be3f0d86.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bd625222-0b05-45ee-a246-8646be3f0d86.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bd9052c6-96e2-4f3b-8738-0411f5ef4245.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bd9052c6-96e2-4f3b-8738-0411f5ef4245.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bd9052c6-96e2-4f3b-8738-0411f5ef4245.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bd9052c6-96e2-4f3b-8738-0411f5ef4245.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bdb4021c-f164-4a1e-ad31-ad004322e15d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bdb4021c-f164-4a1e-ad31-ad004322e15d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bdb4021c-f164-4a1e-ad31-ad004322e15d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bdb4021c-f164-4a1e-ad31-ad004322e15d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bdc843e5-fddf-4bdf-b2d9-395bb183499c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bdc843e5-fddf-4bdf-b2d9-395bb183499c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bdc843e5-fddf-4bdf-b2d9-395bb183499c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bdc843e5-fddf-4bdf-b2d9-395bb183499c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bdd3f163-2efe-422d-b966-0286e7810352.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bdd3f163-2efe-422d-b966-0286e7810352.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bdd3f163-2efe-422d-b966-0286e7810352.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bdd3f163-2efe-422d-b966-0286e7810352.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/be1d3b1f-1942-4b15-9db5-7aa7c8697a8d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/be1d3b1f-1942-4b15-9db5-7aa7c8697a8d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/be1d3b1f-1942-4b15-9db5-7aa7c8697a8d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/be1d3b1f-1942-4b15-9db5-7aa7c8697a8d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/be361486-87f4-4871-9b36-73bd96b0a09d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/be361486-87f4-4871-9b36-73bd96b0a09d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/be361486-87f4-4871-9b36-73bd96b0a09d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/be361486-87f4-4871-9b36-73bd96b0a09d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/be68b3bc-6bc3-4127-b885-4a70a6566f33.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/be68b3bc-6bc3-4127-b885-4a70a6566f33.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/be68b3bc-6bc3-4127-b885-4a70a6566f33.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/be68b3bc-6bc3-4127-b885-4a70a6566f33.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/be693f55-352c-4ea5-a6ce-e2aca8b98d90.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/be693f55-352c-4ea5-a6ce-e2aca8b98d90.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/be693f55-352c-4ea5-a6ce-e2aca8b98d90.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/be693f55-352c-4ea5-a6ce-e2aca8b98d90.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/be6bb8dc-22cf-473e-a4eb-007f4ffbf3d0.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/be6bb8dc-22cf-473e-a4eb-007f4ffbf3d0.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/be6bb8dc-22cf-473e-a4eb-007f4ffbf3d0.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/be6bb8dc-22cf-473e-a4eb-007f4ffbf3d0.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/be6ce4b8-1d69-460d-8ef5-eefcda84d5ed.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/be6ce4b8-1d69-460d-8ef5-eefcda84d5ed.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/be6ce4b8-1d69-460d-8ef5-eefcda84d5ed.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/be6ce4b8-1d69-460d-8ef5-eefcda84d5ed.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/be841c4d-e957-4c68-bd64-dc64d0b9e1c0.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/be841c4d-e957-4c68-bd64-dc64d0b9e1c0.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/be841c4d-e957-4c68-bd64-dc64d0b9e1c0.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/be841c4d-e957-4c68-bd64-dc64d0b9e1c0.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/beaa4fae-dc12-4c01-b5d5-3a0c28f7e591.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/beaa4fae-dc12-4c01-b5d5-3a0c28f7e591.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/beaa4fae-dc12-4c01-b5d5-3a0c28f7e591.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/beaa4fae-dc12-4c01-b5d5-3a0c28f7e591.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bebdb07f-5625-439a-b028-09166d0b32ba.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bebdb07f-5625-439a-b028-09166d0b32ba.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bebdb07f-5625-439a-b028-09166d0b32ba.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bebdb07f-5625-439a-b028-09166d0b32ba.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bedc146e-5d61-4ded-a140-65a9eb32fab5.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bedc146e-5d61-4ded-a140-65a9eb32fab5.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bedc146e-5d61-4ded-a140-65a9eb32fab5.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bedc146e-5d61-4ded-a140-65a9eb32fab5.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bee906ef-6dc9-42f6-9b78-6f1541ad560b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bee906ef-6dc9-42f6-9b78-6f1541ad560b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bee906ef-6dc9-42f6-9b78-6f1541ad560b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bee906ef-6dc9-42f6-9b78-6f1541ad560b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bef061c5-795e-4865-b0c0-10433208226d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bef061c5-795e-4865-b0c0-10433208226d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bef061c5-795e-4865-b0c0-10433208226d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bef061c5-795e-4865-b0c0-10433208226d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bf0869e6-e0ab-432c-91c5-4f0a02e195f5.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bf0869e6-e0ab-432c-91c5-4f0a02e195f5.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bf0869e6-e0ab-432c-91c5-4f0a02e195f5.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bf0869e6-e0ab-432c-91c5-4f0a02e195f5.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bf1bf934-99f0-4891-b6be-9b3a7989be0f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bf1bf934-99f0-4891-b6be-9b3a7989be0f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bf1bf934-99f0-4891-b6be-9b3a7989be0f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bf1bf934-99f0-4891-b6be-9b3a7989be0f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bf3269a3-7506-4608-bd66-ba32effbb707.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bf3269a3-7506-4608-bd66-ba32effbb707.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bf3269a3-7506-4608-bd66-ba32effbb707.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bf3269a3-7506-4608-bd66-ba32effbb707.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bf419340-1180-4f07-b2d1-f75f804c2736.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bf419340-1180-4f07-b2d1-f75f804c2736.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bf419340-1180-4f07-b2d1-f75f804c2736.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bf419340-1180-4f07-b2d1-f75f804c2736.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bf587536-6dd1-472e-bb4b-c461d0978c90.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bf587536-6dd1-472e-bb4b-c461d0978c90.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bf587536-6dd1-472e-bb4b-c461d0978c90.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bf587536-6dd1-472e-bb4b-c461d0978c90.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bfd10648-d815-48a7-a97b-fb0935163c68.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bfd10648-d815-48a7-a97b-fb0935163c68.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bfd10648-d815-48a7-a97b-fb0935163c68.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bfd10648-d815-48a7-a97b-fb0935163c68.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bfda18fa-7604-4a81-908e-407df50df87a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bfda18fa-7604-4a81-908e-407df50df87a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bfda18fa-7604-4a81-908e-407df50df87a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bfda18fa-7604-4a81-908e-407df50df87a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bff0b8bc-3705-4a31-beff-4d13213a2cc0.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bff0b8bc-3705-4a31-beff-4d13213a2cc0.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bff0b8bc-3705-4a31-beff-4d13213a2cc0.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bff0b8bc-3705-4a31-beff-4d13213a2cc0.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bff6b7d3-cffd-4d38-98f7-86507d12bd4b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bff6b7d3-cffd-4d38-98f7-86507d12bd4b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bff6b7d3-cffd-4d38-98f7-86507d12bd4b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/bff6b7d3-cffd-4d38-98f7-86507d12bd4b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c002b4e0-0ba6-4c57-bc64-43fae10622d6.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c002b4e0-0ba6-4c57-bc64-43fae10622d6.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c002b4e0-0ba6-4c57-bc64-43fae10622d6.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c002b4e0-0ba6-4c57-bc64-43fae10622d6.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c0287097-e958-4a7f-8816-65f76d4260a9.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c0287097-e958-4a7f-8816-65f76d4260a9.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c0287097-e958-4a7f-8816-65f76d4260a9.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c0287097-e958-4a7f-8816-65f76d4260a9.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c0601b86-c17f-41fc-b892-baf845c02413.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c0601b86-c17f-41fc-b892-baf845c02413.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c0601b86-c17f-41fc-b892-baf845c02413.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c0601b86-c17f-41fc-b892-baf845c02413.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c0700267-0f7f-49db-a450-f061db02ed98.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c0700267-0f7f-49db-a450-f061db02ed98.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c0700267-0f7f-49db-a450-f061db02ed98.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c0700267-0f7f-49db-a450-f061db02ed98.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c07766c3-2d97-4684-8af4-ab0dd3ec0f27.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c07766c3-2d97-4684-8af4-ab0dd3ec0f27.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c07766c3-2d97-4684-8af4-ab0dd3ec0f27.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c07766c3-2d97-4684-8af4-ab0dd3ec0f27.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c09771e6-2042-48e0-94e1-55ff7bae6fb5.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c09771e6-2042-48e0-94e1-55ff7bae6fb5.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c09771e6-2042-48e0-94e1-55ff7bae6fb5.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c09771e6-2042-48e0-94e1-55ff7bae6fb5.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c0a594d5-173d-45fe-8537-52ef4ce5f777.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c0a594d5-173d-45fe-8537-52ef4ce5f777.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c0a594d5-173d-45fe-8537-52ef4ce5f777.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c0a594d5-173d-45fe-8537-52ef4ce5f777.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c0be8bac-4553-4b23-b75f-f51effce2624.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c0be8bac-4553-4b23-b75f-f51effce2624.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c0be8bac-4553-4b23-b75f-f51effce2624.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c0be8bac-4553-4b23-b75f-f51effce2624.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c0bf3cf3-a38f-4e40-9b2b-1fed1b7cabf5.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c0bf3cf3-a38f-4e40-9b2b-1fed1b7cabf5.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c0bf3cf3-a38f-4e40-9b2b-1fed1b7cabf5.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c0bf3cf3-a38f-4e40-9b2b-1fed1b7cabf5.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c0c6164e-9174-41b3-99c6-9628198cc176.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c0c6164e-9174-41b3-99c6-9628198cc176.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c0c6164e-9174-41b3-99c6-9628198cc176.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c0c6164e-9174-41b3-99c6-9628198cc176.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c0cc789b-63f5-4a67-8cc2-feb315720db3.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c0cc789b-63f5-4a67-8cc2-feb315720db3.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c0cc789b-63f5-4a67-8cc2-feb315720db3.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c0cc789b-63f5-4a67-8cc2-feb315720db3.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c0d361d4-426d-4102-a2f5-fc4e3c2b5165.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c0d361d4-426d-4102-a2f5-fc4e3c2b5165.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c0d361d4-426d-4102-a2f5-fc4e3c2b5165.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c0d361d4-426d-4102-a2f5-fc4e3c2b5165.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c0dd7c24-f149-409a-92e4-502f5141b121.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c0dd7c24-f149-409a-92e4-502f5141b121.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c0dd7c24-f149-409a-92e4-502f5141b121.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c0dd7c24-f149-409a-92e4-502f5141b121.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c10da1bb-497b-4988-aa9b-3e10483bc4bc.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c10da1bb-497b-4988-aa9b-3e10483bc4bc.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c10da1bb-497b-4988-aa9b-3e10483bc4bc.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c10da1bb-497b-4988-aa9b-3e10483bc4bc.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c113af37-f38e-44b5-8d02-14c8a38f5a78.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c113af37-f38e-44b5-8d02-14c8a38f5a78.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c113af37-f38e-44b5-8d02-14c8a38f5a78.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c113af37-f38e-44b5-8d02-14c8a38f5a78.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c1710377-1e76-4b45-a12b-e33b1ddb4ba7.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c1710377-1e76-4b45-a12b-e33b1ddb4ba7.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c1710377-1e76-4b45-a12b-e33b1ddb4ba7.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c1710377-1e76-4b45-a12b-e33b1ddb4ba7.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c174987a-8fc7-4828-99dd-270eede7c7c1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c174987a-8fc7-4828-99dd-270eede7c7c1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c174987a-8fc7-4828-99dd-270eede7c7c1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c174987a-8fc7-4828-99dd-270eede7c7c1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c18a947d-68fe-4c9e-a999-079b8788ad11.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c18a947d-68fe-4c9e-a999-079b8788ad11.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c18a947d-68fe-4c9e-a999-079b8788ad11.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c18a947d-68fe-4c9e-a999-079b8788ad11.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c1ab2e22-b2e2-4430-8786-9e75a3b4062f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c1ab2e22-b2e2-4430-8786-9e75a3b4062f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c1ab2e22-b2e2-4430-8786-9e75a3b4062f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c1ab2e22-b2e2-4430-8786-9e75a3b4062f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c1c94f4c-8107-4115-a16a-1039a111ab95.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c1c94f4c-8107-4115-a16a-1039a111ab95.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c1c94f4c-8107-4115-a16a-1039a111ab95.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c1c94f4c-8107-4115-a16a-1039a111ab95.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c1ce9de6-9d1c-4759-86bb-44365e77d529.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c1ce9de6-9d1c-4759-86bb-44365e77d529.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c1ce9de6-9d1c-4759-86bb-44365e77d529.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c1ce9de6-9d1c-4759-86bb-44365e77d529.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c1ed56c4-1b58-4078-a15e-18ef95493760.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c1ed56c4-1b58-4078-a15e-18ef95493760.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c1ed56c4-1b58-4078-a15e-18ef95493760.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c1ed56c4-1b58-4078-a15e-18ef95493760.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c1ff403f-226c-4581-bef4-031ccc765824.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c1ff403f-226c-4581-bef4-031ccc765824.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c1ff403f-226c-4581-bef4-031ccc765824.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c1ff403f-226c-4581-bef4-031ccc765824.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c222dc36-abf3-4845-a66b-1548e2fa1f53.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c222dc36-abf3-4845-a66b-1548e2fa1f53.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c222dc36-abf3-4845-a66b-1548e2fa1f53.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c222dc36-abf3-4845-a66b-1548e2fa1f53.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c239e299-3b4f-4210-950b-f2f89858a551.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c239e299-3b4f-4210-950b-f2f89858a551.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c239e299-3b4f-4210-950b-f2f89858a551.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c239e299-3b4f-4210-950b-f2f89858a551.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c24962c7-a472-4967-abe0-0ecc6809ed28.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c24962c7-a472-4967-abe0-0ecc6809ed28.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c24962c7-a472-4967-abe0-0ecc6809ed28.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c24962c7-a472-4967-abe0-0ecc6809ed28.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c26706a0-dfdc-43da-aa79-2878d158c7c2.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c26706a0-dfdc-43da-aa79-2878d158c7c2.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c26706a0-dfdc-43da-aa79-2878d158c7c2.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c26706a0-dfdc-43da-aa79-2878d158c7c2.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c267806b-5fe4-49b9-b8fb-ab91c25daadf.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c267806b-5fe4-49b9-b8fb-ab91c25daadf.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c267806b-5fe4-49b9-b8fb-ab91c25daadf.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c267806b-5fe4-49b9-b8fb-ab91c25daadf.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c274268a-7fa1-4ce1-944d-7cf588f81c87.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c274268a-7fa1-4ce1-944d-7cf588f81c87.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c274268a-7fa1-4ce1-944d-7cf588f81c87.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c274268a-7fa1-4ce1-944d-7cf588f81c87.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c288b06c-85be-4cc6-a2ee-4dee7850e3d2.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c288b06c-85be-4cc6-a2ee-4dee7850e3d2.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c288b06c-85be-4cc6-a2ee-4dee7850e3d2.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c288b06c-85be-4cc6-a2ee-4dee7850e3d2.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c293dd81-decd-4c4d-8fc8-3ed9984bb411.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c293dd81-decd-4c4d-8fc8-3ed9984bb411.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c293dd81-decd-4c4d-8fc8-3ed9984bb411.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c293dd81-decd-4c4d-8fc8-3ed9984bb411.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c2c76a21-f795-4725-b080-0f38e7b1afb1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c2c76a21-f795-4725-b080-0f38e7b1afb1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c2c76a21-f795-4725-b080-0f38e7b1afb1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c2c76a21-f795-4725-b080-0f38e7b1afb1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c2e600fd-dcb5-473e-9c03-c089db354d5b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c2e600fd-dcb5-473e-9c03-c089db354d5b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c2e600fd-dcb5-473e-9c03-c089db354d5b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c2e600fd-dcb5-473e-9c03-c089db354d5b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c2f72904-082c-44cb-84cb-1a4fc01188f5.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c2f72904-082c-44cb-84cb-1a4fc01188f5.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c2f72904-082c-44cb-84cb-1a4fc01188f5.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c2f72904-082c-44cb-84cb-1a4fc01188f5.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c302de64-e166-45ae-96f2-e0f24e57d07c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c302de64-e166-45ae-96f2-e0f24e57d07c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c302de64-e166-45ae-96f2-e0f24e57d07c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c302de64-e166-45ae-96f2-e0f24e57d07c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c308826e-4932-4863-8087-a83e520cb94c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c308826e-4932-4863-8087-a83e520cb94c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c308826e-4932-4863-8087-a83e520cb94c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c308826e-4932-4863-8087-a83e520cb94c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c345587e-e206-4466-921a-2b3231818358.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c345587e-e206-4466-921a-2b3231818358.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c345587e-e206-4466-921a-2b3231818358.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c345587e-e206-4466-921a-2b3231818358.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c349a771-50fe-4b65-9d93-972069f4d475.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c349a771-50fe-4b65-9d93-972069f4d475.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c349a771-50fe-4b65-9d93-972069f4d475.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c349a771-50fe-4b65-9d93-972069f4d475.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c35e9dad-448a-4ef1-adbc-2de67f41d6cd.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c35e9dad-448a-4ef1-adbc-2de67f41d6cd.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c35e9dad-448a-4ef1-adbc-2de67f41d6cd.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c35e9dad-448a-4ef1-adbc-2de67f41d6cd.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c373253e-61d4-4cda-bec1-29644523d491.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c373253e-61d4-4cda-bec1-29644523d491.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c373253e-61d4-4cda-bec1-29644523d491.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c373253e-61d4-4cda-bec1-29644523d491.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c3781d11-ffff-4ee9-9893-a3f94f83f746.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c3781d11-ffff-4ee9-9893-a3f94f83f746.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c3781d11-ffff-4ee9-9893-a3f94f83f746.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c3781d11-ffff-4ee9-9893-a3f94f83f746.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c39469f6-da84-46a9-b73b-de645a8e1f2b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c39469f6-da84-46a9-b73b-de645a8e1f2b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c39469f6-da84-46a9-b73b-de645a8e1f2b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c39469f6-da84-46a9-b73b-de645a8e1f2b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c3c994b3-9bd8-4b66-9867-ab8ad5ecafc1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c3c994b3-9bd8-4b66-9867-ab8ad5ecafc1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c3c994b3-9bd8-4b66-9867-ab8ad5ecafc1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c3c994b3-9bd8-4b66-9867-ab8ad5ecafc1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c3fcf9d2-b26d-4e61-afa9-37e96320eaa8.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c3fcf9d2-b26d-4e61-afa9-37e96320eaa8.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c3fcf9d2-b26d-4e61-afa9-37e96320eaa8.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c3fcf9d2-b26d-4e61-afa9-37e96320eaa8.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c420337e-2851-4959-9033-307e7ac5bfe2.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c420337e-2851-4959-9033-307e7ac5bfe2.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c420337e-2851-4959-9033-307e7ac5bfe2.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c420337e-2851-4959-9033-307e7ac5bfe2.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c4219d55-9a92-49f7-ba60-b97522ede9bc.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c4219d55-9a92-49f7-ba60-b97522ede9bc.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c4219d55-9a92-49f7-ba60-b97522ede9bc.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c4219d55-9a92-49f7-ba60-b97522ede9bc.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c434b0b8-2c11-4266-8f7c-089e25f2890a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c434b0b8-2c11-4266-8f7c-089e25f2890a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c434b0b8-2c11-4266-8f7c-089e25f2890a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c434b0b8-2c11-4266-8f7c-089e25f2890a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c43a6f11-6cb7-4027-a65b-f44082e36d09.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c43a6f11-6cb7-4027-a65b-f44082e36d09.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c43a6f11-6cb7-4027-a65b-f44082e36d09.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c43a6f11-6cb7-4027-a65b-f44082e36d09.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c43e7578-5bb2-4b45-9170-75d0ecdf3854.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c43e7578-5bb2-4b45-9170-75d0ecdf3854.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c43e7578-5bb2-4b45-9170-75d0ecdf3854.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c43e7578-5bb2-4b45-9170-75d0ecdf3854.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c4496f98-f992-4a88-be4b-db9c841db1e7.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c4496f98-f992-4a88-be4b-db9c841db1e7.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c4496f98-f992-4a88-be4b-db9c841db1e7.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c4496f98-f992-4a88-be4b-db9c841db1e7.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c4570e69-3987-43c6-8f9c-699006b296a2.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c4570e69-3987-43c6-8f9c-699006b296a2.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c4570e69-3987-43c6-8f9c-699006b296a2.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c4570e69-3987-43c6-8f9c-699006b296a2.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c45c39af-7a5e-4f71-a11b-fe688426cfa1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c45c39af-7a5e-4f71-a11b-fe688426cfa1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c45c39af-7a5e-4f71-a11b-fe688426cfa1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c45c39af-7a5e-4f71-a11b-fe688426cfa1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c4631749-0df9-44a3-bac3-ca7fac236bac.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c4631749-0df9-44a3-bac3-ca7fac236bac.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c4631749-0df9-44a3-bac3-ca7fac236bac.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c4631749-0df9-44a3-bac3-ca7fac236bac.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c4848897-3943-464b-b227-c17152fd107c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c4848897-3943-464b-b227-c17152fd107c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c4848897-3943-464b-b227-c17152fd107c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c4848897-3943-464b-b227-c17152fd107c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c493fbad-50a8-4cb3-95bc-a42ff3332bbc.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c493fbad-50a8-4cb3-95bc-a42ff3332bbc.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c493fbad-50a8-4cb3-95bc-a42ff3332bbc.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c493fbad-50a8-4cb3-95bc-a42ff3332bbc.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c497e0bb-3231-4508-9421-65223fcc53d0.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c497e0bb-3231-4508-9421-65223fcc53d0.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c497e0bb-3231-4508-9421-65223fcc53d0.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c497e0bb-3231-4508-9421-65223fcc53d0.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c4a38502-4416-4c8e-8a4c-a0447005b1ae.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c4a38502-4416-4c8e-8a4c-a0447005b1ae.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c4a38502-4416-4c8e-8a4c-a0447005b1ae.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c4a38502-4416-4c8e-8a4c-a0447005b1ae.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c4b6d3c3-4161-451b-a4b4-acce1ca84488.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c4b6d3c3-4161-451b-a4b4-acce1ca84488.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c4b6d3c3-4161-451b-a4b4-acce1ca84488.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c4b6d3c3-4161-451b-a4b4-acce1ca84488.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c4d72407-9d5e-4567-80fe-0069500c02f8.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c4d72407-9d5e-4567-80fe-0069500c02f8.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c4d72407-9d5e-4567-80fe-0069500c02f8.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c4d72407-9d5e-4567-80fe-0069500c02f8.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c501b90d-756b-4cfa-b798-85d38c3427cf.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c501b90d-756b-4cfa-b798-85d38c3427cf.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c501b90d-756b-4cfa-b798-85d38c3427cf.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c501b90d-756b-4cfa-b798-85d38c3427cf.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c510e6dc-9e32-444e-b2a9-6fdab38bc6d2.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c510e6dc-9e32-444e-b2a9-6fdab38bc6d2.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c510e6dc-9e32-444e-b2a9-6fdab38bc6d2.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c510e6dc-9e32-444e-b2a9-6fdab38bc6d2.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c522a68c-a382-4190-9790-cfd84fad9107.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c522a68c-a382-4190-9790-cfd84fad9107.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c522a68c-a382-4190-9790-cfd84fad9107.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c522a68c-a382-4190-9790-cfd84fad9107.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c538a314-ed94-4c07-872e-37479a1572ba.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c538a314-ed94-4c07-872e-37479a1572ba.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c538a314-ed94-4c07-872e-37479a1572ba.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c538a314-ed94-4c07-872e-37479a1572ba.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c555c30a-ce75-44df-a6eb-699cd5626033.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c555c30a-ce75-44df-a6eb-699cd5626033.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c555c30a-ce75-44df-a6eb-699cd5626033.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c555c30a-ce75-44df-a6eb-699cd5626033.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c55a48d7-bc9e-4236-9dfa-4d0242d27df7.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c55a48d7-bc9e-4236-9dfa-4d0242d27df7.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c55a48d7-bc9e-4236-9dfa-4d0242d27df7.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c55a48d7-bc9e-4236-9dfa-4d0242d27df7.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c55bd711-6de5-4e83-810a-e1e7234eba67.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c55bd711-6de5-4e83-810a-e1e7234eba67.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c55bd711-6de5-4e83-810a-e1e7234eba67.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c55bd711-6de5-4e83-810a-e1e7234eba67.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c55dd5e4-27c4-4894-ad06-bb2a79b407c0.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c55dd5e4-27c4-4894-ad06-bb2a79b407c0.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c55dd5e4-27c4-4894-ad06-bb2a79b407c0.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c55dd5e4-27c4-4894-ad06-bb2a79b407c0.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c56d62b8-1dee-4950-99c4-44e3287ffe89.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c56d62b8-1dee-4950-99c4-44e3287ffe89.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c56d62b8-1dee-4950-99c4-44e3287ffe89.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c56d62b8-1dee-4950-99c4-44e3287ffe89.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c5747b0a-40c6-46f3-b514-e7b75b96e22d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c5747b0a-40c6-46f3-b514-e7b75b96e22d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c5747b0a-40c6-46f3-b514-e7b75b96e22d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c5747b0a-40c6-46f3-b514-e7b75b96e22d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c59a7cd0-4f1b-46e9-b987-7443633192af.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c59a7cd0-4f1b-46e9-b987-7443633192af.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c59a7cd0-4f1b-46e9-b987-7443633192af.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c59a7cd0-4f1b-46e9-b987-7443633192af.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c5d40221-2f86-4a6a-85b9-85c7697c0aef.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c5d40221-2f86-4a6a-85b9-85c7697c0aef.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c5d40221-2f86-4a6a-85b9-85c7697c0aef.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c5d40221-2f86-4a6a-85b9-85c7697c0aef.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c5eaf582-8024-465f-8a9d-5e5113c319c7.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c5eaf582-8024-465f-8a9d-5e5113c319c7.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c5eaf582-8024-465f-8a9d-5e5113c319c7.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c5eaf582-8024-465f-8a9d-5e5113c319c7.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c5ebd151-fe01-49fa-951e-57eb85b0aacb.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c5ebd151-fe01-49fa-951e-57eb85b0aacb.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c5ebd151-fe01-49fa-951e-57eb85b0aacb.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c5ebd151-fe01-49fa-951e-57eb85b0aacb.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c5f12ff4-5474-4bd9-b016-2bbad54bbf38.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c5f12ff4-5474-4bd9-b016-2bbad54bbf38.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c5f12ff4-5474-4bd9-b016-2bbad54bbf38.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c5f12ff4-5474-4bd9-b016-2bbad54bbf38.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c606f0db-3350-430e-ab20-46971759e4d0.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c606f0db-3350-430e-ab20-46971759e4d0.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c606f0db-3350-430e-ab20-46971759e4d0.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c606f0db-3350-430e-ab20-46971759e4d0.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c60e80e2-260e-4cdb-8d66-434475d437a5.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c60e80e2-260e-4cdb-8d66-434475d437a5.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c60e80e2-260e-4cdb-8d66-434475d437a5.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c60e80e2-260e-4cdb-8d66-434475d437a5.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c611cb81-0f3f-486c-bd45-e236f453a322.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c611cb81-0f3f-486c-bd45-e236f453a322.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c611cb81-0f3f-486c-bd45-e236f453a322.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c611cb81-0f3f-486c-bd45-e236f453a322.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c61c4366-3e18-4e90-8733-edc6934e7b3d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c61c4366-3e18-4e90-8733-edc6934e7b3d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c61c4366-3e18-4e90-8733-edc6934e7b3d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c61c4366-3e18-4e90-8733-edc6934e7b3d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c66543ad-2755-45ff-96e8-75aae2e75d31.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c66543ad-2755-45ff-96e8-75aae2e75d31.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c66543ad-2755-45ff-96e8-75aae2e75d31.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c66543ad-2755-45ff-96e8-75aae2e75d31.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c66c37ff-e7df-44f5-bc81-ad54a7ce068f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c66c37ff-e7df-44f5-bc81-ad54a7ce068f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c66c37ff-e7df-44f5-bc81-ad54a7ce068f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c66c37ff-e7df-44f5-bc81-ad54a7ce068f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c6a14329-c65c-40ef-a773-045612ca31c6.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c6a14329-c65c-40ef-a773-045612ca31c6.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c6a14329-c65c-40ef-a773-045612ca31c6.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c6a14329-c65c-40ef-a773-045612ca31c6.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c6aa1948-33ad-46e0-9d0a-294685b3c817.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c6aa1948-33ad-46e0-9d0a-294685b3c817.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c6aa1948-33ad-46e0-9d0a-294685b3c817.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c6aa1948-33ad-46e0-9d0a-294685b3c817.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c6b90453-de5e-48f3-a798-bdf2380af173.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c6b90453-de5e-48f3-a798-bdf2380af173.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c6b90453-de5e-48f3-a798-bdf2380af173.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c6b90453-de5e-48f3-a798-bdf2380af173.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c6c72f70-1ccc-4c05-9abf-a3252c9e8737.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c6c72f70-1ccc-4c05-9abf-a3252c9e8737.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c6c72f70-1ccc-4c05-9abf-a3252c9e8737.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c6c72f70-1ccc-4c05-9abf-a3252c9e8737.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c6d57187-ca2e-4f2c-ae0a-b17aeac814b3.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c6d57187-ca2e-4f2c-ae0a-b17aeac814b3.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c6d57187-ca2e-4f2c-ae0a-b17aeac814b3.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c6d57187-ca2e-4f2c-ae0a-b17aeac814b3.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c7298fe9-c624-40d1-9800-e073b464ffca.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c7298fe9-c624-40d1-9800-e073b464ffca.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c7298fe9-c624-40d1-9800-e073b464ffca.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c7298fe9-c624-40d1-9800-e073b464ffca.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c7318309-faff-4e4a-a98a-d2911faadd8a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c7318309-faff-4e4a-a98a-d2911faadd8a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c7318309-faff-4e4a-a98a-d2911faadd8a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c7318309-faff-4e4a-a98a-d2911faadd8a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c73c1c28-b9d2-4756-9541-20f29a91c376.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c73c1c28-b9d2-4756-9541-20f29a91c376.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c73c1c28-b9d2-4756-9541-20f29a91c376.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c73c1c28-b9d2-4756-9541-20f29a91c376.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c742cf2a-c772-452f-8565-fff49e611038.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c742cf2a-c772-452f-8565-fff49e611038.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c742cf2a-c772-452f-8565-fff49e611038.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c742cf2a-c772-452f-8565-fff49e611038.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c74ce596-fe3c-47f2-9d8e-67c867491b35.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c74ce596-fe3c-47f2-9d8e-67c867491b35.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c74ce596-fe3c-47f2-9d8e-67c867491b35.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c74ce596-fe3c-47f2-9d8e-67c867491b35.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c7640f8d-4c8c-4874-8c96-1901c53c6662.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c7640f8d-4c8c-4874-8c96-1901c53c6662.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c7640f8d-4c8c-4874-8c96-1901c53c6662.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c7640f8d-4c8c-4874-8c96-1901c53c6662.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c76add9a-a1f7-4485-b93d-cf680f973f1c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c76add9a-a1f7-4485-b93d-cf680f973f1c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c76add9a-a1f7-4485-b93d-cf680f973f1c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c76add9a-a1f7-4485-b93d-cf680f973f1c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c77cdedc-68a5-4281-a903-a95e05e01d6f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c77cdedc-68a5-4281-a903-a95e05e01d6f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c77cdedc-68a5-4281-a903-a95e05e01d6f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c77cdedc-68a5-4281-a903-a95e05e01d6f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c7830fac-7428-468d-b1e5-a622740a8475.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c7830fac-7428-468d-b1e5-a622740a8475.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c7830fac-7428-468d-b1e5-a622740a8475.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c7830fac-7428-468d-b1e5-a622740a8475.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c7a846ce-e7f5-4503-a103-144a72e3f0b2.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c7a846ce-e7f5-4503-a103-144a72e3f0b2.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c7a846ce-e7f5-4503-a103-144a72e3f0b2.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c7a846ce-e7f5-4503-a103-144a72e3f0b2.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c7cc40ff-d1fa-4e88-8d17-8429e47f46a1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c7cc40ff-d1fa-4e88-8d17-8429e47f46a1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c7cc40ff-d1fa-4e88-8d17-8429e47f46a1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c7cc40ff-d1fa-4e88-8d17-8429e47f46a1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c7d23e6f-e093-4498-8c58-891ef4960fe3.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c7d23e6f-e093-4498-8c58-891ef4960fe3.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c7d23e6f-e093-4498-8c58-891ef4960fe3.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c7d23e6f-e093-4498-8c58-891ef4960fe3.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c7ea6b2b-13c4-4ced-8c6b-6b20db75b45f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c7ea6b2b-13c4-4ced-8c6b-6b20db75b45f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c7ea6b2b-13c4-4ced-8c6b-6b20db75b45f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c7ea6b2b-13c4-4ced-8c6b-6b20db75b45f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c80dd898-e64e-4752-ab4b-febc5fd54377.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c80dd898-e64e-4752-ab4b-febc5fd54377.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c80dd898-e64e-4752-ab4b-febc5fd54377.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c80dd898-e64e-4752-ab4b-febc5fd54377.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c83ebb2c-13a0-4671-8dd4-7b0060c0c812.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c83ebb2c-13a0-4671-8dd4-7b0060c0c812.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c83ebb2c-13a0-4671-8dd4-7b0060c0c812.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c83ebb2c-13a0-4671-8dd4-7b0060c0c812.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c83ee7ca-47e8-4e23-9027-6340e4552b95.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c83ee7ca-47e8-4e23-9027-6340e4552b95.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c83ee7ca-47e8-4e23-9027-6340e4552b95.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c83ee7ca-47e8-4e23-9027-6340e4552b95.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c849b779-655a-496d-8076-7b951d2d6bbf.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c849b779-655a-496d-8076-7b951d2d6bbf.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c849b779-655a-496d-8076-7b951d2d6bbf.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c849b779-655a-496d-8076-7b951d2d6bbf.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c87141cc-6e68-4fb0-bb6e-423a02680286.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c87141cc-6e68-4fb0-bb6e-423a02680286.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c87141cc-6e68-4fb0-bb6e-423a02680286.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c87141cc-6e68-4fb0-bb6e-423a02680286.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c877fc7e-e249-4f0e-96fb-b50a7a9fc945.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c877fc7e-e249-4f0e-96fb-b50a7a9fc945.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c877fc7e-e249-4f0e-96fb-b50a7a9fc945.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c877fc7e-e249-4f0e-96fb-b50a7a9fc945.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c8a20b3b-3bb7-46f9-8a48-7e0437de9690.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c8a20b3b-3bb7-46f9-8a48-7e0437de9690.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c8a20b3b-3bb7-46f9-8a48-7e0437de9690.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c8a20b3b-3bb7-46f9-8a48-7e0437de9690.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c8acb419-3c3e-4fb1-ac63-dcabbda1443e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c8acb419-3c3e-4fb1-ac63-dcabbda1443e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c8acb419-3c3e-4fb1-ac63-dcabbda1443e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c8acb419-3c3e-4fb1-ac63-dcabbda1443e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c8c0025d-0ea3-4fb8-9024-9c9142e5988d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c8c0025d-0ea3-4fb8-9024-9c9142e5988d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c8c0025d-0ea3-4fb8-9024-9c9142e5988d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c8c0025d-0ea3-4fb8-9024-9c9142e5988d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c8c8f1f5-9011-48c5-928e-9229910a7eed.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c8c8f1f5-9011-48c5-928e-9229910a7eed.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c8c8f1f5-9011-48c5-928e-9229910a7eed.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c8c8f1f5-9011-48c5-928e-9229910a7eed.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c8ce1a77-0192-4038-be58-5076a410ffdc.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c8ce1a77-0192-4038-be58-5076a410ffdc.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c8ce1a77-0192-4038-be58-5076a410ffdc.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c8ce1a77-0192-4038-be58-5076a410ffdc.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c8f40258-4223-432c-850b-c78c825b5b83.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c8f40258-4223-432c-850b-c78c825b5b83.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c8f40258-4223-432c-850b-c78c825b5b83.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c8f40258-4223-432c-850b-c78c825b5b83.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c95b5acd-4e6f-43a1-8996-a1913cf5fb74.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c95b5acd-4e6f-43a1-8996-a1913cf5fb74.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c95b5acd-4e6f-43a1-8996-a1913cf5fb74.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c95b5acd-4e6f-43a1-8996-a1913cf5fb74.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c98a2b26-8ddf-4574-946e-eb0baea5a4b0.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c98a2b26-8ddf-4574-946e-eb0baea5a4b0.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c98a2b26-8ddf-4574-946e-eb0baea5a4b0.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c98a2b26-8ddf-4574-946e-eb0baea5a4b0.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c9c29c43-61fd-4be3-bc65-75f370810913.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c9c29c43-61fd-4be3-bc65-75f370810913.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c9c29c43-61fd-4be3-bc65-75f370810913.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c9c29c43-61fd-4be3-bc65-75f370810913.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c9e005af-73da-466a-9170-220977e0e8d1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c9e005af-73da-466a-9170-220977e0e8d1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c9e005af-73da-466a-9170-220977e0e8d1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c9e005af-73da-466a-9170-220977e0e8d1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c9f41f57-d7fd-4259-9a09-9ec7642914a9.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c9f41f57-d7fd-4259-9a09-9ec7642914a9.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c9f41f57-d7fd-4259-9a09-9ec7642914a9.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/c9f41f57-d7fd-4259-9a09-9ec7642914a9.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ca549bb9-c452-4200-8938-7ce50dea3e85.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ca549bb9-c452-4200-8938-7ce50dea3e85.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ca549bb9-c452-4200-8938-7ce50dea3e85.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ca549bb9-c452-4200-8938-7ce50dea3e85.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ca59b3dc-d47f-40e2-9b43-05156196a5eb.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ca59b3dc-d47f-40e2-9b43-05156196a5eb.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ca59b3dc-d47f-40e2-9b43-05156196a5eb.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ca59b3dc-d47f-40e2-9b43-05156196a5eb.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ca7f3315-9be2-40c4-92ac-265feaa833d3.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ca7f3315-9be2-40c4-92ac-265feaa833d3.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ca7f3315-9be2-40c4-92ac-265feaa833d3.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ca7f3315-9be2-40c4-92ac-265feaa833d3.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ca90a7aa-02d4-4a16-b03e-c5f192161105.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ca90a7aa-02d4-4a16-b03e-c5f192161105.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ca90a7aa-02d4-4a16-b03e-c5f192161105.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ca90a7aa-02d4-4a16-b03e-c5f192161105.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/caa53a14-3dcb-483f-b496-8d283b13796a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/caa53a14-3dcb-483f-b496-8d283b13796a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/caa53a14-3dcb-483f-b496-8d283b13796a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/caa53a14-3dcb-483f-b496-8d283b13796a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/caeaa62a-468b-4c98-b09b-da761174e5fb.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/caeaa62a-468b-4c98-b09b-da761174e5fb.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/caeaa62a-468b-4c98-b09b-da761174e5fb.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/caeaa62a-468b-4c98-b09b-da761174e5fb.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/caf3bc12-e7af-4ad5-944c-9940920850b4.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/caf3bc12-e7af-4ad5-944c-9940920850b4.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/caf3bc12-e7af-4ad5-944c-9940920850b4.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/caf3bc12-e7af-4ad5-944c-9940920850b4.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cb54941e-7021-42eb-9cff-98ae2c76cf69.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cb54941e-7021-42eb-9cff-98ae2c76cf69.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cb54941e-7021-42eb-9cff-98ae2c76cf69.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cb54941e-7021-42eb-9cff-98ae2c76cf69.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cb601b92-9e62-4604-b7b7-e3218ef55dc8.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cb601b92-9e62-4604-b7b7-e3218ef55dc8.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cb601b92-9e62-4604-b7b7-e3218ef55dc8.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cb601b92-9e62-4604-b7b7-e3218ef55dc8.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cb61f547-da0a-460b-8ee2-f9e247fdf202.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cb61f547-da0a-460b-8ee2-f9e247fdf202.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cb61f547-da0a-460b-8ee2-f9e247fdf202.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cb61f547-da0a-460b-8ee2-f9e247fdf202.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cb64d5cd-9e2c-422b-877a-ae92dd2939d8.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cb64d5cd-9e2c-422b-877a-ae92dd2939d8.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cb64d5cd-9e2c-422b-877a-ae92dd2939d8.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cb64d5cd-9e2c-422b-877a-ae92dd2939d8.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cb679654-ddc9-4e7f-8c45-edc58deb0093.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cb679654-ddc9-4e7f-8c45-edc58deb0093.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cb679654-ddc9-4e7f-8c45-edc58deb0093.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cb679654-ddc9-4e7f-8c45-edc58deb0093.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cb704765-b241-44e3-9ade-f5ac3767a84b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cb704765-b241-44e3-9ade-f5ac3767a84b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cb704765-b241-44e3-9ade-f5ac3767a84b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cb704765-b241-44e3-9ade-f5ac3767a84b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cb7bb14b-e497-4ec3-82d6-b78c7fbc68e5.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cb7bb14b-e497-4ec3-82d6-b78c7fbc68e5.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cb7bb14b-e497-4ec3-82d6-b78c7fbc68e5.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cb7bb14b-e497-4ec3-82d6-b78c7fbc68e5.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cb9d87a7-0d3a-4c8c-ae6b-63ab7379c18b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cb9d87a7-0d3a-4c8c-ae6b-63ab7379c18b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cb9d87a7-0d3a-4c8c-ae6b-63ab7379c18b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cb9d87a7-0d3a-4c8c-ae6b-63ab7379c18b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cbaa77bd-a0a8-409b-a681-5e16db9133cc.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cbaa77bd-a0a8-409b-a681-5e16db9133cc.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cbaa77bd-a0a8-409b-a681-5e16db9133cc.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cbaa77bd-a0a8-409b-a681-5e16db9133cc.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cbafe2a2-2c59-40e9-8cbd-9bf30abd99f3.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cbafe2a2-2c59-40e9-8cbd-9bf30abd99f3.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cbafe2a2-2c59-40e9-8cbd-9bf30abd99f3.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cbafe2a2-2c59-40e9-8cbd-9bf30abd99f3.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cbd921a6-4194-4393-985b-012561098df7.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cbd921a6-4194-4393-985b-012561098df7.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cbd921a6-4194-4393-985b-012561098df7.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cbd921a6-4194-4393-985b-012561098df7.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cbde5f20-18ad-4cda-bd44-8ff95d053b66.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cbde5f20-18ad-4cda-bd44-8ff95d053b66.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cbde5f20-18ad-4cda-bd44-8ff95d053b66.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cbde5f20-18ad-4cda-bd44-8ff95d053b66.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cbe4902d-aecb-4f4b-ac01-a569ad4f4622.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cbe4902d-aecb-4f4b-ac01-a569ad4f4622.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cbe4902d-aecb-4f4b-ac01-a569ad4f4622.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cbe4902d-aecb-4f4b-ac01-a569ad4f4622.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cc0eb81d-b3b4-41b0-84d3-ee34d51421c6.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cc0eb81d-b3b4-41b0-84d3-ee34d51421c6.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cc0eb81d-b3b4-41b0-84d3-ee34d51421c6.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cc0eb81d-b3b4-41b0-84d3-ee34d51421c6.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cc0f3077-81e6-4236-b2d9-f04c832ce9a5.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cc0f3077-81e6-4236-b2d9-f04c832ce9a5.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cc0f3077-81e6-4236-b2d9-f04c832ce9a5.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cc0f3077-81e6-4236-b2d9-f04c832ce9a5.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cc24faf8-4c03-4525-b36f-9569dff9fd4a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cc24faf8-4c03-4525-b36f-9569dff9fd4a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cc24faf8-4c03-4525-b36f-9569dff9fd4a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cc24faf8-4c03-4525-b36f-9569dff9fd4a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cc4740c8-28fe-4c04-86d1-7c09bc1733ce.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cc4740c8-28fe-4c04-86d1-7c09bc1733ce.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cc4740c8-28fe-4c04-86d1-7c09bc1733ce.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cc4740c8-28fe-4c04-86d1-7c09bc1733ce.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cc54483f-bda1-4259-884f-cc55718f9716.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cc54483f-bda1-4259-884f-cc55718f9716.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cc54483f-bda1-4259-884f-cc55718f9716.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cc54483f-bda1-4259-884f-cc55718f9716.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cc74f013-2973-488f-b77d-88aaea92a286.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cc74f013-2973-488f-b77d-88aaea92a286.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cc74f013-2973-488f-b77d-88aaea92a286.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cc74f013-2973-488f-b77d-88aaea92a286.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cc95d4a4-da5c-4eae-86ed-397b685cbf27.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cc95d4a4-da5c-4eae-86ed-397b685cbf27.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cc95d4a4-da5c-4eae-86ed-397b685cbf27.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cc95d4a4-da5c-4eae-86ed-397b685cbf27.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ccdd2b2c-4f2e-40ea-87e0-8fdaae193b60.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ccdd2b2c-4f2e-40ea-87e0-8fdaae193b60.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ccdd2b2c-4f2e-40ea-87e0-8fdaae193b60.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ccdd2b2c-4f2e-40ea-87e0-8fdaae193b60.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cce0bb04-4889-48ce-a320-56f3ed074463.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cce0bb04-4889-48ce-a320-56f3ed074463.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cce0bb04-4889-48ce-a320-56f3ed074463.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cce0bb04-4889-48ce-a320-56f3ed074463.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cce12b81-d7bd-4994-84a7-ced40657d483.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cce12b81-d7bd-4994-84a7-ced40657d483.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cce12b81-d7bd-4994-84a7-ced40657d483.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cce12b81-d7bd-4994-84a7-ced40657d483.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cce83f2c-eabe-4c85-8949-8fbe2549dbd5.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cce83f2c-eabe-4c85-8949-8fbe2549dbd5.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cce83f2c-eabe-4c85-8949-8fbe2549dbd5.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cce83f2c-eabe-4c85-8949-8fbe2549dbd5.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cd495259-5785-44f1-adfe-58760dbdaaa7.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cd495259-5785-44f1-adfe-58760dbdaaa7.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cd495259-5785-44f1-adfe-58760dbdaaa7.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cd495259-5785-44f1-adfe-58760dbdaaa7.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cd98e604-df82-4d71-a680-64ccc173e264.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cd98e604-df82-4d71-a680-64ccc173e264.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cd98e604-df82-4d71-a680-64ccc173e264.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cd98e604-df82-4d71-a680-64ccc173e264.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cdb659fb-3c4e-4387-9178-71a8b92c543a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cdb659fb-3c4e-4387-9178-71a8b92c543a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cdb659fb-3c4e-4387-9178-71a8b92c543a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cdb659fb-3c4e-4387-9178-71a8b92c543a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cdcb5598-7773-4523-927c-01d1860d5a74.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cdcb5598-7773-4523-927c-01d1860d5a74.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cdcb5598-7773-4523-927c-01d1860d5a74.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cdcb5598-7773-4523-927c-01d1860d5a74.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cde2c79c-40c8-4a01-a081-7bdadb6e5acb.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cde2c79c-40c8-4a01-a081-7bdadb6e5acb.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cde2c79c-40c8-4a01-a081-7bdadb6e5acb.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cde2c79c-40c8-4a01-a081-7bdadb6e5acb.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ce0ca51c-32d7-41f0-ba7b-c9fcfd8cf222.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ce0ca51c-32d7-41f0-ba7b-c9fcfd8cf222.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ce0ca51c-32d7-41f0-ba7b-c9fcfd8cf222.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ce0ca51c-32d7-41f0-ba7b-c9fcfd8cf222.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ce0da345-d190-4030-a6a3-67d1865ef438.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ce0da345-d190-4030-a6a3-67d1865ef438.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ce0da345-d190-4030-a6a3-67d1865ef438.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ce0da345-d190-4030-a6a3-67d1865ef438.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ce10cef2-210c-4c14-9519-5f483ed7267d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ce10cef2-210c-4c14-9519-5f483ed7267d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ce10cef2-210c-4c14-9519-5f483ed7267d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ce10cef2-210c-4c14-9519-5f483ed7267d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ce1a0a9e-5fe4-434b-a2a1-29d3eb755acc.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ce1a0a9e-5fe4-434b-a2a1-29d3eb755acc.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ce1a0a9e-5fe4-434b-a2a1-29d3eb755acc.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ce1a0a9e-5fe4-434b-a2a1-29d3eb755acc.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ce28d966-7698-412a-80d3-e5562cc3f8ec.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ce28d966-7698-412a-80d3-e5562cc3f8ec.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ce28d966-7698-412a-80d3-e5562cc3f8ec.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ce28d966-7698-412a-80d3-e5562cc3f8ec.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ce31fbd4-420a-4a3f-ab1a-4136232ee670.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ce31fbd4-420a-4a3f-ab1a-4136232ee670.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ce31fbd4-420a-4a3f-ab1a-4136232ee670.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ce31fbd4-420a-4a3f-ab1a-4136232ee670.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ce45ada2-fbb0-4596-9c36-c5ce7612f313.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ce45ada2-fbb0-4596-9c36-c5ce7612f313.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ce45ada2-fbb0-4596-9c36-c5ce7612f313.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ce45ada2-fbb0-4596-9c36-c5ce7612f313.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ce6376b2-bb15-486e-85d0-2be4843eac58.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ce6376b2-bb15-486e-85d0-2be4843eac58.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ce6376b2-bb15-486e-85d0-2be4843eac58.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ce6376b2-bb15-486e-85d0-2be4843eac58.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ce676cdd-2af0-47f0-bfa6-654a0e32f3ec.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ce676cdd-2af0-47f0-bfa6-654a0e32f3ec.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ce676cdd-2af0-47f0-bfa6-654a0e32f3ec.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ce676cdd-2af0-47f0-bfa6-654a0e32f3ec.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ce7b1386-5052-4d99-8318-9b1746967668.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ce7b1386-5052-4d99-8318-9b1746967668.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ce7b1386-5052-4d99-8318-9b1746967668.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ce7b1386-5052-4d99-8318-9b1746967668.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ce8f18dd-8cc2-439d-85a5-9e6065d64a83.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ce8f18dd-8cc2-439d-85a5-9e6065d64a83.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ce8f18dd-8cc2-439d-85a5-9e6065d64a83.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ce8f18dd-8cc2-439d-85a5-9e6065d64a83.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ce975598-2a56-48ec-8000-4e557a0a87d4.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ce975598-2a56-48ec-8000-4e557a0a87d4.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ce975598-2a56-48ec-8000-4e557a0a87d4.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ce975598-2a56-48ec-8000-4e557a0a87d4.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cec6c849-301e-47b6-87fa-666b82c69fe6.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cec6c849-301e-47b6-87fa-666b82c69fe6.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cec6c849-301e-47b6-87fa-666b82c69fe6.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cec6c849-301e-47b6-87fa-666b82c69fe6.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cecc1234-2536-4678-9b46-76f46d87b953.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cecc1234-2536-4678-9b46-76f46d87b953.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cecc1234-2536-4678-9b46-76f46d87b953.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cecc1234-2536-4678-9b46-76f46d87b953.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cef2bafc-5389-44a6-b275-296473633cc5.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cef2bafc-5389-44a6-b275-296473633cc5.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cef2bafc-5389-44a6-b275-296473633cc5.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cef2bafc-5389-44a6-b275-296473633cc5.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cf6b4ce7-3be5-47ed-9307-3849d8bd416e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cf6b4ce7-3be5-47ed-9307-3849d8bd416e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cf6b4ce7-3be5-47ed-9307-3849d8bd416e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cf6b4ce7-3be5-47ed-9307-3849d8bd416e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cf6c77df-0b4c-481f-9200-b5a9df5acb6f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cf6c77df-0b4c-481f-9200-b5a9df5acb6f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cf6c77df-0b4c-481f-9200-b5a9df5acb6f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cf6c77df-0b4c-481f-9200-b5a9df5acb6f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cf8dcfc8-1a71-4153-a6d0-9cc0488b25d3.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cf8dcfc8-1a71-4153-a6d0-9cc0488b25d3.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cf8dcfc8-1a71-4153-a6d0-9cc0488b25d3.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cf8dcfc8-1a71-4153-a6d0-9cc0488b25d3.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cf90655a-0216-49d6-a6de-461a226b1573.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cf90655a-0216-49d6-a6de-461a226b1573.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cf90655a-0216-49d6-a6de-461a226b1573.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cf90655a-0216-49d6-a6de-461a226b1573.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cfa9c6ef-e018-4f21-b4ad-489c445337f2.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cfa9c6ef-e018-4f21-b4ad-489c445337f2.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cfa9c6ef-e018-4f21-b4ad-489c445337f2.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cfa9c6ef-e018-4f21-b4ad-489c445337f2.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cff53faa-7a4b-43e3-a0f0-86e588fba181.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cff53faa-7a4b-43e3-a0f0-86e588fba181.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cff53faa-7a4b-43e3-a0f0-86e588fba181.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/cff53faa-7a4b-43e3-a0f0-86e588fba181.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d00ef1bd-11c2-4ec8-a5a1-4ce189265806.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d00ef1bd-11c2-4ec8-a5a1-4ce189265806.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d00ef1bd-11c2-4ec8-a5a1-4ce189265806.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d00ef1bd-11c2-4ec8-a5a1-4ce189265806.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d024cd64-9671-4754-9c14-0f39964cc0cd.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d024cd64-9671-4754-9c14-0f39964cc0cd.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d024cd64-9671-4754-9c14-0f39964cc0cd.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d024cd64-9671-4754-9c14-0f39964cc0cd.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d0584860-8c97-4bcc-82d9-06a3a3fc621c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d0584860-8c97-4bcc-82d9-06a3a3fc621c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d0584860-8c97-4bcc-82d9-06a3a3fc621c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d0584860-8c97-4bcc-82d9-06a3a3fc621c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d05cfdba-a876-4a4c-b6a8-f84aef52c68f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d05cfdba-a876-4a4c-b6a8-f84aef52c68f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d05cfdba-a876-4a4c-b6a8-f84aef52c68f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d05cfdba-a876-4a4c-b6a8-f84aef52c68f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d0739202-7bee-44aa-990f-0c0f0eb0d84b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d0739202-7bee-44aa-990f-0c0f0eb0d84b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d0739202-7bee-44aa-990f-0c0f0eb0d84b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d0739202-7bee-44aa-990f-0c0f0eb0d84b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d07a80d4-9912-49f0-ae09-1c75f7e5fc63.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d07a80d4-9912-49f0-ae09-1c75f7e5fc63.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d07a80d4-9912-49f0-ae09-1c75f7e5fc63.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d07a80d4-9912-49f0-ae09-1c75f7e5fc63.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d07ac06c-76ee-4629-b098-b0969213a4bb.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d07ac06c-76ee-4629-b098-b0969213a4bb.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d07ac06c-76ee-4629-b098-b0969213a4bb.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d07ac06c-76ee-4629-b098-b0969213a4bb.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d09e7d92-553a-4f38-8ac2-0ab75f4459d6.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d09e7d92-553a-4f38-8ac2-0ab75f4459d6.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d09e7d92-553a-4f38-8ac2-0ab75f4459d6.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d09e7d92-553a-4f38-8ac2-0ab75f4459d6.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d0b23c98-cebd-4e3f-8344-9f72863fbd73.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d0b23c98-cebd-4e3f-8344-9f72863fbd73.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d0b23c98-cebd-4e3f-8344-9f72863fbd73.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d0b23c98-cebd-4e3f-8344-9f72863fbd73.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d0c0ed98-0efc-4b2d-afc5-d31287a7bd87.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d0c0ed98-0efc-4b2d-afc5-d31287a7bd87.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d0c0ed98-0efc-4b2d-afc5-d31287a7bd87.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d0c0ed98-0efc-4b2d-afc5-d31287a7bd87.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d0d6e41b-4798-4f11-8d0d-ad31875bdd79.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d0d6e41b-4798-4f11-8d0d-ad31875bdd79.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d0d6e41b-4798-4f11-8d0d-ad31875bdd79.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d0d6e41b-4798-4f11-8d0d-ad31875bdd79.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d1122604-7ee7-45ca-a117-8665dbfcee0c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d1122604-7ee7-45ca-a117-8665dbfcee0c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d1122604-7ee7-45ca-a117-8665dbfcee0c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d1122604-7ee7-45ca-a117-8665dbfcee0c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d13b799b-4c1d-4839-a2c8-a2beb562ccae.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d13b799b-4c1d-4839-a2c8-a2beb562ccae.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d13b799b-4c1d-4839-a2c8-a2beb562ccae.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d13b799b-4c1d-4839-a2c8-a2beb562ccae.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d13f9d1f-13ac-4917-b17e-0e91f13d6667.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d13f9d1f-13ac-4917-b17e-0e91f13d6667.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d13f9d1f-13ac-4917-b17e-0e91f13d6667.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d13f9d1f-13ac-4917-b17e-0e91f13d6667.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d17c9d66-c6e2-41de-ae5e-017406032bc3.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d17c9d66-c6e2-41de-ae5e-017406032bc3.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d17c9d66-c6e2-41de-ae5e-017406032bc3.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d17c9d66-c6e2-41de-ae5e-017406032bc3.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d17e043d-3733-4f50-bdeb-3ffe1af537fc.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d17e043d-3733-4f50-bdeb-3ffe1af537fc.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d17e043d-3733-4f50-bdeb-3ffe1af537fc.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d17e043d-3733-4f50-bdeb-3ffe1af537fc.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d17eb309-5cbc-4562-accc-77c4936027b1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d17eb309-5cbc-4562-accc-77c4936027b1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d17eb309-5cbc-4562-accc-77c4936027b1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d17eb309-5cbc-4562-accc-77c4936027b1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d18bacd3-9062-481a-834e-f5eb91caf0a2.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d18bacd3-9062-481a-834e-f5eb91caf0a2.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d18bacd3-9062-481a-834e-f5eb91caf0a2.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d18bacd3-9062-481a-834e-f5eb91caf0a2.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d1990917-4586-4590-86b8-15cee17f0b15.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d1990917-4586-4590-86b8-15cee17f0b15.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d1990917-4586-4590-86b8-15cee17f0b15.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d1990917-4586-4590-86b8-15cee17f0b15.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d19c5c2c-6e18-4e5b-9b83-2a671d5798be.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d19c5c2c-6e18-4e5b-9b83-2a671d5798be.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d19c5c2c-6e18-4e5b-9b83-2a671d5798be.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d19c5c2c-6e18-4e5b-9b83-2a671d5798be.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d1aade5b-c63d-48d3-b733-ec0372643e76.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d1aade5b-c63d-48d3-b733-ec0372643e76.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d1aade5b-c63d-48d3-b733-ec0372643e76.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d1aade5b-c63d-48d3-b733-ec0372643e76.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d1c8c3d9-9748-4587-b510-9e79e149ddb0.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d1c8c3d9-9748-4587-b510-9e79e149ddb0.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d1c8c3d9-9748-4587-b510-9e79e149ddb0.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d1c8c3d9-9748-4587-b510-9e79e149ddb0.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d1d6c18d-02db-428a-9db0-838de21086d7.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d1d6c18d-02db-428a-9db0-838de21086d7.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d1d6c18d-02db-428a-9db0-838de21086d7.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d1d6c18d-02db-428a-9db0-838de21086d7.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d1e2f673-b6b9-449a-bf0e-9aaa537141ed.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d1e2f673-b6b9-449a-bf0e-9aaa537141ed.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d1e2f673-b6b9-449a-bf0e-9aaa537141ed.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d1e2f673-b6b9-449a-bf0e-9aaa537141ed.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d1e96243-6444-4cbd-90c0-1519d07862e7.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d1e96243-6444-4cbd-90c0-1519d07862e7.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d1e96243-6444-4cbd-90c0-1519d07862e7.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d1e96243-6444-4cbd-90c0-1519d07862e7.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d1fbdb53-15c0-41d4-bc2f-f6f4948475ce.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d1fbdb53-15c0-41d4-bc2f-f6f4948475ce.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d1fbdb53-15c0-41d4-bc2f-f6f4948475ce.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d1fbdb53-15c0-41d4-bc2f-f6f4948475ce.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d2054694-8d59-478b-a601-d86c4abded5e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d2054694-8d59-478b-a601-d86c4abded5e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d2054694-8d59-478b-a601-d86c4abded5e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d2054694-8d59-478b-a601-d86c4abded5e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d209a2ac-a7a9-488a-979c-f11bf711f7a2.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d209a2ac-a7a9-488a-979c-f11bf711f7a2.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d209a2ac-a7a9-488a-979c-f11bf711f7a2.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d209a2ac-a7a9-488a-979c-f11bf711f7a2.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d21745f0-51e3-474f-b4ec-71bd94ea17af.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d21745f0-51e3-474f-b4ec-71bd94ea17af.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d21745f0-51e3-474f-b4ec-71bd94ea17af.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d21745f0-51e3-474f-b4ec-71bd94ea17af.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d229abf3-5602-4d29-a50c-3aa803f918ba.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d229abf3-5602-4d29-a50c-3aa803f918ba.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d229abf3-5602-4d29-a50c-3aa803f918ba.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d229abf3-5602-4d29-a50c-3aa803f918ba.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d22ebf3a-01fb-4e79-8eb4-2e541570985e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d22ebf3a-01fb-4e79-8eb4-2e541570985e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d22ebf3a-01fb-4e79-8eb4-2e541570985e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d22ebf3a-01fb-4e79-8eb4-2e541570985e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d24b2967-571b-4d9e-8fb6-f29eb5f7916d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d24b2967-571b-4d9e-8fb6-f29eb5f7916d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d24b2967-571b-4d9e-8fb6-f29eb5f7916d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d24b2967-571b-4d9e-8fb6-f29eb5f7916d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d2517242-c445-4f91-9639-afe1e44e88e1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d2517242-c445-4f91-9639-afe1e44e88e1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d2517242-c445-4f91-9639-afe1e44e88e1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d2517242-c445-4f91-9639-afe1e44e88e1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d2671a5f-3fac-48b5-a377-a78e1f251e79.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d2671a5f-3fac-48b5-a377-a78e1f251e79.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d2671a5f-3fac-48b5-a377-a78e1f251e79.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d2671a5f-3fac-48b5-a377-a78e1f251e79.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d287c1b3-df13-4547-b900-9abd1f683af4.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d287c1b3-df13-4547-b900-9abd1f683af4.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d287c1b3-df13-4547-b900-9abd1f683af4.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d287c1b3-df13-4547-b900-9abd1f683af4.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d294f0af-314a-4503-9036-df2cd6905d03.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d294f0af-314a-4503-9036-df2cd6905d03.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d294f0af-314a-4503-9036-df2cd6905d03.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d294f0af-314a-4503-9036-df2cd6905d03.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d297e863-a290-4e54-9ef5-f1bb5f898249.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d297e863-a290-4e54-9ef5-f1bb5f898249.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d297e863-a290-4e54-9ef5-f1bb5f898249.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d297e863-a290-4e54-9ef5-f1bb5f898249.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d2b9c621-6ff9-4f58-a34b-5865bd592617.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d2b9c621-6ff9-4f58-a34b-5865bd592617.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d2b9c621-6ff9-4f58-a34b-5865bd592617.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d2b9c621-6ff9-4f58-a34b-5865bd592617.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d2c1abe7-7b04-4164-9c5c-4f8b65ad1ec9.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d2c1abe7-7b04-4164-9c5c-4f8b65ad1ec9.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d2c1abe7-7b04-4164-9c5c-4f8b65ad1ec9.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d2c1abe7-7b04-4164-9c5c-4f8b65ad1ec9.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d2e8daa8-23c3-4b10-b0e2-4502da89847c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d2e8daa8-23c3-4b10-b0e2-4502da89847c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d2e8daa8-23c3-4b10-b0e2-4502da89847c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d2e8daa8-23c3-4b10-b0e2-4502da89847c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d2ef6908-2fa2-4f24-97d0-fcf316a19c4e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d2ef6908-2fa2-4f24-97d0-fcf316a19c4e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d2ef6908-2fa2-4f24-97d0-fcf316a19c4e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d2ef6908-2fa2-4f24-97d0-fcf316a19c4e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d3219367-a204-44fa-9c52-d10453a1dde4.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d3219367-a204-44fa-9c52-d10453a1dde4.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d3219367-a204-44fa-9c52-d10453a1dde4.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d3219367-a204-44fa-9c52-d10453a1dde4.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d32af07c-0a31-43ab-a125-9878974c7905.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d32af07c-0a31-43ab-a125-9878974c7905.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d32af07c-0a31-43ab-a125-9878974c7905.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d32af07c-0a31-43ab-a125-9878974c7905.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d32fc791-8b57-4b37-9405-05710f9dd65f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d32fc791-8b57-4b37-9405-05710f9dd65f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d32fc791-8b57-4b37-9405-05710f9dd65f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d32fc791-8b57-4b37-9405-05710f9dd65f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d3837d7d-22c7-4efa-af79-1ed8f4bc279d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d3837d7d-22c7-4efa-af79-1ed8f4bc279d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d3837d7d-22c7-4efa-af79-1ed8f4bc279d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d3837d7d-22c7-4efa-af79-1ed8f4bc279d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d39d058a-f0fc-40db-a007-e1e14035da04.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d39d058a-f0fc-40db-a007-e1e14035da04.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d39d058a-f0fc-40db-a007-e1e14035da04.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d39d058a-f0fc-40db-a007-e1e14035da04.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d3c060b8-0fe1-4e77-9538-6104e6ee375d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d3c060b8-0fe1-4e77-9538-6104e6ee375d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d3c060b8-0fe1-4e77-9538-6104e6ee375d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d3c060b8-0fe1-4e77-9538-6104e6ee375d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d430749b-d149-4b29-a2ee-13a8ca5a58d3.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d430749b-d149-4b29-a2ee-13a8ca5a58d3.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d430749b-d149-4b29-a2ee-13a8ca5a58d3.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d430749b-d149-4b29-a2ee-13a8ca5a58d3.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d463a047-7d47-4cc5-8b71-8db4145893fc.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d463a047-7d47-4cc5-8b71-8db4145893fc.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d463a047-7d47-4cc5-8b71-8db4145893fc.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d463a047-7d47-4cc5-8b71-8db4145893fc.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d48f5556-ada7-45bc-bd62-f1bc91089024.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d48f5556-ada7-45bc-bd62-f1bc91089024.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d48f5556-ada7-45bc-bd62-f1bc91089024.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d48f5556-ada7-45bc-bd62-f1bc91089024.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d4bae70f-6ebd-413b-beb7-db726e465b27.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d4bae70f-6ebd-413b-beb7-db726e465b27.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d4bae70f-6ebd-413b-beb7-db726e465b27.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d4bae70f-6ebd-413b-beb7-db726e465b27.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d4bc1cf3-aa92-4139-900f-5052311cf33c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d4bc1cf3-aa92-4139-900f-5052311cf33c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d4bc1cf3-aa92-4139-900f-5052311cf33c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d4bc1cf3-aa92-4139-900f-5052311cf33c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d4bf416e-5c92-4121-9f10-ef5e098f7a65.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d4bf416e-5c92-4121-9f10-ef5e098f7a65.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d4bf416e-5c92-4121-9f10-ef5e098f7a65.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d4bf416e-5c92-4121-9f10-ef5e098f7a65.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d4d48e10-6500-411e-8713-11df5fd21b9b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d4d48e10-6500-411e-8713-11df5fd21b9b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d4d48e10-6500-411e-8713-11df5fd21b9b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d4d48e10-6500-411e-8713-11df5fd21b9b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d4e70b73-a3dc-4bc4-962a-0722b918f928.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d4e70b73-a3dc-4bc4-962a-0722b918f928.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d4e70b73-a3dc-4bc4-962a-0722b918f928.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d4e70b73-a3dc-4bc4-962a-0722b918f928.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d4f17e51-cf58-4cd3-b31b-c389dc7c0add.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d4f17e51-cf58-4cd3-b31b-c389dc7c0add.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d4f17e51-cf58-4cd3-b31b-c389dc7c0add.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d4f17e51-cf58-4cd3-b31b-c389dc7c0add.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d4f385d4-6d88-4ab1-a108-51d6cfebfa64.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d4f385d4-6d88-4ab1-a108-51d6cfebfa64.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d4f385d4-6d88-4ab1-a108-51d6cfebfa64.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d4f385d4-6d88-4ab1-a108-51d6cfebfa64.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d50ee808-3954-4b22-a76f-c9d962b3c764.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d50ee808-3954-4b22-a76f-c9d962b3c764.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d50ee808-3954-4b22-a76f-c9d962b3c764.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d50ee808-3954-4b22-a76f-c9d962b3c764.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d5277cdd-e8b6-4b88-b9f1-ffa19a0b057d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d5277cdd-e8b6-4b88-b9f1-ffa19a0b057d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d5277cdd-e8b6-4b88-b9f1-ffa19a0b057d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d5277cdd-e8b6-4b88-b9f1-ffa19a0b057d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d5398f08-72ba-4d21-8b82-6551b82b7346.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d5398f08-72ba-4d21-8b82-6551b82b7346.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d5398f08-72ba-4d21-8b82-6551b82b7346.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d5398f08-72ba-4d21-8b82-6551b82b7346.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d53ee389-a1c5-42c5-b41d-7bc8a8ec24e4.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d53ee389-a1c5-42c5-b41d-7bc8a8ec24e4.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d53ee389-a1c5-42c5-b41d-7bc8a8ec24e4.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d53ee389-a1c5-42c5-b41d-7bc8a8ec24e4.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d55822d9-6264-444d-8458-4e6696b0efe0.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d55822d9-6264-444d-8458-4e6696b0efe0.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d55822d9-6264-444d-8458-4e6696b0efe0.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d55822d9-6264-444d-8458-4e6696b0efe0.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d56b2f6a-f766-4cf2-893a-90dcab7409b1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d56b2f6a-f766-4cf2-893a-90dcab7409b1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d56b2f6a-f766-4cf2-893a-90dcab7409b1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d56b2f6a-f766-4cf2-893a-90dcab7409b1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d582c1b6-7726-4982-92de-48da1be475cc.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d582c1b6-7726-4982-92de-48da1be475cc.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d582c1b6-7726-4982-92de-48da1be475cc.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d582c1b6-7726-4982-92de-48da1be475cc.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d5a17578-7f7c-45e9-8d9c-c56fb387d75f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d5a17578-7f7c-45e9-8d9c-c56fb387d75f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d5a17578-7f7c-45e9-8d9c-c56fb387d75f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d5a17578-7f7c-45e9-8d9c-c56fb387d75f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d5a921ba-ca80-4e67-bace-f9b8084c9c0e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d5a921ba-ca80-4e67-bace-f9b8084c9c0e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d5a921ba-ca80-4e67-bace-f9b8084c9c0e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d5a921ba-ca80-4e67-bace-f9b8084c9c0e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d5ab40ec-6c91-463b-a5a2-c944942f3e79.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d5ab40ec-6c91-463b-a5a2-c944942f3e79.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d5ab40ec-6c91-463b-a5a2-c944942f3e79.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d5ab40ec-6c91-463b-a5a2-c944942f3e79.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d5cd50e8-d251-4ca9-8a09-5352a3a1b971.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d5cd50e8-d251-4ca9-8a09-5352a3a1b971.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d5cd50e8-d251-4ca9-8a09-5352a3a1b971.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d5cd50e8-d251-4ca9-8a09-5352a3a1b971.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d5d0f7ea-c947-4026-9662-7cfb1cbd5175.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d5d0f7ea-c947-4026-9662-7cfb1cbd5175.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d5d0f7ea-c947-4026-9662-7cfb1cbd5175.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d5d0f7ea-c947-4026-9662-7cfb1cbd5175.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d5d7aa5f-25df-497c-85d7-e1fe5d012e95.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d5d7aa5f-25df-497c-85d7-e1fe5d012e95.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d5d7aa5f-25df-497c-85d7-e1fe5d012e95.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d5d7aa5f-25df-497c-85d7-e1fe5d012e95.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d5dde5a9-4d00-4800-a347-d06bc5105f9c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d5dde5a9-4d00-4800-a347-d06bc5105f9c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d5dde5a9-4d00-4800-a347-d06bc5105f9c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d5dde5a9-4d00-4800-a347-d06bc5105f9c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d60166c8-46ba-4b46-a49a-fb2a25535890.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d60166c8-46ba-4b46-a49a-fb2a25535890.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d60166c8-46ba-4b46-a49a-fb2a25535890.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d60166c8-46ba-4b46-a49a-fb2a25535890.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d60a326f-a7f5-48b2-bd08-536a96c2cb3b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d60a326f-a7f5-48b2-bd08-536a96c2cb3b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d60a326f-a7f5-48b2-bd08-536a96c2cb3b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d60a326f-a7f5-48b2-bd08-536a96c2cb3b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d612dffd-2676-4f58-9f97-46bd57059298.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d612dffd-2676-4f58-9f97-46bd57059298.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d612dffd-2676-4f58-9f97-46bd57059298.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d612dffd-2676-4f58-9f97-46bd57059298.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d61debaa-b5d4-4d79-8889-d763d594708d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d61debaa-b5d4-4d79-8889-d763d594708d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d61debaa-b5d4-4d79-8889-d763d594708d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d61debaa-b5d4-4d79-8889-d763d594708d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d6323e6f-efdc-446a-b83c-03a9b702ff51.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d6323e6f-efdc-446a-b83c-03a9b702ff51.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d6323e6f-efdc-446a-b83c-03a9b702ff51.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d6323e6f-efdc-446a-b83c-03a9b702ff51.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d6428f90-4b5f-41c8-897b-d1f216b6d42b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d6428f90-4b5f-41c8-897b-d1f216b6d42b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d6428f90-4b5f-41c8-897b-d1f216b6d42b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d6428f90-4b5f-41c8-897b-d1f216b6d42b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d6838e49-ac5d-49e8-8d30-5bd84b518d83.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d6838e49-ac5d-49e8-8d30-5bd84b518d83.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d6838e49-ac5d-49e8-8d30-5bd84b518d83.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d6838e49-ac5d-49e8-8d30-5bd84b518d83.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d68c4367-6ffe-4c62-bddb-201816081212.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d68c4367-6ffe-4c62-bddb-201816081212.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d68c4367-6ffe-4c62-bddb-201816081212.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d68c4367-6ffe-4c62-bddb-201816081212.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d6a55e93-0ad0-45c1-bfec-e5970804c424.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d6a55e93-0ad0-45c1-bfec-e5970804c424.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d6a55e93-0ad0-45c1-bfec-e5970804c424.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d6a55e93-0ad0-45c1-bfec-e5970804c424.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d6ae464c-44ae-4909-acf5-ff50c7dcf366.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d6ae464c-44ae-4909-acf5-ff50c7dcf366.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d6ae464c-44ae-4909-acf5-ff50c7dcf366.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d6ae464c-44ae-4909-acf5-ff50c7dcf366.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d6ba364f-959f-4fc2-adaa-751176300406.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d6ba364f-959f-4fc2-adaa-751176300406.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d6ba364f-959f-4fc2-adaa-751176300406.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d6ba364f-959f-4fc2-adaa-751176300406.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d7048c51-d556-4620-8b3d-5b33ee2b331b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d7048c51-d556-4620-8b3d-5b33ee2b331b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d7048c51-d556-4620-8b3d-5b33ee2b331b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d7048c51-d556-4620-8b3d-5b33ee2b331b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d7074539-b966-486b-80fe-094ba40bafb0.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d7074539-b966-486b-80fe-094ba40bafb0.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d7074539-b966-486b-80fe-094ba40bafb0.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d7074539-b966-486b-80fe-094ba40bafb0.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d729ae85-149a-4d28-a0ab-a1d03395c23a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d729ae85-149a-4d28-a0ab-a1d03395c23a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d729ae85-149a-4d28-a0ab-a1d03395c23a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d729ae85-149a-4d28-a0ab-a1d03395c23a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d7352bd0-4122-4d2a-9af9-88be8a38d1c1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d7352bd0-4122-4d2a-9af9-88be8a38d1c1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d7352bd0-4122-4d2a-9af9-88be8a38d1c1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d7352bd0-4122-4d2a-9af9-88be8a38d1c1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d7419f75-e63d-49d0-aaa3-a30de2c03619.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d7419f75-e63d-49d0-aaa3-a30de2c03619.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d7419f75-e63d-49d0-aaa3-a30de2c03619.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d7419f75-e63d-49d0-aaa3-a30de2c03619.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d7522a19-7248-4a0a-b910-0e6c5502a2db.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d7522a19-7248-4a0a-b910-0e6c5502a2db.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d7522a19-7248-4a0a-b910-0e6c5502a2db.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d7522a19-7248-4a0a-b910-0e6c5502a2db.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d762c8cc-35f6-4253-a30d-a643d8bd9740.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d762c8cc-35f6-4253-a30d-a643d8bd9740.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d762c8cc-35f6-4253-a30d-a643d8bd9740.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d762c8cc-35f6-4253-a30d-a643d8bd9740.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d7649436-95be-4191-b9b8-e1a3e1433156.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d7649436-95be-4191-b9b8-e1a3e1433156.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d7649436-95be-4191-b9b8-e1a3e1433156.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d7649436-95be-4191-b9b8-e1a3e1433156.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d767ff49-c81d-44eb-b425-23e06827fa1a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d767ff49-c81d-44eb-b425-23e06827fa1a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d767ff49-c81d-44eb-b425-23e06827fa1a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d767ff49-c81d-44eb-b425-23e06827fa1a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d78f99eb-82a4-44f5-9d09-8629861e9fd3.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d78f99eb-82a4-44f5-9d09-8629861e9fd3.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d78f99eb-82a4-44f5-9d09-8629861e9fd3.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d78f99eb-82a4-44f5-9d09-8629861e9fd3.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d79b67b2-fce2-4eb1-b522-681a7b73c324.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d79b67b2-fce2-4eb1-b522-681a7b73c324.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d79b67b2-fce2-4eb1-b522-681a7b73c324.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d79b67b2-fce2-4eb1-b522-681a7b73c324.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d7b35632-4e01-4747-8111-4431b37712c9.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d7b35632-4e01-4747-8111-4431b37712c9.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d7b35632-4e01-4747-8111-4431b37712c9.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d7b35632-4e01-4747-8111-4431b37712c9.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d7bfe4da-3696-4593-bb50-0a6f4bd819dc.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d7bfe4da-3696-4593-bb50-0a6f4bd819dc.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d7bfe4da-3696-4593-bb50-0a6f4bd819dc.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d7bfe4da-3696-4593-bb50-0a6f4bd819dc.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d7fd29a8-596c-4e12-b2b6-944d9953e628.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d7fd29a8-596c-4e12-b2b6-944d9953e628.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d7fd29a8-596c-4e12-b2b6-944d9953e628.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d7fd29a8-596c-4e12-b2b6-944d9953e628.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d8060c05-932f-4d8f-ab4a-3aea4ce6221a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d8060c05-932f-4d8f-ab4a-3aea4ce6221a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d8060c05-932f-4d8f-ab4a-3aea4ce6221a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d8060c05-932f-4d8f-ab4a-3aea4ce6221a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d8104d66-d20e-4625-855a-a9e16e079c79.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d8104d66-d20e-4625-855a-a9e16e079c79.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d8104d66-d20e-4625-855a-a9e16e079c79.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d8104d66-d20e-4625-855a-a9e16e079c79.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d8160832-7774-4a9a-adb7-5ad0ff7d249c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d8160832-7774-4a9a-adb7-5ad0ff7d249c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d8160832-7774-4a9a-adb7-5ad0ff7d249c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d8160832-7774-4a9a-adb7-5ad0ff7d249c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d8219fe6-feeb-4384-ae4f-71567a0fd16c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d8219fe6-feeb-4384-ae4f-71567a0fd16c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d8219fe6-feeb-4384-ae4f-71567a0fd16c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d8219fe6-feeb-4384-ae4f-71567a0fd16c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d825bfaa-a725-4e4c-832c-adf2f329c5fc.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d825bfaa-a725-4e4c-832c-adf2f329c5fc.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d825bfaa-a725-4e4c-832c-adf2f329c5fc.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d825bfaa-a725-4e4c-832c-adf2f329c5fc.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d87ce499-8127-4433-8e9a-b51b937b468a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d87ce499-8127-4433-8e9a-b51b937b468a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d87ce499-8127-4433-8e9a-b51b937b468a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d87ce499-8127-4433-8e9a-b51b937b468a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d883704a-e70b-4c95-a880-f080c1951fde.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d883704a-e70b-4c95-a880-f080c1951fde.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d883704a-e70b-4c95-a880-f080c1951fde.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d883704a-e70b-4c95-a880-f080c1951fde.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d8971ede-7aa7-42e7-9ae0-e49eee4190f2.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d8971ede-7aa7-42e7-9ae0-e49eee4190f2.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d8971ede-7aa7-42e7-9ae0-e49eee4190f2.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d8971ede-7aa7-42e7-9ae0-e49eee4190f2.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d8a65c8a-7a4b-4825-92f1-2e8aea9acba9.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d8a65c8a-7a4b-4825-92f1-2e8aea9acba9.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d8a65c8a-7a4b-4825-92f1-2e8aea9acba9.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d8a65c8a-7a4b-4825-92f1-2e8aea9acba9.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d8a88ad8-70f1-4698-946f-b508a2cdde67.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d8a88ad8-70f1-4698-946f-b508a2cdde67.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d8a88ad8-70f1-4698-946f-b508a2cdde67.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d8a88ad8-70f1-4698-946f-b508a2cdde67.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d8ae4c1f-87be-49a3-80a4-6f164edaa9fb.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d8ae4c1f-87be-49a3-80a4-6f164edaa9fb.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d8ae4c1f-87be-49a3-80a4-6f164edaa9fb.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d8ae4c1f-87be-49a3-80a4-6f164edaa9fb.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d8b503f1-d3c8-434a-8be3-aad6812791d4.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d8b503f1-d3c8-434a-8be3-aad6812791d4.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d8b503f1-d3c8-434a-8be3-aad6812791d4.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d8b503f1-d3c8-434a-8be3-aad6812791d4.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d8c4e82b-c089-48c8-80d4-22dba6ce15a6.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d8c4e82b-c089-48c8-80d4-22dba6ce15a6.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d8c4e82b-c089-48c8-80d4-22dba6ce15a6.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d8c4e82b-c089-48c8-80d4-22dba6ce15a6.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d9049423-eaea-49d0-9c76-e737a0b9f512.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d9049423-eaea-49d0-9c76-e737a0b9f512.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d9049423-eaea-49d0-9c76-e737a0b9f512.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d9049423-eaea-49d0-9c76-e737a0b9f512.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d918de3f-3d76-4201-a8a3-4bb4080655c1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d918de3f-3d76-4201-a8a3-4bb4080655c1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d918de3f-3d76-4201-a8a3-4bb4080655c1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d918de3f-3d76-4201-a8a3-4bb4080655c1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d92b9312-00a1-4c41-aa49-8241cb6b338e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d92b9312-00a1-4c41-aa49-8241cb6b338e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d92b9312-00a1-4c41-aa49-8241cb6b338e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d92b9312-00a1-4c41-aa49-8241cb6b338e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d9439152-6477-4b05-97a0-318fa3295ac0.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d9439152-6477-4b05-97a0-318fa3295ac0.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d9439152-6477-4b05-97a0-318fa3295ac0.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d9439152-6477-4b05-97a0-318fa3295ac0.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d955215f-ac7e-4ab8-b9a3-c0edafded6de.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d955215f-ac7e-4ab8-b9a3-c0edafded6de.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d955215f-ac7e-4ab8-b9a3-c0edafded6de.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d955215f-ac7e-4ab8-b9a3-c0edafded6de.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d96a950e-7444-427f-8e60-43cc71ae2249.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d96a950e-7444-427f-8e60-43cc71ae2249.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d96a950e-7444-427f-8e60-43cc71ae2249.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d96a950e-7444-427f-8e60-43cc71ae2249.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d99d3818-dcb5-443a-8322-af2d071ec25e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d99d3818-dcb5-443a-8322-af2d071ec25e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d99d3818-dcb5-443a-8322-af2d071ec25e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d99d3818-dcb5-443a-8322-af2d071ec25e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d9a8bac2-548a-4178-a10a-601f49c28181.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d9a8bac2-548a-4178-a10a-601f49c28181.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d9a8bac2-548a-4178-a10a-601f49c28181.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d9a8bac2-548a-4178-a10a-601f49c28181.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d9b3fbc7-6740-4c73-ba1a-54f33782df5d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d9b3fbc7-6740-4c73-ba1a-54f33782df5d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d9b3fbc7-6740-4c73-ba1a-54f33782df5d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d9b3fbc7-6740-4c73-ba1a-54f33782df5d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d9cb3123-c6c7-43eb-956f-1e90350c98fb.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d9cb3123-c6c7-43eb-956f-1e90350c98fb.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d9cb3123-c6c7-43eb-956f-1e90350c98fb.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d9cb3123-c6c7-43eb-956f-1e90350c98fb.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d9e06c24-3289-4184-bf34-980b188543b5.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d9e06c24-3289-4184-bf34-980b188543b5.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d9e06c24-3289-4184-bf34-980b188543b5.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d9e06c24-3289-4184-bf34-980b188543b5.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d9e1d3d2-f6c6-4e67-b382-d51bb9bd1fc3.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d9e1d3d2-f6c6-4e67-b382-d51bb9bd1fc3.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d9e1d3d2-f6c6-4e67-b382-d51bb9bd1fc3.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d9e1d3d2-f6c6-4e67-b382-d51bb9bd1fc3.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d9efab31-bd8c-4f1f-99e5-65485d87ba4b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d9efab31-bd8c-4f1f-99e5-65485d87ba4b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d9efab31-bd8c-4f1f-99e5-65485d87ba4b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/d9efab31-bd8c-4f1f-99e5-65485d87ba4b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/da3b276e-c253-459e-b2fe-f12970d6ab7d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/da3b276e-c253-459e-b2fe-f12970d6ab7d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/da3b276e-c253-459e-b2fe-f12970d6ab7d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/da3b276e-c253-459e-b2fe-f12970d6ab7d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/da4988c3-3f83-4548-a21c-4fb3ede4b473.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/da4988c3-3f83-4548-a21c-4fb3ede4b473.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/da4988c3-3f83-4548-a21c-4fb3ede4b473.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/da4988c3-3f83-4548-a21c-4fb3ede4b473.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/da731124-e9bc-4a43-afac-ec8d278e8894.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/da731124-e9bc-4a43-afac-ec8d278e8894.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/da731124-e9bc-4a43-afac-ec8d278e8894.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/da731124-e9bc-4a43-afac-ec8d278e8894.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/da74212e-a8c1-483f-a25b-9c76cbc6f3ba.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/da74212e-a8c1-483f-a25b-9c76cbc6f3ba.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/da74212e-a8c1-483f-a25b-9c76cbc6f3ba.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/da74212e-a8c1-483f-a25b-9c76cbc6f3ba.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/da7889d4-d441-4565-abfe-8158ac8456db.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/da7889d4-d441-4565-abfe-8158ac8456db.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/da7889d4-d441-4565-abfe-8158ac8456db.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/da7889d4-d441-4565-abfe-8158ac8456db.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/da8ff572-f4cf-45fb-97c8-1d98db93bd9d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/da8ff572-f4cf-45fb-97c8-1d98db93bd9d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/da8ff572-f4cf-45fb-97c8-1d98db93bd9d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/da8ff572-f4cf-45fb-97c8-1d98db93bd9d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/da9294bd-f810-41dc-90a2-8104194cbf30.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/da9294bd-f810-41dc-90a2-8104194cbf30.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/da9294bd-f810-41dc-90a2-8104194cbf30.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/da9294bd-f810-41dc-90a2-8104194cbf30.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dac7329e-de30-447f-b8e0-ba925207753b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dac7329e-de30-447f-b8e0-ba925207753b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dac7329e-de30-447f-b8e0-ba925207753b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dac7329e-de30-447f-b8e0-ba925207753b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dad7a64a-7035-4c28-ae78-9efc63696741.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dad7a64a-7035-4c28-ae78-9efc63696741.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dad7a64a-7035-4c28-ae78-9efc63696741.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dad7a64a-7035-4c28-ae78-9efc63696741.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/daf5a3ee-eb34-41b3-a53c-600f8fedabb2.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/daf5a3ee-eb34-41b3-a53c-600f8fedabb2.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/daf5a3ee-eb34-41b3-a53c-600f8fedabb2.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/daf5a3ee-eb34-41b3-a53c-600f8fedabb2.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dafd356b-88e4-422d-a38f-04da1b20283b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dafd356b-88e4-422d-a38f-04da1b20283b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dafd356b-88e4-422d-a38f-04da1b20283b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dafd356b-88e4-422d-a38f-04da1b20283b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/db0cd21f-09cb-4a97-8a1b-a0724bab8820.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/db0cd21f-09cb-4a97-8a1b-a0724bab8820.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/db0cd21f-09cb-4a97-8a1b-a0724bab8820.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/db0cd21f-09cb-4a97-8a1b-a0724bab8820.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/db21464f-09bf-4252-b6cf-685cf5a317a1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/db21464f-09bf-4252-b6cf-685cf5a317a1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/db21464f-09bf-4252-b6cf-685cf5a317a1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/db21464f-09bf-4252-b6cf-685cf5a317a1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/db2c5c2d-f35c-4066-9c0f-9c17d597ecdb.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/db2c5c2d-f35c-4066-9c0f-9c17d597ecdb.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/db2c5c2d-f35c-4066-9c0f-9c17d597ecdb.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/db2c5c2d-f35c-4066-9c0f-9c17d597ecdb.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/db363c24-a506-49a9-bb12-9df75ef66287.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/db363c24-a506-49a9-bb12-9df75ef66287.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/db363c24-a506-49a9-bb12-9df75ef66287.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/db363c24-a506-49a9-bb12-9df75ef66287.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/db55217f-2013-4a28-ac0e-0952bcd5e4af.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/db55217f-2013-4a28-ac0e-0952bcd5e4af.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/db55217f-2013-4a28-ac0e-0952bcd5e4af.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/db55217f-2013-4a28-ac0e-0952bcd5e4af.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/db98585d-4d2e-4a0a-8b34-e35745d296e8.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/db98585d-4d2e-4a0a-8b34-e35745d296e8.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/db98585d-4d2e-4a0a-8b34-e35745d296e8.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/db98585d-4d2e-4a0a-8b34-e35745d296e8.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dbaa6f17-89f3-4480-9b40-2024baee3b54.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dbaa6f17-89f3-4480-9b40-2024baee3b54.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dbaa6f17-89f3-4480-9b40-2024baee3b54.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dbaa6f17-89f3-4480-9b40-2024baee3b54.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dbb6581c-026c-460d-aa75-b858a94d5a0d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dbb6581c-026c-460d-aa75-b858a94d5a0d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dbb6581c-026c-460d-aa75-b858a94d5a0d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dbb6581c-026c-460d-aa75-b858a94d5a0d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dbbe3667-1024-42cb-85c8-44e6bf8bac70.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dbbe3667-1024-42cb-85c8-44e6bf8bac70.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dbbe3667-1024-42cb-85c8-44e6bf8bac70.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dbbe3667-1024-42cb-85c8-44e6bf8bac70.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dbd4b043-1951-4b71-8bdb-36961087512b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dbd4b043-1951-4b71-8bdb-36961087512b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dbd4b043-1951-4b71-8bdb-36961087512b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dbd4b043-1951-4b71-8bdb-36961087512b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dc00dae7-e6a7-4b49-b911-83e83416aac1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dc00dae7-e6a7-4b49-b911-83e83416aac1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dc00dae7-e6a7-4b49-b911-83e83416aac1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dc00dae7-e6a7-4b49-b911-83e83416aac1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dc00edb6-be57-494e-84c1-4e547bb39971.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dc00edb6-be57-494e-84c1-4e547bb39971.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dc00edb6-be57-494e-84c1-4e547bb39971.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dc00edb6-be57-494e-84c1-4e547bb39971.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dc095348-a477-48cf-974b-db86f186f3b0.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dc095348-a477-48cf-974b-db86f186f3b0.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dc095348-a477-48cf-974b-db86f186f3b0.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dc095348-a477-48cf-974b-db86f186f3b0.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dc113156-5fee-4f12-b369-1eb5c11accf5.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dc113156-5fee-4f12-b369-1eb5c11accf5.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dc113156-5fee-4f12-b369-1eb5c11accf5.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dc113156-5fee-4f12-b369-1eb5c11accf5.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dc1c038d-2ae8-4de7-94cb-a9cca6648209.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dc1c038d-2ae8-4de7-94cb-a9cca6648209.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dc1c038d-2ae8-4de7-94cb-a9cca6648209.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dc1c038d-2ae8-4de7-94cb-a9cca6648209.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dc34ea29-904e-4ee5-9ea4-d1f10a38f973.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dc34ea29-904e-4ee5-9ea4-d1f10a38f973.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dc34ea29-904e-4ee5-9ea4-d1f10a38f973.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dc34ea29-904e-4ee5-9ea4-d1f10a38f973.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dc3636ef-e319-4f54-a77a-7e7d7803b92a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dc3636ef-e319-4f54-a77a-7e7d7803b92a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dc3636ef-e319-4f54-a77a-7e7d7803b92a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dc3636ef-e319-4f54-a77a-7e7d7803b92a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dc3f7f64-a561-43b9-bf03-af0ee672abd1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dc3f7f64-a561-43b9-bf03-af0ee672abd1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dc3f7f64-a561-43b9-bf03-af0ee672abd1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dc3f7f64-a561-43b9-bf03-af0ee672abd1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dc46c3bb-0850-4d51-b91d-1bbd908038dc.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dc46c3bb-0850-4d51-b91d-1bbd908038dc.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dc46c3bb-0850-4d51-b91d-1bbd908038dc.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dc46c3bb-0850-4d51-b91d-1bbd908038dc.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dc61ec7a-a2fb-4dcd-b303-600ac595a1e8.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dc61ec7a-a2fb-4dcd-b303-600ac595a1e8.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dc61ec7a-a2fb-4dcd-b303-600ac595a1e8.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dc61ec7a-a2fb-4dcd-b303-600ac595a1e8.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dc656d2e-bd27-40cc-8e98-9be2104b2ec7.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dc656d2e-bd27-40cc-8e98-9be2104b2ec7.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dc656d2e-bd27-40cc-8e98-9be2104b2ec7.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dc656d2e-bd27-40cc-8e98-9be2104b2ec7.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dc689460-57f0-432f-86c8-2a1ce64d0720.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dc689460-57f0-432f-86c8-2a1ce64d0720.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dc689460-57f0-432f-86c8-2a1ce64d0720.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dc689460-57f0-432f-86c8-2a1ce64d0720.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dc77cb76-c61e-4ded-8bc5-27eed6ee65b5.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dc77cb76-c61e-4ded-8bc5-27eed6ee65b5.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dc77cb76-c61e-4ded-8bc5-27eed6ee65b5.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dc77cb76-c61e-4ded-8bc5-27eed6ee65b5.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dc985f52-33aa-48c7-87a1-278ee5da54f4.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dc985f52-33aa-48c7-87a1-278ee5da54f4.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dc985f52-33aa-48c7-87a1-278ee5da54f4.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dc985f52-33aa-48c7-87a1-278ee5da54f4.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dca0a4f1-89bb-44d8-a0bb-b4ec66fdd58b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dca0a4f1-89bb-44d8-a0bb-b4ec66fdd58b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dca0a4f1-89bb-44d8-a0bb-b4ec66fdd58b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dca0a4f1-89bb-44d8-a0bb-b4ec66fdd58b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dcfda71c-f284-4c3d-9680-d1b5ecd8efae.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dcfda71c-f284-4c3d-9680-d1b5ecd8efae.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dcfda71c-f284-4c3d-9680-d1b5ecd8efae.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dcfda71c-f284-4c3d-9680-d1b5ecd8efae.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dd0ab4a0-30ba-4374-b2eb-2082ee24bec7.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dd0ab4a0-30ba-4374-b2eb-2082ee24bec7.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dd0ab4a0-30ba-4374-b2eb-2082ee24bec7.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dd0ab4a0-30ba-4374-b2eb-2082ee24bec7.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dd2dc76b-bf71-4e2d-8650-9641041ba11d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dd2dc76b-bf71-4e2d-8650-9641041ba11d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dd2dc76b-bf71-4e2d-8650-9641041ba11d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dd2dc76b-bf71-4e2d-8650-9641041ba11d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dd3631a1-e917-45a6-8490-206dfa22b210.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dd3631a1-e917-45a6-8490-206dfa22b210.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dd3631a1-e917-45a6-8490-206dfa22b210.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dd3631a1-e917-45a6-8490-206dfa22b210.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dd3a3f13-3d92-408f-be9e-80e21cbd17f6.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dd3a3f13-3d92-408f-be9e-80e21cbd17f6.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dd3a3f13-3d92-408f-be9e-80e21cbd17f6.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dd3a3f13-3d92-408f-be9e-80e21cbd17f6.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dd539d7d-ff83-49f9-bc51-14f43b864b37.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dd539d7d-ff83-49f9-bc51-14f43b864b37.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dd539d7d-ff83-49f9-bc51-14f43b864b37.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dd539d7d-ff83-49f9-bc51-14f43b864b37.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ddb408d5-ca39-4694-98ad-caa6b81de6bc.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ddb408d5-ca39-4694-98ad-caa6b81de6bc.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ddb408d5-ca39-4694-98ad-caa6b81de6bc.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ddb408d5-ca39-4694-98ad-caa6b81de6bc.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ddda9291-740a-49f4-ae1a-d1b1751e900e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ddda9291-740a-49f4-ae1a-d1b1751e900e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ddda9291-740a-49f4-ae1a-d1b1751e900e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ddda9291-740a-49f4-ae1a-d1b1751e900e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/de021c8f-b67f-4f53-9650-8ce0b6691ec0.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/de021c8f-b67f-4f53-9650-8ce0b6691ec0.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/de021c8f-b67f-4f53-9650-8ce0b6691ec0.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/de021c8f-b67f-4f53-9650-8ce0b6691ec0.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/de1db872-4a17-4eb3-8697-f7efa94ba5f1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/de1db872-4a17-4eb3-8697-f7efa94ba5f1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/de1db872-4a17-4eb3-8697-f7efa94ba5f1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/de1db872-4a17-4eb3-8697-f7efa94ba5f1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/de405a05-4ff1-4131-9404-4bc207496f11.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/de405a05-4ff1-4131-9404-4bc207496f11.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/de405a05-4ff1-4131-9404-4bc207496f11.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/de405a05-4ff1-4131-9404-4bc207496f11.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/de44588b-27f2-48ea-8927-fa8e7e0eca84.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/de44588b-27f2-48ea-8927-fa8e7e0eca84.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/de44588b-27f2-48ea-8927-fa8e7e0eca84.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/de44588b-27f2-48ea-8927-fa8e7e0eca84.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/de47dc1f-240b-4e96-ab11-9dce7a84b293.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/de47dc1f-240b-4e96-ab11-9dce7a84b293.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/de47dc1f-240b-4e96-ab11-9dce7a84b293.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/de47dc1f-240b-4e96-ab11-9dce7a84b293.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/de518a84-51e5-4300-ae67-1e862f385a90.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/de518a84-51e5-4300-ae67-1e862f385a90.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/de518a84-51e5-4300-ae67-1e862f385a90.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/de518a84-51e5-4300-ae67-1e862f385a90.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/de9cdb27-1a36-443b-b8b8-bc30a5c7d092.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/de9cdb27-1a36-443b-b8b8-bc30a5c7d092.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/de9cdb27-1a36-443b-b8b8-bc30a5c7d092.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/de9cdb27-1a36-443b-b8b8-bc30a5c7d092.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/def104cf-27c5-42ac-a871-475cd30ad64d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/def104cf-27c5-42ac-a871-475cd30ad64d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/def104cf-27c5-42ac-a871-475cd30ad64d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/def104cf-27c5-42ac-a871-475cd30ad64d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/df2c57ca-400d-42d7-8842-27296689b59f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/df2c57ca-400d-42d7-8842-27296689b59f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/df2c57ca-400d-42d7-8842-27296689b59f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/df2c57ca-400d-42d7-8842-27296689b59f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/df374c63-c113-4833-b4da-917273c7d050.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/df374c63-c113-4833-b4da-917273c7d050.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/df374c63-c113-4833-b4da-917273c7d050.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/df374c63-c113-4833-b4da-917273c7d050.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/df38ae9e-b491-4000-afd4-4d4d3e870e80.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/df38ae9e-b491-4000-afd4-4d4d3e870e80.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/df38ae9e-b491-4000-afd4-4d4d3e870e80.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/df38ae9e-b491-4000-afd4-4d4d3e870e80.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/df3f097b-ff35-4ea6-b9b1-10d0b370c5d7.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/df3f097b-ff35-4ea6-b9b1-10d0b370c5d7.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/df3f097b-ff35-4ea6-b9b1-10d0b370c5d7.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/df3f097b-ff35-4ea6-b9b1-10d0b370c5d7.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/df672aad-6260-4649-870b-5d7cf1f30592.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/df672aad-6260-4649-870b-5d7cf1f30592.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/df672aad-6260-4649-870b-5d7cf1f30592.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/df672aad-6260-4649-870b-5d7cf1f30592.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/df6b3950-86e5-4c6a-8ed9-b10f1e248a59.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/df6b3950-86e5-4c6a-8ed9-b10f1e248a59.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/df6b3950-86e5-4c6a-8ed9-b10f1e248a59.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/df6b3950-86e5-4c6a-8ed9-b10f1e248a59.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/df978083-4166-4d35-bde7-7e31c1990f54.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/df978083-4166-4d35-bde7-7e31c1990f54.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/df978083-4166-4d35-bde7-7e31c1990f54.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/df978083-4166-4d35-bde7-7e31c1990f54.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dfc24953-fb1c-4c45-81ca-5134d1c30600.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dfc24953-fb1c-4c45-81ca-5134d1c30600.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dfc24953-fb1c-4c45-81ca-5134d1c30600.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dfc24953-fb1c-4c45-81ca-5134d1c30600.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dffc7acc-118c-4a72-ab68-e8a8adce0e3a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dffc7acc-118c-4a72-ab68-e8a8adce0e3a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dffc7acc-118c-4a72-ab68-e8a8adce0e3a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/dffc7acc-118c-4a72-ab68-e8a8adce0e3a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e0139510-8817-4dce-80a2-8ef23bcf94c1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e0139510-8817-4dce-80a2-8ef23bcf94c1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e0139510-8817-4dce-80a2-8ef23bcf94c1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e0139510-8817-4dce-80a2-8ef23bcf94c1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e01cc7d4-fa13-4397-93d5-a36d32e2f132.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e01cc7d4-fa13-4397-93d5-a36d32e2f132.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e01cc7d4-fa13-4397-93d5-a36d32e2f132.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e01cc7d4-fa13-4397-93d5-a36d32e2f132.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e021c8ab-48fb-419b-9b4e-b2328f94eb2b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e021c8ab-48fb-419b-9b4e-b2328f94eb2b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e021c8ab-48fb-419b-9b4e-b2328f94eb2b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e021c8ab-48fb-419b-9b4e-b2328f94eb2b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e036aae9-9225-4a04-9303-07d04e721a33.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e036aae9-9225-4a04-9303-07d04e721a33.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e036aae9-9225-4a04-9303-07d04e721a33.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e036aae9-9225-4a04-9303-07d04e721a33.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e04eee0e-1f82-40c4-8b72-a38f74c59362.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e04eee0e-1f82-40c4-8b72-a38f74c59362.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e04eee0e-1f82-40c4-8b72-a38f74c59362.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e04eee0e-1f82-40c4-8b72-a38f74c59362.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e0840ab1-0093-4a38-aa43-b4adebb7f1b0.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e0840ab1-0093-4a38-aa43-b4adebb7f1b0.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e0840ab1-0093-4a38-aa43-b4adebb7f1b0.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e0840ab1-0093-4a38-aa43-b4adebb7f1b0.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e0c1bcd5-6832-4ec0-b4fa-70d3bd4baab4.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e0c1bcd5-6832-4ec0-b4fa-70d3bd4baab4.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e0c1bcd5-6832-4ec0-b4fa-70d3bd4baab4.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e0c1bcd5-6832-4ec0-b4fa-70d3bd4baab4.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e0d1de8b-5064-4785-b8d6-dcceb77f5870.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e0d1de8b-5064-4785-b8d6-dcceb77f5870.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e0d1de8b-5064-4785-b8d6-dcceb77f5870.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e0d1de8b-5064-4785-b8d6-dcceb77f5870.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e0de03aa-42a6-4e7d-84ab-12285e0beb15.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e0de03aa-42a6-4e7d-84ab-12285e0beb15.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e0de03aa-42a6-4e7d-84ab-12285e0beb15.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e0de03aa-42a6-4e7d-84ab-12285e0beb15.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e0fd9704-e220-468f-bf42-6e0b13353cc8.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e0fd9704-e220-468f-bf42-6e0b13353cc8.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e0fd9704-e220-468f-bf42-6e0b13353cc8.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e0fd9704-e220-468f-bf42-6e0b13353cc8.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e1197fbc-e575-4d56-b2c2-38c97611143c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e1197fbc-e575-4d56-b2c2-38c97611143c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e1197fbc-e575-4d56-b2c2-38c97611143c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e1197fbc-e575-4d56-b2c2-38c97611143c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e11d0161-0f04-4ad4-a43e-5bb0170339f3.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e11d0161-0f04-4ad4-a43e-5bb0170339f3.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e11d0161-0f04-4ad4-a43e-5bb0170339f3.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e11d0161-0f04-4ad4-a43e-5bb0170339f3.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e12afd54-f3a9-4eea-b17d-030700d95403.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e12afd54-f3a9-4eea-b17d-030700d95403.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e12afd54-f3a9-4eea-b17d-030700d95403.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e12afd54-f3a9-4eea-b17d-030700d95403.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e14ba3c1-0f14-484e-ae7d-c9d25ac99f01.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e14ba3c1-0f14-484e-ae7d-c9d25ac99f01.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e14ba3c1-0f14-484e-ae7d-c9d25ac99f01.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e14ba3c1-0f14-484e-ae7d-c9d25ac99f01.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e1845e46-f0e9-48a9-bc5d-1e569d832c96.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e1845e46-f0e9-48a9-bc5d-1e569d832c96.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e1845e46-f0e9-48a9-bc5d-1e569d832c96.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e1845e46-f0e9-48a9-bc5d-1e569d832c96.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e1c1f7ea-5cf2-4b1e-b603-6c3767458a59.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e1c1f7ea-5cf2-4b1e-b603-6c3767458a59.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e1c1f7ea-5cf2-4b1e-b603-6c3767458a59.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e1c1f7ea-5cf2-4b1e-b603-6c3767458a59.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e1ef25e7-0028-4b61-b732-9cec3e454273.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e1ef25e7-0028-4b61-b732-9cec3e454273.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e1ef25e7-0028-4b61-b732-9cec3e454273.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e1ef25e7-0028-4b61-b732-9cec3e454273.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e1f88a23-289b-44f2-8a55-02cbfab628ce.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e1f88a23-289b-44f2-8a55-02cbfab628ce.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e1f88a23-289b-44f2-8a55-02cbfab628ce.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e1f88a23-289b-44f2-8a55-02cbfab628ce.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e20adb8c-bbff-484c-b2f2-62053097c2f4.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e20adb8c-bbff-484c-b2f2-62053097c2f4.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e20adb8c-bbff-484c-b2f2-62053097c2f4.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e20adb8c-bbff-484c-b2f2-62053097c2f4.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e20d8e75-79ef-4ca6-9a82-f2e18a3accb6.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e20d8e75-79ef-4ca6-9a82-f2e18a3accb6.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e20d8e75-79ef-4ca6-9a82-f2e18a3accb6.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e20d8e75-79ef-4ca6-9a82-f2e18a3accb6.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e21f2332-4aff-4ee8-b613-ed5d368817cf.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e21f2332-4aff-4ee8-b613-ed5d368817cf.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e21f2332-4aff-4ee8-b613-ed5d368817cf.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e21f2332-4aff-4ee8-b613-ed5d368817cf.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e24732ac-f76d-4be4-8791-d18ddcf220a6.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e24732ac-f76d-4be4-8791-d18ddcf220a6.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e24732ac-f76d-4be4-8791-d18ddcf220a6.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e24732ac-f76d-4be4-8791-d18ddcf220a6.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e259092e-bd97-4eff-9dee-547f93b3d369.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e259092e-bd97-4eff-9dee-547f93b3d369.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e259092e-bd97-4eff-9dee-547f93b3d369.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e259092e-bd97-4eff-9dee-547f93b3d369.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e25aa899-1c2d-4d02-afa8-53d6b164d033.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e25aa899-1c2d-4d02-afa8-53d6b164d033.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e25aa899-1c2d-4d02-afa8-53d6b164d033.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e25aa899-1c2d-4d02-afa8-53d6b164d033.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e26e7d22-e431-416a-89a3-cbc25eab3b2c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e26e7d22-e431-416a-89a3-cbc25eab3b2c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e26e7d22-e431-416a-89a3-cbc25eab3b2c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e26e7d22-e431-416a-89a3-cbc25eab3b2c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e28bc514-04d5-4deb-8395-4782b0d69e7f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e28bc514-04d5-4deb-8395-4782b0d69e7f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e28bc514-04d5-4deb-8395-4782b0d69e7f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e28bc514-04d5-4deb-8395-4782b0d69e7f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e2bf91b0-5451-46eb-b196-5838e958e50e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e2bf91b0-5451-46eb-b196-5838e958e50e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e2bf91b0-5451-46eb-b196-5838e958e50e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e2bf91b0-5451-46eb-b196-5838e958e50e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e2c975f8-f3b4-4fbe-9a37-89b56686110b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e2c975f8-f3b4-4fbe-9a37-89b56686110b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e2c975f8-f3b4-4fbe-9a37-89b56686110b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e2c975f8-f3b4-4fbe-9a37-89b56686110b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e2cd996c-9352-4a6b-90f6-47b8383ecdb1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e2cd996c-9352-4a6b-90f6-47b8383ecdb1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e2cd996c-9352-4a6b-90f6-47b8383ecdb1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e2cd996c-9352-4a6b-90f6-47b8383ecdb1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e2d172b2-ca3b-4e75-ad86-f53df61ab7f9.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e2d172b2-ca3b-4e75-ad86-f53df61ab7f9.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e2d172b2-ca3b-4e75-ad86-f53df61ab7f9.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e2d172b2-ca3b-4e75-ad86-f53df61ab7f9.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e2e487fa-847e-4a87-a3ad-5d25758a87c0.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e2e487fa-847e-4a87-a3ad-5d25758a87c0.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e2e487fa-847e-4a87-a3ad-5d25758a87c0.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e2e487fa-847e-4a87-a3ad-5d25758a87c0.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e2f091b7-f200-44aa-a18f-24bd4cba4aae.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e2f091b7-f200-44aa-a18f-24bd4cba4aae.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e2f091b7-f200-44aa-a18f-24bd4cba4aae.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e2f091b7-f200-44aa-a18f-24bd4cba4aae.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e2f502dc-0caf-4aab-b895-f6d7f14ced54.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e2f502dc-0caf-4aab-b895-f6d7f14ced54.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e2f502dc-0caf-4aab-b895-f6d7f14ced54.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e2f502dc-0caf-4aab-b895-f6d7f14ced54.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e3232a47-e92a-4956-9dbd-0eef45a6dcd0.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e3232a47-e92a-4956-9dbd-0eef45a6dcd0.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e3232a47-e92a-4956-9dbd-0eef45a6dcd0.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e3232a47-e92a-4956-9dbd-0eef45a6dcd0.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e328d76f-e619-4f35-81ab-528b05b35cca.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e328d76f-e619-4f35-81ab-528b05b35cca.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e328d76f-e619-4f35-81ab-528b05b35cca.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e328d76f-e619-4f35-81ab-528b05b35cca.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e3466fd5-f2b2-4d38-a51c-f6e66a0f070a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e3466fd5-f2b2-4d38-a51c-f6e66a0f070a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e3466fd5-f2b2-4d38-a51c-f6e66a0f070a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e3466fd5-f2b2-4d38-a51c-f6e66a0f070a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e34aaa46-438c-4081-a2fc-1131b1f0c230.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e34aaa46-438c-4081-a2fc-1131b1f0c230.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e34aaa46-438c-4081-a2fc-1131b1f0c230.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e34aaa46-438c-4081-a2fc-1131b1f0c230.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e3621acd-b0df-42fb-a50c-c21122527c95.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e3621acd-b0df-42fb-a50c-c21122527c95.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e3621acd-b0df-42fb-a50c-c21122527c95.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e3621acd-b0df-42fb-a50c-c21122527c95.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e366524e-3585-4481-90a8-b8f17a369c8e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e366524e-3585-4481-90a8-b8f17a369c8e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e366524e-3585-4481-90a8-b8f17a369c8e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e366524e-3585-4481-90a8-b8f17a369c8e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e37477bb-fed0-4834-b7ff-39fbe6e9b397.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e37477bb-fed0-4834-b7ff-39fbe6e9b397.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e37477bb-fed0-4834-b7ff-39fbe6e9b397.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e37477bb-fed0-4834-b7ff-39fbe6e9b397.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e38a4339-9d1b-4677-a6ab-043309e27344.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e38a4339-9d1b-4677-a6ab-043309e27344.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e38a4339-9d1b-4677-a6ab-043309e27344.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e38a4339-9d1b-4677-a6ab-043309e27344.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e3fd9ac4-1ad4-47b3-9b41-59f26e2b4c30.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e3fd9ac4-1ad4-47b3-9b41-59f26e2b4c30.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e3fd9ac4-1ad4-47b3-9b41-59f26e2b4c30.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e3fd9ac4-1ad4-47b3-9b41-59f26e2b4c30.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e4292c75-e2d8-4259-a66b-9af3140d0050.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e4292c75-e2d8-4259-a66b-9af3140d0050.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e4292c75-e2d8-4259-a66b-9af3140d0050.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e4292c75-e2d8-4259-a66b-9af3140d0050.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e4891e88-8462-443f-acce-5b6833da6c5c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e4891e88-8462-443f-acce-5b6833da6c5c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e4891e88-8462-443f-acce-5b6833da6c5c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e4891e88-8462-443f-acce-5b6833da6c5c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e48930c2-567b-4af9-9d89-d221c70ac559.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e48930c2-567b-4af9-9d89-d221c70ac559.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e48930c2-567b-4af9-9d89-d221c70ac559.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e48930c2-567b-4af9-9d89-d221c70ac559.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e4e40c9e-8602-4a5c-8c25-c5fa74bef0f3.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e4e40c9e-8602-4a5c-8c25-c5fa74bef0f3.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e4e40c9e-8602-4a5c-8c25-c5fa74bef0f3.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e4e40c9e-8602-4a5c-8c25-c5fa74bef0f3.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e4f7a853-a7d8-4931-ba70-1e790a276224.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e4f7a853-a7d8-4931-ba70-1e790a276224.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e4f7a853-a7d8-4931-ba70-1e790a276224.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e4f7a853-a7d8-4931-ba70-1e790a276224.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e50a04bf-9423-4fc0-b599-eb301d0483a9.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e50a04bf-9423-4fc0-b599-eb301d0483a9.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e50a04bf-9423-4fc0-b599-eb301d0483a9.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e50a04bf-9423-4fc0-b599-eb301d0483a9.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e50bad9e-4513-4c4a-8223-beca0d00a21d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e50bad9e-4513-4c4a-8223-beca0d00a21d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e50bad9e-4513-4c4a-8223-beca0d00a21d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e50bad9e-4513-4c4a-8223-beca0d00a21d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e50f184c-fcc1-4bdf-99b6-370c32ce17b3.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e50f184c-fcc1-4bdf-99b6-370c32ce17b3.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e50f184c-fcc1-4bdf-99b6-370c32ce17b3.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e50f184c-fcc1-4bdf-99b6-370c32ce17b3.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e511ef52-f783-4354-9ec1-1f09fabb9d18.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e511ef52-f783-4354-9ec1-1f09fabb9d18.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e511ef52-f783-4354-9ec1-1f09fabb9d18.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e511ef52-f783-4354-9ec1-1f09fabb9d18.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e5423de5-871e-4769-81a6-3f1608285e0a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e5423de5-871e-4769-81a6-3f1608285e0a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e5423de5-871e-4769-81a6-3f1608285e0a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e5423de5-871e-4769-81a6-3f1608285e0a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e554b0f3-ba22-42b3-8adb-197b06550be6.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e554b0f3-ba22-42b3-8adb-197b06550be6.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e554b0f3-ba22-42b3-8adb-197b06550be6.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e554b0f3-ba22-42b3-8adb-197b06550be6.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e56061e4-36d0-4cd5-aa9b-2be467e15b68.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e56061e4-36d0-4cd5-aa9b-2be467e15b68.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e56061e4-36d0-4cd5-aa9b-2be467e15b68.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e56061e4-36d0-4cd5-aa9b-2be467e15b68.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e59e4a28-9d1c-4353-832f-5b2d31b51489.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e59e4a28-9d1c-4353-832f-5b2d31b51489.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e59e4a28-9d1c-4353-832f-5b2d31b51489.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e59e4a28-9d1c-4353-832f-5b2d31b51489.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e5a1bcd2-3437-4f63-a3a3-a09c82dab251.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e5a1bcd2-3437-4f63-a3a3-a09c82dab251.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e5a1bcd2-3437-4f63-a3a3-a09c82dab251.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e5a1bcd2-3437-4f63-a3a3-a09c82dab251.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e5c98240-cf56-4d15-9b3b-8cfed1a798ce.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e5c98240-cf56-4d15-9b3b-8cfed1a798ce.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e5c98240-cf56-4d15-9b3b-8cfed1a798ce.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e5c98240-cf56-4d15-9b3b-8cfed1a798ce.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e5ce389f-c652-4dff-93ae-1af5e06bca9d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e5ce389f-c652-4dff-93ae-1af5e06bca9d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e5ce389f-c652-4dff-93ae-1af5e06bca9d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e5ce389f-c652-4dff-93ae-1af5e06bca9d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e5f5d563-4af7-4ff9-9066-95f14843ab03.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e5f5d563-4af7-4ff9-9066-95f14843ab03.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e5f5d563-4af7-4ff9-9066-95f14843ab03.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e5f5d563-4af7-4ff9-9066-95f14843ab03.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e61f0aa1-07d7-401c-9549-d05f6c653204.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e61f0aa1-07d7-401c-9549-d05f6c653204.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e61f0aa1-07d7-401c-9549-d05f6c653204.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e61f0aa1-07d7-401c-9549-d05f6c653204.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e63b0993-85cb-45e2-ba94-7b00553339f2.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e63b0993-85cb-45e2-ba94-7b00553339f2.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e63b0993-85cb-45e2-ba94-7b00553339f2.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e63b0993-85cb-45e2-ba94-7b00553339f2.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e647cfef-b33d-4d77-8ca8-0dc11f72b2e6.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e647cfef-b33d-4d77-8ca8-0dc11f72b2e6.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e647cfef-b33d-4d77-8ca8-0dc11f72b2e6.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e647cfef-b33d-4d77-8ca8-0dc11f72b2e6.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e65459fe-aa59-4682-a569-14ab1b627bd7.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e65459fe-aa59-4682-a569-14ab1b627bd7.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e65459fe-aa59-4682-a569-14ab1b627bd7.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e65459fe-aa59-4682-a569-14ab1b627bd7.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e6d95156-cc2f-4e7b-80c3-54703aff398c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e6d95156-cc2f-4e7b-80c3-54703aff398c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e6d95156-cc2f-4e7b-80c3-54703aff398c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e6d95156-cc2f-4e7b-80c3-54703aff398c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e6daad7b-ee4a-4091-80db-2820b4094643.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e6daad7b-ee4a-4091-80db-2820b4094643.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e6daad7b-ee4a-4091-80db-2820b4094643.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e6daad7b-ee4a-4091-80db-2820b4094643.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e6f8dd05-6235-4c82-8d3e-7e9ad1967090.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e6f8dd05-6235-4c82-8d3e-7e9ad1967090.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e6f8dd05-6235-4c82-8d3e-7e9ad1967090.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e6f8dd05-6235-4c82-8d3e-7e9ad1967090.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e6ffd46d-ba7f-4313-b72e-abdf2433ddb4.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e6ffd46d-ba7f-4313-b72e-abdf2433ddb4.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e6ffd46d-ba7f-4313-b72e-abdf2433ddb4.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e6ffd46d-ba7f-4313-b72e-abdf2433ddb4.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e7045f8b-9dad-4f3e-9e2e-f1312bc98e89.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e7045f8b-9dad-4f3e-9e2e-f1312bc98e89.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e7045f8b-9dad-4f3e-9e2e-f1312bc98e89.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e7045f8b-9dad-4f3e-9e2e-f1312bc98e89.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e70c79e9-1820-42c1-915b-2fa3a0b8dc21.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e70c79e9-1820-42c1-915b-2fa3a0b8dc21.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e70c79e9-1820-42c1-915b-2fa3a0b8dc21.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e70c79e9-1820-42c1-915b-2fa3a0b8dc21.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e724c9c2-ff78-45c5-92a5-ab5036de9d79.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e724c9c2-ff78-45c5-92a5-ab5036de9d79.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e724c9c2-ff78-45c5-92a5-ab5036de9d79.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e724c9c2-ff78-45c5-92a5-ab5036de9d79.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e732d3dc-15bf-452c-a295-7e191407cdb1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e732d3dc-15bf-452c-a295-7e191407cdb1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e732d3dc-15bf-452c-a295-7e191407cdb1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e732d3dc-15bf-452c-a295-7e191407cdb1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e74b0664-df4d-496f-b67a-7df59c41106d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e74b0664-df4d-496f-b67a-7df59c41106d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e74b0664-df4d-496f-b67a-7df59c41106d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e74b0664-df4d-496f-b67a-7df59c41106d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e770b7d5-cb51-4ffa-819b-184c1c8423df.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e770b7d5-cb51-4ffa-819b-184c1c8423df.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e770b7d5-cb51-4ffa-819b-184c1c8423df.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e770b7d5-cb51-4ffa-819b-184c1c8423df.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e77dd289-6724-42c2-aa87-0c94d5cd919b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e77dd289-6724-42c2-aa87-0c94d5cd919b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e77dd289-6724-42c2-aa87-0c94d5cd919b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e77dd289-6724-42c2-aa87-0c94d5cd919b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e7948170-2e05-4cfd-854b-d7f1a299cb7b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e7948170-2e05-4cfd-854b-d7f1a299cb7b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e7948170-2e05-4cfd-854b-d7f1a299cb7b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e7948170-2e05-4cfd-854b-d7f1a299cb7b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e7abe2e0-36b0-4b2f-8540-95fd1e24639e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e7abe2e0-36b0-4b2f-8540-95fd1e24639e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e7abe2e0-36b0-4b2f-8540-95fd1e24639e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e7abe2e0-36b0-4b2f-8540-95fd1e24639e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e7deb74c-bd71-4cc6-baf3-7910b699a9aa.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e7deb74c-bd71-4cc6-baf3-7910b699a9aa.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e7deb74c-bd71-4cc6-baf3-7910b699a9aa.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e7deb74c-bd71-4cc6-baf3-7910b699a9aa.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e8473f48-13ec-4a04-8191-078fc96b50ee.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e8473f48-13ec-4a04-8191-078fc96b50ee.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e8473f48-13ec-4a04-8191-078fc96b50ee.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e8473f48-13ec-4a04-8191-078fc96b50ee.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e8499ac6-2f6b-4c89-b571-7f3945d0cf6f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e8499ac6-2f6b-4c89-b571-7f3945d0cf6f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e8499ac6-2f6b-4c89-b571-7f3945d0cf6f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e8499ac6-2f6b-4c89-b571-7f3945d0cf6f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e87189c5-245b-4a3c-8881-f9de5e155430.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e87189c5-245b-4a3c-8881-f9de5e155430.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e87189c5-245b-4a3c-8881-f9de5e155430.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e87189c5-245b-4a3c-8881-f9de5e155430.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e8aea8b5-53d7-4879-9026-51594e4b86bc.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e8aea8b5-53d7-4879-9026-51594e4b86bc.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e8aea8b5-53d7-4879-9026-51594e4b86bc.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e8aea8b5-53d7-4879-9026-51594e4b86bc.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e8b59740-7d01-4bbd-837e-65cdb7fa9fa4.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e8b59740-7d01-4bbd-837e-65cdb7fa9fa4.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e8b59740-7d01-4bbd-837e-65cdb7fa9fa4.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e8b59740-7d01-4bbd-837e-65cdb7fa9fa4.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e8e4493b-a728-44b3-ba93-4810bafb9857.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e8e4493b-a728-44b3-ba93-4810bafb9857.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e8e4493b-a728-44b3-ba93-4810bafb9857.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e8e4493b-a728-44b3-ba93-4810bafb9857.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e8fc8cc7-8de3-49e8-871f-a8a172bdeb29.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e8fc8cc7-8de3-49e8-871f-a8a172bdeb29.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e8fc8cc7-8de3-49e8-871f-a8a172bdeb29.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e8fc8cc7-8de3-49e8-871f-a8a172bdeb29.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e906629d-df55-4148-a0e4-3e9c3a3b377b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e906629d-df55-4148-a0e4-3e9c3a3b377b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e906629d-df55-4148-a0e4-3e9c3a3b377b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e906629d-df55-4148-a0e4-3e9c3a3b377b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e92228c6-6290-493b-b054-3c3e8d2a6121.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e92228c6-6290-493b-b054-3c3e8d2a6121.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e92228c6-6290-493b-b054-3c3e8d2a6121.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e92228c6-6290-493b-b054-3c3e8d2a6121.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e93603fa-a1dc-48ce-925c-da45afbbb7d7.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e93603fa-a1dc-48ce-925c-da45afbbb7d7.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e93603fa-a1dc-48ce-925c-da45afbbb7d7.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e93603fa-a1dc-48ce-925c-da45afbbb7d7.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e95092c5-212e-49a1-9a7a-79f2a34dfb46.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e95092c5-212e-49a1-9a7a-79f2a34dfb46.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e95092c5-212e-49a1-9a7a-79f2a34dfb46.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e95092c5-212e-49a1-9a7a-79f2a34dfb46.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e96393f3-d10e-4a73-8100-ca67a9144900.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e96393f3-d10e-4a73-8100-ca67a9144900.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e96393f3-d10e-4a73-8100-ca67a9144900.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e96393f3-d10e-4a73-8100-ca67a9144900.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e97986e8-177e-4738-bc80-46d82a613918.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e97986e8-177e-4738-bc80-46d82a613918.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e97986e8-177e-4738-bc80-46d82a613918.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e97986e8-177e-4738-bc80-46d82a613918.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e99ce3c5-bc35-4c73-be0e-2d6b4e4a9e8a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e99ce3c5-bc35-4c73-be0e-2d6b4e4a9e8a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e99ce3c5-bc35-4c73-be0e-2d6b4e4a9e8a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e99ce3c5-bc35-4c73-be0e-2d6b4e4a9e8a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e9a77a26-9c82-4301-b270-6ba338ba0f4d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e9a77a26-9c82-4301-b270-6ba338ba0f4d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e9a77a26-9c82-4301-b270-6ba338ba0f4d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e9a77a26-9c82-4301-b270-6ba338ba0f4d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e9bfc7eb-a470-4a02-a11b-527ba5a240ac.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e9bfc7eb-a470-4a02-a11b-527ba5a240ac.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e9bfc7eb-a470-4a02-a11b-527ba5a240ac.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e9bfc7eb-a470-4a02-a11b-527ba5a240ac.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e9dc919f-4e59-4c64-ab94-2dffbbc7a5a3.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e9dc919f-4e59-4c64-ab94-2dffbbc7a5a3.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e9dc919f-4e59-4c64-ab94-2dffbbc7a5a3.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e9dc919f-4e59-4c64-ab94-2dffbbc7a5a3.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e9f51f4f-fad9-4edf-abd4-24099d05e54b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e9f51f4f-fad9-4edf-abd4-24099d05e54b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e9f51f4f-fad9-4edf-abd4-24099d05e54b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/e9f51f4f-fad9-4edf-abd4-24099d05e54b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ea1167e8-0aee-4310-a9de-1b75954412bf.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ea1167e8-0aee-4310-a9de-1b75954412bf.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ea1167e8-0aee-4310-a9de-1b75954412bf.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ea1167e8-0aee-4310-a9de-1b75954412bf.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ea29d1a5-be1b-48ed-b4f4-28ddfc177ff5.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ea29d1a5-be1b-48ed-b4f4-28ddfc177ff5.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ea29d1a5-be1b-48ed-b4f4-28ddfc177ff5.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ea29d1a5-be1b-48ed-b4f4-28ddfc177ff5.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ea2b9b37-e086-4904-a323-be0d6f7841e8.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ea2b9b37-e086-4904-a323-be0d6f7841e8.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ea2b9b37-e086-4904-a323-be0d6f7841e8.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ea2b9b37-e086-4904-a323-be0d6f7841e8.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ea3ce5a8-b0ce-4bcc-bed1-fbc224f93397.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ea3ce5a8-b0ce-4bcc-bed1-fbc224f93397.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ea3ce5a8-b0ce-4bcc-bed1-fbc224f93397.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ea3ce5a8-b0ce-4bcc-bed1-fbc224f93397.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ea42072e-e23d-476e-baef-67a96abd75cc.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ea42072e-e23d-476e-baef-67a96abd75cc.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ea42072e-e23d-476e-baef-67a96abd75cc.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ea42072e-e23d-476e-baef-67a96abd75cc.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ea470a38-70d4-4233-b8be-2d0cfa2b6c0f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ea470a38-70d4-4233-b8be-2d0cfa2b6c0f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ea470a38-70d4-4233-b8be-2d0cfa2b6c0f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ea470a38-70d4-4233-b8be-2d0cfa2b6c0f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ea6a5fc6-6480-4ded-a40b-2814b4aed932.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ea6a5fc6-6480-4ded-a40b-2814b4aed932.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ea6a5fc6-6480-4ded-a40b-2814b4aed932.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ea6a5fc6-6480-4ded-a40b-2814b4aed932.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ea967dd8-b65e-4ec9-ade6-4220847f5e3b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ea967dd8-b65e-4ec9-ade6-4220847f5e3b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ea967dd8-b65e-4ec9-ade6-4220847f5e3b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ea967dd8-b65e-4ec9-ade6-4220847f5e3b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/eaa15df6-2e24-445e-bf63-f1d7b9cfc18d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/eaa15df6-2e24-445e-bf63-f1d7b9cfc18d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/eaa15df6-2e24-445e-bf63-f1d7b9cfc18d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/eaa15df6-2e24-445e-bf63-f1d7b9cfc18d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/eaa9dc66-c505-4b0f-a025-a28a72894981.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/eaa9dc66-c505-4b0f-a025-a28a72894981.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/eaa9dc66-c505-4b0f-a025-a28a72894981.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/eaa9dc66-c505-4b0f-a025-a28a72894981.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/eab50f04-7194-4024-8758-0cfe7fee2bb3.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/eab50f04-7194-4024-8758-0cfe7fee2bb3.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/eab50f04-7194-4024-8758-0cfe7fee2bb3.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/eab50f04-7194-4024-8758-0cfe7fee2bb3.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/eabb08e9-23aa-4a18-9aed-f2c7839a098b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/eabb08e9-23aa-4a18-9aed-f2c7839a098b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/eabb08e9-23aa-4a18-9aed-f2c7839a098b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/eabb08e9-23aa-4a18-9aed-f2c7839a098b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ead182f2-3b41-454e-b487-5b2e73fac43c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ead182f2-3b41-454e-b487-5b2e73fac43c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ead182f2-3b41-454e-b487-5b2e73fac43c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ead182f2-3b41-454e-b487-5b2e73fac43c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/eaf72bb6-1ecf-4b13-acab-772f3ac70e43.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/eaf72bb6-1ecf-4b13-acab-772f3ac70e43.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/eaf72bb6-1ecf-4b13-acab-772f3ac70e43.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/eaf72bb6-1ecf-4b13-acab-772f3ac70e43.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/eb0b4ad1-eaeb-4263-846b-18e45141329e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/eb0b4ad1-eaeb-4263-846b-18e45141329e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/eb0b4ad1-eaeb-4263-846b-18e45141329e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/eb0b4ad1-eaeb-4263-846b-18e45141329e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/eb4001f4-59ef-4b23-8d97-3a4566067a0c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/eb4001f4-59ef-4b23-8d97-3a4566067a0c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/eb4001f4-59ef-4b23-8d97-3a4566067a0c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/eb4001f4-59ef-4b23-8d97-3a4566067a0c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/eb54cc9d-0fb9-4716-922a-c3cd87fdd597.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/eb54cc9d-0fb9-4716-922a-c3cd87fdd597.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/eb54cc9d-0fb9-4716-922a-c3cd87fdd597.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/eb54cc9d-0fb9-4716-922a-c3cd87fdd597.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/eb7fa4bf-07b7-4eef-9a89-7e0a1f62e254.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/eb7fa4bf-07b7-4eef-9a89-7e0a1f62e254.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/eb7fa4bf-07b7-4eef-9a89-7e0a1f62e254.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/eb7fa4bf-07b7-4eef-9a89-7e0a1f62e254.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/eb9f6eaa-1ea2-43ce-a05c-c17153656270.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/eb9f6eaa-1ea2-43ce-a05c-c17153656270.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/eb9f6eaa-1ea2-43ce-a05c-c17153656270.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/eb9f6eaa-1ea2-43ce-a05c-c17153656270.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/eba20b77-b8ae-4fad-bfc3-8088beb6dbeb.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/eba20b77-b8ae-4fad-bfc3-8088beb6dbeb.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/eba20b77-b8ae-4fad-bfc3-8088beb6dbeb.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/eba20b77-b8ae-4fad-bfc3-8088beb6dbeb.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/eba6dec9-f975-44cc-b97a-9233ed1a16c7.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/eba6dec9-f975-44cc-b97a-9233ed1a16c7.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/eba6dec9-f975-44cc-b97a-9233ed1a16c7.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/eba6dec9-f975-44cc-b97a-9233ed1a16c7.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/eba9dd24-9823-403d-b470-903e78d31354.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/eba9dd24-9823-403d-b470-903e78d31354.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/eba9dd24-9823-403d-b470-903e78d31354.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/eba9dd24-9823-403d-b470-903e78d31354.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ebaf196a-9b0d-4269-ad9b-2413e4f8a8a7.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ebaf196a-9b0d-4269-ad9b-2413e4f8a8a7.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ebaf196a-9b0d-4269-ad9b-2413e4f8a8a7.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ebaf196a-9b0d-4269-ad9b-2413e4f8a8a7.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ebbb1f11-a2f6-4497-b88a-b3b428806a26.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ebbb1f11-a2f6-4497-b88a-b3b428806a26.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ebbb1f11-a2f6-4497-b88a-b3b428806a26.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ebbb1f11-a2f6-4497-b88a-b3b428806a26.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ebbce8bc-254f-433f-aae7-e5397eb5ca20.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ebbce8bc-254f-433f-aae7-e5397eb5ca20.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ebbce8bc-254f-433f-aae7-e5397eb5ca20.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ebbce8bc-254f-433f-aae7-e5397eb5ca20.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ebbe7396-7a11-4bea-a164-4c9300157118.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ebbe7396-7a11-4bea-a164-4c9300157118.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ebbe7396-7a11-4bea-a164-4c9300157118.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ebbe7396-7a11-4bea-a164-4c9300157118.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ebd4c816-2ce2-41e1-9da2-4333f24801a6.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ebd4c816-2ce2-41e1-9da2-4333f24801a6.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ebd4c816-2ce2-41e1-9da2-4333f24801a6.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ebd4c816-2ce2-41e1-9da2-4333f24801a6.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ebf3a214-51a0-4be1-a504-78a087421e5c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ebf3a214-51a0-4be1-a504-78a087421e5c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ebf3a214-51a0-4be1-a504-78a087421e5c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ebf3a214-51a0-4be1-a504-78a087421e5c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ec225b5f-4899-484b-8c73-f958c3278381.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ec225b5f-4899-484b-8c73-f958c3278381.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ec225b5f-4899-484b-8c73-f958c3278381.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ec225b5f-4899-484b-8c73-f958c3278381.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ec2a9324-33db-4bae-8154-ba991ea43e9e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ec2a9324-33db-4bae-8154-ba991ea43e9e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ec2a9324-33db-4bae-8154-ba991ea43e9e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ec2a9324-33db-4bae-8154-ba991ea43e9e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ec424bcc-0e56-48c4-af72-cab32dcedfda.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ec424bcc-0e56-48c4-af72-cab32dcedfda.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ec424bcc-0e56-48c4-af72-cab32dcedfda.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ec424bcc-0e56-48c4-af72-cab32dcedfda.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ec56bd05-43dd-4ad9-8118-722afd703f35.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ec56bd05-43dd-4ad9-8118-722afd703f35.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ec56bd05-43dd-4ad9-8118-722afd703f35.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ec56bd05-43dd-4ad9-8118-722afd703f35.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ec91accb-a5dd-44fd-868d-45a8eca637f9.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ec91accb-a5dd-44fd-868d-45a8eca637f9.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ec91accb-a5dd-44fd-868d-45a8eca637f9.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ec91accb-a5dd-44fd-868d-45a8eca637f9.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ecb9ba58-e97c-4d86-ab28-c903c027a224.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ecb9ba58-e97c-4d86-ab28-c903c027a224.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ecb9ba58-e97c-4d86-ab28-c903c027a224.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ecb9ba58-e97c-4d86-ab28-c903c027a224.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ecc43ce7-5a01-44cb-9fe9-2887e71e5801.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ecc43ce7-5a01-44cb-9fe9-2887e71e5801.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ecc43ce7-5a01-44cb-9fe9-2887e71e5801.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ecc43ce7-5a01-44cb-9fe9-2887e71e5801.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ecdaf686-e758-4f9a-958c-34c0b2b9c027.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ecdaf686-e758-4f9a-958c-34c0b2b9c027.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ecdaf686-e758-4f9a-958c-34c0b2b9c027.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ecdaf686-e758-4f9a-958c-34c0b2b9c027.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ecfa7440-6e12-4c36-9508-20f0ec69c56a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ecfa7440-6e12-4c36-9508-20f0ec69c56a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ecfa7440-6e12-4c36-9508-20f0ec69c56a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ecfa7440-6e12-4c36-9508-20f0ec69c56a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ed020ebd-a93f-4fbd-b863-f13f6fcfa3a9.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ed020ebd-a93f-4fbd-b863-f13f6fcfa3a9.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ed020ebd-a93f-4fbd-b863-f13f6fcfa3a9.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ed020ebd-a93f-4fbd-b863-f13f6fcfa3a9.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ed073b9e-2e87-41a9-aa98-0afd327f2861.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ed073b9e-2e87-41a9-aa98-0afd327f2861.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ed073b9e-2e87-41a9-aa98-0afd327f2861.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ed073b9e-2e87-41a9-aa98-0afd327f2861.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ed1f2268-76c5-43f4-a67e-6b8a7a2e72e8.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ed1f2268-76c5-43f4-a67e-6b8a7a2e72e8.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ed1f2268-76c5-43f4-a67e-6b8a7a2e72e8.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ed1f2268-76c5-43f4-a67e-6b8a7a2e72e8.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ed3cc0e0-80bb-48eb-95db-d8a94f7cd4ed.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ed3cc0e0-80bb-48eb-95db-d8a94f7cd4ed.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ed3cc0e0-80bb-48eb-95db-d8a94f7cd4ed.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ed3cc0e0-80bb-48eb-95db-d8a94f7cd4ed.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ed42b7d9-ea1e-4608-85f4-00b936b10b64.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ed42b7d9-ea1e-4608-85f4-00b936b10b64.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ed42b7d9-ea1e-4608-85f4-00b936b10b64.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ed42b7d9-ea1e-4608-85f4-00b936b10b64.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ed468912-cd97-40a5-92bd-caa5e5e725f2.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ed468912-cd97-40a5-92bd-caa5e5e725f2.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ed468912-cd97-40a5-92bd-caa5e5e725f2.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ed468912-cd97-40a5-92bd-caa5e5e725f2.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ed556613-ed39-4316-94ef-36eb22c94ad3.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ed556613-ed39-4316-94ef-36eb22c94ad3.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ed556613-ed39-4316-94ef-36eb22c94ad3.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ed556613-ed39-4316-94ef-36eb22c94ad3.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/edb7356f-7bbf-413d-85ea-df4c6e5090db.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/edb7356f-7bbf-413d-85ea-df4c6e5090db.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/edb7356f-7bbf-413d-85ea-df4c6e5090db.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/edb7356f-7bbf-413d-85ea-df4c6e5090db.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/edc7cae8-b08d-4f19-93d8-ce3d628a09fd.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/edc7cae8-b08d-4f19-93d8-ce3d628a09fd.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/edc7cae8-b08d-4f19-93d8-ce3d628a09fd.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/edc7cae8-b08d-4f19-93d8-ce3d628a09fd.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/edea375a-988d-4a02-ad23-679cbf3a4182.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/edea375a-988d-4a02-ad23-679cbf3a4182.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/edea375a-988d-4a02-ad23-679cbf3a4182.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/edea375a-988d-4a02-ad23-679cbf3a4182.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ee1da991-a34f-457f-b0e7-5916a84b77ac.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ee1da991-a34f-457f-b0e7-5916a84b77ac.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ee1da991-a34f-457f-b0e7-5916a84b77ac.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ee1da991-a34f-457f-b0e7-5916a84b77ac.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ee48d04b-abeb-4c14-b14a-d82731b77e88.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ee48d04b-abeb-4c14-b14a-d82731b77e88.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ee48d04b-abeb-4c14-b14a-d82731b77e88.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ee48d04b-abeb-4c14-b14a-d82731b77e88.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ee4e8c92-c10e-4773-a9aa-29d9e67890af.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ee4e8c92-c10e-4773-a9aa-29d9e67890af.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ee4e8c92-c10e-4773-a9aa-29d9e67890af.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ee4e8c92-c10e-4773-a9aa-29d9e67890af.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ee5f3b1e-0eb9-4468-b4b6-b18fa63a0041.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ee5f3b1e-0eb9-4468-b4b6-b18fa63a0041.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ee5f3b1e-0eb9-4468-b4b6-b18fa63a0041.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ee5f3b1e-0eb9-4468-b4b6-b18fa63a0041.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ee73d573-f4a5-42a0-9bbb-e6a47185c99b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ee73d573-f4a5-42a0-9bbb-e6a47185c99b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ee73d573-f4a5-42a0-9bbb-e6a47185c99b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ee73d573-f4a5-42a0-9bbb-e6a47185c99b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/eeb15cdf-2734-480a-bd9d-7c8917519622.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/eeb15cdf-2734-480a-bd9d-7c8917519622.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/eeb15cdf-2734-480a-bd9d-7c8917519622.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/eeb15cdf-2734-480a-bd9d-7c8917519622.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/eeba19c5-f0a8-4151-8b76-c15857bbdc58.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/eeba19c5-f0a8-4151-8b76-c15857bbdc58.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/eeba19c5-f0a8-4151-8b76-c15857bbdc58.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/eeba19c5-f0a8-4151-8b76-c15857bbdc58.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/eec33edd-41b9-4dda-a8d3-8a7659066d71.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/eec33edd-41b9-4dda-a8d3-8a7659066d71.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/eec33edd-41b9-4dda-a8d3-8a7659066d71.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/eec33edd-41b9-4dda-a8d3-8a7659066d71.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/eeda0068-26cb-4c21-8230-9383d1c08ecc.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/eeda0068-26cb-4c21-8230-9383d1c08ecc.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/eeda0068-26cb-4c21-8230-9383d1c08ecc.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/eeda0068-26cb-4c21-8230-9383d1c08ecc.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ef0102ed-1a3d-4892-a19c-60d148af633d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ef0102ed-1a3d-4892-a19c-60d148af633d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ef0102ed-1a3d-4892-a19c-60d148af633d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ef0102ed-1a3d-4892-a19c-60d148af633d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ef2a184a-1412-4d8e-b8d3-df9dd7e2b2e1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ef2a184a-1412-4d8e-b8d3-df9dd7e2b2e1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ef2a184a-1412-4d8e-b8d3-df9dd7e2b2e1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ef2a184a-1412-4d8e-b8d3-df9dd7e2b2e1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ef38f00c-b30f-4172-a8a4-6a76a66e1bf4.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ef38f00c-b30f-4172-a8a4-6a76a66e1bf4.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ef38f00c-b30f-4172-a8a4-6a76a66e1bf4.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ef38f00c-b30f-4172-a8a4-6a76a66e1bf4.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ef4f6c42-231c-46a1-b743-c941c7d15d46.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ef4f6c42-231c-46a1-b743-c941c7d15d46.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ef4f6c42-231c-46a1-b743-c941c7d15d46.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ef4f6c42-231c-46a1-b743-c941c7d15d46.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ef536a48-bc92-418a-a8bb-5f5b7aeb3977.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ef536a48-bc92-418a-a8bb-5f5b7aeb3977.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ef536a48-bc92-418a-a8bb-5f5b7aeb3977.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ef536a48-bc92-418a-a8bb-5f5b7aeb3977.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ef7613ed-944f-4166-8482-d22cdbca2432.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ef7613ed-944f-4166-8482-d22cdbca2432.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ef7613ed-944f-4166-8482-d22cdbca2432.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ef7613ed-944f-4166-8482-d22cdbca2432.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ef846337-8f83-4919-a052-e3cf15a6ca9e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ef846337-8f83-4919-a052-e3cf15a6ca9e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ef846337-8f83-4919-a052-e3cf15a6ca9e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ef846337-8f83-4919-a052-e3cf15a6ca9e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ef875c5f-4fb6-4668-8cac-a4f551d03b90.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ef875c5f-4fb6-4668-8cac-a4f551d03b90.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ef875c5f-4fb6-4668-8cac-a4f551d03b90.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ef875c5f-4fb6-4668-8cac-a4f551d03b90.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ef9f5700-f56a-4442-8bd2-372a465eadf7.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ef9f5700-f56a-4442-8bd2-372a465eadf7.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ef9f5700-f56a-4442-8bd2-372a465eadf7.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ef9f5700-f56a-4442-8bd2-372a465eadf7.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/efb191a1-4679-43ad-8a0c-9c43a543a9ca.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/efb191a1-4679-43ad-8a0c-9c43a543a9ca.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/efb191a1-4679-43ad-8a0c-9c43a543a9ca.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/efb191a1-4679-43ad-8a0c-9c43a543a9ca.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/efb6d16c-97c8-44c8-87e7-dfebb32c57d1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/efb6d16c-97c8-44c8-87e7-dfebb32c57d1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/efb6d16c-97c8-44c8-87e7-dfebb32c57d1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/efb6d16c-97c8-44c8-87e7-dfebb32c57d1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/efd56862-9b3d-446c-a0fb-23b31940bacd.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/efd56862-9b3d-446c-a0fb-23b31940bacd.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/efd56862-9b3d-446c-a0fb-23b31940bacd.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/efd56862-9b3d-446c-a0fb-23b31940bacd.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/efdaa812-6536-45e2-9a29-9339aa721668.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/efdaa812-6536-45e2-9a29-9339aa721668.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/efdaa812-6536-45e2-9a29-9339aa721668.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/efdaa812-6536-45e2-9a29-9339aa721668.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/efdd1963-1b73-458d-aa04-82ae71adc6e1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/efdd1963-1b73-458d-aa04-82ae71adc6e1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/efdd1963-1b73-458d-aa04-82ae71adc6e1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/efdd1963-1b73-458d-aa04-82ae71adc6e1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/eff0c31a-e446-48ce-9ff9-ced9e822f0e2.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/eff0c31a-e446-48ce-9ff9-ced9e822f0e2.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/eff0c31a-e446-48ce-9ff9-ced9e822f0e2.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/eff0c31a-e446-48ce-9ff9-ced9e822f0e2.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/effd231b-0291-41a8-8dfa-35b75d76c394.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/effd231b-0291-41a8-8dfa-35b75d76c394.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/effd231b-0291-41a8-8dfa-35b75d76c394.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/effd231b-0291-41a8-8dfa-35b75d76c394.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f01ab956-63fc-4ace-a27e-5c3547b879d2.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f01ab956-63fc-4ace-a27e-5c3547b879d2.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f01ab956-63fc-4ace-a27e-5c3547b879d2.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f01ab956-63fc-4ace-a27e-5c3547b879d2.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f03bc0da-9e68-4810-8c86-9a3f53487fb8.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f03bc0da-9e68-4810-8c86-9a3f53487fb8.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f03bc0da-9e68-4810-8c86-9a3f53487fb8.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f03bc0da-9e68-4810-8c86-9a3f53487fb8.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f042651b-a181-43e0-98d6-a2ca789681af.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f042651b-a181-43e0-98d6-a2ca789681af.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f042651b-a181-43e0-98d6-a2ca789681af.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f042651b-a181-43e0-98d6-a2ca789681af.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f05bd5c4-8db8-4764-b439-1ff91a0aec00.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f05bd5c4-8db8-4764-b439-1ff91a0aec00.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f05bd5c4-8db8-4764-b439-1ff91a0aec00.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f05bd5c4-8db8-4764-b439-1ff91a0aec00.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f061ead2-fdd6-4a9a-9200-f512c3f3d224.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f061ead2-fdd6-4a9a-9200-f512c3f3d224.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f061ead2-fdd6-4a9a-9200-f512c3f3d224.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f061ead2-fdd6-4a9a-9200-f512c3f3d224.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f073e117-c917-4e08-ab31-a41beaf3c508.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f073e117-c917-4e08-ab31-a41beaf3c508.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f073e117-c917-4e08-ab31-a41beaf3c508.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f073e117-c917-4e08-ab31-a41beaf3c508.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f07887c7-5c25-4a42-8c36-04be59af032e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f07887c7-5c25-4a42-8c36-04be59af032e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f07887c7-5c25-4a42-8c36-04be59af032e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f07887c7-5c25-4a42-8c36-04be59af032e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f09d2760-4103-44f3-9a08-127c7ea51b69.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f09d2760-4103-44f3-9a08-127c7ea51b69.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f09d2760-4103-44f3-9a08-127c7ea51b69.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f09d2760-4103-44f3-9a08-127c7ea51b69.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f0a171b0-735f-4dff-90de-8d9bd181ef3f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f0a171b0-735f-4dff-90de-8d9bd181ef3f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f0a171b0-735f-4dff-90de-8d9bd181ef3f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f0a171b0-735f-4dff-90de-8d9bd181ef3f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f0c3bc89-f93a-49f4-81a8-5e9356e79c62.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f0c3bc89-f93a-49f4-81a8-5e9356e79c62.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f0c3bc89-f93a-49f4-81a8-5e9356e79c62.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f0c3bc89-f93a-49f4-81a8-5e9356e79c62.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f0fa4b2f-68bd-43bd-801e-db4954c6ef32.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f0fa4b2f-68bd-43bd-801e-db4954c6ef32.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f0fa4b2f-68bd-43bd-801e-db4954c6ef32.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f0fa4b2f-68bd-43bd-801e-db4954c6ef32.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f107f438-71f0-4c50-9bcb-3076b2a61b2c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f107f438-71f0-4c50-9bcb-3076b2a61b2c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f107f438-71f0-4c50-9bcb-3076b2a61b2c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f107f438-71f0-4c50-9bcb-3076b2a61b2c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f12dd29b-c2dc-4f4c-afcd-884fa334e363.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f12dd29b-c2dc-4f4c-afcd-884fa334e363.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f12dd29b-c2dc-4f4c-afcd-884fa334e363.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f12dd29b-c2dc-4f4c-afcd-884fa334e363.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f14ffea9-2b9d-463c-a6f6-611621a5d538.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f14ffea9-2b9d-463c-a6f6-611621a5d538.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f14ffea9-2b9d-463c-a6f6-611621a5d538.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f14ffea9-2b9d-463c-a6f6-611621a5d538.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f1759c9f-59a6-4ee0-aafe-c779035470c2.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f1759c9f-59a6-4ee0-aafe-c779035470c2.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f1759c9f-59a6-4ee0-aafe-c779035470c2.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f1759c9f-59a6-4ee0-aafe-c779035470c2.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f180f2c3-c10c-42d2-9da3-6de0cf99f3d5.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f180f2c3-c10c-42d2-9da3-6de0cf99f3d5.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f180f2c3-c10c-42d2-9da3-6de0cf99f3d5.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f180f2c3-c10c-42d2-9da3-6de0cf99f3d5.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f1890790-5d14-480f-a197-6f10f3279590.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f1890790-5d14-480f-a197-6f10f3279590.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f1890790-5d14-480f-a197-6f10f3279590.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f1890790-5d14-480f-a197-6f10f3279590.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f18c0d16-f5fd-4f95-a271-981b764c4d60.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f18c0d16-f5fd-4f95-a271-981b764c4d60.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f18c0d16-f5fd-4f95-a271-981b764c4d60.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f18c0d16-f5fd-4f95-a271-981b764c4d60.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f19a2a8c-bfb3-422e-a706-fed0160f6163.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f19a2a8c-bfb3-422e-a706-fed0160f6163.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f19a2a8c-bfb3-422e-a706-fed0160f6163.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f19a2a8c-bfb3-422e-a706-fed0160f6163.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f1ae61b6-1173-413d-b4db-a03ac3757fcc.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f1ae61b6-1173-413d-b4db-a03ac3757fcc.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f1ae61b6-1173-413d-b4db-a03ac3757fcc.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f1ae61b6-1173-413d-b4db-a03ac3757fcc.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f1d6e89b-0db8-4b20-917c-bf46e0645220.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f1d6e89b-0db8-4b20-917c-bf46e0645220.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f1d6e89b-0db8-4b20-917c-bf46e0645220.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f1d6e89b-0db8-4b20-917c-bf46e0645220.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f1df477a-dce6-4ff4-8834-c279fb258b52.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f1df477a-dce6-4ff4-8834-c279fb258b52.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f1df477a-dce6-4ff4-8834-c279fb258b52.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f1df477a-dce6-4ff4-8834-c279fb258b52.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f1e3d270-5679-4d6a-a35b-f3ad20164f3f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f1e3d270-5679-4d6a-a35b-f3ad20164f3f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f1e3d270-5679-4d6a-a35b-f3ad20164f3f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f1e3d270-5679-4d6a-a35b-f3ad20164f3f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f2500ce1-47f5-414f-9293-7f2a6d6c33e3.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f2500ce1-47f5-414f-9293-7f2a6d6c33e3.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f2500ce1-47f5-414f-9293-7f2a6d6c33e3.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f2500ce1-47f5-414f-9293-7f2a6d6c33e3.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f25e8552-a304-4fc9-ae86-0a7b8b2e78b8.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f25e8552-a304-4fc9-ae86-0a7b8b2e78b8.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f25e8552-a304-4fc9-ae86-0a7b8b2e78b8.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f25e8552-a304-4fc9-ae86-0a7b8b2e78b8.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f26ce962-fe7e-4a8c-b151-f156c2205979.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f26ce962-fe7e-4a8c-b151-f156c2205979.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f26ce962-fe7e-4a8c-b151-f156c2205979.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f26ce962-fe7e-4a8c-b151-f156c2205979.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f2834133-9a99-4601-8763-384d02da90f0.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f2834133-9a99-4601-8763-384d02da90f0.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f2834133-9a99-4601-8763-384d02da90f0.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f2834133-9a99-4601-8763-384d02da90f0.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f2876a0b-8512-4cce-96f6-099d1d9766a1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f2876a0b-8512-4cce-96f6-099d1d9766a1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f2876a0b-8512-4cce-96f6-099d1d9766a1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f2876a0b-8512-4cce-96f6-099d1d9766a1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f2b0ca07-a873-4309-af04-957c11a222dc.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f2b0ca07-a873-4309-af04-957c11a222dc.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f2b0ca07-a873-4309-af04-957c11a222dc.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f2b0ca07-a873-4309-af04-957c11a222dc.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f2c78abe-e48b-4a2d-917b-a76f9186fe8a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f2c78abe-e48b-4a2d-917b-a76f9186fe8a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f2c78abe-e48b-4a2d-917b-a76f9186fe8a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f2c78abe-e48b-4a2d-917b-a76f9186fe8a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f2e67325-17b6-4d99-be62-ca56fc2b70c4.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f2e67325-17b6-4d99-be62-ca56fc2b70c4.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f2e67325-17b6-4d99-be62-ca56fc2b70c4.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f2e67325-17b6-4d99-be62-ca56fc2b70c4.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f2e7cba1-f9bd-4b1e-b9ca-131b6b473dc3.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f2e7cba1-f9bd-4b1e-b9ca-131b6b473dc3.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f2e7cba1-f9bd-4b1e-b9ca-131b6b473dc3.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f2e7cba1-f9bd-4b1e-b9ca-131b6b473dc3.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f2f99b57-bf6f-4ecd-9274-811c80efd621.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f2f99b57-bf6f-4ecd-9274-811c80efd621.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f2f99b57-bf6f-4ecd-9274-811c80efd621.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f2f99b57-bf6f-4ecd-9274-811c80efd621.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f30ee3bb-b661-41ad-9f2d-b85522b2d4ec.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f30ee3bb-b661-41ad-9f2d-b85522b2d4ec.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f30ee3bb-b661-41ad-9f2d-b85522b2d4ec.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f30ee3bb-b661-41ad-9f2d-b85522b2d4ec.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f3131882-a879-40c1-b7ce-528ec1a1edca.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f3131882-a879-40c1-b7ce-528ec1a1edca.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f3131882-a879-40c1-b7ce-528ec1a1edca.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f3131882-a879-40c1-b7ce-528ec1a1edca.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f3151e97-ae69-433d-844d-936708f9fc99.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f3151e97-ae69-433d-844d-936708f9fc99.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f3151e97-ae69-433d-844d-936708f9fc99.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f3151e97-ae69-433d-844d-936708f9fc99.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f35031b0-1501-4080-a748-69a85dd66e62.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f35031b0-1501-4080-a748-69a85dd66e62.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f35031b0-1501-4080-a748-69a85dd66e62.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f35031b0-1501-4080-a748-69a85dd66e62.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f358d414-cac0-4f0c-a1b7-df03d5e0a3bd.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f358d414-cac0-4f0c-a1b7-df03d5e0a3bd.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f358d414-cac0-4f0c-a1b7-df03d5e0a3bd.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f358d414-cac0-4f0c-a1b7-df03d5e0a3bd.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f3605fc2-bae3-41c6-bdb5-f509d2a487f4.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f3605fc2-bae3-41c6-bdb5-f509d2a487f4.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f3605fc2-bae3-41c6-bdb5-f509d2a487f4.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f3605fc2-bae3-41c6-bdb5-f509d2a487f4.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f360f497-6372-42a6-a6cf-3a6167583fbe.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f360f497-6372-42a6-a6cf-3a6167583fbe.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f360f497-6372-42a6-a6cf-3a6167583fbe.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f360f497-6372-42a6-a6cf-3a6167583fbe.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f37de0f2-119c-417b-850d-3db151cee11a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f37de0f2-119c-417b-850d-3db151cee11a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f37de0f2-119c-417b-850d-3db151cee11a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f37de0f2-119c-417b-850d-3db151cee11a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f39474be-e9eb-4ff3-b7f5-8caad429bd56.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f39474be-e9eb-4ff3-b7f5-8caad429bd56.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f39474be-e9eb-4ff3-b7f5-8caad429bd56.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f39474be-e9eb-4ff3-b7f5-8caad429bd56.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f3986181-b713-4ccf-a3bc-25ab363c91b3.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f3986181-b713-4ccf-a3bc-25ab363c91b3.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f3986181-b713-4ccf-a3bc-25ab363c91b3.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f3986181-b713-4ccf-a3bc-25ab363c91b3.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f3b2bfff-b601-4fb7-bde9-587bd75787ea.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f3b2bfff-b601-4fb7-bde9-587bd75787ea.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f3b2bfff-b601-4fb7-bde9-587bd75787ea.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f3b2bfff-b601-4fb7-bde9-587bd75787ea.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f3cf55a7-9438-4999-997f-ebb34812e87f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f3cf55a7-9438-4999-997f-ebb34812e87f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f3cf55a7-9438-4999-997f-ebb34812e87f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f3cf55a7-9438-4999-997f-ebb34812e87f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f3ea113f-0594-452e-99a2-e8ceee6fe499.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f3ea113f-0594-452e-99a2-e8ceee6fe499.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f3ea113f-0594-452e-99a2-e8ceee6fe499.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f3ea113f-0594-452e-99a2-e8ceee6fe499.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f4024591-1fa3-4c23-aaac-6925701b2c6b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f4024591-1fa3-4c23-aaac-6925701b2c6b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f4024591-1fa3-4c23-aaac-6925701b2c6b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f4024591-1fa3-4c23-aaac-6925701b2c6b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f40c3682-d126-478f-bc5a-bc1d1dfdda5f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f40c3682-d126-478f-bc5a-bc1d1dfdda5f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f40c3682-d126-478f-bc5a-bc1d1dfdda5f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f40c3682-d126-478f-bc5a-bc1d1dfdda5f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f43ff24b-8547-4f37-917c-f9f6c56a2f17.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f43ff24b-8547-4f37-917c-f9f6c56a2f17.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f43ff24b-8547-4f37-917c-f9f6c56a2f17.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f43ff24b-8547-4f37-917c-f9f6c56a2f17.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f443c1ea-7fc5-430b-abe5-5edda4db4018.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f443c1ea-7fc5-430b-abe5-5edda4db4018.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f443c1ea-7fc5-430b-abe5-5edda4db4018.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f443c1ea-7fc5-430b-abe5-5edda4db4018.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f44ea9f5-f805-4e10-a1eb-6987de1f4fa7.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f44ea9f5-f805-4e10-a1eb-6987de1f4fa7.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f44ea9f5-f805-4e10-a1eb-6987de1f4fa7.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f44ea9f5-f805-4e10-a1eb-6987de1f4fa7.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f4613a62-abc3-4c6f-86a4-83f23abb2ac3.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f4613a62-abc3-4c6f-86a4-83f23abb2ac3.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f4613a62-abc3-4c6f-86a4-83f23abb2ac3.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f4613a62-abc3-4c6f-86a4-83f23abb2ac3.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f4b596b1-5ae9-4711-a84d-a5004bc8e1be.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f4b596b1-5ae9-4711-a84d-a5004bc8e1be.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f4b596b1-5ae9-4711-a84d-a5004bc8e1be.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f4b596b1-5ae9-4711-a84d-a5004bc8e1be.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f4b8864e-b234-4d2b-8772-b13602745b24.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f4b8864e-b234-4d2b-8772-b13602745b24.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f4b8864e-b234-4d2b-8772-b13602745b24.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f4b8864e-b234-4d2b-8772-b13602745b24.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f4d4f1d5-ea92-4a73-b16e-63d53996f436.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f4d4f1d5-ea92-4a73-b16e-63d53996f436.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f4d4f1d5-ea92-4a73-b16e-63d53996f436.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f4d4f1d5-ea92-4a73-b16e-63d53996f436.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f4d9a371-ae7b-4ba0-9e0b-24efc8be5d69.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f4d9a371-ae7b-4ba0-9e0b-24efc8be5d69.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f4d9a371-ae7b-4ba0-9e0b-24efc8be5d69.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f4d9a371-ae7b-4ba0-9e0b-24efc8be5d69.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f4f2ef41-306a-43c8-8aef-4047a4afb621.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f4f2ef41-306a-43c8-8aef-4047a4afb621.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f4f2ef41-306a-43c8-8aef-4047a4afb621.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f4f2ef41-306a-43c8-8aef-4047a4afb621.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f5037a37-7b2a-470b-91c9-27a0cba52e02.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f5037a37-7b2a-470b-91c9-27a0cba52e02.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f5037a37-7b2a-470b-91c9-27a0cba52e02.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f5037a37-7b2a-470b-91c9-27a0cba52e02.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f5072063-0a52-4a9f-8e30-2b047305c63e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f5072063-0a52-4a9f-8e30-2b047305c63e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f5072063-0a52-4a9f-8e30-2b047305c63e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f5072063-0a52-4a9f-8e30-2b047305c63e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f5520a83-bc9e-478c-91da-d912ed89a144.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f5520a83-bc9e-478c-91da-d912ed89a144.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f5520a83-bc9e-478c-91da-d912ed89a144.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f5520a83-bc9e-478c-91da-d912ed89a144.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f55de017-1035-42b7-9f0f-03cdda1b81eb.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f55de017-1035-42b7-9f0f-03cdda1b81eb.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f55de017-1035-42b7-9f0f-03cdda1b81eb.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f55de017-1035-42b7-9f0f-03cdda1b81eb.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f5b35c78-c626-4c73-ad9d-2dced8539afb.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f5b35c78-c626-4c73-ad9d-2dced8539afb.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f5b35c78-c626-4c73-ad9d-2dced8539afb.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f5b35c78-c626-4c73-ad9d-2dced8539afb.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f5c0fad5-380e-4e2c-a5a5-2e4d72441a25.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f5c0fad5-380e-4e2c-a5a5-2e4d72441a25.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f5c0fad5-380e-4e2c-a5a5-2e4d72441a25.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f5c0fad5-380e-4e2c-a5a5-2e4d72441a25.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f5d4280c-3d04-46c6-9b04-cf7bcbf8de83.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f5d4280c-3d04-46c6-9b04-cf7bcbf8de83.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f5d4280c-3d04-46c6-9b04-cf7bcbf8de83.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f5d4280c-3d04-46c6-9b04-cf7bcbf8de83.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f5d4e234-e87a-427b-bc09-b491123d1d80.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f5d4e234-e87a-427b-bc09-b491123d1d80.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f5d4e234-e87a-427b-bc09-b491123d1d80.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f5d4e234-e87a-427b-bc09-b491123d1d80.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f6193e2a-40d0-4388-a217-6e2ec23aee6b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f6193e2a-40d0-4388-a217-6e2ec23aee6b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f6193e2a-40d0-4388-a217-6e2ec23aee6b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f6193e2a-40d0-4388-a217-6e2ec23aee6b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f6321126-4a33-4a52-ae62-678e987ade6b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f6321126-4a33-4a52-ae62-678e987ade6b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f6321126-4a33-4a52-ae62-678e987ade6b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f6321126-4a33-4a52-ae62-678e987ade6b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f63a66af-24a0-4b2b-9f0a-2e1b675e94bd.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f63a66af-24a0-4b2b-9f0a-2e1b675e94bd.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f63a66af-24a0-4b2b-9f0a-2e1b675e94bd.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f63a66af-24a0-4b2b-9f0a-2e1b675e94bd.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f64b3078-cb34-4a72-982c-c835b2fb2239.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f64b3078-cb34-4a72-982c-c835b2fb2239.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f64b3078-cb34-4a72-982c-c835b2fb2239.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f64b3078-cb34-4a72-982c-c835b2fb2239.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f6535755-a0d7-4e48-9879-52e159c2eeeb.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f6535755-a0d7-4e48-9879-52e159c2eeeb.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f6535755-a0d7-4e48-9879-52e159c2eeeb.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f6535755-a0d7-4e48-9879-52e159c2eeeb.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f675eb47-4ad2-4743-822b-f85392e7fe71.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f675eb47-4ad2-4743-822b-f85392e7fe71.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f675eb47-4ad2-4743-822b-f85392e7fe71.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f675eb47-4ad2-4743-822b-f85392e7fe71.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f6a9bbc3-26a1-4299-9b75-30315edf1711.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f6a9bbc3-26a1-4299-9b75-30315edf1711.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f6a9bbc3-26a1-4299-9b75-30315edf1711.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f6a9bbc3-26a1-4299-9b75-30315edf1711.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f6b060ad-a746-4998-ac17-b5391b098c94.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f6b060ad-a746-4998-ac17-b5391b098c94.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f6b060ad-a746-4998-ac17-b5391b098c94.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f6b060ad-a746-4998-ac17-b5391b098c94.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f6cc8bc0-851a-42c1-876e-56800bb30723.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f6cc8bc0-851a-42c1-876e-56800bb30723.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f6cc8bc0-851a-42c1-876e-56800bb30723.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f6cc8bc0-851a-42c1-876e-56800bb30723.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f6d0b936-e2e4-4c6d-9ec2-103ee86b09ea.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f6d0b936-e2e4-4c6d-9ec2-103ee86b09ea.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f6d0b936-e2e4-4c6d-9ec2-103ee86b09ea.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f6d0b936-e2e4-4c6d-9ec2-103ee86b09ea.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f6d46354-f718-4d25-aef1-c21eeb2ffcad.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f6d46354-f718-4d25-aef1-c21eeb2ffcad.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f6d46354-f718-4d25-aef1-c21eeb2ffcad.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f6d46354-f718-4d25-aef1-c21eeb2ffcad.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f6d48031-9499-4850-addb-9d950b0fd927.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f6d48031-9499-4850-addb-9d950b0fd927.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f6d48031-9499-4850-addb-9d950b0fd927.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f6d48031-9499-4850-addb-9d950b0fd927.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f7098778-b33a-49d0-a21a-65e1603a1ee3.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f7098778-b33a-49d0-a21a-65e1603a1ee3.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f7098778-b33a-49d0-a21a-65e1603a1ee3.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f7098778-b33a-49d0-a21a-65e1603a1ee3.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f7157efe-e58e-45fd-92b2-60c598994e86.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f7157efe-e58e-45fd-92b2-60c598994e86.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f7157efe-e58e-45fd-92b2-60c598994e86.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f7157efe-e58e-45fd-92b2-60c598994e86.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f7187f98-032d-41e3-8cbc-d74c67e898ee.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f7187f98-032d-41e3-8cbc-d74c67e898ee.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f7187f98-032d-41e3-8cbc-d74c67e898ee.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f7187f98-032d-41e3-8cbc-d74c67e898ee.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f72a3173-4205-4c66-abf4-1c7a5e689b13.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f72a3173-4205-4c66-abf4-1c7a5e689b13.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f72a3173-4205-4c66-abf4-1c7a5e689b13.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f72a3173-4205-4c66-abf4-1c7a5e689b13.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f75733ef-3c1c-4680-893e-48318a7e98eb.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f75733ef-3c1c-4680-893e-48318a7e98eb.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f75733ef-3c1c-4680-893e-48318a7e98eb.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f75733ef-3c1c-4680-893e-48318a7e98eb.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f7b3918b-edaa-48ca-9ce8-2a98918daadc.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f7b3918b-edaa-48ca-9ce8-2a98918daadc.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f7b3918b-edaa-48ca-9ce8-2a98918daadc.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f7b3918b-edaa-48ca-9ce8-2a98918daadc.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f7b4969f-f5a9-4c5c-a13a-689dc4bad380.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f7b4969f-f5a9-4c5c-a13a-689dc4bad380.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f7b4969f-f5a9-4c5c-a13a-689dc4bad380.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f7b4969f-f5a9-4c5c-a13a-689dc4bad380.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f7c815c6-59b4-4dbc-b89f-ca87d36fc999.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f7c815c6-59b4-4dbc-b89f-ca87d36fc999.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f7c815c6-59b4-4dbc-b89f-ca87d36fc999.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f7c815c6-59b4-4dbc-b89f-ca87d36fc999.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f7c92ecb-0dab-42e3-bd8c-d06f8b8ad4d2.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f7c92ecb-0dab-42e3-bd8c-d06f8b8ad4d2.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f7c92ecb-0dab-42e3-bd8c-d06f8b8ad4d2.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f7c92ecb-0dab-42e3-bd8c-d06f8b8ad4d2.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f7e53bb8-3b5e-44c5-8d50-55bac339de1e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f7e53bb8-3b5e-44c5-8d50-55bac339de1e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f7e53bb8-3b5e-44c5-8d50-55bac339de1e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f7e53bb8-3b5e-44c5-8d50-55bac339de1e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f7ed4d09-de50-49eb-9582-a351449a1df1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f7ed4d09-de50-49eb-9582-a351449a1df1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f7ed4d09-de50-49eb-9582-a351449a1df1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f7ed4d09-de50-49eb-9582-a351449a1df1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f7fcfa94-be1a-417e-80e4-33424a527a5a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f7fcfa94-be1a-417e-80e4-33424a527a5a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f7fcfa94-be1a-417e-80e4-33424a527a5a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f7fcfa94-be1a-417e-80e4-33424a527a5a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f8091f77-010b-4b56-aac3-d79959c2f9fe.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f8091f77-010b-4b56-aac3-d79959c2f9fe.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f8091f77-010b-4b56-aac3-d79959c2f9fe.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f8091f77-010b-4b56-aac3-d79959c2f9fe.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f81f02af-4542-4f8c-b45b-1e78e570febf.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f81f02af-4542-4f8c-b45b-1e78e570febf.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f81f02af-4542-4f8c-b45b-1e78e570febf.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f81f02af-4542-4f8c-b45b-1e78e570febf.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f82004a3-1a54-4bab-8d7a-a271e9377400.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f82004a3-1a54-4bab-8d7a-a271e9377400.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f82004a3-1a54-4bab-8d7a-a271e9377400.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f82004a3-1a54-4bab-8d7a-a271e9377400.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f8243b9e-cc03-40af-9d07-7a62cf9bb287.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f8243b9e-cc03-40af-9d07-7a62cf9bb287.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f8243b9e-cc03-40af-9d07-7a62cf9bb287.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f8243b9e-cc03-40af-9d07-7a62cf9bb287.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f8372cdc-9f1b-41eb-98e4-f7c4ebe13205.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f8372cdc-9f1b-41eb-98e4-f7c4ebe13205.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f8372cdc-9f1b-41eb-98e4-f7c4ebe13205.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f8372cdc-9f1b-41eb-98e4-f7c4ebe13205.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f83d8bc7-e37f-486c-88e9-fad174de2c94.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f83d8bc7-e37f-486c-88e9-fad174de2c94.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f83d8bc7-e37f-486c-88e9-fad174de2c94.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f83d8bc7-e37f-486c-88e9-fad174de2c94.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f8480981-770c-4d69-9a2e-43e461fb1e8c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f8480981-770c-4d69-9a2e-43e461fb1e8c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f8480981-770c-4d69-9a2e-43e461fb1e8c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f8480981-770c-4d69-9a2e-43e461fb1e8c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f849fdd2-9291-48f4-9ed1-e2ceb7edf5b8.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f849fdd2-9291-48f4-9ed1-e2ceb7edf5b8.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f849fdd2-9291-48f4-9ed1-e2ceb7edf5b8.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f849fdd2-9291-48f4-9ed1-e2ceb7edf5b8.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f857e4cd-3594-4bc9-bc58-ecec530e1333.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f857e4cd-3594-4bc9-bc58-ecec530e1333.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f857e4cd-3594-4bc9-bc58-ecec530e1333.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f857e4cd-3594-4bc9-bc58-ecec530e1333.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f8587186-718e-4bb1-9f6c-099485419a9b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f8587186-718e-4bb1-9f6c-099485419a9b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f8587186-718e-4bb1-9f6c-099485419a9b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f8587186-718e-4bb1-9f6c-099485419a9b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f85ddcef-01f9-4481-8bb3-b4d3734beb75.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f85ddcef-01f9-4481-8bb3-b4d3734beb75.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f85ddcef-01f9-4481-8bb3-b4d3734beb75.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f85ddcef-01f9-4481-8bb3-b4d3734beb75.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f86f1a62-8d5b-47f7-9662-e064f8dba4f6.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f86f1a62-8d5b-47f7-9662-e064f8dba4f6.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f86f1a62-8d5b-47f7-9662-e064f8dba4f6.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f86f1a62-8d5b-47f7-9662-e064f8dba4f6.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f8a834db-6a77-4127-91c0-16b747e08887.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f8a834db-6a77-4127-91c0-16b747e08887.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f8a834db-6a77-4127-91c0-16b747e08887.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f8a834db-6a77-4127-91c0-16b747e08887.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f8ac3e44-b4ba-4018-809f-eba109b0d815.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f8ac3e44-b4ba-4018-809f-eba109b0d815.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f8ac3e44-b4ba-4018-809f-eba109b0d815.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f8ac3e44-b4ba-4018-809f-eba109b0d815.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f8de004d-f52e-4cd3-99f7-23290aecadd2.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f8de004d-f52e-4cd3-99f7-23290aecadd2.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f8de004d-f52e-4cd3-99f7-23290aecadd2.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f8de004d-f52e-4cd3-99f7-23290aecadd2.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f9108530-4ac1-4491-806f-e8fcba9c32f3.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f9108530-4ac1-4491-806f-e8fcba9c32f3.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f9108530-4ac1-4491-806f-e8fcba9c32f3.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f9108530-4ac1-4491-806f-e8fcba9c32f3.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f91d5f7e-7e96-4ec5-846e-c01e973b0fb1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f91d5f7e-7e96-4ec5-846e-c01e973b0fb1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f91d5f7e-7e96-4ec5-846e-c01e973b0fb1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f91d5f7e-7e96-4ec5-846e-c01e973b0fb1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f923b656-2a64-45bc-a666-667d2cab3ec1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f923b656-2a64-45bc-a666-667d2cab3ec1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f923b656-2a64-45bc-a666-667d2cab3ec1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f923b656-2a64-45bc-a666-667d2cab3ec1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f957cd16-db23-410a-abc1-ae61c60fc482.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f957cd16-db23-410a-abc1-ae61c60fc482.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f957cd16-db23-410a-abc1-ae61c60fc482.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f957cd16-db23-410a-abc1-ae61c60fc482.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f96a2a67-3e68-44fc-a9af-ac7bb0d876de.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f96a2a67-3e68-44fc-a9af-ac7bb0d876de.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f96a2a67-3e68-44fc-a9af-ac7bb0d876de.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f96a2a67-3e68-44fc-a9af-ac7bb0d876de.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f96f233a-cf7d-4b2a-a6b4-d27233a8959f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f96f233a-cf7d-4b2a-a6b4-d27233a8959f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f96f233a-cf7d-4b2a-a6b4-d27233a8959f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f96f233a-cf7d-4b2a-a6b4-d27233a8959f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f9781de5-6d85-4cf8-bda5-7f0aa7e59152.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f9781de5-6d85-4cf8-bda5-7f0aa7e59152.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f9781de5-6d85-4cf8-bda5-7f0aa7e59152.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f9781de5-6d85-4cf8-bda5-7f0aa7e59152.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f97b6530-c203-4977-8b50-c7f8a74a5844.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f97b6530-c203-4977-8b50-c7f8a74a5844.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f97b6530-c203-4977-8b50-c7f8a74a5844.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f97b6530-c203-4977-8b50-c7f8a74a5844.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f982d513-9ed2-4a6d-b3d8-c1c4c3cde282.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f982d513-9ed2-4a6d-b3d8-c1c4c3cde282.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f982d513-9ed2-4a6d-b3d8-c1c4c3cde282.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f982d513-9ed2-4a6d-b3d8-c1c4c3cde282.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f99c4572-2947-4139-b17d-d43608c0fd34.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f99c4572-2947-4139-b17d-d43608c0fd34.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f99c4572-2947-4139-b17d-d43608c0fd34.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f99c4572-2947-4139-b17d-d43608c0fd34.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f9a2e7e6-e23f-4d2e-801f-bfadc4a13e43.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f9a2e7e6-e23f-4d2e-801f-bfadc4a13e43.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f9a2e7e6-e23f-4d2e-801f-bfadc4a13e43.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f9a2e7e6-e23f-4d2e-801f-bfadc4a13e43.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f9aacb16-117d-46e3-9e11-dcfa7f85af85.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f9aacb16-117d-46e3-9e11-dcfa7f85af85.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f9aacb16-117d-46e3-9e11-dcfa7f85af85.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f9aacb16-117d-46e3-9e11-dcfa7f85af85.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f9ae9b33-750a-43e7-820b-0f1fe4696744.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f9ae9b33-750a-43e7-820b-0f1fe4696744.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f9ae9b33-750a-43e7-820b-0f1fe4696744.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f9ae9b33-750a-43e7-820b-0f1fe4696744.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f9cb4614-b017-4b2b-b7ea-9938ed2f7f7f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f9cb4614-b017-4b2b-b7ea-9938ed2f7f7f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f9cb4614-b017-4b2b-b7ea-9938ed2f7f7f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f9cb4614-b017-4b2b-b7ea-9938ed2f7f7f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f9d16468-ab31-4674-8c76-07f212f8c5b5.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f9d16468-ab31-4674-8c76-07f212f8c5b5.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f9d16468-ab31-4674-8c76-07f212f8c5b5.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/f9d16468-ab31-4674-8c76-07f212f8c5b5.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fa0413b4-980d-44ae-8737-8acbf6d4d2b1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fa0413b4-980d-44ae-8737-8acbf6d4d2b1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fa0413b4-980d-44ae-8737-8acbf6d4d2b1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fa0413b4-980d-44ae-8737-8acbf6d4d2b1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fa2acab6-cc6e-463e-8f12-0e6f6ea8abae.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fa2acab6-cc6e-463e-8f12-0e6f6ea8abae.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fa2acab6-cc6e-463e-8f12-0e6f6ea8abae.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fa2acab6-cc6e-463e-8f12-0e6f6ea8abae.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fa4244aa-ede9-419c-b7c1-3a497890b348.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fa4244aa-ede9-419c-b7c1-3a497890b348.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fa4244aa-ede9-419c-b7c1-3a497890b348.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fa4244aa-ede9-419c-b7c1-3a497890b348.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fa61943a-841e-494f-93d5-73867781ea73.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fa61943a-841e-494f-93d5-73867781ea73.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fa61943a-841e-494f-93d5-73867781ea73.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fa61943a-841e-494f-93d5-73867781ea73.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fa7907d8-6399-4f46-a2e5-e7425a95744a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fa7907d8-6399-4f46-a2e5-e7425a95744a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fa7907d8-6399-4f46-a2e5-e7425a95744a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fa7907d8-6399-4f46-a2e5-e7425a95744a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fabac8a9-d86c-4ebd-91ae-e122d581ff50.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fabac8a9-d86c-4ebd-91ae-e122d581ff50.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fabac8a9-d86c-4ebd-91ae-e122d581ff50.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fabac8a9-d86c-4ebd-91ae-e122d581ff50.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fad1fd06-f066-479f-b5f5-192975141bac.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fad1fd06-f066-479f-b5f5-192975141bac.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fad1fd06-f066-479f-b5f5-192975141bac.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fad1fd06-f066-479f-b5f5-192975141bac.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fb1df875-63fd-4359-951f-be256581c380.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fb1df875-63fd-4359-951f-be256581c380.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fb1df875-63fd-4359-951f-be256581c380.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fb1df875-63fd-4359-951f-be256581c380.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fb30a12e-cf0d-46c4-b8d2-68434056b07e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fb30a12e-cf0d-46c4-b8d2-68434056b07e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fb30a12e-cf0d-46c4-b8d2-68434056b07e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fb30a12e-cf0d-46c4-b8d2-68434056b07e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fb396fbe-77aa-4ea7-b8b2-2d58f8f3d9f7.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fb396fbe-77aa-4ea7-b8b2-2d58f8f3d9f7.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fb396fbe-77aa-4ea7-b8b2-2d58f8f3d9f7.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fb396fbe-77aa-4ea7-b8b2-2d58f8f3d9f7.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fb58a16e-c7ad-4305-b223-189112343287.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fb58a16e-c7ad-4305-b223-189112343287.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fb58a16e-c7ad-4305-b223-189112343287.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fb58a16e-c7ad-4305-b223-189112343287.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fb655412-ce21-45e4-a3ab-f7a6854a1397.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fb655412-ce21-45e4-a3ab-f7a6854a1397.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fb655412-ce21-45e4-a3ab-f7a6854a1397.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fb655412-ce21-45e4-a3ab-f7a6854a1397.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fb7fac6a-d678-4f1e-a61b-8adda8af3890.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fb7fac6a-d678-4f1e-a61b-8adda8af3890.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fb7fac6a-d678-4f1e-a61b-8adda8af3890.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fb7fac6a-d678-4f1e-a61b-8adda8af3890.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fb9104d7-7af3-4a8b-8f1d-cf05e682bf70.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fb9104d7-7af3-4a8b-8f1d-cf05e682bf70.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fb9104d7-7af3-4a8b-8f1d-cf05e682bf70.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fb9104d7-7af3-4a8b-8f1d-cf05e682bf70.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fb9f5818-c9dd-46c5-b857-394fb666c5a5.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fb9f5818-c9dd-46c5-b857-394fb666c5a5.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fb9f5818-c9dd-46c5-b857-394fb666c5a5.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fb9f5818-c9dd-46c5-b857-394fb666c5a5.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fbad164e-f0c1-4c0e-bf3e-0bf079711020.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fbad164e-f0c1-4c0e-bf3e-0bf079711020.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fbad164e-f0c1-4c0e-bf3e-0bf079711020.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fbad164e-f0c1-4c0e-bf3e-0bf079711020.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fbb068f8-b058-4cb3-9cce-78c097acab73.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fbb068f8-b058-4cb3-9cce-78c097acab73.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fbb068f8-b058-4cb3-9cce-78c097acab73.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fbb068f8-b058-4cb3-9cce-78c097acab73.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fbb4c0f1-287c-4dbb-9066-743e612683d5.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fbb4c0f1-287c-4dbb-9066-743e612683d5.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fbb4c0f1-287c-4dbb-9066-743e612683d5.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fbb4c0f1-287c-4dbb-9066-743e612683d5.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fbc6dd18-09b4-4e1b-9b70-076419a8241b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fbc6dd18-09b4-4e1b-9b70-076419a8241b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fbc6dd18-09b4-4e1b-9b70-076419a8241b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fbc6dd18-09b4-4e1b-9b70-076419a8241b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fbf845de-8dea-42cf-b5c2-8c7696b3da87.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fbf845de-8dea-42cf-b5c2-8c7696b3da87.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fbf845de-8dea-42cf-b5c2-8c7696b3da87.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fbf845de-8dea-42cf-b5c2-8c7696b3da87.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fbfc088a-5f1b-4c6c-9e14-9a2a4554a15b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fbfc088a-5f1b-4c6c-9e14-9a2a4554a15b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fbfc088a-5f1b-4c6c-9e14-9a2a4554a15b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fbfc088a-5f1b-4c6c-9e14-9a2a4554a15b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fc091f34-cc4d-463f-a947-825f6c00b94e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fc091f34-cc4d-463f-a947-825f6c00b94e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fc091f34-cc4d-463f-a947-825f6c00b94e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fc091f34-cc4d-463f-a947-825f6c00b94e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fc0c6b21-e926-4d50-8f95-2c7e8c45aed3.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fc0c6b21-e926-4d50-8f95-2c7e8c45aed3.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fc0c6b21-e926-4d50-8f95-2c7e8c45aed3.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fc0c6b21-e926-4d50-8f95-2c7e8c45aed3.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fc1ef395-17f0-4002-a59d-9cc6840beaa7.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fc1ef395-17f0-4002-a59d-9cc6840beaa7.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fc1ef395-17f0-4002-a59d-9cc6840beaa7.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fc1ef395-17f0-4002-a59d-9cc6840beaa7.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fc364b09-e30d-4567-86f2-3317e4743259.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fc364b09-e30d-4567-86f2-3317e4743259.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fc364b09-e30d-4567-86f2-3317e4743259.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fc364b09-e30d-4567-86f2-3317e4743259.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fc379117-e7bc-457f-bc06-3869f76541d8.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fc379117-e7bc-457f-bc06-3869f76541d8.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fc379117-e7bc-457f-bc06-3869f76541d8.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fc379117-e7bc-457f-bc06-3869f76541d8.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fc3f6a32-8c77-452a-ac5d-a6a4f4256805.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fc3f6a32-8c77-452a-ac5d-a6a4f4256805.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fc3f6a32-8c77-452a-ac5d-a6a4f4256805.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fc3f6a32-8c77-452a-ac5d-a6a4f4256805.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fcb7e73a-c94b-4cef-bdf2-7fac711fd08f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fcb7e73a-c94b-4cef-bdf2-7fac711fd08f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fcb7e73a-c94b-4cef-bdf2-7fac711fd08f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fcb7e73a-c94b-4cef-bdf2-7fac711fd08f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fcca04e9-00d9-4bbc-9caa-79290d684dbb.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fcca04e9-00d9-4bbc-9caa-79290d684dbb.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fcca04e9-00d9-4bbc-9caa-79290d684dbb.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fcca04e9-00d9-4bbc-9caa-79290d684dbb.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fcd748b1-ab44-41c9-94fa-277c069a5764.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fcd748b1-ab44-41c9-94fa-277c069a5764.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fcd748b1-ab44-41c9-94fa-277c069a5764.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fcd748b1-ab44-41c9-94fa-277c069a5764.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fd1462a4-e997-4369-b25a-acf7e166ff27.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fd1462a4-e997-4369-b25a-acf7e166ff27.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fd1462a4-e997-4369-b25a-acf7e166ff27.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fd1462a4-e997-4369-b25a-acf7e166ff27.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fd4abb32-bdcc-46c3-bccd-f03fe0aec792.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fd4abb32-bdcc-46c3-bccd-f03fe0aec792.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fd4abb32-bdcc-46c3-bccd-f03fe0aec792.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fd4abb32-bdcc-46c3-bccd-f03fe0aec792.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fd4c81c1-45d6-4a97-83f9-e7c3da41d76f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fd4c81c1-45d6-4a97-83f9-e7c3da41d76f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fd4c81c1-45d6-4a97-83f9-e7c3da41d76f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fd4c81c1-45d6-4a97-83f9-e7c3da41d76f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fd5611b5-6d2c-425a-8a1d-c2cdfadabd86.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fd5611b5-6d2c-425a-8a1d-c2cdfadabd86.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fd5611b5-6d2c-425a-8a1d-c2cdfadabd86.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fd5611b5-6d2c-425a-8a1d-c2cdfadabd86.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fd584d82-571a-43f2-81fd-5cd97a9b3eb4.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fd584d82-571a-43f2-81fd-5cd97a9b3eb4.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fd584d82-571a-43f2-81fd-5cd97a9b3eb4.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fd584d82-571a-43f2-81fd-5cd97a9b3eb4.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fdb7a2bf-f85a-429b-8707-9fd28f997d7e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fdb7a2bf-f85a-429b-8707-9fd28f997d7e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fdb7a2bf-f85a-429b-8707-9fd28f997d7e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fdb7a2bf-f85a-429b-8707-9fd28f997d7e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fdde9d5f-ea82-4df8-a850-3b131dbade55.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fdde9d5f-ea82-4df8-a850-3b131dbade55.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fdde9d5f-ea82-4df8-a850-3b131dbade55.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fdde9d5f-ea82-4df8-a850-3b131dbade55.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fdec46fe-cb47-4a9e-8ee8-ae531c06bf8f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fdec46fe-cb47-4a9e-8ee8-ae531c06bf8f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fdec46fe-cb47-4a9e-8ee8-ae531c06bf8f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fdec46fe-cb47-4a9e-8ee8-ae531c06bf8f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fe0b2a90-f779-4d52-a5b4-016c9d58493b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fe0b2a90-f779-4d52-a5b4-016c9d58493b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fe0b2a90-f779-4d52-a5b4-016c9d58493b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fe0b2a90-f779-4d52-a5b4-016c9d58493b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fe0ed831-be23-4276-8907-1bbe154728a4.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fe0ed831-be23-4276-8907-1bbe154728a4.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fe0ed831-be23-4276-8907-1bbe154728a4.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fe0ed831-be23-4276-8907-1bbe154728a4.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fe146432-c126-46db-9a45-555db08514fc.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fe146432-c126-46db-9a45-555db08514fc.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fe146432-c126-46db-9a45-555db08514fc.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fe146432-c126-46db-9a45-555db08514fc.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fe2c30cb-5e37-48af-82cf-98fa734643c6.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fe2c30cb-5e37-48af-82cf-98fa734643c6.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fe2c30cb-5e37-48af-82cf-98fa734643c6.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fe2c30cb-5e37-48af-82cf-98fa734643c6.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fe3162ac-e3a5-4fb8-92b6-f5c888c29fcf.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fe3162ac-e3a5-4fb8-92b6-f5c888c29fcf.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fe3162ac-e3a5-4fb8-92b6-f5c888c29fcf.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fe3162ac-e3a5-4fb8-92b6-f5c888c29fcf.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fe4e220d-f028-4086-8fa1-79c097a34917.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fe4e220d-f028-4086-8fa1-79c097a34917.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fe4e220d-f028-4086-8fa1-79c097a34917.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fe4e220d-f028-4086-8fa1-79c097a34917.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fe55f338-f9f5-43e6-8647-8558e5766d99.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fe55f338-f9f5-43e6-8647-8558e5766d99.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fe55f338-f9f5-43e6-8647-8558e5766d99.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fe55f338-f9f5-43e6-8647-8558e5766d99.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fe71982f-8fa8-4573-8027-e6989dbb8ccc.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fe71982f-8fa8-4573-8027-e6989dbb8ccc.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fe71982f-8fa8-4573-8027-e6989dbb8ccc.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fe71982f-8fa8-4573-8027-e6989dbb8ccc.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fe753c1f-04a7-4fbd-8ec1-78f69f0a7b8d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fe753c1f-04a7-4fbd-8ec1-78f69f0a7b8d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fe753c1f-04a7-4fbd-8ec1-78f69f0a7b8d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fe753c1f-04a7-4fbd-8ec1-78f69f0a7b8d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fe7def6a-c319-44f8-9f23-f53cdbf9ecbd.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fe7def6a-c319-44f8-9f23-f53cdbf9ecbd.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fe7def6a-c319-44f8-9f23-f53cdbf9ecbd.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fe7def6a-c319-44f8-9f23-f53cdbf9ecbd.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fe893093-26cb-47eb-90f8-095014f14b61.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fe893093-26cb-47eb-90f8-095014f14b61.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fe893093-26cb-47eb-90f8-095014f14b61.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fe893093-26cb-47eb-90f8-095014f14b61.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fe980394-d9b0-461b-9f94-46b3eca95241.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fe980394-d9b0-461b-9f94-46b3eca95241.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fe980394-d9b0-461b-9f94-46b3eca95241.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fe980394-d9b0-461b-9f94-46b3eca95241.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/feb28cb6-13f3-420b-af9d-2b55fea4a288.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/feb28cb6-13f3-420b-af9d-2b55fea4a288.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/feb28cb6-13f3-420b-af9d-2b55fea4a288.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/feb28cb6-13f3-420b-af9d-2b55fea4a288.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fedfc648-1e52-4b3c-9fb4-2ee97d1b4363.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fedfc648-1e52-4b3c-9fb4-2ee97d1b4363.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fedfc648-1e52-4b3c-9fb4-2ee97d1b4363.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fedfc648-1e52-4b3c-9fb4-2ee97d1b4363.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ff007662-734d-426f-b18d-d2df6126fb35.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ff007662-734d-426f-b18d-d2df6126fb35.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ff007662-734d-426f-b18d-d2df6126fb35.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ff007662-734d-426f-b18d-d2df6126fb35.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ff058bb8-007f-496d-9d36-598435f510f9.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ff058bb8-007f-496d-9d36-598435f510f9.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ff058bb8-007f-496d-9d36-598435f510f9.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ff058bb8-007f-496d-9d36-598435f510f9.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ff4047ec-572b-424b-9223-3e3813d2bed4.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ff4047ec-572b-424b-9223-3e3813d2bed4.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ff4047ec-572b-424b-9223-3e3813d2bed4.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ff4047ec-572b-424b-9223-3e3813d2bed4.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ff47eb15-1766-4d9c-91c4-54366d64876c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ff47eb15-1766-4d9c-91c4-54366d64876c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ff47eb15-1766-4d9c-91c4-54366d64876c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ff47eb15-1766-4d9c-91c4-54366d64876c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ff4e3bd8-e840-412a-8296-f2795a1459b1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ff4e3bd8-e840-412a-8296-f2795a1459b1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ff4e3bd8-e840-412a-8296-f2795a1459b1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ff4e3bd8-e840-412a-8296-f2795a1459b1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ff79aa27-f5bf-4a0f-80c0-5d9c021d088f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ff79aa27-f5bf-4a0f-80c0-5d9c021d088f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ff79aa27-f5bf-4a0f-80c0-5d9c021d088f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ff79aa27-f5bf-4a0f-80c0-5d9c021d088f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ffb44f7f-e530-473d-a139-0c72285c9290.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ffb44f7f-e530-473d-a139-0c72285c9290.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ffb44f7f-e530-473d-a139-0c72285c9290.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ffb44f7f-e530-473d-a139-0c72285c9290.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ffb77ba2-5c76-4eff-8380-cf6340023b4b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ffb77ba2-5c76-4eff-8380-cf6340023b4b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ffb77ba2-5c76-4eff-8380-cf6340023b4b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ffb77ba2-5c76-4eff-8380-cf6340023b4b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ffdfa689-8b89-4d29-a1d8-311c3ca17898.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ffdfa689-8b89-4d29-a1d8-311c3ca17898.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ffdfa689-8b89-4d29-a1d8-311c3ca17898.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/ffdfa689-8b89-4d29-a1d8-311c3ca17898.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fff8c063-24ed-4e49-b2e7-92ecc61d185c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fff8c063-24ed-4e49-b2e7-92ecc61d185c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fff8c063-24ed-4e49-b2e7-92ecc61d185c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/fff8c063-24ed-4e49-b2e7-92ecc61d185c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-003bb2bb2f8048ff8d82e140d6768986.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-003bb2bb2f8048ff8d82e140d6768986.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-003bb2bb2f8048ff8d82e140d6768986.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-003bb2bb2f8048ff8d82e140d6768986.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-0054c97f5be749f788e1c01c433c9115.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-0054c97f5be749f788e1c01c433c9115.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-0054c97f5be749f788e1c01c433c9115.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-0054c97f5be749f788e1c01c433c9115.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-00aa6d0adce54a9d918f1a38b8372c2e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-00aa6d0adce54a9d918f1a38b8372c2e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-00aa6d0adce54a9d918f1a38b8372c2e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-00aa6d0adce54a9d918f1a38b8372c2e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-017fee5b46e14f03945630bb7ab17ea9.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-017fee5b46e14f03945630bb7ab17ea9.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-017fee5b46e14f03945630bb7ab17ea9.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-017fee5b46e14f03945630bb7ab17ea9.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-035877f72f15435295d2e4f8d6b536ad.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-035877f72f15435295d2e4f8d6b536ad.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-035877f72f15435295d2e4f8d6b536ad.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-035877f72f15435295d2e4f8d6b536ad.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-038bd1bf6a55476d89f0b5937628d13a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-038bd1bf6a55476d89f0b5937628d13a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-038bd1bf6a55476d89f0b5937628d13a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-038bd1bf6a55476d89f0b5937628d13a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-04bf065ed0f14a58b0da6129b8016093.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-04bf065ed0f14a58b0da6129b8016093.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-04bf065ed0f14a58b0da6129b8016093.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-04bf065ed0f14a58b0da6129b8016093.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-05c4c217469c422f92de101350ec9400.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-05c4c217469c422f92de101350ec9400.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-05c4c217469c422f92de101350ec9400.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-05c4c217469c422f92de101350ec9400.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-06b7ddf0057c4a5d95930f0bd5e1dbc4.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-06b7ddf0057c4a5d95930f0bd5e1dbc4.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-06b7ddf0057c4a5d95930f0bd5e1dbc4.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-06b7ddf0057c4a5d95930f0bd5e1dbc4.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-06e7106c9bc9402b8bf6329d2c447040.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-06e7106c9bc9402b8bf6329d2c447040.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-06e7106c9bc9402b8bf6329d2c447040.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-06e7106c9bc9402b8bf6329d2c447040.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-073a0470a4ec4ff2a6ba0799e9039dc2.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-073a0470a4ec4ff2a6ba0799e9039dc2.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-073a0470a4ec4ff2a6ba0799e9039dc2.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-073a0470a4ec4ff2a6ba0799e9039dc2.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-0b4bcb90105e4744aa93a10714575ac3.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-0b4bcb90105e4744aa93a10714575ac3.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-0b4bcb90105e4744aa93a10714575ac3.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-0b4bcb90105e4744aa93a10714575ac3.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-0dc525a070a14e8090a335a73393f1d9.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-0dc525a070a14e8090a335a73393f1d9.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-0dc525a070a14e8090a335a73393f1d9.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-0dc525a070a14e8090a335a73393f1d9.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-0ec7e48aee7745e4bcaf4c4bbdb1a2c1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-0ec7e48aee7745e4bcaf4c4bbdb1a2c1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-0ec7e48aee7745e4bcaf4c4bbdb1a2c1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-0ec7e48aee7745e4bcaf4c4bbdb1a2c1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-11393c9f67724724bd56f939cf02ebe4.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-11393c9f67724724bd56f939cf02ebe4.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-11393c9f67724724bd56f939cf02ebe4.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-11393c9f67724724bd56f939cf02ebe4.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-126fd601948c4905be8ebd3d64d251ce.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-126fd601948c4905be8ebd3d64d251ce.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-126fd601948c4905be8ebd3d64d251ce.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-126fd601948c4905be8ebd3d64d251ce.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-12cf877d572d410bb16d4ca6f564ea3c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-12cf877d572d410bb16d4ca6f564ea3c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-12cf877d572d410bb16d4ca6f564ea3c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-12cf877d572d410bb16d4ca6f564ea3c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-15105dd9234840fdb668d461fa1d307d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-15105dd9234840fdb668d461fa1d307d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-15105dd9234840fdb668d461fa1d307d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-15105dd9234840fdb668d461fa1d307d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-158cdc8d9860477a99155597d8cb1344.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-158cdc8d9860477a99155597d8cb1344.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-158cdc8d9860477a99155597d8cb1344.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-158cdc8d9860477a99155597d8cb1344.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-16b6558405104d16a8e444b071123001.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-16b6558405104d16a8e444b071123001.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-16b6558405104d16a8e444b071123001.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-16b6558405104d16a8e444b071123001.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-199558fd981940c09b27cafd987b9fa1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-199558fd981940c09b27cafd987b9fa1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-199558fd981940c09b27cafd987b9fa1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-199558fd981940c09b27cafd987b9fa1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-1c595278212f420194f030abf44fdbaa.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-1c595278212f420194f030abf44fdbaa.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-1c595278212f420194f030abf44fdbaa.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-1c595278212f420194f030abf44fdbaa.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-1db4f410be5d4301a7db4dd93c354633.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-1db4f410be5d4301a7db4dd93c354633.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-1db4f410be5d4301a7db4dd93c354633.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-1db4f410be5d4301a7db4dd93c354633.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-1e0e03b882c444ab8b2f99aadbec2fe3.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-1e0e03b882c444ab8b2f99aadbec2fe3.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-1e0e03b882c444ab8b2f99aadbec2fe3.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-1e0e03b882c444ab8b2f99aadbec2fe3.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-1e7c0114fed74cb785222864b1a35650.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-1e7c0114fed74cb785222864b1a35650.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-1e7c0114fed74cb785222864b1a35650.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-1e7c0114fed74cb785222864b1a35650.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-23238961f2a04a1e9f80b44fdeb4e307.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-23238961f2a04a1e9f80b44fdeb4e307.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-23238961f2a04a1e9f80b44fdeb4e307.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-23238961f2a04a1e9f80b44fdeb4e307.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-23869a61529a46db9b4ce81cc20e47ea.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-23869a61529a46db9b4ce81cc20e47ea.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-23869a61529a46db9b4ce81cc20e47ea.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-23869a61529a46db9b4ce81cc20e47ea.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-248411c6c39947edaaffb00f8128d601.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-248411c6c39947edaaffb00f8128d601.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-248411c6c39947edaaffb00f8128d601.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-248411c6c39947edaaffb00f8128d601.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-24fb3759898443de93bb2af28227c185.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-24fb3759898443de93bb2af28227c185.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-24fb3759898443de93bb2af28227c185.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-24fb3759898443de93bb2af28227c185.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-27878db80ac5406e8d1e22f7f0e398b5.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-27878db80ac5406e8d1e22f7f0e398b5.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-27878db80ac5406e8d1e22f7f0e398b5.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-27878db80ac5406e8d1e22f7f0e398b5.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-2903b57f534a46e8945bc61210df371b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-2903b57f534a46e8945bc61210df371b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-2903b57f534a46e8945bc61210df371b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-2903b57f534a46e8945bc61210df371b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-2a48a4c112c049d1932d58403af049bb.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-2a48a4c112c049d1932d58403af049bb.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-2a48a4c112c049d1932d58403af049bb.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-2a48a4c112c049d1932d58403af049bb.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-2afb39a20a30495f8a0c64c2a7a79640.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-2afb39a20a30495f8a0c64c2a7a79640.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-2afb39a20a30495f8a0c64c2a7a79640.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-2afb39a20a30495f8a0c64c2a7a79640.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-2bddfb62b85e4998980739ca245aabbc.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-2bddfb62b85e4998980739ca245aabbc.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-2bddfb62b85e4998980739ca245aabbc.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-2bddfb62b85e4998980739ca245aabbc.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-2bf2eaeb62db4c7da90ff44da071fa36.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-2bf2eaeb62db4c7da90ff44da071fa36.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-2bf2eaeb62db4c7da90ff44da071fa36.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-2bf2eaeb62db4c7da90ff44da071fa36.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-2bfd2d19f0a642169422d8795a4a41f8.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-2bfd2d19f0a642169422d8795a4a41f8.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-2bfd2d19f0a642169422d8795a4a41f8.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-2bfd2d19f0a642169422d8795a4a41f8.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-2f02eed7ec354ab6b765d06d6681b43b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-2f02eed7ec354ab6b765d06d6681b43b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-2f02eed7ec354ab6b765d06d6681b43b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-2f02eed7ec354ab6b765d06d6681b43b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-2f074dc63fac480b86c576a99fbac1f1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-2f074dc63fac480b86c576a99fbac1f1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-2f074dc63fac480b86c576a99fbac1f1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-2f074dc63fac480b86c576a99fbac1f1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-3075ac8f7f5a470585a21313a5c5290d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-3075ac8f7f5a470585a21313a5c5290d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-3075ac8f7f5a470585a21313a5c5290d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-3075ac8f7f5a470585a21313a5c5290d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-30a52df10f904682add27cdeea826a75.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-30a52df10f904682add27cdeea826a75.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-30a52df10f904682add27cdeea826a75.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-30a52df10f904682add27cdeea826a75.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-3361899465d14a9cbe8cb3471f9ecaa6.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-3361899465d14a9cbe8cb3471f9ecaa6.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-3361899465d14a9cbe8cb3471f9ecaa6.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-3361899465d14a9cbe8cb3471f9ecaa6.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-33c629350ac94ab9bd81330a4ec45b8e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-33c629350ac94ab9bd81330a4ec45b8e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-33c629350ac94ab9bd81330a4ec45b8e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-33c629350ac94ab9bd81330a4ec45b8e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-342983e650c849748937ce8519014196.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-342983e650c849748937ce8519014196.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-342983e650c849748937ce8519014196.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-342983e650c849748937ce8519014196.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-34a18cd31c6240048fc0da3a7e256d9f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-34a18cd31c6240048fc0da3a7e256d9f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-34a18cd31c6240048fc0da3a7e256d9f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-34a18cd31c6240048fc0da3a7e256d9f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-36e452dd53324272b873710fb3f34aa5.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-36e452dd53324272b873710fb3f34aa5.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-36e452dd53324272b873710fb3f34aa5.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-36e452dd53324272b873710fb3f34aa5.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-376271e4717b448691831e237ca3f5e5.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-376271e4717b448691831e237ca3f5e5.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-376271e4717b448691831e237ca3f5e5.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-376271e4717b448691831e237ca3f5e5.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-3942baadb2b64993b39982f04a293b93.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-3942baadb2b64993b39982f04a293b93.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-3942baadb2b64993b39982f04a293b93.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-3942baadb2b64993b39982f04a293b93.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-39b345d111414a719f5d938255490505.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-39b345d111414a719f5d938255490505.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-39b345d111414a719f5d938255490505.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-39b345d111414a719f5d938255490505.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-3b2262276c38490299bd07cdaa5ad2dc.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-3b2262276c38490299bd07cdaa5ad2dc.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-3b2262276c38490299bd07cdaa5ad2dc.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-3b2262276c38490299bd07cdaa5ad2dc.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-3b9e9dc629204c16bed7abf8309c03dc.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-3b9e9dc629204c16bed7abf8309c03dc.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-3b9e9dc629204c16bed7abf8309c03dc.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-3b9e9dc629204c16bed7abf8309c03dc.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-3d1b98e280474621b0b20b51a70c56db.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-3d1b98e280474621b0b20b51a70c56db.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-3d1b98e280474621b0b20b51a70c56db.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-3d1b98e280474621b0b20b51a70c56db.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-404b75785a5345e4a71398da3077c053.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-404b75785a5345e4a71398da3077c053.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-404b75785a5345e4a71398da3077c053.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-404b75785a5345e4a71398da3077c053.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-405fa6b1f7d34e4aaef25c8088721f18.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-405fa6b1f7d34e4aaef25c8088721f18.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-405fa6b1f7d34e4aaef25c8088721f18.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-405fa6b1f7d34e4aaef25c8088721f18.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-44128cbe8d7346b387de166f0b6a92b6.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-44128cbe8d7346b387de166f0b6a92b6.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-44128cbe8d7346b387de166f0b6a92b6.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-44128cbe8d7346b387de166f0b6a92b6.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-44b77d4661de424f8ed1105c65185c32.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-44b77d4661de424f8ed1105c65185c32.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-44b77d4661de424f8ed1105c65185c32.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-44b77d4661de424f8ed1105c65185c32.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-44ffa515686b4489a9e94c410e28e10a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-44ffa515686b4489a9e94c410e28e10a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-44ffa515686b4489a9e94c410e28e10a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-44ffa515686b4489a9e94c410e28e10a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-4596032779da40739f0954ea2e7945fa.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-4596032779da40739f0954ea2e7945fa.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-4596032779da40739f0954ea2e7945fa.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-4596032779da40739f0954ea2e7945fa.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-45be76c2e8224d86a8b41f1cbc80f675.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-45be76c2e8224d86a8b41f1cbc80f675.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-45be76c2e8224d86a8b41f1cbc80f675.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-45be76c2e8224d86a8b41f1cbc80f675.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-4653e96429a941da93f1b1f87f1a4958.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-4653e96429a941da93f1b1f87f1a4958.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-4653e96429a941da93f1b1f87f1a4958.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-4653e96429a941da93f1b1f87f1a4958.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-46dca7bfd75246f3af5472c98cd2729f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-46dca7bfd75246f3af5472c98cd2729f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-46dca7bfd75246f3af5472c98cd2729f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-46dca7bfd75246f3af5472c98cd2729f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-474f23f9895b4b64b5cdce0a354a59b6.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-474f23f9895b4b64b5cdce0a354a59b6.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-474f23f9895b4b64b5cdce0a354a59b6.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-474f23f9895b4b64b5cdce0a354a59b6.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-496bb4ba378842069f430ed13a116e92.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-496bb4ba378842069f430ed13a116e92.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-496bb4ba378842069f430ed13a116e92.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-496bb4ba378842069f430ed13a116e92.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-4b61ede9395a425fbac942b15e01dbe0.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-4b61ede9395a425fbac942b15e01dbe0.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-4b61ede9395a425fbac942b15e01dbe0.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-4b61ede9395a425fbac942b15e01dbe0.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-4bbaa46681a3417fa272adc54ce18b0a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-4bbaa46681a3417fa272adc54ce18b0a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-4bbaa46681a3417fa272adc54ce18b0a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-4bbaa46681a3417fa272adc54ce18b0a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-4c22ac9781bd4941afac598c4ef4145f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-4c22ac9781bd4941afac598c4ef4145f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-4c22ac9781bd4941afac598c4ef4145f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-4c22ac9781bd4941afac598c4ef4145f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-4dd735f56e9645f0934a964b403072f9.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-4dd735f56e9645f0934a964b403072f9.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-4dd735f56e9645f0934a964b403072f9.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-4dd735f56e9645f0934a964b403072f9.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-4deb97cbc52e406dbae74bb88e18341f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-4deb97cbc52e406dbae74bb88e18341f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-4deb97cbc52e406dbae74bb88e18341f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-4deb97cbc52e406dbae74bb88e18341f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-4e574f97f60b4b40916afbd2edb63aed.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-4e574f97f60b4b40916afbd2edb63aed.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-4e574f97f60b4b40916afbd2edb63aed.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-4e574f97f60b4b40916afbd2edb63aed.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-5023dac7895a4b309a3d89aab78ad51f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-5023dac7895a4b309a3d89aab78ad51f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-5023dac7895a4b309a3d89aab78ad51f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-5023dac7895a4b309a3d89aab78ad51f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-50e76d4574c64001a08a7cc08efd8795.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-50e76d4574c64001a08a7cc08efd8795.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-50e76d4574c64001a08a7cc08efd8795.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-50e76d4574c64001a08a7cc08efd8795.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-52881c41004a42c48a58f315a511db78.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-52881c41004a42c48a58f315a511db78.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-52881c41004a42c48a58f315a511db78.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-52881c41004a42c48a58f315a511db78.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-544aae364b514d3aaa6b93e7ba8f2171.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-544aae364b514d3aaa6b93e7ba8f2171.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-544aae364b514d3aaa6b93e7ba8f2171.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-544aae364b514d3aaa6b93e7ba8f2171.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-54b92f9933c746e78361e0243d7addf5.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-54b92f9933c746e78361e0243d7addf5.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-54b92f9933c746e78361e0243d7addf5.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-54b92f9933c746e78361e0243d7addf5.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-5668abbf6f6a4808b075aafafb0238c1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-5668abbf6f6a4808b075aafafb0238c1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-5668abbf6f6a4808b075aafafb0238c1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-5668abbf6f6a4808b075aafafb0238c1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-56d910c8e6bf4f78a553ca74c8980b76.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-56d910c8e6bf4f78a553ca74c8980b76.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-56d910c8e6bf4f78a553ca74c8980b76.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-56d910c8e6bf4f78a553ca74c8980b76.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-580bf8cf8a9741a8b5dfa4fb41c9ec01.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-580bf8cf8a9741a8b5dfa4fb41c9ec01.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-580bf8cf8a9741a8b5dfa4fb41c9ec01.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-580bf8cf8a9741a8b5dfa4fb41c9ec01.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-59df25116f7446f6bbb91110588e582e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-59df25116f7446f6bbb91110588e582e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-59df25116f7446f6bbb91110588e582e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-59df25116f7446f6bbb91110588e582e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-5b431a6edd364b5cafacd9f806398707.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-5b431a6edd364b5cafacd9f806398707.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-5b431a6edd364b5cafacd9f806398707.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-5b431a6edd364b5cafacd9f806398707.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-5c108c538ef743f2a23b20f9c9cfbadf.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-5c108c538ef743f2a23b20f9c9cfbadf.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-5c108c538ef743f2a23b20f9c9cfbadf.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-5c108c538ef743f2a23b20f9c9cfbadf.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-62122b2bc6624abf9363b1e9fc9a7ebe.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-62122b2bc6624abf9363b1e9fc9a7ebe.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-62122b2bc6624abf9363b1e9fc9a7ebe.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-62122b2bc6624abf9363b1e9fc9a7ebe.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-6224ec9d749f45279fca4e9e785f739f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-6224ec9d749f45279fca4e9e785f739f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-6224ec9d749f45279fca4e9e785f739f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-6224ec9d749f45279fca4e9e785f739f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-62815393642c4a718ee15f63f231db78.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-62815393642c4a718ee15f63f231db78.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-62815393642c4a718ee15f63f231db78.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-62815393642c4a718ee15f63f231db78.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-64971367fa804b339573ebe0988eb4a0.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-64971367fa804b339573ebe0988eb4a0.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-64971367fa804b339573ebe0988eb4a0.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-64971367fa804b339573ebe0988eb4a0.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-649a0c325e8246dd9afe5a8805263ce1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-649a0c325e8246dd9afe5a8805263ce1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-649a0c325e8246dd9afe5a8805263ce1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-649a0c325e8246dd9afe5a8805263ce1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-6842d13e35d640faad70e863dd331d90.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-6842d13e35d640faad70e863dd331d90.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-6842d13e35d640faad70e863dd331d90.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-6842d13e35d640faad70e863dd331d90.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-6859c29481d9419dacb8309b88114e13.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-6859c29481d9419dacb8309b88114e13.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-6859c29481d9419dacb8309b88114e13.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-6859c29481d9419dacb8309b88114e13.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-697b1898c6094d53a7b476a64c5711c8.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-697b1898c6094d53a7b476a64c5711c8.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-697b1898c6094d53a7b476a64c5711c8.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-697b1898c6094d53a7b476a64c5711c8.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-69cb51d65aad4dfe8953d9d2d0d0b439.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-69cb51d65aad4dfe8953d9d2d0d0b439.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-69cb51d65aad4dfe8953d9d2d0d0b439.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-69cb51d65aad4dfe8953d9d2d0d0b439.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-6a450ce298be43e08eb225a15ca75dae.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-6a450ce298be43e08eb225a15ca75dae.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-6a450ce298be43e08eb225a15ca75dae.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-6a450ce298be43e08eb225a15ca75dae.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-6b77968b3ad241dda399ef0aa8a2f4d3.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-6b77968b3ad241dda399ef0aa8a2f4d3.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-6b77968b3ad241dda399ef0aa8a2f4d3.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-6b77968b3ad241dda399ef0aa8a2f4d3.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-6bc05b08e1dc4c4a98b5558609659531.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-6bc05b08e1dc4c4a98b5558609659531.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-6bc05b08e1dc4c4a98b5558609659531.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-6bc05b08e1dc4c4a98b5558609659531.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-6befca6f260b47d6bf2e03e4f5edffec.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-6befca6f260b47d6bf2e03e4f5edffec.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-6befca6f260b47d6bf2e03e4f5edffec.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-6befca6f260b47d6bf2e03e4f5edffec.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-6f40319ee5214013915628d4bd2ae9a1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-6f40319ee5214013915628d4bd2ae9a1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-6f40319ee5214013915628d4bd2ae9a1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-6f40319ee5214013915628d4bd2ae9a1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-6f86af4468664fdd89b3651544938c7d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-6f86af4468664fdd89b3651544938c7d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-6f86af4468664fdd89b3651544938c7d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-6f86af4468664fdd89b3651544938c7d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-6ff8553b755c426a8345e060f3de1cb2.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-6ff8553b755c426a8345e060f3de1cb2.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-6ff8553b755c426a8345e060f3de1cb2.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-6ff8553b755c426a8345e060f3de1cb2.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-7030dca6edfd441ca68662383afb2ff5.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-7030dca6edfd441ca68662383afb2ff5.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-7030dca6edfd441ca68662383afb2ff5.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-7030dca6edfd441ca68662383afb2ff5.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-71faddfb0e124e42908fea3d7ba64161.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-71faddfb0e124e42908fea3d7ba64161.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-71faddfb0e124e42908fea3d7ba64161.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-71faddfb0e124e42908fea3d7ba64161.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-7371436f8c5e4e2d9a5ea0fb27e3f0a4.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-7371436f8c5e4e2d9a5ea0fb27e3f0a4.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-7371436f8c5e4e2d9a5ea0fb27e3f0a4.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-7371436f8c5e4e2d9a5ea0fb27e3f0a4.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-7518db167e4248178ff61b0bacf78248.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-7518db167e4248178ff61b0bacf78248.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-7518db167e4248178ff61b0bacf78248.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-7518db167e4248178ff61b0bacf78248.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-75db05eab0ef47519857505a23fe66f2.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-75db05eab0ef47519857505a23fe66f2.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-75db05eab0ef47519857505a23fe66f2.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-75db05eab0ef47519857505a23fe66f2.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-7699706992f34008bca2ed20a9fc91a5.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-7699706992f34008bca2ed20a9fc91a5.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-7699706992f34008bca2ed20a9fc91a5.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-7699706992f34008bca2ed20a9fc91a5.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-76adcab5fbf444d1a7fd36057165f282.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-76adcab5fbf444d1a7fd36057165f282.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-76adcab5fbf444d1a7fd36057165f282.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-76adcab5fbf444d1a7fd36057165f282.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-773292f4a6624d0d9ee39f7aa910ec77.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-773292f4a6624d0d9ee39f7aa910ec77.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-773292f4a6624d0d9ee39f7aa910ec77.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-773292f4a6624d0d9ee39f7aa910ec77.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-7874710f69714cf68c5f93bd11ff5952.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-7874710f69714cf68c5f93bd11ff5952.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-7874710f69714cf68c5f93bd11ff5952.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-7874710f69714cf68c5f93bd11ff5952.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-7bd677be68c549429d911db72c606da5.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-7bd677be68c549429d911db72c606da5.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-7bd677be68c549429d911db72c606da5.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-7bd677be68c549429d911db72c606da5.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-7de415e2d5f243ff8f9d53ddf0c8e105.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-7de415e2d5f243ff8f9d53ddf0c8e105.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-7de415e2d5f243ff8f9d53ddf0c8e105.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-7de415e2d5f243ff8f9d53ddf0c8e105.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-81d1f0351a7b4eb2a5af709406fbb946.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-81d1f0351a7b4eb2a5af709406fbb946.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-81d1f0351a7b4eb2a5af709406fbb946.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-81d1f0351a7b4eb2a5af709406fbb946.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-8237fee75b4640bb9cdc6b6ab2916c97.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-8237fee75b4640bb9cdc6b6ab2916c97.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-8237fee75b4640bb9cdc6b6ab2916c97.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-8237fee75b4640bb9cdc6b6ab2916c97.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-8303fd4f2872461a98fab8971d3b5602.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-8303fd4f2872461a98fab8971d3b5602.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-8303fd4f2872461a98fab8971d3b5602.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-8303fd4f2872461a98fab8971d3b5602.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-846a11f610ae4fe0917a9560911a3c2a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-846a11f610ae4fe0917a9560911a3c2a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-846a11f610ae4fe0917a9560911a3c2a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-846a11f610ae4fe0917a9560911a3c2a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-85b97695192446deae0659553029449c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-85b97695192446deae0659553029449c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-85b97695192446deae0659553029449c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-85b97695192446deae0659553029449c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-8646d0704f5b4ebe9e50d7058ea8d02d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-8646d0704f5b4ebe9e50d7058ea8d02d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-8646d0704f5b4ebe9e50d7058ea8d02d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-8646d0704f5b4ebe9e50d7058ea8d02d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-873b4d3c577743eabef7fdb29c73b04f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-873b4d3c577743eabef7fdb29c73b04f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-873b4d3c577743eabef7fdb29c73b04f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-873b4d3c577743eabef7fdb29c73b04f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-87766b7c2d39430db8a99111ee8c7d24.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-87766b7c2d39430db8a99111ee8c7d24.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-87766b7c2d39430db8a99111ee8c7d24.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-87766b7c2d39430db8a99111ee8c7d24.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-87a4e33ead574e12ba9face74d1149a0.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-87a4e33ead574e12ba9face74d1149a0.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-87a4e33ead574e12ba9face74d1149a0.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-87a4e33ead574e12ba9face74d1149a0.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-88fb741c40b549bea3e4390e9bf459ed.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-88fb741c40b549bea3e4390e9bf459ed.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-88fb741c40b549bea3e4390e9bf459ed.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-88fb741c40b549bea3e4390e9bf459ed.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-8b026cea134041cbb9437a2885a5f87f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-8b026cea134041cbb9437a2885a5f87f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-8b026cea134041cbb9437a2885a5f87f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-8b026cea134041cbb9437a2885a5f87f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-8c813a25fe504bef997a39ffbf07936d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-8c813a25fe504bef997a39ffbf07936d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-8c813a25fe504bef997a39ffbf07936d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-8c813a25fe504bef997a39ffbf07936d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-8e42b5e25e754b1b84eef7cd86fea3c8.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-8e42b5e25e754b1b84eef7cd86fea3c8.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-8e42b5e25e754b1b84eef7cd86fea3c8.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-8e42b5e25e754b1b84eef7cd86fea3c8.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-8ea80cc5a70741e6903732d62370dfae.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-8ea80cc5a70741e6903732d62370dfae.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-8ea80cc5a70741e6903732d62370dfae.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-8ea80cc5a70741e6903732d62370dfae.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-8eec572428c44cd1a26b18e95380551c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-8eec572428c44cd1a26b18e95380551c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-8eec572428c44cd1a26b18e95380551c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-8eec572428c44cd1a26b18e95380551c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-9041b40ae7444b89865466050c7e5f99.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-9041b40ae7444b89865466050c7e5f99.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-9041b40ae7444b89865466050c7e5f99.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-9041b40ae7444b89865466050c7e5f99.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-90ec6121a98840ae956f2a6551134a5a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-90ec6121a98840ae956f2a6551134a5a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-90ec6121a98840ae956f2a6551134a5a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-90ec6121a98840ae956f2a6551134a5a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-9153a6af20434efdbd247f3706ebe073.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-9153a6af20434efdbd247f3706ebe073.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-9153a6af20434efdbd247f3706ebe073.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-9153a6af20434efdbd247f3706ebe073.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-92122ac86fc54a538baf042ad122be64.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-92122ac86fc54a538baf042ad122be64.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-92122ac86fc54a538baf042ad122be64.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-92122ac86fc54a538baf042ad122be64.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-93d716b55a584d6aac8d342d1898d28a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-93d716b55a584d6aac8d342d1898d28a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-93d716b55a584d6aac8d342d1898d28a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-93d716b55a584d6aac8d342d1898d28a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-95c9837ae10e4bc596faed5311f77792.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-95c9837ae10e4bc596faed5311f77792.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-95c9837ae10e4bc596faed5311f77792.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-95c9837ae10e4bc596faed5311f77792.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-9628ca1c1c0941c392d462cef87024da.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-9628ca1c1c0941c392d462cef87024da.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-9628ca1c1c0941c392d462cef87024da.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-9628ca1c1c0941c392d462cef87024da.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-972074756be946889819b71d14cf47ea.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-972074756be946889819b71d14cf47ea.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-972074756be946889819b71d14cf47ea.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-972074756be946889819b71d14cf47ea.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-97407b3ed9ad4b8d9670e651e263c74b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-97407b3ed9ad4b8d9670e651e263c74b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-97407b3ed9ad4b8d9670e651e263c74b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-97407b3ed9ad4b8d9670e651e263c74b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-983c3f5540864a5e9f80fc0f96e48a72.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-983c3f5540864a5e9f80fc0f96e48a72.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-983c3f5540864a5e9f80fc0f96e48a72.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-983c3f5540864a5e9f80fc0f96e48a72.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-9c919ceac55e4284be672f23f9d10e98.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-9c919ceac55e4284be672f23f9d10e98.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-9c919ceac55e4284be672f23f9d10e98.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-9c919ceac55e4284be672f23f9d10e98.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-9ceae0abc0ab446b858d5cbff5db5329.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-9ceae0abc0ab446b858d5cbff5db5329.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-9ceae0abc0ab446b858d5cbff5db5329.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-9ceae0abc0ab446b858d5cbff5db5329.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-9dd25957304c468292a68dac9b8c4a06.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-9dd25957304c468292a68dac9b8c4a06.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-9dd25957304c468292a68dac9b8c4a06.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-9dd25957304c468292a68dac9b8c4a06.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-9ffce6e9d6cd4750aa692f93f5c3f032.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-9ffce6e9d6cd4750aa692f93f5c3f032.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-9ffce6e9d6cd4750aa692f93f5c3f032.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-9ffce6e9d6cd4750aa692f93f5c3f032.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-a0d17b00b63b466b8f0b09e053719e99.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-a0d17b00b63b466b8f0b09e053719e99.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-a0d17b00b63b466b8f0b09e053719e99.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-a0d17b00b63b466b8f0b09e053719e99.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-a0dc0163e8d84b24ac91f1dd1ebe679e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-a0dc0163e8d84b24ac91f1dd1ebe679e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-a0dc0163e8d84b24ac91f1dd1ebe679e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-a0dc0163e8d84b24ac91f1dd1ebe679e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-a200518810ed4a90845db258ac961b67.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-a200518810ed4a90845db258ac961b67.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-a200518810ed4a90845db258ac961b67.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-a200518810ed4a90845db258ac961b67.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-a4a181ae337747a797a93fdce88ead91.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-a4a181ae337747a797a93fdce88ead91.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-a4a181ae337747a797a93fdce88ead91.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-a4a181ae337747a797a93fdce88ead91.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-a59722387fd045928007c70419e9f603.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-a59722387fd045928007c70419e9f603.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-a59722387fd045928007c70419e9f603.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-a59722387fd045928007c70419e9f603.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-a6be387b57c84fb782eee1f87ad9576a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-a6be387b57c84fb782eee1f87ad9576a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-a6be387b57c84fb782eee1f87ad9576a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-a6be387b57c84fb782eee1f87ad9576a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-a70c8f14af1b4ba0953ec32a21606d7f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-a70c8f14af1b4ba0953ec32a21606d7f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-a70c8f14af1b4ba0953ec32a21606d7f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-a70c8f14af1b4ba0953ec32a21606d7f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-a868e6abc5cf4f40a0c1cf597c621823.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-a868e6abc5cf4f40a0c1cf597c621823.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-a868e6abc5cf4f40a0c1cf597c621823.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-a868e6abc5cf4f40a0c1cf597c621823.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-aa919d83173f492493177511dc5b3343.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-aa919d83173f492493177511dc5b3343.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-aa919d83173f492493177511dc5b3343.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-aa919d83173f492493177511dc5b3343.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-aafb4463c794412e92ba403eab3a5acc.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-aafb4463c794412e92ba403eab3a5acc.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-aafb4463c794412e92ba403eab3a5acc.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-aafb4463c794412e92ba403eab3a5acc.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-af20d8dbd0a64354a0c2fcf1b115d370.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-af20d8dbd0a64354a0c2fcf1b115d370.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-af20d8dbd0a64354a0c2fcf1b115d370.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-af20d8dbd0a64354a0c2fcf1b115d370.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-af5908e2d5134142853ec47ba535dccb.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-af5908e2d5134142853ec47ba535dccb.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-af5908e2d5134142853ec47ba535dccb.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-af5908e2d5134142853ec47ba535dccb.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-af655db9666641afa2510e1d9d01e800.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-af655db9666641afa2510e1d9d01e800.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-af655db9666641afa2510e1d9d01e800.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-af655db9666641afa2510e1d9d01e800.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-b07c01013c584c7e805f3e2561ed46a1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-b07c01013c584c7e805f3e2561ed46a1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-b07c01013c584c7e805f3e2561ed46a1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-b07c01013c584c7e805f3e2561ed46a1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-b0ceaca79726435295d3e489c145f1dd.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-b0ceaca79726435295d3e489c145f1dd.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-b0ceaca79726435295d3e489c145f1dd.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-b0ceaca79726435295d3e489c145f1dd.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-b39bc8394319460cb19c1845a5ff40e8.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-b39bc8394319460cb19c1845a5ff40e8.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-b39bc8394319460cb19c1845a5ff40e8.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-b39bc8394319460cb19c1845a5ff40e8.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-b6b96955da774e0891ad026f990b31a2.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-b6b96955da774e0891ad026f990b31a2.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-b6b96955da774e0891ad026f990b31a2.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-b6b96955da774e0891ad026f990b31a2.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-b819fbe576b646bd8a0173be48109271.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-b819fbe576b646bd8a0173be48109271.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-b819fbe576b646bd8a0173be48109271.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-b819fbe576b646bd8a0173be48109271.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-ba509c330c984b92b13e583f2b22d7e7.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-ba509c330c984b92b13e583f2b22d7e7.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-ba509c330c984b92b13e583f2b22d7e7.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-ba509c330c984b92b13e583f2b22d7e7.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-ba63677331164ee8aac2bfe1ca55c220.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-ba63677331164ee8aac2bfe1ca55c220.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-ba63677331164ee8aac2bfe1ca55c220.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-ba63677331164ee8aac2bfe1ca55c220.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-bd9912174402413eac20435beba3f00c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-bd9912174402413eac20435beba3f00c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-bd9912174402413eac20435beba3f00c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-bd9912174402413eac20435beba3f00c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-bde61ca6989148f6a150f9bae77e21d9.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-bde61ca6989148f6a150f9bae77e21d9.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-bde61ca6989148f6a150f9bae77e21d9.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-bde61ca6989148f6a150f9bae77e21d9.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-bea22bfb12934b5b92d19bece4a57c74.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-bea22bfb12934b5b92d19bece4a57c74.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-bea22bfb12934b5b92d19bece4a57c74.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-bea22bfb12934b5b92d19bece4a57c74.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-bea3e6c1396745189180b82148c1278a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-bea3e6c1396745189180b82148c1278a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-bea3e6c1396745189180b82148c1278a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-bea3e6c1396745189180b82148c1278a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-c1d4f05bab3742d7a1333833a22f657a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-c1d4f05bab3742d7a1333833a22f657a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-c1d4f05bab3742d7a1333833a22f657a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-c1d4f05bab3742d7a1333833a22f657a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-c1ee7937b21449c18cc8abde33e3bb5f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-c1ee7937b21449c18cc8abde33e3bb5f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-c1ee7937b21449c18cc8abde33e3bb5f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-c1ee7937b21449c18cc8abde33e3bb5f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-c1fb8f7515394e2c820bc176047780e0.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-c1fb8f7515394e2c820bc176047780e0.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-c1fb8f7515394e2c820bc176047780e0.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-c1fb8f7515394e2c820bc176047780e0.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-c227708e1ea9403a842b1436b893f198.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-c227708e1ea9403a842b1436b893f198.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-c227708e1ea9403a842b1436b893f198.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-c227708e1ea9403a842b1436b893f198.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-c2510f4823d043ff8b480fc0fe92e7c6.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-c2510f4823d043ff8b480fc0fe92e7c6.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-c2510f4823d043ff8b480fc0fe92e7c6.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-c2510f4823d043ff8b480fc0fe92e7c6.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-c345bf5765b447969e349281ee970fa6.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-c345bf5765b447969e349281ee970fa6.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-c345bf5765b447969e349281ee970fa6.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-c345bf5765b447969e349281ee970fa6.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-c367704d797243e39bff689538db8cc7.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-c367704d797243e39bff689538db8cc7.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-c367704d797243e39bff689538db8cc7.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-c367704d797243e39bff689538db8cc7.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-c36efe54b537463dba7059158a00e0d2.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-c36efe54b537463dba7059158a00e0d2.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-c36efe54b537463dba7059158a00e0d2.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-c36efe54b537463dba7059158a00e0d2.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-c50ff2b123e94bfeb9971f7bf8382b22.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-c50ff2b123e94bfeb9971f7bf8382b22.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-c50ff2b123e94bfeb9971f7bf8382b22.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-c50ff2b123e94bfeb9971f7bf8382b22.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-c51a4f1a318245939e776041eccb3c9c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-c51a4f1a318245939e776041eccb3c9c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-c51a4f1a318245939e776041eccb3c9c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-c51a4f1a318245939e776041eccb3c9c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-c54c0d1c5aed42319206ffb3b2dbaef9.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-c54c0d1c5aed42319206ffb3b2dbaef9.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-c54c0d1c5aed42319206ffb3b2dbaef9.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-c54c0d1c5aed42319206ffb3b2dbaef9.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-c5c687b6c39b41b5912c440d5bfd7faa.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-c5c687b6c39b41b5912c440d5bfd7faa.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-c5c687b6c39b41b5912c440d5bfd7faa.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-c5c687b6c39b41b5912c440d5bfd7faa.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-c9cb192cc4684d0dbbfc3b2c62f3e4b6.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-c9cb192cc4684d0dbbfc3b2c62f3e4b6.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-c9cb192cc4684d0dbbfc3b2c62f3e4b6.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-c9cb192cc4684d0dbbfc3b2c62f3e4b6.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-cb3b94c161264b6896cc3ba58e3902fd.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-cb3b94c161264b6896cc3ba58e3902fd.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-cb3b94c161264b6896cc3ba58e3902fd.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-cb3b94c161264b6896cc3ba58e3902fd.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-cd671377770d454293ffc3eabc72c3f1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-cd671377770d454293ffc3eabc72c3f1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-cd671377770d454293ffc3eabc72c3f1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-cd671377770d454293ffc3eabc72c3f1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-ce2df41cc4c849db8fde1df1a00dc122.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-ce2df41cc4c849db8fde1df1a00dc122.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-ce2df41cc4c849db8fde1df1a00dc122.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-ce2df41cc4c849db8fde1df1a00dc122.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-d01310339437475c963bac60445beacb.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-d01310339437475c963bac60445beacb.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-d01310339437475c963bac60445beacb.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-d01310339437475c963bac60445beacb.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-d0f09834f18d4d7eab3f12f6277aa1c5.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-d0f09834f18d4d7eab3f12f6277aa1c5.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-d0f09834f18d4d7eab3f12f6277aa1c5.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-d0f09834f18d4d7eab3f12f6277aa1c5.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-d1569af3ea7240089e6b5c3428d65304.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-d1569af3ea7240089e6b5c3428d65304.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-d1569af3ea7240089e6b5c3428d65304.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-d1569af3ea7240089e6b5c3428d65304.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-d54a4035f1e64f5b8c510d90ea6ec270.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-d54a4035f1e64f5b8c510d90ea6ec270.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-d54a4035f1e64f5b8c510d90ea6ec270.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-d54a4035f1e64f5b8c510d90ea6ec270.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-d568e7e611e748bb89c7e5da46b8ecd6.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-d568e7e611e748bb89c7e5da46b8ecd6.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-d568e7e611e748bb89c7e5da46b8ecd6.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-d568e7e611e748bb89c7e5da46b8ecd6.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-d70105ac8f844c5ca19ab95c052238c9.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-d70105ac8f844c5ca19ab95c052238c9.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-d70105ac8f844c5ca19ab95c052238c9.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-d70105ac8f844c5ca19ab95c052238c9.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-d70d237a66444331b4d91d24d9ef73d5.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-d70d237a66444331b4d91d24d9ef73d5.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-d70d237a66444331b4d91d24d9ef73d5.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-d70d237a66444331b4d91d24d9ef73d5.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-d7daaacfd2634e7fb4c9e8943d568ed5.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-d7daaacfd2634e7fb4c9e8943d568ed5.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-d7daaacfd2634e7fb4c9e8943d568ed5.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-d7daaacfd2634e7fb4c9e8943d568ed5.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-d7e7c1bee0bd48f6aca5acdf2d1b92b8.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-d7e7c1bee0bd48f6aca5acdf2d1b92b8.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-d7e7c1bee0bd48f6aca5acdf2d1b92b8.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-d7e7c1bee0bd48f6aca5acdf2d1b92b8.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-d8b3d3bbf81048f4917167368def560e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-d8b3d3bbf81048f4917167368def560e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-d8b3d3bbf81048f4917167368def560e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-d8b3d3bbf81048f4917167368def560e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-da44aca9226f4e8a955f36af0f4191fb.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-da44aca9226f4e8a955f36af0f4191fb.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-da44aca9226f4e8a955f36af0f4191fb.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-da44aca9226f4e8a955f36af0f4191fb.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-dbaadd14d0ed4dfe8c97829d96cda865.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-dbaadd14d0ed4dfe8c97829d96cda865.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-dbaadd14d0ed4dfe8c97829d96cda865.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-dbaadd14d0ed4dfe8c97829d96cda865.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-dc4ccf9c94e94500aca70184ac86059d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-dc4ccf9c94e94500aca70184ac86059d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-dc4ccf9c94e94500aca70184ac86059d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-dc4ccf9c94e94500aca70184ac86059d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-dc96cd5b41a54897a819896cd37992bc.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-dc96cd5b41a54897a819896cd37992bc.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-dc96cd5b41a54897a819896cd37992bc.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-dc96cd5b41a54897a819896cd37992bc.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-dd6c3a3b162d408ca2aee32bb4098692.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-dd6c3a3b162d408ca2aee32bb4098692.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-dd6c3a3b162d408ca2aee32bb4098692.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-dd6c3a3b162d408ca2aee32bb4098692.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-de6c673247cf467e99b6adc996c5b471.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-de6c673247cf467e99b6adc996c5b471.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-de6c673247cf467e99b6adc996c5b471.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-de6c673247cf467e99b6adc996c5b471.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-dfd548b610614925928876b33d567dba.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-dfd548b610614925928876b33d567dba.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-dfd548b610614925928876b33d567dba.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-dfd548b610614925928876b33d567dba.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-e3003e793fd24de09669c906b5a4a0d3.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-e3003e793fd24de09669c906b5a4a0d3.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-e3003e793fd24de09669c906b5a4a0d3.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-e3003e793fd24de09669c906b5a4a0d3.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-e388cf0ac5d4471a99a39a83d56fa719.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-e388cf0ac5d4471a99a39a83d56fa719.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-e388cf0ac5d4471a99a39a83d56fa719.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-e388cf0ac5d4471a99a39a83d56fa719.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-e46fa3381b5346049f29d9aed2f18154.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-e46fa3381b5346049f29d9aed2f18154.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-e46fa3381b5346049f29d9aed2f18154.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-e46fa3381b5346049f29d9aed2f18154.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-e4eec81fac78401198b7ad936ad64c39.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-e4eec81fac78401198b7ad936ad64c39.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-e4eec81fac78401198b7ad936ad64c39.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-e4eec81fac78401198b7ad936ad64c39.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-e5e170b128d34e86b5718a62d4710499.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-e5e170b128d34e86b5718a62d4710499.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-e5e170b128d34e86b5718a62d4710499.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-e5e170b128d34e86b5718a62d4710499.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-e632fab5d0a7413c81d3331e519693b9.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-e632fab5d0a7413c81d3331e519693b9.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-e632fab5d0a7413c81d3331e519693b9.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-e632fab5d0a7413c81d3331e519693b9.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-e895a7bbee764032ae658c7e040673fc.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-e895a7bbee764032ae658c7e040673fc.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-e895a7bbee764032ae658c7e040673fc.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-e895a7bbee764032ae658c7e040673fc.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-e94476d2912b48c08fda2b58331aca1b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-e94476d2912b48c08fda2b58331aca1b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-e94476d2912b48c08fda2b58331aca1b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-e94476d2912b48c08fda2b58331aca1b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-e9bc0136d9074474b472fe413791aabf.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-e9bc0136d9074474b472fe413791aabf.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-e9bc0136d9074474b472fe413791aabf.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-e9bc0136d9074474b472fe413791aabf.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-e9efa0330015499b8cf50af7753c3d89.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-e9efa0330015499b8cf50af7753c3d89.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-e9efa0330015499b8cf50af7753c3d89.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-e9efa0330015499b8cf50af7753c3d89.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-ea59ad0303d64378be16100fbd2d2526.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-ea59ad0303d64378be16100fbd2d2526.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-ea59ad0303d64378be16100fbd2d2526.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-ea59ad0303d64378be16100fbd2d2526.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-eb8717996ca741fea954586ee8bee963.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-eb8717996ca741fea954586ee8bee963.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-eb8717996ca741fea954586ee8bee963.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-eb8717996ca741fea954586ee8bee963.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-ecace70cf2424f3ab6dfe825c32ee849.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-ecace70cf2424f3ab6dfe825c32ee849.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-ecace70cf2424f3ab6dfe825c32ee849.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-ecace70cf2424f3ab6dfe825c32ee849.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-f067b7f94daa4fd3b1367e223a232ea0.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-f067b7f94daa4fd3b1367e223a232ea0.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-f067b7f94daa4fd3b1367e223a232ea0.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-f067b7f94daa4fd3b1367e223a232ea0.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-f0c2970b4d6d433ba7c8cd244349cbd0.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-f0c2970b4d6d433ba7c8cd244349cbd0.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-f0c2970b4d6d433ba7c8cd244349cbd0.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-f0c2970b4d6d433ba7c8cd244349cbd0.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-f2b8c7bc77554728a61c2a379c6ed917.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-f2b8c7bc77554728a61c2a379c6ed917.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-f2b8c7bc77554728a61c2a379c6ed917.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-f2b8c7bc77554728a61c2a379c6ed917.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-f35d942bfa984c95ae69ab43dea68d9b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-f35d942bfa984c95ae69ab43dea68d9b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-f35d942bfa984c95ae69ab43dea68d9b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-f35d942bfa984c95ae69ab43dea68d9b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-f3f2f5cb126748459e1c77e577c2b6a6.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-f3f2f5cb126748459e1c77e577c2b6a6.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-f3f2f5cb126748459e1c77e577c2b6a6.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-f3f2f5cb126748459e1c77e577c2b6a6.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-f8e5bd59e0e94d0889d9f1e5a05b22b1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-f8e5bd59e0e94d0889d9f1e5a05b22b1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-f8e5bd59e0e94d0889d9f1e5a05b22b1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-f8e5bd59e0e94d0889d9f1e5a05b22b1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-fd087378dfd845ce8c0d0501b6d363d6.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-fd087378dfd845ce8c0d0501b6d363d6.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-fd087378dfd845ce8c0d0501b6d363d6.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-fd087378dfd845ce8c0d0501b6d363d6.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-fec6bb4c59794779814a2ded021d13c0.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-fec6bb4c59794779814a2ded021d13c0.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-fec6bb4c59794779814a2ded021d13c0.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/id-fec6bb4c59794779814a2ded021d13c0.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/model.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/model.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/model.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/elements/model.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/00ac2c5a-2461-407d-994a-522621827cbf.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/00ac2c5a-2461-407d-994a-522621827cbf.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/00ac2c5a-2461-407d-994a-522621827cbf.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/00ac2c5a-2461-407d-994a-522621827cbf.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/07a38777-a034-4a6b-8f90-6a9874ae035d.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/07a38777-a034-4a6b-8f90-6a9874ae035d.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/07a38777-a034-4a6b-8f90-6a9874ae035d.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/07a38777-a034-4a6b-8f90-6a9874ae035d.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/081ae1b1-7c1a-4a87-8f07-188d90448d4c.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/081ae1b1-7c1a-4a87-8f07-188d90448d4c.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/081ae1b1-7c1a-4a87-8f07-188d90448d4c.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/081ae1b1-7c1a-4a87-8f07-188d90448d4c.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/0a8ae1fb-a3b9-4baf-8f9c-a8752f200c6a.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/0a8ae1fb-a3b9-4baf-8f9c-a8752f200c6a.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/0a8ae1fb-a3b9-4baf-8f9c-a8752f200c6a.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/0a8ae1fb-a3b9-4baf-8f9c-a8752f200c6a.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/0b28e43c-0d28-4a27-9303-786f6b1bb04c.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/0b28e43c-0d28-4a27-9303-786f6b1bb04c.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/0b28e43c-0d28-4a27-9303-786f6b1bb04c.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/0b28e43c-0d28-4a27-9303-786f6b1bb04c.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/0c953c3c-994e-4cb7-9d3c-926515fefc17.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/0c953c3c-994e-4cb7-9d3c-926515fefc17.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/0c953c3c-994e-4cb7-9d3c-926515fefc17.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/0c953c3c-994e-4cb7-9d3c-926515fefc17.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/0cb18ec8-ed64-4cb6-864f-3416ca2d198a.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/0cb18ec8-ed64-4cb6-864f-3416ca2d198a.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/0cb18ec8-ed64-4cb6-864f-3416ca2d198a.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/0cb18ec8-ed64-4cb6-864f-3416ca2d198a.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/0dabd82b-9a4c-499b-afe7-da988722d1da.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/0dabd82b-9a4c-499b-afe7-da988722d1da.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/0dabd82b-9a4c-499b-afe7-da988722d1da.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/0dabd82b-9a4c-499b-afe7-da988722d1da.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/0e94dc1b-2f53-4777-9d6c-07be9d48d3f6.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/0e94dc1b-2f53-4777-9d6c-07be9d48d3f6.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/0e94dc1b-2f53-4777-9d6c-07be9d48d3f6.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/0e94dc1b-2f53-4777-9d6c-07be9d48d3f6.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/1050ce85-8788-44a8-a1d8-c9de65b3cfe3.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/1050ce85-8788-44a8-a1d8-c9de65b3cfe3.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/1050ce85-8788-44a8-a1d8-c9de65b3cfe3.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/1050ce85-8788-44a8-a1d8-c9de65b3cfe3.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/1618d303-0b6a-4c28-9e71-7bcac8c7d66c.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/1618d303-0b6a-4c28-9e71-7bcac8c7d66c.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/1618d303-0b6a-4c28-9e71-7bcac8c7d66c.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/1618d303-0b6a-4c28-9e71-7bcac8c7d66c.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/17db811f-5cd6-41b8-883f-23cc1373f61b.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/17db811f-5cd6-41b8-883f-23cc1373f61b.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/17db811f-5cd6-41b8-883f-23cc1373f61b.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/17db811f-5cd6-41b8-883f-23cc1373f61b.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/197f2e6a-96de-4fa9-910c-0cbecb488bec.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/197f2e6a-96de-4fa9-910c-0cbecb488bec.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/197f2e6a-96de-4fa9-910c-0cbecb488bec.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/197f2e6a-96de-4fa9-910c-0cbecb488bec.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/1b37c1aa-1336-4038-a23b-d067ed080a7a.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/1b37c1aa-1336-4038-a23b-d067ed080a7a.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/1b37c1aa-1336-4038-a23b-d067ed080a7a.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/1b37c1aa-1336-4038-a23b-d067ed080a7a.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/1d12d390-5fbb-4944-b82d-26660e3f4ad5.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/1d12d390-5fbb-4944-b82d-26660e3f4ad5.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/1d12d390-5fbb-4944-b82d-26660e3f4ad5.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/1d12d390-5fbb-4944-b82d-26660e3f4ad5.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/1dc1de6c-0489-4299-8f28-2096975a4838.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/1dc1de6c-0489-4299-8f28-2096975a4838.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/1dc1de6c-0489-4299-8f28-2096975a4838.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/1dc1de6c-0489-4299-8f28-2096975a4838.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/20f74adb-5143-4ea4-be7c-abf026b2e8ae.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/20f74adb-5143-4ea4-be7c-abf026b2e8ae.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/20f74adb-5143-4ea4-be7c-abf026b2e8ae.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/20f74adb-5143-4ea4-be7c-abf026b2e8ae.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/2274bd38-980b-4e91-9a24-09578c013b80.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/2274bd38-980b-4e91-9a24-09578c013b80.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/2274bd38-980b-4e91-9a24-09578c013b80.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/2274bd38-980b-4e91-9a24-09578c013b80.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/28bb74a3-9728-447a-8d72-d7b54e58b591.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/28bb74a3-9728-447a-8d72-d7b54e58b591.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/28bb74a3-9728-447a-8d72-d7b54e58b591.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/28bb74a3-9728-447a-8d72-d7b54e58b591.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/2e5cfe74-9b17-476b-8ca6-d19b142642d3.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/2e5cfe74-9b17-476b-8ca6-d19b142642d3.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/2e5cfe74-9b17-476b-8ca6-d19b142642d3.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/2e5cfe74-9b17-476b-8ca6-d19b142642d3.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/3092fb53-e617-4dbe-ba08-ce4f5f7bc167.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/3092fb53-e617-4dbe-ba08-ce4f5f7bc167.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/3092fb53-e617-4dbe-ba08-ce4f5f7bc167.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/3092fb53-e617-4dbe-ba08-ce4f5f7bc167.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/33e43de8-bac8-4d90-952e-12597a33df65.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/33e43de8-bac8-4d90-952e-12597a33df65.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/33e43de8-bac8-4d90-952e-12597a33df65.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/33e43de8-bac8-4d90-952e-12597a33df65.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/34b6537b-5534-4e64-95a5-00a8ffea9d02.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/34b6537b-5534-4e64-95a5-00a8ffea9d02.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/34b6537b-5534-4e64-95a5-00a8ffea9d02.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/34b6537b-5534-4e64-95a5-00a8ffea9d02.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/34d88f16-ab1f-4e58-8515-6feaec2d62a5.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/34d88f16-ab1f-4e58-8515-6feaec2d62a5.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/34d88f16-ab1f-4e58-8515-6feaec2d62a5.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/34d88f16-ab1f-4e58-8515-6feaec2d62a5.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/39dc2922-646c-488f-8615-6fb7a16830b6.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/39dc2922-646c-488f-8615-6fb7a16830b6.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/39dc2922-646c-488f-8615-6fb7a16830b6.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/39dc2922-646c-488f-8615-6fb7a16830b6.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/3c419c35-0e35-4e22-b6da-072d9243593c.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/3c419c35-0e35-4e22-b6da-072d9243593c.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/3c419c35-0e35-4e22-b6da-072d9243593c.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/3c419c35-0e35-4e22-b6da-072d9243593c.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/3efe0da1-7899-4949-a225-6db9d42f6926.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/3efe0da1-7899-4949-a225-6db9d42f6926.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/3efe0da1-7899-4949-a225-6db9d42f6926.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/3efe0da1-7899-4949-a225-6db9d42f6926.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/453f404d-0a13-4dce-9c11-0afdf527d1e1.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/453f404d-0a13-4dce-9c11-0afdf527d1e1.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/453f404d-0a13-4dce-9c11-0afdf527d1e1.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/453f404d-0a13-4dce-9c11-0afdf527d1e1.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/49a674dc-c388-4056-b572-87e8cea77181.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/49a674dc-c388-4056-b572-87e8cea77181.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/49a674dc-c388-4056-b572-87e8cea77181.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/49a674dc-c388-4056-b572-87e8cea77181.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/4c0f9830-5065-4922-902f-c3734c524545.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/4c0f9830-5065-4922-902f-c3734c524545.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/4c0f9830-5065-4922-902f-c3734c524545.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/4c0f9830-5065-4922-902f-c3734c524545.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/50be8b01-7789-4f72-aa5c-39904f3ab3f0.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/50be8b01-7789-4f72-aa5c-39904f3ab3f0.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/50be8b01-7789-4f72-aa5c-39904f3ab3f0.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/50be8b01-7789-4f72-aa5c-39904f3ab3f0.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/51754659-d4ae-4a21-9ea2-dc58655a9456.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/51754659-d4ae-4a21-9ea2-dc58655a9456.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/51754659-d4ae-4a21-9ea2-dc58655a9456.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/51754659-d4ae-4a21-9ea2-dc58655a9456.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/53be9acc-0c21-42ea-a060-1d7839892b3c.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/53be9acc-0c21-42ea-a060-1d7839892b3c.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/53be9acc-0c21-42ea-a060-1d7839892b3c.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/53be9acc-0c21-42ea-a060-1d7839892b3c.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/556e83e8-3dd4-456d-9268-efaff2bdf9ce.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/556e83e8-3dd4-456d-9268-efaff2bdf9ce.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/556e83e8-3dd4-456d-9268-efaff2bdf9ce.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/556e83e8-3dd4-456d-9268-efaff2bdf9ce.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/5652c6c7-bf2d-4a43-8d90-e64c9b7c0a5c.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/5652c6c7-bf2d-4a43-8d90-e64c9b7c0a5c.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/5652c6c7-bf2d-4a43-8d90-e64c9b7c0a5c.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/5652c6c7-bf2d-4a43-8d90-e64c9b7c0a5c.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/56c03b2e-15e1-4de3-96e6-332287b6e3e7.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/56c03b2e-15e1-4de3-96e6-332287b6e3e7.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/56c03b2e-15e1-4de3-96e6-332287b6e3e7.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/56c03b2e-15e1-4de3-96e6-332287b6e3e7.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/5894e7ec-d626-4c77-913a-f61b36267329.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/5894e7ec-d626-4c77-913a-f61b36267329.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/5894e7ec-d626-4c77-913a-f61b36267329.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/5894e7ec-d626-4c77-913a-f61b36267329.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/58a3ed11-fb28-498e-b912-bdc4a9e2a82b.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/58a3ed11-fb28-498e-b912-bdc4a9e2a82b.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/58a3ed11-fb28-498e-b912-bdc4a9e2a82b.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/58a3ed11-fb28-498e-b912-bdc4a9e2a82b.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/58c28a73-0190-4a6b-aee8-caf039021d60.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/58c28a73-0190-4a6b-aee8-caf039021d60.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/58c28a73-0190-4a6b-aee8-caf039021d60.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/58c28a73-0190-4a6b-aee8-caf039021d60.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/5b93b02c-895d-431e-8213-87b70e81c686.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/5b93b02c-895d-431e-8213-87b70e81c686.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/5b93b02c-895d-431e-8213-87b70e81c686.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/5b93b02c-895d-431e-8213-87b70e81c686.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/5c18c323-3686-4f73-8cd7-408bd9a68394.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/5c18c323-3686-4f73-8cd7-408bd9a68394.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/5c18c323-3686-4f73-8cd7-408bd9a68394.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/5c18c323-3686-4f73-8cd7-408bd9a68394.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/5c8c4ecb-89c2-4a11-869c-41d8330a0527.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/5c8c4ecb-89c2-4a11-869c-41d8330a0527.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/5c8c4ecb-89c2-4a11-869c-41d8330a0527.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/5c8c4ecb-89c2-4a11-869c-41d8330a0527.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/5dfea728-f0a4-4532-8255-aba4a475bff7.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/5dfea728-f0a4-4532-8255-aba4a475bff7.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/5dfea728-f0a4-4532-8255-aba4a475bff7.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/5dfea728-f0a4-4532-8255-aba4a475bff7.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/68a12e8c-1eea-4e9b-9dc2-9cb4d89edec1.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/68a12e8c-1eea-4e9b-9dc2-9cb4d89edec1.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/68a12e8c-1eea-4e9b-9dc2-9cb4d89edec1.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/68a12e8c-1eea-4e9b-9dc2-9cb4d89edec1.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/6927b348-6f6d-4836-a6db-96bb2ecf0b8d.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/6927b348-6f6d-4836-a6db-96bb2ecf0b8d.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/6927b348-6f6d-4836-a6db-96bb2ecf0b8d.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/6927b348-6f6d-4836-a6db-96bb2ecf0b8d.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/6d9d9c8b-f34f-4806-9efc-34affd994099.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/6d9d9c8b-f34f-4806-9efc-34affd994099.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/6d9d9c8b-f34f-4806-9efc-34affd994099.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/6d9d9c8b-f34f-4806-9efc-34affd994099.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/6f156b03-6698-4bbe-9376-d3339ff0cd4c.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/6f156b03-6698-4bbe-9376-d3339ff0cd4c.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/6f156b03-6698-4bbe-9376-d3339ff0cd4c.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/6f156b03-6698-4bbe-9376-d3339ff0cd4c.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/6f7b7410-581f-4b4f-b7c1-e9a6585355c2.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/6f7b7410-581f-4b4f-b7c1-e9a6585355c2.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/6f7b7410-581f-4b4f-b7c1-e9a6585355c2.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/6f7b7410-581f-4b4f-b7c1-e9a6585355c2.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/73dddaff-91c8-4a57-a28c-c26ceeef21f9.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/73dddaff-91c8-4a57-a28c-c26ceeef21f9.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/73dddaff-91c8-4a57-a28c-c26ceeef21f9.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/73dddaff-91c8-4a57-a28c-c26ceeef21f9.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/749152f0-1015-458b-8521-421b2e81cb7a.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/749152f0-1015-458b-8521-421b2e81cb7a.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/749152f0-1015-458b-8521-421b2e81cb7a.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/749152f0-1015-458b-8521-421b2e81cb7a.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/75755276-fce7-4ea3-b17f-ca2c02528780.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/75755276-fce7-4ea3-b17f-ca2c02528780.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/75755276-fce7-4ea3-b17f-ca2c02528780.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/75755276-fce7-4ea3-b17f-ca2c02528780.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/76654356-4818-4f4f-90ad-baa95663e02c.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/76654356-4818-4f4f-90ad-baa95663e02c.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/76654356-4818-4f4f-90ad-baa95663e02c.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/76654356-4818-4f4f-90ad-baa95663e02c.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/7a3be38e-7df1-460a-b9d6-fdc735e4390a.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/7a3be38e-7df1-460a-b9d6-fdc735e4390a.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/7a3be38e-7df1-460a-b9d6-fdc735e4390a.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/7a3be38e-7df1-460a-b9d6-fdc735e4390a.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/7b2f2dcd-d491-45e1-b992-28d946254450.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/7b2f2dcd-d491-45e1-b992-28d946254450.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/7b2f2dcd-d491-45e1-b992-28d946254450.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/7b2f2dcd-d491-45e1-b992-28d946254450.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/7d3cb257-9703-446c-aed9-3ecca665e269.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/7d3cb257-9703-446c-aed9-3ecca665e269.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/7d3cb257-9703-446c-aed9-3ecca665e269.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/7d3cb257-9703-446c-aed9-3ecca665e269.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/80554891-2aab-49d1-a6cd-453db07e4c43.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/80554891-2aab-49d1-a6cd-453db07e4c43.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/80554891-2aab-49d1-a6cd-453db07e4c43.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/80554891-2aab-49d1-a6cd-453db07e4c43.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/81725358-dad2-4a80-8c44-fde5d3885b78.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/81725358-dad2-4a80-8c44-fde5d3885b78.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/81725358-dad2-4a80-8c44-fde5d3885b78.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/81725358-dad2-4a80-8c44-fde5d3885b78.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/830c1fd0-0773-4ee6-8f2b-1a4b5fe24e7a.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/830c1fd0-0773-4ee6-8f2b-1a4b5fe24e7a.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/830c1fd0-0773-4ee6-8f2b-1a4b5fe24e7a.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/830c1fd0-0773-4ee6-8f2b-1a4b5fe24e7a.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/83138509-14d7-4de5-99ea-63b35cfa95d1.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/83138509-14d7-4de5-99ea-63b35cfa95d1.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/83138509-14d7-4de5-99ea-63b35cfa95d1.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/83138509-14d7-4de5-99ea-63b35cfa95d1.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/833a39e0-577e-4c9e-bb08-77887e473433.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/833a39e0-577e-4c9e-bb08-77887e473433.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/833a39e0-577e-4c9e-bb08-77887e473433.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/833a39e0-577e-4c9e-bb08-77887e473433.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/8757eca2-0d19-4277-ad5f-99bb6ef53f37.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/8757eca2-0d19-4277-ad5f-99bb6ef53f37.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/8757eca2-0d19-4277-ad5f-99bb6ef53f37.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/8757eca2-0d19-4277-ad5f-99bb6ef53f37.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/87605ad8-9255-43f7-bb06-e162a2987d31.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/87605ad8-9255-43f7-bb06-e162a2987d31.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/87605ad8-9255-43f7-bb06-e162a2987d31.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/87605ad8-9255-43f7-bb06-e162a2987d31.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/87b7bc68-e167-46c5-ac00-3f63c6bb7e81.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/87b7bc68-e167-46c5-ac00-3f63c6bb7e81.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/87b7bc68-e167-46c5-ac00-3f63c6bb7e81.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/87b7bc68-e167-46c5-ac00-3f63c6bb7e81.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/87f45453-8608-413d-b2d6-81088464613b.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/87f45453-8608-413d-b2d6-81088464613b.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/87f45453-8608-413d-b2d6-81088464613b.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/87f45453-8608-413d-b2d6-81088464613b.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/8946283c-9e57-4ada-889a-2e2d4fc54143.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/8946283c-9e57-4ada-889a-2e2d4fc54143.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/8946283c-9e57-4ada-889a-2e2d4fc54143.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/8946283c-9e57-4ada-889a-2e2d4fc54143.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/897333ea-5006-4dbe-b4d5-ca6409789037.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/897333ea-5006-4dbe-b4d5-ca6409789037.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/897333ea-5006-4dbe-b4d5-ca6409789037.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/897333ea-5006-4dbe-b4d5-ca6409789037.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/8c67dc20-3b7c-407d-9a60-c3b50d68169d.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/8c67dc20-3b7c-407d-9a60-c3b50d68169d.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/8c67dc20-3b7c-407d-9a60-c3b50d68169d.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/8c67dc20-3b7c-407d-9a60-c3b50d68169d.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/8c6df0a1-5306-4a77-9de8-97c9e6eae53e.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/8c6df0a1-5306-4a77-9de8-97c9e6eae53e.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/8c6df0a1-5306-4a77-9de8-97c9e6eae53e.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/8c6df0a1-5306-4a77-9de8-97c9e6eae53e.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/8de5d237-d280-4656-80f5-1a63f42d7bc6.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/8de5d237-d280-4656-80f5-1a63f42d7bc6.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/8de5d237-d280-4656-80f5-1a63f42d7bc6.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/8de5d237-d280-4656-80f5-1a63f42d7bc6.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/928f2592-d38b-4b62-8841-47f8c3ebafe7.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/928f2592-d38b-4b62-8841-47f8c3ebafe7.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/928f2592-d38b-4b62-8841-47f8c3ebafe7.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/928f2592-d38b-4b62-8841-47f8c3ebafe7.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/93cd208f-6cce-4cde-8d78-22e06fcf08dd.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/93cd208f-6cce-4cde-8d78-22e06fcf08dd.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/93cd208f-6cce-4cde-8d78-22e06fcf08dd.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/93cd208f-6cce-4cde-8d78-22e06fcf08dd.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/98e50d5c-3e4b-459d-a949-39de7587f5a0.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/98e50d5c-3e4b-459d-a949-39de7587f5a0.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/98e50d5c-3e4b-459d-a949-39de7587f5a0.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/98e50d5c-3e4b-459d-a949-39de7587f5a0.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/9952fa14-77c7-46e9-adfd-0bce4049553b.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/9952fa14-77c7-46e9-adfd-0bce4049553b.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/9952fa14-77c7-46e9-adfd-0bce4049553b.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/9952fa14-77c7-46e9-adfd-0bce4049553b.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/9af1c006-6e44-4e92-ac06-6ac705ecf85a.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/9af1c006-6e44-4e92-ac06-6ac705ecf85a.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/9af1c006-6e44-4e92-ac06-6ac705ecf85a.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/9af1c006-6e44-4e92-ac06-6ac705ecf85a.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/9e19f7b6-5ff6-422c-8975-4979ab57f559.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/9e19f7b6-5ff6-422c-8975-4979ab57f559.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/9e19f7b6-5ff6-422c-8975-4979ab57f559.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/9e19f7b6-5ff6-422c-8975-4979ab57f559.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/a282f8da-9466-42db-af61-280ed9930371.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/a282f8da-9466-42db-af61-280ed9930371.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/a282f8da-9466-42db-af61-280ed9930371.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/a282f8da-9466-42db-af61-280ed9930371.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/a58958bc-2048-499e-87f9-8048454190fa.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/a58958bc-2048-499e-87f9-8048454190fa.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/a58958bc-2048-499e-87f9-8048454190fa.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/a58958bc-2048-499e-87f9-8048454190fa.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/af519ca8-a892-4627-a0f6-77b055f32da1.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/af519ca8-a892-4627-a0f6-77b055f32da1.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/af519ca8-a892-4627-a0f6-77b055f32da1.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/af519ca8-a892-4627-a0f6-77b055f32da1.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/b1af5501-989f-434d-b71a-50eb3c66d827.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/b1af5501-989f-434d-b71a-50eb3c66d827.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/b1af5501-989f-434d-b71a-50eb3c66d827.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/b1af5501-989f-434d-b71a-50eb3c66d827.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/b4f7426b-79a2-4b67-882a-c519d04b651e.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/b4f7426b-79a2-4b67-882a-c519d04b651e.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/b4f7426b-79a2-4b67-882a-c519d04b651e.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/b4f7426b-79a2-4b67-882a-c519d04b651e.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/b51aaed8-1e4c-44e8-9f39-7df7c0c369e2.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/b51aaed8-1e4c-44e8-9f39-7df7c0c369e2.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/b51aaed8-1e4c-44e8-9f39-7df7c0c369e2.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/b51aaed8-1e4c-44e8-9f39-7df7c0c369e2.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/b6811261-01b1-4f92-b4ef-12c8cf959aa0.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/b6811261-01b1-4f92-b4ef-12c8cf959aa0.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/b6811261-01b1-4f92-b4ef-12c8cf959aa0.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/b6811261-01b1-4f92-b4ef-12c8cf959aa0.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/b97b2681-7c53-47fe-b899-c6ac0de4d9a3.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/b97b2681-7c53-47fe-b899-c6ac0de4d9a3.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/b97b2681-7c53-47fe-b899-c6ac0de4d9a3.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/b97b2681-7c53-47fe-b899-c6ac0de4d9a3.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/b99fd98c-4fe6-43e4-ba7e-ab2988eca3fb.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/b99fd98c-4fe6-43e4-ba7e-ab2988eca3fb.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/b99fd98c-4fe6-43e4-ba7e-ab2988eca3fb.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/b99fd98c-4fe6-43e4-ba7e-ab2988eca3fb.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/ba306546-fc22-4827-bb65-f8e413886aa1.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/ba306546-fc22-4827-bb65-f8e413886aa1.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/ba306546-fc22-4827-bb65-f8e413886aa1.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/ba306546-fc22-4827-bb65-f8e413886aa1.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/bb583668-1273-44d7-a88d-e0d219b84679.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/bb583668-1273-44d7-a88d-e0d219b84679.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/bb583668-1273-44d7-a88d-e0d219b84679.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/bb583668-1273-44d7-a88d-e0d219b84679.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/bbedec01-ffef-4063-abba-1cc92da9e01a.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/bbedec01-ffef-4063-abba-1cc92da9e01a.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/bbedec01-ffef-4063-abba-1cc92da9e01a.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/bbedec01-ffef-4063-abba-1cc92da9e01a.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/bca0768a-3306-4e57-933b-abc64a153d83.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/bca0768a-3306-4e57-933b-abc64a153d83.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/bca0768a-3306-4e57-933b-abc64a153d83.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/bca0768a-3306-4e57-933b-abc64a153d83.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/bdbd0690-4813-49f7-97a8-8521fc371d88.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/bdbd0690-4813-49f7-97a8-8521fc371d88.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/bdbd0690-4813-49f7-97a8-8521fc371d88.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/bdbd0690-4813-49f7-97a8-8521fc371d88.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/be6074eb-3739-42ae-b86b-e7cae6e1a458.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/be6074eb-3739-42ae-b86b-e7cae6e1a458.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/be6074eb-3739-42ae-b86b-e7cae6e1a458.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/be6074eb-3739-42ae-b86b-e7cae6e1a458.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/bf091a49-e570-4600-a963-502436b84f38.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/bf091a49-e570-4600-a963-502436b84f38.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/bf091a49-e570-4600-a963-502436b84f38.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/bf091a49-e570-4600-a963-502436b84f38.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/c095ad5e-c8cc-4638-b977-c7028c8b5d23.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/c095ad5e-c8cc-4638-b977-c7028c8b5d23.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/c095ad5e-c8cc-4638-b977-c7028c8b5d23.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/c095ad5e-c8cc-4638-b977-c7028c8b5d23.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/c0e8af05-1bbb-4269-9ec7-a9cb6c5c8b66.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/c0e8af05-1bbb-4269-9ec7-a9cb6c5c8b66.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/c0e8af05-1bbb-4269-9ec7-a9cb6c5c8b66.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/c0e8af05-1bbb-4269-9ec7-a9cb6c5c8b66.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/c112c25e-881d-4fd3-9a47-5b55d30592b3.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/c112c25e-881d-4fd3-9a47-5b55d30592b3.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/c112c25e-881d-4fd3-9a47-5b55d30592b3.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/c112c25e-881d-4fd3-9a47-5b55d30592b3.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/c35a5b8b-d429-4e24-8404-9c35817b4f37.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/c35a5b8b-d429-4e24-8404-9c35817b4f37.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/c35a5b8b-d429-4e24-8404-9c35817b4f37.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/c35a5b8b-d429-4e24-8404-9c35817b4f37.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/c4837879-c378-4e61-958f-9159fa9e26e7.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/c4837879-c378-4e61-958f-9159fa9e26e7.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/c4837879-c378-4e61-958f-9159fa9e26e7.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/c4837879-c378-4e61-958f-9159fa9e26e7.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/c4d02459-d3d4-4668-a686-52e02e604ff4.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/c4d02459-d3d4-4668-a686-52e02e604ff4.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/c4d02459-d3d4-4668-a686-52e02e604ff4.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/c4d02459-d3d4-4668-a686-52e02e604ff4.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/c5bf6758-2670-4e3f-afe1-f7ba16f85f48.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/c5bf6758-2670-4e3f-afe1-f7ba16f85f48.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/c5bf6758-2670-4e3f-afe1-f7ba16f85f48.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/c5bf6758-2670-4e3f-afe1-f7ba16f85f48.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/ca405cd2-d732-4bb8-bee4-20629c3b040c.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/ca405cd2-d732-4bb8-bee4-20629c3b040c.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/ca405cd2-d732-4bb8-bee4-20629c3b040c.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/ca405cd2-d732-4bb8-bee4-20629c3b040c.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/ca52fba9-1e26-4a94-bb10-64fe8e4ae01b.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/ca52fba9-1e26-4a94-bb10-64fe8e4ae01b.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/ca52fba9-1e26-4a94-bb10-64fe8e4ae01b.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/ca52fba9-1e26-4a94-bb10-64fe8e4ae01b.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/cce8df8c-d0f9-41b7-a2d4-537de2d543bc.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/cce8df8c-d0f9-41b7-a2d4-537de2d543bc.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/cce8df8c-d0f9-41b7-a2d4-537de2d543bc.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/cce8df8c-d0f9-41b7-a2d4-537de2d543bc.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/cf1387bd-5133-4b31-a98c-cb5bf94efa6b.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/cf1387bd-5133-4b31-a98c-cb5bf94efa6b.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/cf1387bd-5133-4b31-a98c-cb5bf94efa6b.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/cf1387bd-5133-4b31-a98c-cb5bf94efa6b.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/d1466cf6-135e-4cac-8c54-ae5264889e0e.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/d1466cf6-135e-4cac-8c54-ae5264889e0e.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/d1466cf6-135e-4cac-8c54-ae5264889e0e.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/d1466cf6-135e-4cac-8c54-ae5264889e0e.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/d447a1a9-7ceb-41f4-82ad-1b262aa5539d.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/d447a1a9-7ceb-41f4-82ad-1b262aa5539d.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/d447a1a9-7ceb-41f4-82ad-1b262aa5539d.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/d447a1a9-7ceb-41f4-82ad-1b262aa5539d.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/d50f3e55-1a7b-4c89-a532-c674e8d5da29.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/d50f3e55-1a7b-4c89-a532-c674e8d5da29.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/d50f3e55-1a7b-4c89-a532-c674e8d5da29.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/d50f3e55-1a7b-4c89-a532-c674e8d5da29.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/d5d0837f-827e-4e0e-b314-d7a9b0ae8ea1.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/d5d0837f-827e-4e0e-b314-d7a9b0ae8ea1.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/d5d0837f-827e-4e0e-b314-d7a9b0ae8ea1.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/d5d0837f-827e-4e0e-b314-d7a9b0ae8ea1.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/d6b95a23-2d52-4b0b-85d9-03445792060c.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/d6b95a23-2d52-4b0b-85d9-03445792060c.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/d6b95a23-2d52-4b0b-85d9-03445792060c.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/d6b95a23-2d52-4b0b-85d9-03445792060c.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/d7a666ef-d86a-4d06-a528-9944474afedf.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/d7a666ef-d86a-4d06-a528-9944474afedf.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/d7a666ef-d86a-4d06-a528-9944474afedf.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/d7a666ef-d86a-4d06-a528-9944474afedf.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/d9861c01-5b14-4268-b3d3-9ced861e6c64.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/d9861c01-5b14-4268-b3d3-9ced861e6c64.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/d9861c01-5b14-4268-b3d3-9ced861e6c64.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/d9861c01-5b14-4268-b3d3-9ced861e6c64.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/d9e6658b-3e9c-4a93-a33c-0b50f0c3f5d3.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/d9e6658b-3e9c-4a93-a33c-0b50f0c3f5d3.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/d9e6658b-3e9c-4a93-a33c-0b50f0c3f5d3.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/d9e6658b-3e9c-4a93-a33c-0b50f0c3f5d3.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/da2dae15-373c-4c05-9d8a-737dc810b8d7.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/da2dae15-373c-4c05-9d8a-737dc810b8d7.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/da2dae15-373c-4c05-9d8a-737dc810b8d7.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/da2dae15-373c-4c05-9d8a-737dc810b8d7.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/dbc1fb81-7d17-48e0-9c4a-f88680fb999b.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/dbc1fb81-7d17-48e0-9c4a-f88680fb999b.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/dbc1fb81-7d17-48e0-9c4a-f88680fb999b.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/dbc1fb81-7d17-48e0-9c4a-f88680fb999b.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/df1dfad2-95e1-4097-a9db-4e6e6fbae550.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/df1dfad2-95e1-4097-a9db-4e6e6fbae550.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/df1dfad2-95e1-4097-a9db-4e6e6fbae550.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/df1dfad2-95e1-4097-a9db-4e6e6fbae550.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/df7375f9-514c-45b8-86e6-2e61789514f0.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/df7375f9-514c-45b8-86e6-2e61789514f0.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/df7375f9-514c-45b8-86e6-2e61789514f0.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/df7375f9-514c-45b8-86e6-2e61789514f0.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/dfad9615-8898-4af2-af15-3f61c6696fd2.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/dfad9615-8898-4af2-af15-3f61c6696fd2.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/dfad9615-8898-4af2-af15-3f61c6696fd2.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/dfad9615-8898-4af2-af15-3f61c6696fd2.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/e00fefee-f93d-4b74-a1a9-6f0aea5d1d0f.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/e00fefee-f93d-4b74-a1a9-6f0aea5d1d0f.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/e00fefee-f93d-4b74-a1a9-6f0aea5d1d0f.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/e00fefee-f93d-4b74-a1a9-6f0aea5d1d0f.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/e0eb4804-d8e0-4310-8a4f-a924dd158fdf.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/e0eb4804-d8e0-4310-8a4f-a924dd158fdf.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/e0eb4804-d8e0-4310-8a4f-a924dd158fdf.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/e0eb4804-d8e0-4310-8a4f-a924dd158fdf.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/e31d4bb8-c0c1-4412-9226-a4b3c5c770c6.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/e31d4bb8-c0c1-4412-9226-a4b3c5c770c6.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/e31d4bb8-c0c1-4412-9226-a4b3c5c770c6.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/e31d4bb8-c0c1-4412-9226-a4b3c5c770c6.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/e392ffe6-321c-4b1d-9aa8-0bd58e497e1f.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/e392ffe6-321c-4b1d-9aa8-0bd58e497e1f.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/e392ffe6-321c-4b1d-9aa8-0bd58e497e1f.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/e392ffe6-321c-4b1d-9aa8-0bd58e497e1f.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/e4579da6-9927-4c71-a95b-a76671512b3f.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/e4579da6-9927-4c71-a95b-a76671512b3f.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/e4579da6-9927-4c71-a95b-a76671512b3f.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/e4579da6-9927-4c71-a95b-a76671512b3f.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/e4d750dd-f058-4c21-ac0f-cef0275dd5a7.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/e4d750dd-f058-4c21-ac0f-cef0275dd5a7.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/e4d750dd-f058-4c21-ac0f-cef0275dd5a7.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/e4d750dd-f058-4c21-ac0f-cef0275dd5a7.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/f14b68e7-b98b-438a-947a-bc84327e424d.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/f14b68e7-b98b-438a-947a-bc84327e424d.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/f14b68e7-b98b-438a-947a-bc84327e424d.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/f14b68e7-b98b-438a-947a-bc84327e424d.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/f1f89b71-14d0-474d-923c-ce5b175c21db.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/f1f89b71-14d0-474d-923c-ce5b175c21db.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/f1f89b71-14d0-474d-923c-ce5b175c21db.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/f1f89b71-14d0-474d-923c-ce5b175c21db.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/f4da23e4-ee58-49b3-b47e-45cb29aa1ac9.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/f4da23e4-ee58-49b3-b47e-45cb29aa1ac9.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/f4da23e4-ee58-49b3-b47e-45cb29aa1ac9.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/f4da23e4-ee58-49b3-b47e-45cb29aa1ac9.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/f5ab2a23-af9e-4b52-b065-667e3fba21e6.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/f5ab2a23-af9e-4b52-b065-667e3fba21e6.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/f5ab2a23-af9e-4b52-b065-667e3fba21e6.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/f5ab2a23-af9e-4b52-b065-667e3fba21e6.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/f95d3794-c6f4-4dbf-9ab9-b881633ff765.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/f95d3794-c6f4-4dbf-9ab9-b881633ff765.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/f95d3794-c6f4-4dbf-9ab9-b881633ff765.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/f95d3794-c6f4-4dbf-9ab9-b881633ff765.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/fca3d7f4-cc95-49d3-92e2-a386c5a089d1.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/fca3d7f4-cc95-49d3-92e2-a386c5a089d1.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/fca3d7f4-cc95-49d3-92e2-a386c5a089d1.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/fca3d7f4-cc95-49d3-92e2-a386c5a089d1.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/fceaf399-f380-446a-a6d8-3c57651d671c.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/fceaf399-f380-446a-a6d8-3c57651d671c.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/fceaf399-f380-446a-a6d8-3c57651d671c.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/fceaf399-f380-446a-a6d8-3c57651d671c.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/ff6be561-816d-49ba-8cb7-94f0f368352c.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/ff6be561-816d-49ba-8cb7-94f0f368352c.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/ff6be561-816d-49ba-8cb7-94f0f368352c.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/ff6be561-816d-49ba-8cb7-94f0f368352c.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/ffa8ffe4-2c55-4ccd-97c5-b621f759b585.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/ffa8ffe4-2c55-4ccd-97c5-b621f759b585.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/ffa8ffe4-2c55-4ccd-97c5-b621f759b585.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/ffa8ffe4-2c55-4ccd-97c5-b621f759b585.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/id-113d3857ca7c493bab31f9cab968b684.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/id-113d3857ca7c493bab31f9cab968b684.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/id-113d3857ca7c493bab31f9cab968b684.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/id-113d3857ca7c493bab31f9cab968b684.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/id-28903a8b84594435bf7918184111b0eb.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/id-28903a8b84594435bf7918184111b0eb.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/id-28903a8b84594435bf7918184111b0eb.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/id-28903a8b84594435bf7918184111b0eb.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/id-6ce8b12e754e4b128606d433d271f303.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/id-6ce8b12e754e4b128606d433d271f303.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/id-6ce8b12e754e4b128606d433d271f303.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/id-6ce8b12e754e4b128606d433d271f303.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/id-79aedba0196148b0b4d54ec26ec1cb1a.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/id-79aedba0196148b0b4d54ec26ec1cb1a.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/id-79aedba0196148b0b4d54ec26ec1cb1a.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/id-79aedba0196148b0b4d54ec26ec1cb1a.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/id-8a9d1a27f6944591810a1cfb0980bf26.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/id-8a9d1a27f6944591810a1cfb0980bf26.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/id-8a9d1a27f6944591810a1cfb0980bf26.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/id-8a9d1a27f6944591810a1cfb0980bf26.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/id-bb483777115f400fad270e8b35e2e950.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/id-bb483777115f400fad270e8b35e2e950.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/id-bb483777115f400fad270e8b35e2e950.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/id-bb483777115f400fad270e8b35e2e950.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/id-c0b6b3025fc147f3b2d88fd0c29797e1.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/id-c0b6b3025fc147f3b2d88fd0c29797e1.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/id-c0b6b3025fc147f3b2d88fd0c29797e1.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/id-c0b6b3025fc147f3b2d88fd0c29797e1.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/id-ef87fc757efa4d64a6df101e1e4f821a.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/id-ef87fc757efa4d64a6df101e1e4f821a.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/id-ef87fc757efa4d64a6df101e1e4f821a.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/id-ef87fc757efa4d64a6df101e1e4f821a.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/id-f0ec0e39125846c0ae6ba61297ac595e.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/id-f0ec0e39125846c0ae6ba61297ac595e.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/id-f0ec0e39125846c0ae6ba61297ac595e.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/id-f0ec0e39125846c0ae6ba61297ac595e.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/id-f9e30582684b4fa7988df040a957f347.png b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/id-f9e30582684b4fa7988df040a957f347.png similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/id-f9e30582684b4fa7988df040a957f347.png rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/images/id-f9e30582684b4fa7988df040a957f347.png diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/033bfba6-c676-457e-bcb8-df5307c67782.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/033bfba6-c676-457e-bcb8-df5307c67782.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/033bfba6-c676-457e-bcb8-df5307c67782.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/033bfba6-c676-457e-bcb8-df5307c67782.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/0b4f1f23-0598-48eb-b309-0f890f2fd299.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/0b4f1f23-0598-48eb-b309-0f890f2fd299.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/0b4f1f23-0598-48eb-b309-0f890f2fd299.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/0b4f1f23-0598-48eb-b309-0f890f2fd299.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/0c3144ea-9a38-474f-8c08-fdf86ede9cc4.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/0c3144ea-9a38-474f-8c08-fdf86ede9cc4.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/0c3144ea-9a38-474f-8c08-fdf86ede9cc4.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/0c3144ea-9a38-474f-8c08-fdf86ede9cc4.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/0d7753c2-202b-4304-a3e9-a7e509ea6e6c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/0d7753c2-202b-4304-a3e9-a7e509ea6e6c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/0d7753c2-202b-4304-a3e9-a7e509ea6e6c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/0d7753c2-202b-4304-a3e9-a7e509ea6e6c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/0f070b75-7c76-4273-b82c-dfb4f0572dee.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/0f070b75-7c76-4273-b82c-dfb4f0572dee.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/0f070b75-7c76-4273-b82c-dfb4f0572dee.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/0f070b75-7c76-4273-b82c-dfb4f0572dee.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/102d56bc-0f36-4a60-82cb-31ec41d0b775.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/102d56bc-0f36-4a60-82cb-31ec41d0b775.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/102d56bc-0f36-4a60-82cb-31ec41d0b775.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/102d56bc-0f36-4a60-82cb-31ec41d0b775.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/10e01e96-ae21-44ad-acfc-2aa14fdc2348.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/10e01e96-ae21-44ad-acfc-2aa14fdc2348.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/10e01e96-ae21-44ad-acfc-2aa14fdc2348.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/10e01e96-ae21-44ad-acfc-2aa14fdc2348.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/12c83ca9-5439-4dcf-a070-96d557f30d7c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/12c83ca9-5439-4dcf-a070-96d557f30d7c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/12c83ca9-5439-4dcf-a070-96d557f30d7c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/12c83ca9-5439-4dcf-a070-96d557f30d7c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/13885dad-d2e8-4952-9123-0bfec146b900.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/13885dad-d2e8-4952-9123-0bfec146b900.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/13885dad-d2e8-4952-9123-0bfec146b900.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/13885dad-d2e8-4952-9123-0bfec146b900.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/18ac3e97-4019-4490-b2b4-3fbb27185e4b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/18ac3e97-4019-4490-b2b4-3fbb27185e4b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/18ac3e97-4019-4490-b2b4-3fbb27185e4b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/18ac3e97-4019-4490-b2b4-3fbb27185e4b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/1a1630fa-42a0-47a1-acf6-4adab8731424.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/1a1630fa-42a0-47a1-acf6-4adab8731424.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/1a1630fa-42a0-47a1-acf6-4adab8731424.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/1a1630fa-42a0-47a1-acf6-4adab8731424.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/1b2c23e1-4c89-4aa8-b6d7-2cbc2451cb65.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/1b2c23e1-4c89-4aa8-b6d7-2cbc2451cb65.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/1b2c23e1-4c89-4aa8-b6d7-2cbc2451cb65.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/1b2c23e1-4c89-4aa8-b6d7-2cbc2451cb65.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/1d661f7b-f717-415d-91b6-915ffc2fb596.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/1d661f7b-f717-415d-91b6-915ffc2fb596.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/1d661f7b-f717-415d-91b6-915ffc2fb596.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/1d661f7b-f717-415d-91b6-915ffc2fb596.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/1e5838f4-5d4e-44f5-9ab7-754b8adece5b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/1e5838f4-5d4e-44f5-9ab7-754b8adece5b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/1e5838f4-5d4e-44f5-9ab7-754b8adece5b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/1e5838f4-5d4e-44f5-9ab7-754b8adece5b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/2045f098-4462-45e0-8614-e495e8881524.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/2045f098-4462-45e0-8614-e495e8881524.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/2045f098-4462-45e0-8614-e495e8881524.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/2045f098-4462-45e0-8614-e495e8881524.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/207b8273-9c52-4cee-90f5-78845dfa2259.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/207b8273-9c52-4cee-90f5-78845dfa2259.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/207b8273-9c52-4cee-90f5-78845dfa2259.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/207b8273-9c52-4cee-90f5-78845dfa2259.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/24932ef1-59d4-4d7a-aa1a-d776223f3e9e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/24932ef1-59d4-4d7a-aa1a-d776223f3e9e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/24932ef1-59d4-4d7a-aa1a-d776223f3e9e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/24932ef1-59d4-4d7a-aa1a-d776223f3e9e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/250f51f5-6058-4c95-9142-4559dc5943b4.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/250f51f5-6058-4c95-9142-4559dc5943b4.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/250f51f5-6058-4c95-9142-4559dc5943b4.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/250f51f5-6058-4c95-9142-4559dc5943b4.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/265c7dfa-f409-4fb0-9b70-a4d3348d2d95.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/265c7dfa-f409-4fb0-9b70-a4d3348d2d95.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/265c7dfa-f409-4fb0-9b70-a4d3348d2d95.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/265c7dfa-f409-4fb0-9b70-a4d3348d2d95.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/2987faaa-f600-45b9-b81a-c98fce1bfb89.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/2987faaa-f600-45b9-b81a-c98fce1bfb89.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/2987faaa-f600-45b9-b81a-c98fce1bfb89.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/2987faaa-f600-45b9-b81a-c98fce1bfb89.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/2c2906af-9e78-4e8f-a618-18420d077b94.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/2c2906af-9e78-4e8f-a618-18420d077b94.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/2c2906af-9e78-4e8f-a618-18420d077b94.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/2c2906af-9e78-4e8f-a618-18420d077b94.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/30a18dae-cc16-4ce4-848e-375279913095.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/30a18dae-cc16-4ce4-848e-375279913095.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/30a18dae-cc16-4ce4-848e-375279913095.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/30a18dae-cc16-4ce4-848e-375279913095.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/32cb2662-9dd4-49a5-b180-05500b49bc37.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/32cb2662-9dd4-49a5-b180-05500b49bc37.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/32cb2662-9dd4-49a5-b180-05500b49bc37.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/32cb2662-9dd4-49a5-b180-05500b49bc37.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/3474c659-2c87-444b-9301-303f399f4d3b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/3474c659-2c87-444b-9301-303f399f4d3b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/3474c659-2c87-444b-9301-303f399f4d3b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/3474c659-2c87-444b-9301-303f399f4d3b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/399899fe-2820-4a9c-9f9d-7bd9c14eee07.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/399899fe-2820-4a9c-9f9d-7bd9c14eee07.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/399899fe-2820-4a9c-9f9d-7bd9c14eee07.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/399899fe-2820-4a9c-9f9d-7bd9c14eee07.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/3a1c328d-6cb3-40cd-a80e-b2dad9f0dcf3.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/3a1c328d-6cb3-40cd-a80e-b2dad9f0dcf3.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/3a1c328d-6cb3-40cd-a80e-b2dad9f0dcf3.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/3a1c328d-6cb3-40cd-a80e-b2dad9f0dcf3.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/3a4c794b-7518-423c-bed1-199314183786.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/3a4c794b-7518-423c-bed1-199314183786.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/3a4c794b-7518-423c-bed1-199314183786.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/3a4c794b-7518-423c-bed1-199314183786.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/3a5b91b9-8399-4902-948e-93f246bd6682.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/3a5b91b9-8399-4902-948e-93f246bd6682.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/3a5b91b9-8399-4902-948e-93f246bd6682.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/3a5b91b9-8399-4902-948e-93f246bd6682.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/3ab3c063-07fa-40c1-b70b-63aef169f79a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/3ab3c063-07fa-40c1-b70b-63aef169f79a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/3ab3c063-07fa-40c1-b70b-63aef169f79a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/3ab3c063-07fa-40c1-b70b-63aef169f79a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/3dec8287-929c-4914-a65c-e7c8cc9d0369.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/3dec8287-929c-4914-a65c-e7c8cc9d0369.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/3dec8287-929c-4914-a65c-e7c8cc9d0369.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/3dec8287-929c-4914-a65c-e7c8cc9d0369.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/3f549ce6-5112-4cfa-8355-3b46cd3cdfb0.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/3f549ce6-5112-4cfa-8355-3b46cd3cdfb0.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/3f549ce6-5112-4cfa-8355-3b46cd3cdfb0.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/3f549ce6-5112-4cfa-8355-3b46cd3cdfb0.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/3fbe51cf-4dc3-4783-b8a1-fdb8f2d683c2.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/3fbe51cf-4dc3-4783-b8a1-fdb8f2d683c2.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/3fbe51cf-4dc3-4783-b8a1-fdb8f2d683c2.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/3fbe51cf-4dc3-4783-b8a1-fdb8f2d683c2.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/42dfb378-50a8-4a8f-907f-cd9229495263.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/42dfb378-50a8-4a8f-907f-cd9229495263.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/42dfb378-50a8-4a8f-907f-cd9229495263.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/42dfb378-50a8-4a8f-907f-cd9229495263.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/466e7afd-8afa-47bf-a522-a3cc419fb8c9.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/466e7afd-8afa-47bf-a522-a3cc419fb8c9.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/466e7afd-8afa-47bf-a522-a3cc419fb8c9.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/466e7afd-8afa-47bf-a522-a3cc419fb8c9.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/4d81bce1-0376-40be-bbaf-9a424612988e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/4d81bce1-0376-40be-bbaf-9a424612988e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/4d81bce1-0376-40be-bbaf-9a424612988e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/4d81bce1-0376-40be-bbaf-9a424612988e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/4fea83ff-517d-44b2-a36e-f2d86e1e4026.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/4fea83ff-517d-44b2-a36e-f2d86e1e4026.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/4fea83ff-517d-44b2-a36e-f2d86e1e4026.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/4fea83ff-517d-44b2-a36e-f2d86e1e4026.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/514c4c1c-3c68-414c-b6de-891943cb92fe.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/514c4c1c-3c68-414c-b6de-891943cb92fe.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/514c4c1c-3c68-414c-b6de-891943cb92fe.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/514c4c1c-3c68-414c-b6de-891943cb92fe.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/5172da0d-0395-478f-a6bf-6d21c756690d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/5172da0d-0395-478f-a6bf-6d21c756690d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/5172da0d-0395-478f-a6bf-6d21c756690d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/5172da0d-0395-478f-a6bf-6d21c756690d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/51907461-ebfa-47b7-a1a6-4578d7b3d41a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/51907461-ebfa-47b7-a1a6-4578d7b3d41a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/51907461-ebfa-47b7-a1a6-4578d7b3d41a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/51907461-ebfa-47b7-a1a6-4578d7b3d41a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/560fae54-387b-4c1d-91f4-3800f4dc1229.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/560fae54-387b-4c1d-91f4-3800f4dc1229.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/560fae54-387b-4c1d-91f4-3800f4dc1229.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/560fae54-387b-4c1d-91f4-3800f4dc1229.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/56620451-0149-4e7d-b12c-399dd8e20524.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/56620451-0149-4e7d-b12c-399dd8e20524.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/56620451-0149-4e7d-b12c-399dd8e20524.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/56620451-0149-4e7d-b12c-399dd8e20524.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/57233f67-e351-4052-8ab7-28a5a5cc30c4.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/57233f67-e351-4052-8ab7-28a5a5cc30c4.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/57233f67-e351-4052-8ab7-28a5a5cc30c4.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/57233f67-e351-4052-8ab7-28a5a5cc30c4.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/5a4f8a45-6c09-4843-83a9-6c107e32f91a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/5a4f8a45-6c09-4843-83a9-6c107e32f91a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/5a4f8a45-6c09-4843-83a9-6c107e32f91a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/5a4f8a45-6c09-4843-83a9-6c107e32f91a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/5b604a10-b789-4eeb-8af7-087080275410.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/5b604a10-b789-4eeb-8af7-087080275410.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/5b604a10-b789-4eeb-8af7-087080275410.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/5b604a10-b789-4eeb-8af7-087080275410.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/5c8f6839-6e86-495b-a93f-8a1d60695207.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/5c8f6839-6e86-495b-a93f-8a1d60695207.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/5c8f6839-6e86-495b-a93f-8a1d60695207.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/5c8f6839-6e86-495b-a93f-8a1d60695207.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/63ea5c59-638e-4888-a761-cf8e4a0b7899.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/63ea5c59-638e-4888-a761-cf8e4a0b7899.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/63ea5c59-638e-4888-a761-cf8e4a0b7899.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/63ea5c59-638e-4888-a761-cf8e4a0b7899.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/6ba3cf1b-ace0-4b65-92c6-cfe738d9218a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/6ba3cf1b-ace0-4b65-92c6-cfe738d9218a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/6ba3cf1b-ace0-4b65-92c6-cfe738d9218a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/6ba3cf1b-ace0-4b65-92c6-cfe738d9218a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/6ebf4796-5f47-4ab1-9738-ffd6747b05ab.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/6ebf4796-5f47-4ab1-9738-ffd6747b05ab.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/6ebf4796-5f47-4ab1-9738-ffd6747b05ab.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/6ebf4796-5f47-4ab1-9738-ffd6747b05ab.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/717c6738-8976-4c8a-9058-7bc4395292a9.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/717c6738-8976-4c8a-9058-7bc4395292a9.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/717c6738-8976-4c8a-9058-7bc4395292a9.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/717c6738-8976-4c8a-9058-7bc4395292a9.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/764dad9e-e8b4-4846-9271-c67dd4858e9d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/764dad9e-e8b4-4846-9271-c67dd4858e9d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/764dad9e-e8b4-4846-9271-c67dd4858e9d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/764dad9e-e8b4-4846-9271-c67dd4858e9d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/76ccf333-cf6d-4e80-85da-f2b9f4747f9d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/76ccf333-cf6d-4e80-85da-f2b9f4747f9d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/76ccf333-cf6d-4e80-85da-f2b9f4747f9d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/76ccf333-cf6d-4e80-85da-f2b9f4747f9d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/7984926f-a6c6-481d-9ecc-edb55c6b33bc.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/7984926f-a6c6-481d-9ecc-edb55c6b33bc.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/7984926f-a6c6-481d-9ecc-edb55c6b33bc.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/7984926f-a6c6-481d-9ecc-edb55c6b33bc.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/79d28ab1-7799-492b-b0c9-22639cb62694.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/79d28ab1-7799-492b-b0c9-22639cb62694.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/79d28ab1-7799-492b-b0c9-22639cb62694.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/79d28ab1-7799-492b-b0c9-22639cb62694.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/7a403f55-646f-4c91-b6ac-40cdad6b3fc3.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/7a403f55-646f-4c91-b6ac-40cdad6b3fc3.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/7a403f55-646f-4c91-b6ac-40cdad6b3fc3.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/7a403f55-646f-4c91-b6ac-40cdad6b3fc3.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/7baade07-e4a9-4228-881b-7881c25343f4.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/7baade07-e4a9-4228-881b-7881c25343f4.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/7baade07-e4a9-4228-881b-7881c25343f4.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/7baade07-e4a9-4228-881b-7881c25343f4.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/7cba96cb-f095-4dfc-a339-741b52eb9391.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/7cba96cb-f095-4dfc-a339-741b52eb9391.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/7cba96cb-f095-4dfc-a339-741b52eb9391.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/7cba96cb-f095-4dfc-a339-741b52eb9391.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/82225dde-06bd-4c33-a738-15e66a5817d7.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/82225dde-06bd-4c33-a738-15e66a5817d7.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/82225dde-06bd-4c33-a738-15e66a5817d7.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/82225dde-06bd-4c33-a738-15e66a5817d7.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/836d5aaa-28e8-49c6-b644-95c3cf0ddadd.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/836d5aaa-28e8-49c6-b644-95c3cf0ddadd.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/836d5aaa-28e8-49c6-b644-95c3cf0ddadd.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/836d5aaa-28e8-49c6-b644-95c3cf0ddadd.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/8696b2f3-c51a-4623-9c6e-45ca1fcea89e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/8696b2f3-c51a-4623-9c6e-45ca1fcea89e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/8696b2f3-c51a-4623-9c6e-45ca1fcea89e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/8696b2f3-c51a-4623-9c6e-45ca1fcea89e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/8b5f7051-0147-4f97-b2f7-2580c862f7d1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/8b5f7051-0147-4f97-b2f7-2580c862f7d1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/8b5f7051-0147-4f97-b2f7-2580c862f7d1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/8b5f7051-0147-4f97-b2f7-2580c862f7d1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/8c2385e9-cb37-4ca8-a95f-38d2eabff37a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/8c2385e9-cb37-4ca8-a95f-38d2eabff37a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/8c2385e9-cb37-4ca8-a95f-38d2eabff37a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/8c2385e9-cb37-4ca8-a95f-38d2eabff37a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/8d00c49c-80fd-470f-a85b-6f87144dd182.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/8d00c49c-80fd-470f-a85b-6f87144dd182.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/8d00c49c-80fd-470f-a85b-6f87144dd182.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/8d00c49c-80fd-470f-a85b-6f87144dd182.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/94242728-a56a-494b-a1c1-5dae19abc5fb.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/94242728-a56a-494b-a1c1-5dae19abc5fb.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/94242728-a56a-494b-a1c1-5dae19abc5fb.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/94242728-a56a-494b-a1c1-5dae19abc5fb.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/94e89825-e359-43ad-b877-64ff6e6ccda2.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/94e89825-e359-43ad-b877-64ff6e6ccda2.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/94e89825-e359-43ad-b877-64ff6e6ccda2.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/94e89825-e359-43ad-b877-64ff6e6ccda2.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/96c8bc99-f7cc-496f-8fcc-492ca4c94064.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/96c8bc99-f7cc-496f-8fcc-492ca4c94064.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/96c8bc99-f7cc-496f-8fcc-492ca4c94064.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/96c8bc99-f7cc-496f-8fcc-492ca4c94064.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/9804c2dd-ae55-48f5-bcae-5675c84eefd7.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/9804c2dd-ae55-48f5-bcae-5675c84eefd7.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/9804c2dd-ae55-48f5-bcae-5675c84eefd7.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/9804c2dd-ae55-48f5-bcae-5675c84eefd7.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/9a3bcc33-40c5-4423-b79e-b22d4523041d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/9a3bcc33-40c5-4423-b79e-b22d4523041d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/9a3bcc33-40c5-4423-b79e-b22d4523041d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/9a3bcc33-40c5-4423-b79e-b22d4523041d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/9fe89e7a-07d2-487c-8c3d-d3f0eaa952a1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/9fe89e7a-07d2-487c-8c3d-d3f0eaa952a1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/9fe89e7a-07d2-487c-8c3d-d3f0eaa952a1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/9fe89e7a-07d2-487c-8c3d-d3f0eaa952a1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/a1635b11-270d-40d2-95c7-ffa85f278270.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/a1635b11-270d-40d2-95c7-ffa85f278270.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/a1635b11-270d-40d2-95c7-ffa85f278270.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/a1635b11-270d-40d2-95c7-ffa85f278270.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/a33490d0-ec83-4f77-bdd0-88cd3ff9dd65.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/a33490d0-ec83-4f77-bdd0-88cd3ff9dd65.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/a33490d0-ec83-4f77-bdd0-88cd3ff9dd65.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/a33490d0-ec83-4f77-bdd0-88cd3ff9dd65.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/a4329bac-4309-477a-bf39-42311a612385.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/a4329bac-4309-477a-bf39-42311a612385.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/a4329bac-4309-477a-bf39-42311a612385.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/a4329bac-4309-477a-bf39-42311a612385.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/a4e8f577-1b7f-44f9-beca-7e208578d858.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/a4e8f577-1b7f-44f9-beca-7e208578d858.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/a4e8f577-1b7f-44f9-beca-7e208578d858.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/a4e8f577-1b7f-44f9-beca-7e208578d858.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/a5211f28-49d4-4d08-8a5d-728450a3345c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/a5211f28-49d4-4d08-8a5d-728450a3345c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/a5211f28-49d4-4d08-8a5d-728450a3345c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/a5211f28-49d4-4d08-8a5d-728450a3345c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/a57fd394-a9af-479b-ae5b-7d227e0b23d4.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/a57fd394-a9af-479b-ae5b-7d227e0b23d4.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/a57fd394-a9af-479b-ae5b-7d227e0b23d4.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/a57fd394-a9af-479b-ae5b-7d227e0b23d4.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/a7a61185-f8a5-4dd2-8d30-652716fc8df7.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/a7a61185-f8a5-4dd2-8d30-652716fc8df7.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/a7a61185-f8a5-4dd2-8d30-652716fc8df7.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/a7a61185-f8a5-4dd2-8d30-652716fc8df7.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/aa0a8dd4-3255-4a1d-a901-b0b5084e33cb.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/aa0a8dd4-3255-4a1d-a901-b0b5084e33cb.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/aa0a8dd4-3255-4a1d-a901-b0b5084e33cb.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/aa0a8dd4-3255-4a1d-a901-b0b5084e33cb.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/ad46b320-30a2-452b-9403-acaa9ceccd59.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/ad46b320-30a2-452b-9403-acaa9ceccd59.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/ad46b320-30a2-452b-9403-acaa9ceccd59.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/ad46b320-30a2-452b-9403-acaa9ceccd59.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/aeda3a11-8c1a-42e1-9a47-3ebfea32990a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/aeda3a11-8c1a-42e1-9a47-3ebfea32990a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/aeda3a11-8c1a-42e1-9a47-3ebfea32990a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/aeda3a11-8c1a-42e1-9a47-3ebfea32990a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/af22eaeb-d7a1-4cdc-a716-d8f77e9e42f5.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/af22eaeb-d7a1-4cdc-a716-d8f77e9e42f5.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/af22eaeb-d7a1-4cdc-a716-d8f77e9e42f5.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/af22eaeb-d7a1-4cdc-a716-d8f77e9e42f5.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/b31129c6-e897-4857-9542-64e924a7c562.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/b31129c6-e897-4857-9542-64e924a7c562.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/b31129c6-e897-4857-9542-64e924a7c562.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/b31129c6-e897-4857-9542-64e924a7c562.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/b4a1cfb8-033f-4d21-b282-aa61831a1652.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/b4a1cfb8-033f-4d21-b282-aa61831a1652.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/b4a1cfb8-033f-4d21-b282-aa61831a1652.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/b4a1cfb8-033f-4d21-b282-aa61831a1652.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/b6eb1d30-55ef-4d0f-9db6-1a54be1001c8.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/b6eb1d30-55ef-4d0f-9db6-1a54be1001c8.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/b6eb1d30-55ef-4d0f-9db6-1a54be1001c8.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/b6eb1d30-55ef-4d0f-9db6-1a54be1001c8.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/bcb8d9c8-9625-486d-b83d-05cd811a5b52.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/bcb8d9c8-9625-486d-b83d-05cd811a5b52.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/bcb8d9c8-9625-486d-b83d-05cd811a5b52.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/bcb8d9c8-9625-486d-b83d-05cd811a5b52.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/bee94f87-b135-49a0-bd1e-e6c9c5a27393.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/bee94f87-b135-49a0-bd1e-e6c9c5a27393.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/bee94f87-b135-49a0-bd1e-e6c9c5a27393.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/bee94f87-b135-49a0-bd1e-e6c9c5a27393.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/bf6dc26d-67b2-4d12-8085-c567f4ab1f06.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/bf6dc26d-67b2-4d12-8085-c567f4ab1f06.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/bf6dc26d-67b2-4d12-8085-c567f4ab1f06.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/bf6dc26d-67b2-4d12-8085-c567f4ab1f06.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/c3820ec2-f46d-4b2b-9f5c-efd2e29e3a69.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/c3820ec2-f46d-4b2b-9f5c-efd2e29e3a69.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/c3820ec2-f46d-4b2b-9f5c-efd2e29e3a69.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/c3820ec2-f46d-4b2b-9f5c-efd2e29e3a69.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/ca99a74d-1ae8-414d-941b-068a852be16c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/ca99a74d-1ae8-414d-941b-068a852be16c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/ca99a74d-1ae8-414d-941b-068a852be16c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/ca99a74d-1ae8-414d-941b-068a852be16c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/ce62fd4a-a29a-4dac-8be3-2e1c81509cb1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/ce62fd4a-a29a-4dac-8be3-2e1c81509cb1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/ce62fd4a-a29a-4dac-8be3-2e1c81509cb1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/ce62fd4a-a29a-4dac-8be3-2e1c81509cb1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/cf8014f7-f203-455f-9c37-a224d684701e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/cf8014f7-f203-455f-9c37-a224d684701e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/cf8014f7-f203-455f-9c37-a224d684701e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/cf8014f7-f203-455f-9c37-a224d684701e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/d1d3734b-651c-44a6-ad68-918a9ee45505.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/d1d3734b-651c-44a6-ad68-918a9ee45505.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/d1d3734b-651c-44a6-ad68-918a9ee45505.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/d1d3734b-651c-44a6-ad68-918a9ee45505.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/d27f302c-5fe1-4d00-bb42-ce7e2ccda17d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/d27f302c-5fe1-4d00-bb42-ce7e2ccda17d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/d27f302c-5fe1-4d00-bb42-ce7e2ccda17d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/d27f302c-5fe1-4d00-bb42-ce7e2ccda17d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/d44206ca-0812-4995-91e7-7e26afd2678e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/d44206ca-0812-4995-91e7-7e26afd2678e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/d44206ca-0812-4995-91e7-7e26afd2678e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/d44206ca-0812-4995-91e7-7e26afd2678e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/d5abfe83-15e1-4dde-a8e3-ff87e3a66318.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/d5abfe83-15e1-4dde-a8e3-ff87e3a66318.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/d5abfe83-15e1-4dde-a8e3-ff87e3a66318.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/d5abfe83-15e1-4dde-a8e3-ff87e3a66318.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/da49292c-4502-4aff-bbac-172429f56a95.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/da49292c-4502-4aff-bbac-172429f56a95.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/da49292c-4502-4aff-bbac-172429f56a95.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/da49292c-4502-4aff-bbac-172429f56a95.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/da95fc1f-d18a-4bd4-94b1-68fc5adce114.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/da95fc1f-d18a-4bd4-94b1-68fc5adce114.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/da95fc1f-d18a-4bd4-94b1-68fc5adce114.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/da95fc1f-d18a-4bd4-94b1-68fc5adce114.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/db7adce0-47e1-4833-9aa4-94bbb92b03a7.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/db7adce0-47e1-4833-9aa4-94bbb92b03a7.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/db7adce0-47e1-4833-9aa4-94bbb92b03a7.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/db7adce0-47e1-4833-9aa4-94bbb92b03a7.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/dba8215d-c9af-49f9-acc7-89f5795cbd9e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/dba8215d-c9af-49f9-acc7-89f5795cbd9e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/dba8215d-c9af-49f9-acc7-89f5795cbd9e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/dba8215d-c9af-49f9-acc7-89f5795cbd9e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/dd29af9c-e203-4fda-b8cd-fe263a3ce322.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/dd29af9c-e203-4fda-b8cd-fe263a3ce322.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/dd29af9c-e203-4fda-b8cd-fe263a3ce322.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/dd29af9c-e203-4fda-b8cd-fe263a3ce322.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/df4fcca8-9154-4e6b-9d64-bb66506fa23a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/df4fcca8-9154-4e6b-9d64-bb66506fa23a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/df4fcca8-9154-4e6b-9d64-bb66506fa23a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/df4fcca8-9154-4e6b-9d64-bb66506fa23a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/dfbeaaac-b325-4dc8-bd90-21c79e10ff65.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/dfbeaaac-b325-4dc8-bd90-21c79e10ff65.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/dfbeaaac-b325-4dc8-bd90-21c79e10ff65.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/dfbeaaac-b325-4dc8-bd90-21c79e10ff65.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/e48eedc6-f167-4ce3-b8da-cae8f82b354a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/e48eedc6-f167-4ce3-b8da-cae8f82b354a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/e48eedc6-f167-4ce3-b8da-cae8f82b354a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/e48eedc6-f167-4ce3-b8da-cae8f82b354a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/e5ffb349-a56e-4ba6-be01-3348d74496ef.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/e5ffb349-a56e-4ba6-be01-3348d74496ef.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/e5ffb349-a56e-4ba6-be01-3348d74496ef.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/e5ffb349-a56e-4ba6-be01-3348d74496ef.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/e9151148-c948-438b-b1cb-49929f8117ea.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/e9151148-c948-438b-b1cb-49929f8117ea.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/e9151148-c948-438b-b1cb-49929f8117ea.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/e9151148-c948-438b-b1cb-49929f8117ea.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/ebaa041e-05f4-4de2-9c15-fdbdfbcd0833.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/ebaa041e-05f4-4de2-9c15-fdbdfbcd0833.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/ebaa041e-05f4-4de2-9c15-fdbdfbcd0833.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/ebaa041e-05f4-4de2-9c15-fdbdfbcd0833.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/ec038320-b592-4deb-aea2-ec9a43a24557.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/ec038320-b592-4deb-aea2-ec9a43a24557.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/ec038320-b592-4deb-aea2-ec9a43a24557.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/ec038320-b592-4deb-aea2-ec9a43a24557.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/ec8a7612-2548-4495-8bfc-60de48b46ddc.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/ec8a7612-2548-4495-8bfc-60de48b46ddc.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/ec8a7612-2548-4495-8bfc-60de48b46ddc.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/ec8a7612-2548-4495-8bfc-60de48b46ddc.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/f4238e37-714d-4c7a-882c-dcdd692d60c5.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/f4238e37-714d-4c7a-882c-dcdd692d60c5.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/f4238e37-714d-4c7a-882c-dcdd692d60c5.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/f4238e37-714d-4c7a-882c-dcdd692d60c5.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/f5aa952b-582b-4be5-9a78-59b1618dda0d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/f5aa952b-582b-4be5-9a78-59b1618dda0d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/f5aa952b-582b-4be5-9a78-59b1618dda0d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/f5aa952b-582b-4be5-9a78-59b1618dda0d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/f8a6cdc0-f5d5-4e09-88d1-7d0b5fc5acff.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/f8a6cdc0-f5d5-4e09-88d1-7d0b5fc5acff.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/f8a6cdc0-f5d5-4e09-88d1-7d0b5fc5acff.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/f8a6cdc0-f5d5-4e09-88d1-7d0b5fc5acff.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/f9abfc38-1eae-46ab-981c-0946b7119850.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/f9abfc38-1eae-46ab-981c-0946b7119850.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/f9abfc38-1eae-46ab-981c-0946b7119850.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/f9abfc38-1eae-46ab-981c-0946b7119850.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/fce30b86-959e-4cfb-baad-76f9c1c57110.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/fce30b86-959e-4cfb-baad-76f9c1c57110.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/fce30b86-959e-4cfb-baad-76f9c1c57110.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/fce30b86-959e-4cfb-baad-76f9c1c57110.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/fd643eef-3e8e-4fc8-9f6c-feaca4261821.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/fd643eef-3e8e-4fc8-9f6c-feaca4261821.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/fd643eef-3e8e-4fc8-9f6c-feaca4261821.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/fd643eef-3e8e-4fc8-9f6c-feaca4261821.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/fdd290d0-d04d-414c-bd44-fc04f9a7f9ca.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/fdd290d0-d04d-414c-bd44-fc04f9a7f9ca.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/fdd290d0-d04d-414c-bd44-fc04f9a7f9ca.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/fdd290d0-d04d-414c-bd44-fc04f9a7f9ca.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/fe94540e-ecaa-4e09-b4f3-637fcf0f55a0.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/fe94540e-ecaa-4e09-b4f3-637fcf0f55a0.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/fe94540e-ecaa-4e09-b4f3-637fcf0f55a0.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/fe94540e-ecaa-4e09-b4f3-637fcf0f55a0.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-0a111de0fb7f46fdbbb366be06e20255.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-0a111de0fb7f46fdbbb366be06e20255.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-0a111de0fb7f46fdbbb366be06e20255.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-0a111de0fb7f46fdbbb366be06e20255.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-0a3c87b2fee646eb812fbb7e54ca65d6.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-0a3c87b2fee646eb812fbb7e54ca65d6.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-0a3c87b2fee646eb812fbb7e54ca65d6.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-0a3c87b2fee646eb812fbb7e54ca65d6.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-0ac34a39b9d14b718ef129f4a8240882.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-0ac34a39b9d14b718ef129f4a8240882.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-0ac34a39b9d14b718ef129f4a8240882.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-0ac34a39b9d14b718ef129f4a8240882.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-19d2e4fdcf9042cdb1aeb07ae4c12543.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-19d2e4fdcf9042cdb1aeb07ae4c12543.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-19d2e4fdcf9042cdb1aeb07ae4c12543.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-19d2e4fdcf9042cdb1aeb07ae4c12543.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-1f8ff939efee48c0b5364a62eeca2937.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-1f8ff939efee48c0b5364a62eeca2937.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-1f8ff939efee48c0b5364a62eeca2937.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-1f8ff939efee48c0b5364a62eeca2937.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-21db9389365b467498bffd6e3ca443a4.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-21db9389365b467498bffd6e3ca443a4.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-21db9389365b467498bffd6e3ca443a4.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-21db9389365b467498bffd6e3ca443a4.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-222196c353e54e21a807429b561d0098.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-222196c353e54e21a807429b561d0098.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-222196c353e54e21a807429b561d0098.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-222196c353e54e21a807429b561d0098.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-2e68487b6c8d4385868ddd5de8682f67.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-2e68487b6c8d4385868ddd5de8682f67.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-2e68487b6c8d4385868ddd5de8682f67.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-2e68487b6c8d4385868ddd5de8682f67.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-425985f475b34ebdb7dbae20fdf475df.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-425985f475b34ebdb7dbae20fdf475df.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-425985f475b34ebdb7dbae20fdf475df.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-425985f475b34ebdb7dbae20fdf475df.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-53097b85240248faa87a68e8b3f8fe15.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-53097b85240248faa87a68e8b3f8fe15.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-53097b85240248faa87a68e8b3f8fe15.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-53097b85240248faa87a68e8b3f8fe15.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-570715fedad14cdabd29280e30b7fcfa.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-570715fedad14cdabd29280e30b7fcfa.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-570715fedad14cdabd29280e30b7fcfa.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-570715fedad14cdabd29280e30b7fcfa.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-64f083e7063f49ba901f7c49f1d2d65a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-64f083e7063f49ba901f7c49f1d2d65a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-64f083e7063f49ba901f7c49f1d2d65a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-64f083e7063f49ba901f7c49f1d2d65a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-6581a6a7721d45b680bce5c74374af25.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-6581a6a7721d45b680bce5c74374af25.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-6581a6a7721d45b680bce5c74374af25.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-6581a6a7721d45b680bce5c74374af25.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-665fd930a19143dcaae0f3bf00c20dab.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-665fd930a19143dcaae0f3bf00c20dab.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-665fd930a19143dcaae0f3bf00c20dab.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-665fd930a19143dcaae0f3bf00c20dab.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-831d168a71be464c8ffec86945842b5b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-831d168a71be464c8ffec86945842b5b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-831d168a71be464c8ffec86945842b5b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-831d168a71be464c8ffec86945842b5b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-83bf17d74ee74d11b01243580c9576f3.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-83bf17d74ee74d11b01243580c9576f3.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-83bf17d74ee74d11b01243580c9576f3.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-83bf17d74ee74d11b01243580c9576f3.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-86f60df73d244def868ef3ccc8d7850a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-86f60df73d244def868ef3ccc8d7850a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-86f60df73d244def868ef3ccc8d7850a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-86f60df73d244def868ef3ccc8d7850a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-88dbcd93d6f04ca7ad4bdfc0834c8552.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-88dbcd93d6f04ca7ad4bdfc0834c8552.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-88dbcd93d6f04ca7ad4bdfc0834c8552.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-88dbcd93d6f04ca7ad4bdfc0834c8552.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-8a550914dc6343859ca1afbe6445f1f7.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-8a550914dc6343859ca1afbe6445f1f7.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-8a550914dc6343859ca1afbe6445f1f7.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-8a550914dc6343859ca1afbe6445f1f7.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-8dd4f9d4322f4b958d56d7cdb43f2116.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-8dd4f9d4322f4b958d56d7cdb43f2116.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-8dd4f9d4322f4b958d56d7cdb43f2116.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-8dd4f9d4322f4b958d56d7cdb43f2116.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-9b03593cdc38451b96d238639545dfd1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-9b03593cdc38451b96d238639545dfd1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-9b03593cdc38451b96d238639545dfd1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-9b03593cdc38451b96d238639545dfd1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-a26898543cdd42f4a2657892f94c6334.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-a26898543cdd42f4a2657892f94c6334.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-a26898543cdd42f4a2657892f94c6334.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-a26898543cdd42f4a2657892f94c6334.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-a2a0903018f44876a3a51cf6ca4a187d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-a2a0903018f44876a3a51cf6ca4a187d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-a2a0903018f44876a3a51cf6ca4a187d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-a2a0903018f44876a3a51cf6ca4a187d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-b512da9572a549288aa1d4a533fc65fa.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-b512da9572a549288aa1d4a533fc65fa.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-b512da9572a549288aa1d4a533fc65fa.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-b512da9572a549288aa1d4a533fc65fa.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-bbb2f75527ee4785bed13d46895cc16d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-bbb2f75527ee4785bed13d46895cc16d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-bbb2f75527ee4785bed13d46895cc16d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-bbb2f75527ee4785bed13d46895cc16d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-dda8cb93a7f64a9da2db17a065929648.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-dda8cb93a7f64a9da2db17a065929648.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-dda8cb93a7f64a9da2db17a065929648.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-dda8cb93a7f64a9da2db17a065929648.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-e48891edd4cd4ad0beb7714cf3003292.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-e48891edd4cd4ad0beb7714cf3003292.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-e48891edd4cd4ad0beb7714cf3003292.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-e48891edd4cd4ad0beb7714cf3003292.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-fe1d307dc58445079dac8d7f692119f5.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-fe1d307dc58445079dac8d7f692119f5.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-fe1d307dc58445079dac8d7f692119f5.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/objects/id-fe1d307dc58445079dac8d7f692119f5.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/00ac2c5a-2461-407d-994a-522621827cbf.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/00ac2c5a-2461-407d-994a-522621827cbf.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/00ac2c5a-2461-407d-994a-522621827cbf.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/00ac2c5a-2461-407d-994a-522621827cbf.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/07a38777-a034-4a6b-8f90-6a9874ae035d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/07a38777-a034-4a6b-8f90-6a9874ae035d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/07a38777-a034-4a6b-8f90-6a9874ae035d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/07a38777-a034-4a6b-8f90-6a9874ae035d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/081ae1b1-7c1a-4a87-8f07-188d90448d4c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/081ae1b1-7c1a-4a87-8f07-188d90448d4c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/081ae1b1-7c1a-4a87-8f07-188d90448d4c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/081ae1b1-7c1a-4a87-8f07-188d90448d4c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/0a8ae1fb-a3b9-4baf-8f9c-a8752f200c6a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/0a8ae1fb-a3b9-4baf-8f9c-a8752f200c6a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/0a8ae1fb-a3b9-4baf-8f9c-a8752f200c6a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/0a8ae1fb-a3b9-4baf-8f9c-a8752f200c6a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/0b28e43c-0d28-4a27-9303-786f6b1bb04c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/0b28e43c-0d28-4a27-9303-786f6b1bb04c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/0b28e43c-0d28-4a27-9303-786f6b1bb04c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/0b28e43c-0d28-4a27-9303-786f6b1bb04c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/0c953c3c-994e-4cb7-9d3c-926515fefc17.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/0c953c3c-994e-4cb7-9d3c-926515fefc17.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/0c953c3c-994e-4cb7-9d3c-926515fefc17.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/0c953c3c-994e-4cb7-9d3c-926515fefc17.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/0cb18ec8-ed64-4cb6-864f-3416ca2d198a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/0cb18ec8-ed64-4cb6-864f-3416ca2d198a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/0cb18ec8-ed64-4cb6-864f-3416ca2d198a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/0cb18ec8-ed64-4cb6-864f-3416ca2d198a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/0dabd82b-9a4c-499b-afe7-da988722d1da.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/0dabd82b-9a4c-499b-afe7-da988722d1da.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/0dabd82b-9a4c-499b-afe7-da988722d1da.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/0dabd82b-9a4c-499b-afe7-da988722d1da.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/0e94dc1b-2f53-4777-9d6c-07be9d48d3f6.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/0e94dc1b-2f53-4777-9d6c-07be9d48d3f6.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/0e94dc1b-2f53-4777-9d6c-07be9d48d3f6.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/0e94dc1b-2f53-4777-9d6c-07be9d48d3f6.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/1050ce85-8788-44a8-a1d8-c9de65b3cfe3.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/1050ce85-8788-44a8-a1d8-c9de65b3cfe3.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/1050ce85-8788-44a8-a1d8-c9de65b3cfe3.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/1050ce85-8788-44a8-a1d8-c9de65b3cfe3.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/1618d303-0b6a-4c28-9e71-7bcac8c7d66c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/1618d303-0b6a-4c28-9e71-7bcac8c7d66c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/1618d303-0b6a-4c28-9e71-7bcac8c7d66c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/1618d303-0b6a-4c28-9e71-7bcac8c7d66c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/17db811f-5cd6-41b8-883f-23cc1373f61b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/17db811f-5cd6-41b8-883f-23cc1373f61b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/17db811f-5cd6-41b8-883f-23cc1373f61b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/17db811f-5cd6-41b8-883f-23cc1373f61b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/197f2e6a-96de-4fa9-910c-0cbecb488bec.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/197f2e6a-96de-4fa9-910c-0cbecb488bec.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/197f2e6a-96de-4fa9-910c-0cbecb488bec.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/197f2e6a-96de-4fa9-910c-0cbecb488bec.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/1b37c1aa-1336-4038-a23b-d067ed080a7a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/1b37c1aa-1336-4038-a23b-d067ed080a7a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/1b37c1aa-1336-4038-a23b-d067ed080a7a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/1b37c1aa-1336-4038-a23b-d067ed080a7a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/1d12d390-5fbb-4944-b82d-26660e3f4ad5.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/1d12d390-5fbb-4944-b82d-26660e3f4ad5.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/1d12d390-5fbb-4944-b82d-26660e3f4ad5.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/1d12d390-5fbb-4944-b82d-26660e3f4ad5.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/1dc1de6c-0489-4299-8f28-2096975a4838.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/1dc1de6c-0489-4299-8f28-2096975a4838.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/1dc1de6c-0489-4299-8f28-2096975a4838.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/1dc1de6c-0489-4299-8f28-2096975a4838.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/20f74adb-5143-4ea4-be7c-abf026b2e8ae.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/20f74adb-5143-4ea4-be7c-abf026b2e8ae.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/20f74adb-5143-4ea4-be7c-abf026b2e8ae.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/20f74adb-5143-4ea4-be7c-abf026b2e8ae.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/2274bd38-980b-4e91-9a24-09578c013b80.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/2274bd38-980b-4e91-9a24-09578c013b80.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/2274bd38-980b-4e91-9a24-09578c013b80.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/2274bd38-980b-4e91-9a24-09578c013b80.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/28bb74a3-9728-447a-8d72-d7b54e58b591.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/28bb74a3-9728-447a-8d72-d7b54e58b591.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/28bb74a3-9728-447a-8d72-d7b54e58b591.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/28bb74a3-9728-447a-8d72-d7b54e58b591.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/2e5cfe74-9b17-476b-8ca6-d19b142642d3.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/2e5cfe74-9b17-476b-8ca6-d19b142642d3.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/2e5cfe74-9b17-476b-8ca6-d19b142642d3.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/2e5cfe74-9b17-476b-8ca6-d19b142642d3.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/3092fb53-e617-4dbe-ba08-ce4f5f7bc167.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/3092fb53-e617-4dbe-ba08-ce4f5f7bc167.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/3092fb53-e617-4dbe-ba08-ce4f5f7bc167.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/3092fb53-e617-4dbe-ba08-ce4f5f7bc167.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/33e43de8-bac8-4d90-952e-12597a33df65.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/33e43de8-bac8-4d90-952e-12597a33df65.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/33e43de8-bac8-4d90-952e-12597a33df65.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/33e43de8-bac8-4d90-952e-12597a33df65.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/34b6537b-5534-4e64-95a5-00a8ffea9d02.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/34b6537b-5534-4e64-95a5-00a8ffea9d02.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/34b6537b-5534-4e64-95a5-00a8ffea9d02.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/34b6537b-5534-4e64-95a5-00a8ffea9d02.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/34d88f16-ab1f-4e58-8515-6feaec2d62a5.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/34d88f16-ab1f-4e58-8515-6feaec2d62a5.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/34d88f16-ab1f-4e58-8515-6feaec2d62a5.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/34d88f16-ab1f-4e58-8515-6feaec2d62a5.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/39dc2922-646c-488f-8615-6fb7a16830b6.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/39dc2922-646c-488f-8615-6fb7a16830b6.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/39dc2922-646c-488f-8615-6fb7a16830b6.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/39dc2922-646c-488f-8615-6fb7a16830b6.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/3c419c35-0e35-4e22-b6da-072d9243593c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/3c419c35-0e35-4e22-b6da-072d9243593c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/3c419c35-0e35-4e22-b6da-072d9243593c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/3c419c35-0e35-4e22-b6da-072d9243593c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/3efe0da1-7899-4949-a225-6db9d42f6926.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/3efe0da1-7899-4949-a225-6db9d42f6926.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/3efe0da1-7899-4949-a225-6db9d42f6926.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/3efe0da1-7899-4949-a225-6db9d42f6926.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/453f404d-0a13-4dce-9c11-0afdf527d1e1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/453f404d-0a13-4dce-9c11-0afdf527d1e1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/453f404d-0a13-4dce-9c11-0afdf527d1e1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/453f404d-0a13-4dce-9c11-0afdf527d1e1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/49a674dc-c388-4056-b572-87e8cea77181.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/49a674dc-c388-4056-b572-87e8cea77181.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/49a674dc-c388-4056-b572-87e8cea77181.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/49a674dc-c388-4056-b572-87e8cea77181.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/4c0f9830-5065-4922-902f-c3734c524545.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/4c0f9830-5065-4922-902f-c3734c524545.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/4c0f9830-5065-4922-902f-c3734c524545.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/4c0f9830-5065-4922-902f-c3734c524545.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/50be8b01-7789-4f72-aa5c-39904f3ab3f0.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/50be8b01-7789-4f72-aa5c-39904f3ab3f0.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/50be8b01-7789-4f72-aa5c-39904f3ab3f0.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/50be8b01-7789-4f72-aa5c-39904f3ab3f0.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/51754659-d4ae-4a21-9ea2-dc58655a9456.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/51754659-d4ae-4a21-9ea2-dc58655a9456.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/51754659-d4ae-4a21-9ea2-dc58655a9456.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/51754659-d4ae-4a21-9ea2-dc58655a9456.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/53be9acc-0c21-42ea-a060-1d7839892b3c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/53be9acc-0c21-42ea-a060-1d7839892b3c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/53be9acc-0c21-42ea-a060-1d7839892b3c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/53be9acc-0c21-42ea-a060-1d7839892b3c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/556e83e8-3dd4-456d-9268-efaff2bdf9ce.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/556e83e8-3dd4-456d-9268-efaff2bdf9ce.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/556e83e8-3dd4-456d-9268-efaff2bdf9ce.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/556e83e8-3dd4-456d-9268-efaff2bdf9ce.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/5652c6c7-bf2d-4a43-8d90-e64c9b7c0a5c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/5652c6c7-bf2d-4a43-8d90-e64c9b7c0a5c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/5652c6c7-bf2d-4a43-8d90-e64c9b7c0a5c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/5652c6c7-bf2d-4a43-8d90-e64c9b7c0a5c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/56c03b2e-15e1-4de3-96e6-332287b6e3e7.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/56c03b2e-15e1-4de3-96e6-332287b6e3e7.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/56c03b2e-15e1-4de3-96e6-332287b6e3e7.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/56c03b2e-15e1-4de3-96e6-332287b6e3e7.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/5894e7ec-d626-4c77-913a-f61b36267329.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/5894e7ec-d626-4c77-913a-f61b36267329.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/5894e7ec-d626-4c77-913a-f61b36267329.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/5894e7ec-d626-4c77-913a-f61b36267329.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/58a3ed11-fb28-498e-b912-bdc4a9e2a82b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/58a3ed11-fb28-498e-b912-bdc4a9e2a82b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/58a3ed11-fb28-498e-b912-bdc4a9e2a82b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/58a3ed11-fb28-498e-b912-bdc4a9e2a82b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/58c28a73-0190-4a6b-aee8-caf039021d60.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/58c28a73-0190-4a6b-aee8-caf039021d60.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/58c28a73-0190-4a6b-aee8-caf039021d60.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/58c28a73-0190-4a6b-aee8-caf039021d60.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/5b93b02c-895d-431e-8213-87b70e81c686.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/5b93b02c-895d-431e-8213-87b70e81c686.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/5b93b02c-895d-431e-8213-87b70e81c686.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/5b93b02c-895d-431e-8213-87b70e81c686.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/5c18c323-3686-4f73-8cd7-408bd9a68394.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/5c18c323-3686-4f73-8cd7-408bd9a68394.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/5c18c323-3686-4f73-8cd7-408bd9a68394.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/5c18c323-3686-4f73-8cd7-408bd9a68394.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/5c8c4ecb-89c2-4a11-869c-41d8330a0527.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/5c8c4ecb-89c2-4a11-869c-41d8330a0527.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/5c8c4ecb-89c2-4a11-869c-41d8330a0527.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/5c8c4ecb-89c2-4a11-869c-41d8330a0527.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/5dfea728-f0a4-4532-8255-aba4a475bff7.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/5dfea728-f0a4-4532-8255-aba4a475bff7.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/5dfea728-f0a4-4532-8255-aba4a475bff7.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/5dfea728-f0a4-4532-8255-aba4a475bff7.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/68a12e8c-1eea-4e9b-9dc2-9cb4d89edec1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/68a12e8c-1eea-4e9b-9dc2-9cb4d89edec1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/68a12e8c-1eea-4e9b-9dc2-9cb4d89edec1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/68a12e8c-1eea-4e9b-9dc2-9cb4d89edec1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/6927b348-6f6d-4836-a6db-96bb2ecf0b8d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/6927b348-6f6d-4836-a6db-96bb2ecf0b8d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/6927b348-6f6d-4836-a6db-96bb2ecf0b8d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/6927b348-6f6d-4836-a6db-96bb2ecf0b8d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/6d9d9c8b-f34f-4806-9efc-34affd994099.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/6d9d9c8b-f34f-4806-9efc-34affd994099.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/6d9d9c8b-f34f-4806-9efc-34affd994099.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/6d9d9c8b-f34f-4806-9efc-34affd994099.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/6f156b03-6698-4bbe-9376-d3339ff0cd4c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/6f156b03-6698-4bbe-9376-d3339ff0cd4c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/6f156b03-6698-4bbe-9376-d3339ff0cd4c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/6f156b03-6698-4bbe-9376-d3339ff0cd4c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/6f7b7410-581f-4b4f-b7c1-e9a6585355c2.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/6f7b7410-581f-4b4f-b7c1-e9a6585355c2.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/6f7b7410-581f-4b4f-b7c1-e9a6585355c2.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/6f7b7410-581f-4b4f-b7c1-e9a6585355c2.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/73dddaff-91c8-4a57-a28c-c26ceeef21f9.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/73dddaff-91c8-4a57-a28c-c26ceeef21f9.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/73dddaff-91c8-4a57-a28c-c26ceeef21f9.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/73dddaff-91c8-4a57-a28c-c26ceeef21f9.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/749152f0-1015-458b-8521-421b2e81cb7a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/749152f0-1015-458b-8521-421b2e81cb7a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/749152f0-1015-458b-8521-421b2e81cb7a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/749152f0-1015-458b-8521-421b2e81cb7a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/75755276-fce7-4ea3-b17f-ca2c02528780.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/75755276-fce7-4ea3-b17f-ca2c02528780.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/75755276-fce7-4ea3-b17f-ca2c02528780.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/75755276-fce7-4ea3-b17f-ca2c02528780.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/76654356-4818-4f4f-90ad-baa95663e02c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/76654356-4818-4f4f-90ad-baa95663e02c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/76654356-4818-4f4f-90ad-baa95663e02c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/76654356-4818-4f4f-90ad-baa95663e02c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/7a3be38e-7df1-460a-b9d6-fdc735e4390a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/7a3be38e-7df1-460a-b9d6-fdc735e4390a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/7a3be38e-7df1-460a-b9d6-fdc735e4390a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/7a3be38e-7df1-460a-b9d6-fdc735e4390a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/7b2f2dcd-d491-45e1-b992-28d946254450.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/7b2f2dcd-d491-45e1-b992-28d946254450.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/7b2f2dcd-d491-45e1-b992-28d946254450.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/7b2f2dcd-d491-45e1-b992-28d946254450.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/7d3cb257-9703-446c-aed9-3ecca665e269.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/7d3cb257-9703-446c-aed9-3ecca665e269.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/7d3cb257-9703-446c-aed9-3ecca665e269.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/7d3cb257-9703-446c-aed9-3ecca665e269.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/80554891-2aab-49d1-a6cd-453db07e4c43.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/80554891-2aab-49d1-a6cd-453db07e4c43.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/80554891-2aab-49d1-a6cd-453db07e4c43.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/80554891-2aab-49d1-a6cd-453db07e4c43.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/81725358-dad2-4a80-8c44-fde5d3885b78.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/81725358-dad2-4a80-8c44-fde5d3885b78.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/81725358-dad2-4a80-8c44-fde5d3885b78.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/81725358-dad2-4a80-8c44-fde5d3885b78.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/830c1fd0-0773-4ee6-8f2b-1a4b5fe24e7a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/830c1fd0-0773-4ee6-8f2b-1a4b5fe24e7a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/830c1fd0-0773-4ee6-8f2b-1a4b5fe24e7a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/830c1fd0-0773-4ee6-8f2b-1a4b5fe24e7a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/83138509-14d7-4de5-99ea-63b35cfa95d1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/83138509-14d7-4de5-99ea-63b35cfa95d1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/83138509-14d7-4de5-99ea-63b35cfa95d1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/83138509-14d7-4de5-99ea-63b35cfa95d1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/833a39e0-577e-4c9e-bb08-77887e473433.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/833a39e0-577e-4c9e-bb08-77887e473433.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/833a39e0-577e-4c9e-bb08-77887e473433.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/833a39e0-577e-4c9e-bb08-77887e473433.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/8757eca2-0d19-4277-ad5f-99bb6ef53f37.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/8757eca2-0d19-4277-ad5f-99bb6ef53f37.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/8757eca2-0d19-4277-ad5f-99bb6ef53f37.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/8757eca2-0d19-4277-ad5f-99bb6ef53f37.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/87605ad8-9255-43f7-bb06-e162a2987d31.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/87605ad8-9255-43f7-bb06-e162a2987d31.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/87605ad8-9255-43f7-bb06-e162a2987d31.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/87605ad8-9255-43f7-bb06-e162a2987d31.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/87b7bc68-e167-46c5-ac00-3f63c6bb7e81.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/87b7bc68-e167-46c5-ac00-3f63c6bb7e81.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/87b7bc68-e167-46c5-ac00-3f63c6bb7e81.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/87b7bc68-e167-46c5-ac00-3f63c6bb7e81.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/87f45453-8608-413d-b2d6-81088464613b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/87f45453-8608-413d-b2d6-81088464613b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/87f45453-8608-413d-b2d6-81088464613b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/87f45453-8608-413d-b2d6-81088464613b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/8946283c-9e57-4ada-889a-2e2d4fc54143.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/8946283c-9e57-4ada-889a-2e2d4fc54143.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/8946283c-9e57-4ada-889a-2e2d4fc54143.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/8946283c-9e57-4ada-889a-2e2d4fc54143.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/897333ea-5006-4dbe-b4d5-ca6409789037.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/897333ea-5006-4dbe-b4d5-ca6409789037.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/897333ea-5006-4dbe-b4d5-ca6409789037.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/897333ea-5006-4dbe-b4d5-ca6409789037.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/8c67dc20-3b7c-407d-9a60-c3b50d68169d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/8c67dc20-3b7c-407d-9a60-c3b50d68169d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/8c67dc20-3b7c-407d-9a60-c3b50d68169d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/8c67dc20-3b7c-407d-9a60-c3b50d68169d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/8c6df0a1-5306-4a77-9de8-97c9e6eae53e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/8c6df0a1-5306-4a77-9de8-97c9e6eae53e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/8c6df0a1-5306-4a77-9de8-97c9e6eae53e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/8c6df0a1-5306-4a77-9de8-97c9e6eae53e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/8de5d237-d280-4656-80f5-1a63f42d7bc6.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/8de5d237-d280-4656-80f5-1a63f42d7bc6.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/8de5d237-d280-4656-80f5-1a63f42d7bc6.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/8de5d237-d280-4656-80f5-1a63f42d7bc6.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/928f2592-d38b-4b62-8841-47f8c3ebafe7.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/928f2592-d38b-4b62-8841-47f8c3ebafe7.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/928f2592-d38b-4b62-8841-47f8c3ebafe7.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/928f2592-d38b-4b62-8841-47f8c3ebafe7.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/93cd208f-6cce-4cde-8d78-22e06fcf08dd.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/93cd208f-6cce-4cde-8d78-22e06fcf08dd.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/93cd208f-6cce-4cde-8d78-22e06fcf08dd.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/93cd208f-6cce-4cde-8d78-22e06fcf08dd.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/98e50d5c-3e4b-459d-a949-39de7587f5a0.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/98e50d5c-3e4b-459d-a949-39de7587f5a0.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/98e50d5c-3e4b-459d-a949-39de7587f5a0.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/98e50d5c-3e4b-459d-a949-39de7587f5a0.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/9952fa14-77c7-46e9-adfd-0bce4049553b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/9952fa14-77c7-46e9-adfd-0bce4049553b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/9952fa14-77c7-46e9-adfd-0bce4049553b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/9952fa14-77c7-46e9-adfd-0bce4049553b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/9af1c006-6e44-4e92-ac06-6ac705ecf85a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/9af1c006-6e44-4e92-ac06-6ac705ecf85a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/9af1c006-6e44-4e92-ac06-6ac705ecf85a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/9af1c006-6e44-4e92-ac06-6ac705ecf85a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/9e19f7b6-5ff6-422c-8975-4979ab57f559.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/9e19f7b6-5ff6-422c-8975-4979ab57f559.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/9e19f7b6-5ff6-422c-8975-4979ab57f559.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/9e19f7b6-5ff6-422c-8975-4979ab57f559.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/a282f8da-9466-42db-af61-280ed9930371.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/a282f8da-9466-42db-af61-280ed9930371.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/a282f8da-9466-42db-af61-280ed9930371.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/a282f8da-9466-42db-af61-280ed9930371.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/a58958bc-2048-499e-87f9-8048454190fa.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/a58958bc-2048-499e-87f9-8048454190fa.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/a58958bc-2048-499e-87f9-8048454190fa.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/a58958bc-2048-499e-87f9-8048454190fa.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/af519ca8-a892-4627-a0f6-77b055f32da1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/af519ca8-a892-4627-a0f6-77b055f32da1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/af519ca8-a892-4627-a0f6-77b055f32da1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/af519ca8-a892-4627-a0f6-77b055f32da1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/b1af5501-989f-434d-b71a-50eb3c66d827.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/b1af5501-989f-434d-b71a-50eb3c66d827.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/b1af5501-989f-434d-b71a-50eb3c66d827.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/b1af5501-989f-434d-b71a-50eb3c66d827.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/b4f7426b-79a2-4b67-882a-c519d04b651e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/b4f7426b-79a2-4b67-882a-c519d04b651e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/b4f7426b-79a2-4b67-882a-c519d04b651e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/b4f7426b-79a2-4b67-882a-c519d04b651e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/b51aaed8-1e4c-44e8-9f39-7df7c0c369e2.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/b51aaed8-1e4c-44e8-9f39-7df7c0c369e2.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/b51aaed8-1e4c-44e8-9f39-7df7c0c369e2.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/b51aaed8-1e4c-44e8-9f39-7df7c0c369e2.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/b6811261-01b1-4f92-b4ef-12c8cf959aa0.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/b6811261-01b1-4f92-b4ef-12c8cf959aa0.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/b6811261-01b1-4f92-b4ef-12c8cf959aa0.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/b6811261-01b1-4f92-b4ef-12c8cf959aa0.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/b97b2681-7c53-47fe-b899-c6ac0de4d9a3.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/b97b2681-7c53-47fe-b899-c6ac0de4d9a3.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/b97b2681-7c53-47fe-b899-c6ac0de4d9a3.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/b97b2681-7c53-47fe-b899-c6ac0de4d9a3.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/b99fd98c-4fe6-43e4-ba7e-ab2988eca3fb.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/b99fd98c-4fe6-43e4-ba7e-ab2988eca3fb.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/b99fd98c-4fe6-43e4-ba7e-ab2988eca3fb.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/b99fd98c-4fe6-43e4-ba7e-ab2988eca3fb.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/ba306546-fc22-4827-bb65-f8e413886aa1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/ba306546-fc22-4827-bb65-f8e413886aa1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/ba306546-fc22-4827-bb65-f8e413886aa1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/ba306546-fc22-4827-bb65-f8e413886aa1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/bb583668-1273-44d7-a88d-e0d219b84679.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/bb583668-1273-44d7-a88d-e0d219b84679.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/bb583668-1273-44d7-a88d-e0d219b84679.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/bb583668-1273-44d7-a88d-e0d219b84679.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/bbedec01-ffef-4063-abba-1cc92da9e01a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/bbedec01-ffef-4063-abba-1cc92da9e01a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/bbedec01-ffef-4063-abba-1cc92da9e01a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/bbedec01-ffef-4063-abba-1cc92da9e01a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/bca0768a-3306-4e57-933b-abc64a153d83.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/bca0768a-3306-4e57-933b-abc64a153d83.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/bca0768a-3306-4e57-933b-abc64a153d83.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/bca0768a-3306-4e57-933b-abc64a153d83.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/bdbd0690-4813-49f7-97a8-8521fc371d88.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/bdbd0690-4813-49f7-97a8-8521fc371d88.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/bdbd0690-4813-49f7-97a8-8521fc371d88.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/bdbd0690-4813-49f7-97a8-8521fc371d88.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/be6074eb-3739-42ae-b86b-e7cae6e1a458.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/be6074eb-3739-42ae-b86b-e7cae6e1a458.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/be6074eb-3739-42ae-b86b-e7cae6e1a458.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/be6074eb-3739-42ae-b86b-e7cae6e1a458.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/bf091a49-e570-4600-a963-502436b84f38.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/bf091a49-e570-4600-a963-502436b84f38.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/bf091a49-e570-4600-a963-502436b84f38.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/bf091a49-e570-4600-a963-502436b84f38.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/c095ad5e-c8cc-4638-b977-c7028c8b5d23.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/c095ad5e-c8cc-4638-b977-c7028c8b5d23.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/c095ad5e-c8cc-4638-b977-c7028c8b5d23.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/c095ad5e-c8cc-4638-b977-c7028c8b5d23.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/c0e8af05-1bbb-4269-9ec7-a9cb6c5c8b66.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/c0e8af05-1bbb-4269-9ec7-a9cb6c5c8b66.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/c0e8af05-1bbb-4269-9ec7-a9cb6c5c8b66.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/c0e8af05-1bbb-4269-9ec7-a9cb6c5c8b66.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/c112c25e-881d-4fd3-9a47-5b55d30592b3.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/c112c25e-881d-4fd3-9a47-5b55d30592b3.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/c112c25e-881d-4fd3-9a47-5b55d30592b3.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/c112c25e-881d-4fd3-9a47-5b55d30592b3.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/c35a5b8b-d429-4e24-8404-9c35817b4f37.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/c35a5b8b-d429-4e24-8404-9c35817b4f37.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/c35a5b8b-d429-4e24-8404-9c35817b4f37.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/c35a5b8b-d429-4e24-8404-9c35817b4f37.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/c4837879-c378-4e61-958f-9159fa9e26e7.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/c4837879-c378-4e61-958f-9159fa9e26e7.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/c4837879-c378-4e61-958f-9159fa9e26e7.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/c4837879-c378-4e61-958f-9159fa9e26e7.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/c4d02459-d3d4-4668-a686-52e02e604ff4.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/c4d02459-d3d4-4668-a686-52e02e604ff4.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/c4d02459-d3d4-4668-a686-52e02e604ff4.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/c4d02459-d3d4-4668-a686-52e02e604ff4.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/c5bf6758-2670-4e3f-afe1-f7ba16f85f48.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/c5bf6758-2670-4e3f-afe1-f7ba16f85f48.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/c5bf6758-2670-4e3f-afe1-f7ba16f85f48.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/c5bf6758-2670-4e3f-afe1-f7ba16f85f48.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/ca405cd2-d732-4bb8-bee4-20629c3b040c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/ca405cd2-d732-4bb8-bee4-20629c3b040c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/ca405cd2-d732-4bb8-bee4-20629c3b040c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/ca405cd2-d732-4bb8-bee4-20629c3b040c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/ca52fba9-1e26-4a94-bb10-64fe8e4ae01b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/ca52fba9-1e26-4a94-bb10-64fe8e4ae01b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/ca52fba9-1e26-4a94-bb10-64fe8e4ae01b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/ca52fba9-1e26-4a94-bb10-64fe8e4ae01b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/cce8df8c-d0f9-41b7-a2d4-537de2d543bc.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/cce8df8c-d0f9-41b7-a2d4-537de2d543bc.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/cce8df8c-d0f9-41b7-a2d4-537de2d543bc.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/cce8df8c-d0f9-41b7-a2d4-537de2d543bc.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/cf1387bd-5133-4b31-a98c-cb5bf94efa6b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/cf1387bd-5133-4b31-a98c-cb5bf94efa6b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/cf1387bd-5133-4b31-a98c-cb5bf94efa6b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/cf1387bd-5133-4b31-a98c-cb5bf94efa6b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/d1466cf6-135e-4cac-8c54-ae5264889e0e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/d1466cf6-135e-4cac-8c54-ae5264889e0e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/d1466cf6-135e-4cac-8c54-ae5264889e0e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/d1466cf6-135e-4cac-8c54-ae5264889e0e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/d447a1a9-7ceb-41f4-82ad-1b262aa5539d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/d447a1a9-7ceb-41f4-82ad-1b262aa5539d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/d447a1a9-7ceb-41f4-82ad-1b262aa5539d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/d447a1a9-7ceb-41f4-82ad-1b262aa5539d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/d50f3e55-1a7b-4c89-a532-c674e8d5da29.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/d50f3e55-1a7b-4c89-a532-c674e8d5da29.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/d50f3e55-1a7b-4c89-a532-c674e8d5da29.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/d50f3e55-1a7b-4c89-a532-c674e8d5da29.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/d5d0837f-827e-4e0e-b314-d7a9b0ae8ea1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/d5d0837f-827e-4e0e-b314-d7a9b0ae8ea1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/d5d0837f-827e-4e0e-b314-d7a9b0ae8ea1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/d5d0837f-827e-4e0e-b314-d7a9b0ae8ea1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/d6b95a23-2d52-4b0b-85d9-03445792060c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/d6b95a23-2d52-4b0b-85d9-03445792060c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/d6b95a23-2d52-4b0b-85d9-03445792060c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/d6b95a23-2d52-4b0b-85d9-03445792060c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/d7a666ef-d86a-4d06-a528-9944474afedf.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/d7a666ef-d86a-4d06-a528-9944474afedf.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/d7a666ef-d86a-4d06-a528-9944474afedf.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/d7a666ef-d86a-4d06-a528-9944474afedf.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/d9861c01-5b14-4268-b3d3-9ced861e6c64.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/d9861c01-5b14-4268-b3d3-9ced861e6c64.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/d9861c01-5b14-4268-b3d3-9ced861e6c64.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/d9861c01-5b14-4268-b3d3-9ced861e6c64.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/d9e6658b-3e9c-4a93-a33c-0b50f0c3f5d3.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/d9e6658b-3e9c-4a93-a33c-0b50f0c3f5d3.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/d9e6658b-3e9c-4a93-a33c-0b50f0c3f5d3.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/d9e6658b-3e9c-4a93-a33c-0b50f0c3f5d3.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/da2dae15-373c-4c05-9d8a-737dc810b8d7.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/da2dae15-373c-4c05-9d8a-737dc810b8d7.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/da2dae15-373c-4c05-9d8a-737dc810b8d7.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/da2dae15-373c-4c05-9d8a-737dc810b8d7.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/dbc1fb81-7d17-48e0-9c4a-f88680fb999b.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/dbc1fb81-7d17-48e0-9c4a-f88680fb999b.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/dbc1fb81-7d17-48e0-9c4a-f88680fb999b.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/dbc1fb81-7d17-48e0-9c4a-f88680fb999b.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/df1dfad2-95e1-4097-a9db-4e6e6fbae550.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/df1dfad2-95e1-4097-a9db-4e6e6fbae550.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/df1dfad2-95e1-4097-a9db-4e6e6fbae550.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/df1dfad2-95e1-4097-a9db-4e6e6fbae550.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/df7375f9-514c-45b8-86e6-2e61789514f0.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/df7375f9-514c-45b8-86e6-2e61789514f0.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/df7375f9-514c-45b8-86e6-2e61789514f0.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/df7375f9-514c-45b8-86e6-2e61789514f0.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/dfad9615-8898-4af2-af15-3f61c6696fd2.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/dfad9615-8898-4af2-af15-3f61c6696fd2.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/dfad9615-8898-4af2-af15-3f61c6696fd2.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/dfad9615-8898-4af2-af15-3f61c6696fd2.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/e00fefee-f93d-4b74-a1a9-6f0aea5d1d0f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/e00fefee-f93d-4b74-a1a9-6f0aea5d1d0f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/e00fefee-f93d-4b74-a1a9-6f0aea5d1d0f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/e00fefee-f93d-4b74-a1a9-6f0aea5d1d0f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/e0eb4804-d8e0-4310-8a4f-a924dd158fdf.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/e0eb4804-d8e0-4310-8a4f-a924dd158fdf.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/e0eb4804-d8e0-4310-8a4f-a924dd158fdf.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/e0eb4804-d8e0-4310-8a4f-a924dd158fdf.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/e31d4bb8-c0c1-4412-9226-a4b3c5c770c6.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/e31d4bb8-c0c1-4412-9226-a4b3c5c770c6.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/e31d4bb8-c0c1-4412-9226-a4b3c5c770c6.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/e31d4bb8-c0c1-4412-9226-a4b3c5c770c6.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/e392ffe6-321c-4b1d-9aa8-0bd58e497e1f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/e392ffe6-321c-4b1d-9aa8-0bd58e497e1f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/e392ffe6-321c-4b1d-9aa8-0bd58e497e1f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/e392ffe6-321c-4b1d-9aa8-0bd58e497e1f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/e4579da6-9927-4c71-a95b-a76671512b3f.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/e4579da6-9927-4c71-a95b-a76671512b3f.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/e4579da6-9927-4c71-a95b-a76671512b3f.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/e4579da6-9927-4c71-a95b-a76671512b3f.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/e4d750dd-f058-4c21-ac0f-cef0275dd5a7.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/e4d750dd-f058-4c21-ac0f-cef0275dd5a7.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/e4d750dd-f058-4c21-ac0f-cef0275dd5a7.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/e4d750dd-f058-4c21-ac0f-cef0275dd5a7.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/f14b68e7-b98b-438a-947a-bc84327e424d.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/f14b68e7-b98b-438a-947a-bc84327e424d.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/f14b68e7-b98b-438a-947a-bc84327e424d.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/f14b68e7-b98b-438a-947a-bc84327e424d.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/f1f89b71-14d0-474d-923c-ce5b175c21db.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/f1f89b71-14d0-474d-923c-ce5b175c21db.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/f1f89b71-14d0-474d-923c-ce5b175c21db.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/f1f89b71-14d0-474d-923c-ce5b175c21db.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/f4da23e4-ee58-49b3-b47e-45cb29aa1ac9.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/f4da23e4-ee58-49b3-b47e-45cb29aa1ac9.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/f4da23e4-ee58-49b3-b47e-45cb29aa1ac9.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/f4da23e4-ee58-49b3-b47e-45cb29aa1ac9.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/f5ab2a23-af9e-4b52-b065-667e3fba21e6.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/f5ab2a23-af9e-4b52-b065-667e3fba21e6.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/f5ab2a23-af9e-4b52-b065-667e3fba21e6.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/f5ab2a23-af9e-4b52-b065-667e3fba21e6.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/f95d3794-c6f4-4dbf-9ab9-b881633ff765.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/f95d3794-c6f4-4dbf-9ab9-b881633ff765.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/f95d3794-c6f4-4dbf-9ab9-b881633ff765.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/f95d3794-c6f4-4dbf-9ab9-b881633ff765.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/fca3d7f4-cc95-49d3-92e2-a386c5a089d1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/fca3d7f4-cc95-49d3-92e2-a386c5a089d1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/fca3d7f4-cc95-49d3-92e2-a386c5a089d1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/fca3d7f4-cc95-49d3-92e2-a386c5a089d1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/fceaf399-f380-446a-a6d8-3c57651d671c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/fceaf399-f380-446a-a6d8-3c57651d671c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/fceaf399-f380-446a-a6d8-3c57651d671c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/fceaf399-f380-446a-a6d8-3c57651d671c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/ff6be561-816d-49ba-8cb7-94f0f368352c.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/ff6be561-816d-49ba-8cb7-94f0f368352c.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/ff6be561-816d-49ba-8cb7-94f0f368352c.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/ff6be561-816d-49ba-8cb7-94f0f368352c.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/ffa8ffe4-2c55-4ccd-97c5-b621f759b585.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/ffa8ffe4-2c55-4ccd-97c5-b621f759b585.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/ffa8ffe4-2c55-4ccd-97c5-b621f759b585.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/ffa8ffe4-2c55-4ccd-97c5-b621f759b585.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/id-113d3857ca7c493bab31f9cab968b684.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/id-113d3857ca7c493bab31f9cab968b684.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/id-113d3857ca7c493bab31f9cab968b684.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/id-113d3857ca7c493bab31f9cab968b684.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/id-28903a8b84594435bf7918184111b0eb.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/id-28903a8b84594435bf7918184111b0eb.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/id-28903a8b84594435bf7918184111b0eb.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/id-28903a8b84594435bf7918184111b0eb.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/id-6ce8b12e754e4b128606d433d271f303.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/id-6ce8b12e754e4b128606d433d271f303.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/id-6ce8b12e754e4b128606d433d271f303.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/id-6ce8b12e754e4b128606d433d271f303.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/id-79aedba0196148b0b4d54ec26ec1cb1a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/id-79aedba0196148b0b4d54ec26ec1cb1a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/id-79aedba0196148b0b4d54ec26ec1cb1a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/id-79aedba0196148b0b4d54ec26ec1cb1a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/id-8a9d1a27f6944591810a1cfb0980bf26.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/id-8a9d1a27f6944591810a1cfb0980bf26.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/id-8a9d1a27f6944591810a1cfb0980bf26.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/id-8a9d1a27f6944591810a1cfb0980bf26.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/id-bb483777115f400fad270e8b35e2e950.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/id-bb483777115f400fad270e8b35e2e950.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/id-bb483777115f400fad270e8b35e2e950.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/id-bb483777115f400fad270e8b35e2e950.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/id-c0b6b3025fc147f3b2d88fd0c29797e1.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/id-c0b6b3025fc147f3b2d88fd0c29797e1.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/id-c0b6b3025fc147f3b2d88fd0c29797e1.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/id-c0b6b3025fc147f3b2d88fd0c29797e1.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/id-ef87fc757efa4d64a6df101e1e4f821a.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/id-ef87fc757efa4d64a6df101e1e4f821a.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/id-ef87fc757efa4d64a6df101e1e4f821a.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/id-ef87fc757efa4d64a6df101e1e4f821a.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/id-f0ec0e39125846c0ae6ba61297ac595e.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/id-f0ec0e39125846c0ae6ba61297ac595e.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/id-f0ec0e39125846c0ae6ba61297ac595e.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/id-f0ec0e39125846c0ae6ba61297ac595e.html diff --git a/app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/id-f9e30582684b4fa7988df040a957f347.html b/app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/id-f9e30582684b4fa7988df040a957f347.html similarity index 100% rename from app/dataviz/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/id-f9e30582684b4fa7988df040a957f347.html rename to app/project/archimate-smart-gov/54e87e47-f01c-49fe-af55-2068f4564bd2/views/id-f9e30582684b4fa7988df040a957f347.html diff --git a/app/dataviz/archimate-smart-gov/css/i18n.css b/app/project/archimate-smart-gov/css/i18n.css similarity index 100% rename from app/dataviz/archimate-smart-gov/css/i18n.css rename to app/project/archimate-smart-gov/css/i18n.css diff --git a/app/dataviz/archimate-smart-gov/css/i18n/en.css b/app/project/archimate-smart-gov/css/i18n/en.css similarity index 100% rename from app/dataviz/archimate-smart-gov/css/i18n/en.css rename to app/project/archimate-smart-gov/css/i18n/en.css diff --git a/app/dataviz/archimate-smart-gov/css/model.css b/app/project/archimate-smart-gov/css/model.css similarity index 100% rename from app/dataviz/archimate-smart-gov/css/model.css rename to app/project/archimate-smart-gov/css/model.css diff --git a/app/dataviz/archimate-smart-gov/elements/empty-element.html b/app/project/archimate-smart-gov/elements/empty-element.html similarity index 100% rename from app/dataviz/archimate-smart-gov/elements/empty-element.html rename to app/project/archimate-smart-gov/elements/empty-element.html diff --git a/app/dataviz/archimate-smart-gov/hints/access.html b/app/project/archimate-smart-gov/hints/access.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/access.html rename to app/project/archimate-smart-gov/hints/access.html diff --git a/app/dataviz/archimate-smart-gov/hints/aggregation.html b/app/project/archimate-smart-gov/hints/aggregation.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/aggregation.html rename to app/project/archimate-smart-gov/hints/aggregation.html diff --git a/app/dataviz/archimate-smart-gov/hints/application_collaboration.html b/app/project/archimate-smart-gov/hints/application_collaboration.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/application_collaboration.html rename to app/project/archimate-smart-gov/hints/application_collaboration.html diff --git a/app/dataviz/archimate-smart-gov/hints/application_component.html b/app/project/archimate-smart-gov/hints/application_component.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/application_component.html rename to app/project/archimate-smart-gov/hints/application_component.html diff --git a/app/dataviz/archimate-smart-gov/hints/application_event.html b/app/project/archimate-smart-gov/hints/application_event.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/application_event.html rename to app/project/archimate-smart-gov/hints/application_event.html diff --git a/app/dataviz/archimate-smart-gov/hints/application_function.html b/app/project/archimate-smart-gov/hints/application_function.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/application_function.html rename to app/project/archimate-smart-gov/hints/application_function.html diff --git a/app/dataviz/archimate-smart-gov/hints/application_interaction.html b/app/project/archimate-smart-gov/hints/application_interaction.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/application_interaction.html rename to app/project/archimate-smart-gov/hints/application_interaction.html diff --git a/app/dataviz/archimate-smart-gov/hints/application_interface.html b/app/project/archimate-smart-gov/hints/application_interface.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/application_interface.html rename to app/project/archimate-smart-gov/hints/application_interface.html diff --git a/app/dataviz/archimate-smart-gov/hints/application_process.html b/app/project/archimate-smart-gov/hints/application_process.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/application_process.html rename to app/project/archimate-smart-gov/hints/application_process.html diff --git a/app/dataviz/archimate-smart-gov/hints/application_service.html b/app/project/archimate-smart-gov/hints/application_service.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/application_service.html rename to app/project/archimate-smart-gov/hints/application_service.html diff --git a/app/dataviz/archimate-smart-gov/hints/artifact.html b/app/project/archimate-smart-gov/hints/artifact.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/artifact.html rename to app/project/archimate-smart-gov/hints/artifact.html diff --git a/app/dataviz/archimate-smart-gov/hints/assessment.html b/app/project/archimate-smart-gov/hints/assessment.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/assessment.html rename to app/project/archimate-smart-gov/hints/assessment.html diff --git a/app/dataviz/archimate-smart-gov/hints/assignment.html b/app/project/archimate-smart-gov/hints/assignment.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/assignment.html rename to app/project/archimate-smart-gov/hints/assignment.html diff --git a/app/dataviz/archimate-smart-gov/hints/association.html b/app/project/archimate-smart-gov/hints/association.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/association.html rename to app/project/archimate-smart-gov/hints/association.html diff --git a/app/dataviz/archimate-smart-gov/hints/business_actor.html b/app/project/archimate-smart-gov/hints/business_actor.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/business_actor.html rename to app/project/archimate-smart-gov/hints/business_actor.html diff --git a/app/dataviz/archimate-smart-gov/hints/business_collaboration.html b/app/project/archimate-smart-gov/hints/business_collaboration.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/business_collaboration.html rename to app/project/archimate-smart-gov/hints/business_collaboration.html diff --git a/app/dataviz/archimate-smart-gov/hints/business_event.html b/app/project/archimate-smart-gov/hints/business_event.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/business_event.html rename to app/project/archimate-smart-gov/hints/business_event.html diff --git a/app/dataviz/archimate-smart-gov/hints/business_function.html b/app/project/archimate-smart-gov/hints/business_function.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/business_function.html rename to app/project/archimate-smart-gov/hints/business_function.html diff --git a/app/dataviz/archimate-smart-gov/hints/business_interaction.html b/app/project/archimate-smart-gov/hints/business_interaction.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/business_interaction.html rename to app/project/archimate-smart-gov/hints/business_interaction.html diff --git a/app/dataviz/archimate-smart-gov/hints/business_interface.html b/app/project/archimate-smart-gov/hints/business_interface.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/business_interface.html rename to app/project/archimate-smart-gov/hints/business_interface.html diff --git a/app/dataviz/archimate-smart-gov/hints/business_object.html b/app/project/archimate-smart-gov/hints/business_object.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/business_object.html rename to app/project/archimate-smart-gov/hints/business_object.html diff --git a/app/dataviz/archimate-smart-gov/hints/business_process.html b/app/project/archimate-smart-gov/hints/business_process.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/business_process.html rename to app/project/archimate-smart-gov/hints/business_process.html diff --git a/app/dataviz/archimate-smart-gov/hints/business_role.html b/app/project/archimate-smart-gov/hints/business_role.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/business_role.html rename to app/project/archimate-smart-gov/hints/business_role.html diff --git a/app/dataviz/archimate-smart-gov/hints/business_service.html b/app/project/archimate-smart-gov/hints/business_service.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/business_service.html rename to app/project/archimate-smart-gov/hints/business_service.html diff --git a/app/dataviz/archimate-smart-gov/hints/canvas_block.html b/app/project/archimate-smart-gov/hints/canvas_block.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/canvas_block.html rename to app/project/archimate-smart-gov/hints/canvas_block.html diff --git a/app/dataviz/archimate-smart-gov/hints/canvas_connection.html b/app/project/archimate-smart-gov/hints/canvas_connection.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/canvas_connection.html rename to app/project/archimate-smart-gov/hints/canvas_connection.html diff --git a/app/dataviz/archimate-smart-gov/hints/canvas_diagram.html b/app/project/archimate-smart-gov/hints/canvas_diagram.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/canvas_diagram.html rename to app/project/archimate-smart-gov/hints/canvas_diagram.html diff --git a/app/dataviz/archimate-smart-gov/hints/canvas_image.html b/app/project/archimate-smart-gov/hints/canvas_image.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/canvas_image.html rename to app/project/archimate-smart-gov/hints/canvas_image.html diff --git a/app/dataviz/archimate-smart-gov/hints/canvas_sticky.html b/app/project/archimate-smart-gov/hints/canvas_sticky.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/canvas_sticky.html rename to app/project/archimate-smart-gov/hints/canvas_sticky.html diff --git a/app/dataviz/archimate-smart-gov/hints/capability.html b/app/project/archimate-smart-gov/hints/capability.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/capability.html rename to app/project/archimate-smart-gov/hints/capability.html diff --git a/app/dataviz/archimate-smart-gov/hints/communication_network.html b/app/project/archimate-smart-gov/hints/communication_network.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/communication_network.html rename to app/project/archimate-smart-gov/hints/communication_network.html diff --git a/app/dataviz/archimate-smart-gov/hints/composition.html b/app/project/archimate-smart-gov/hints/composition.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/composition.html rename to app/project/archimate-smart-gov/hints/composition.html diff --git a/app/dataviz/archimate-smart-gov/hints/connection.html b/app/project/archimate-smart-gov/hints/connection.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/connection.html rename to app/project/archimate-smart-gov/hints/connection.html diff --git a/app/dataviz/archimate-smart-gov/hints/constraint.html b/app/project/archimate-smart-gov/hints/constraint.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/constraint.html rename to app/project/archimate-smart-gov/hints/constraint.html diff --git a/app/dataviz/archimate-smart-gov/hints/contract.html b/app/project/archimate-smart-gov/hints/contract.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/contract.html rename to app/project/archimate-smart-gov/hints/contract.html diff --git a/app/dataviz/archimate-smart-gov/hints/course_of_action.html b/app/project/archimate-smart-gov/hints/course_of_action.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/course_of_action.html rename to app/project/archimate-smart-gov/hints/course_of_action.html diff --git a/app/dataviz/archimate-smart-gov/hints/data_object.html b/app/project/archimate-smart-gov/hints/data_object.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/data_object.html rename to app/project/archimate-smart-gov/hints/data_object.html diff --git a/app/dataviz/archimate-smart-gov/hints/deliverable.html b/app/project/archimate-smart-gov/hints/deliverable.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/deliverable.html rename to app/project/archimate-smart-gov/hints/deliverable.html diff --git a/app/dataviz/archimate-smart-gov/hints/device.html b/app/project/archimate-smart-gov/hints/device.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/device.html rename to app/project/archimate-smart-gov/hints/device.html diff --git a/app/dataviz/archimate-smart-gov/hints/diagram_image.html b/app/project/archimate-smart-gov/hints/diagram_image.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/diagram_image.html rename to app/project/archimate-smart-gov/hints/diagram_image.html diff --git a/app/dataviz/archimate-smart-gov/hints/distribution_network.html b/app/project/archimate-smart-gov/hints/distribution_network.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/distribution_network.html rename to app/project/archimate-smart-gov/hints/distribution_network.html diff --git a/app/dataviz/archimate-smart-gov/hints/driver.html b/app/project/archimate-smart-gov/hints/driver.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/driver.html rename to app/project/archimate-smart-gov/hints/driver.html diff --git a/app/dataviz/archimate-smart-gov/hints/equipment.html b/app/project/archimate-smart-gov/hints/equipment.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/equipment.html rename to app/project/archimate-smart-gov/hints/equipment.html diff --git a/app/dataviz/archimate-smart-gov/hints/facility.html b/app/project/archimate-smart-gov/hints/facility.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/facility.html rename to app/project/archimate-smart-gov/hints/facility.html diff --git a/app/dataviz/archimate-smart-gov/hints/flow.html b/app/project/archimate-smart-gov/hints/flow.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/flow.html rename to app/project/archimate-smart-gov/hints/flow.html diff --git a/app/dataviz/archimate-smart-gov/hints/folder.html b/app/project/archimate-smart-gov/hints/folder.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/folder.html rename to app/project/archimate-smart-gov/hints/folder.html diff --git a/app/dataviz/archimate-smart-gov/hints/gap.html b/app/project/archimate-smart-gov/hints/gap.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/gap.html rename to app/project/archimate-smart-gov/hints/gap.html diff --git a/app/dataviz/archimate-smart-gov/hints/goal.html b/app/project/archimate-smart-gov/hints/goal.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/goal.html rename to app/project/archimate-smart-gov/hints/goal.html diff --git a/app/dataviz/archimate-smart-gov/hints/group.html b/app/project/archimate-smart-gov/hints/group.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/group.html rename to app/project/archimate-smart-gov/hints/group.html diff --git a/app/dataviz/archimate-smart-gov/hints/grouping.html b/app/project/archimate-smart-gov/hints/grouping.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/grouping.html rename to app/project/archimate-smart-gov/hints/grouping.html diff --git a/app/dataviz/archimate-smart-gov/hints/implementation_event.html b/app/project/archimate-smart-gov/hints/implementation_event.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/implementation_event.html rename to app/project/archimate-smart-gov/hints/implementation_event.html diff --git a/app/dataviz/archimate-smart-gov/hints/influence.html b/app/project/archimate-smart-gov/hints/influence.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/influence.html rename to app/project/archimate-smart-gov/hints/influence.html diff --git a/app/dataviz/archimate-smart-gov/hints/junction.html b/app/project/archimate-smart-gov/hints/junction.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/junction.html rename to app/project/archimate-smart-gov/hints/junction.html diff --git a/app/dataviz/archimate-smart-gov/hints/location.html b/app/project/archimate-smart-gov/hints/location.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/location.html rename to app/project/archimate-smart-gov/hints/location.html diff --git a/app/dataviz/archimate-smart-gov/hints/material.html b/app/project/archimate-smart-gov/hints/material.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/material.html rename to app/project/archimate-smart-gov/hints/material.html diff --git a/app/dataviz/archimate-smart-gov/hints/meaning.html b/app/project/archimate-smart-gov/hints/meaning.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/meaning.html rename to app/project/archimate-smart-gov/hints/meaning.html diff --git a/app/dataviz/archimate-smart-gov/hints/model.html b/app/project/archimate-smart-gov/hints/model.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/model.html rename to app/project/archimate-smart-gov/hints/model.html diff --git a/app/dataviz/archimate-smart-gov/hints/node.html b/app/project/archimate-smart-gov/hints/node.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/node.html rename to app/project/archimate-smart-gov/hints/node.html diff --git a/app/dataviz/archimate-smart-gov/hints/note.html b/app/project/archimate-smart-gov/hints/note.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/note.html rename to app/project/archimate-smart-gov/hints/note.html diff --git a/app/dataviz/archimate-smart-gov/hints/outcome.html b/app/project/archimate-smart-gov/hints/outcome.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/outcome.html rename to app/project/archimate-smart-gov/hints/outcome.html diff --git a/app/dataviz/archimate-smart-gov/hints/path.html b/app/project/archimate-smart-gov/hints/path.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/path.html rename to app/project/archimate-smart-gov/hints/path.html diff --git a/app/dataviz/archimate-smart-gov/hints/plateau.html b/app/project/archimate-smart-gov/hints/plateau.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/plateau.html rename to app/project/archimate-smart-gov/hints/plateau.html diff --git a/app/dataviz/archimate-smart-gov/hints/principle.html b/app/project/archimate-smart-gov/hints/principle.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/principle.html rename to app/project/archimate-smart-gov/hints/principle.html diff --git a/app/dataviz/archimate-smart-gov/hints/product.html b/app/project/archimate-smart-gov/hints/product.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/product.html rename to app/project/archimate-smart-gov/hints/product.html diff --git a/app/dataviz/archimate-smart-gov/hints/realization.html b/app/project/archimate-smart-gov/hints/realization.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/realization.html rename to app/project/archimate-smart-gov/hints/realization.html diff --git a/app/dataviz/archimate-smart-gov/hints/representation.html b/app/project/archimate-smart-gov/hints/representation.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/representation.html rename to app/project/archimate-smart-gov/hints/representation.html diff --git a/app/dataviz/archimate-smart-gov/hints/requirement.html b/app/project/archimate-smart-gov/hints/requirement.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/requirement.html rename to app/project/archimate-smart-gov/hints/requirement.html diff --git a/app/dataviz/archimate-smart-gov/hints/resource.html b/app/project/archimate-smart-gov/hints/resource.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/resource.html rename to app/project/archimate-smart-gov/hints/resource.html diff --git a/app/dataviz/archimate-smart-gov/hints/serving.html b/app/project/archimate-smart-gov/hints/serving.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/serving.html rename to app/project/archimate-smart-gov/hints/serving.html diff --git a/app/dataviz/archimate-smart-gov/hints/sketch.html b/app/project/archimate-smart-gov/hints/sketch.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/sketch.html rename to app/project/archimate-smart-gov/hints/sketch.html diff --git a/app/dataviz/archimate-smart-gov/hints/sketch_actor.html b/app/project/archimate-smart-gov/hints/sketch_actor.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/sketch_actor.html rename to app/project/archimate-smart-gov/hints/sketch_actor.html diff --git a/app/dataviz/archimate-smart-gov/hints/sketch_sticky.html b/app/project/archimate-smart-gov/hints/sketch_sticky.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/sketch_sticky.html rename to app/project/archimate-smart-gov/hints/sketch_sticky.html diff --git a/app/dataviz/archimate-smart-gov/hints/specialization.html b/app/project/archimate-smart-gov/hints/specialization.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/specialization.html rename to app/project/archimate-smart-gov/hints/specialization.html diff --git a/app/dataviz/archimate-smart-gov/hints/stakeholder.html b/app/project/archimate-smart-gov/hints/stakeholder.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/stakeholder.html rename to app/project/archimate-smart-gov/hints/stakeholder.html diff --git a/app/dataviz/archimate-smart-gov/hints/style.css b/app/project/archimate-smart-gov/hints/style.css similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/style.css rename to app/project/archimate-smart-gov/hints/style.css diff --git a/app/dataviz/archimate-smart-gov/hints/system_software.html b/app/project/archimate-smart-gov/hints/system_software.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/system_software.html rename to app/project/archimate-smart-gov/hints/system_software.html diff --git a/app/dataviz/archimate-smart-gov/hints/technology_collaboration.html b/app/project/archimate-smart-gov/hints/technology_collaboration.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/technology_collaboration.html rename to app/project/archimate-smart-gov/hints/technology_collaboration.html diff --git a/app/dataviz/archimate-smart-gov/hints/technology_event.html b/app/project/archimate-smart-gov/hints/technology_event.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/technology_event.html rename to app/project/archimate-smart-gov/hints/technology_event.html diff --git a/app/dataviz/archimate-smart-gov/hints/technology_function.html b/app/project/archimate-smart-gov/hints/technology_function.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/technology_function.html rename to app/project/archimate-smart-gov/hints/technology_function.html diff --git a/app/dataviz/archimate-smart-gov/hints/technology_interaction.html b/app/project/archimate-smart-gov/hints/technology_interaction.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/technology_interaction.html rename to app/project/archimate-smart-gov/hints/technology_interaction.html diff --git a/app/dataviz/archimate-smart-gov/hints/technology_interface.html b/app/project/archimate-smart-gov/hints/technology_interface.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/technology_interface.html rename to app/project/archimate-smart-gov/hints/technology_interface.html diff --git a/app/dataviz/archimate-smart-gov/hints/technology_process.html b/app/project/archimate-smart-gov/hints/technology_process.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/technology_process.html rename to app/project/archimate-smart-gov/hints/technology_process.html diff --git a/app/dataviz/archimate-smart-gov/hints/technology_service.html b/app/project/archimate-smart-gov/hints/technology_service.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/technology_service.html rename to app/project/archimate-smart-gov/hints/technology_service.html diff --git a/app/dataviz/archimate-smart-gov/hints/triggering.html b/app/project/archimate-smart-gov/hints/triggering.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/triggering.html rename to app/project/archimate-smart-gov/hints/triggering.html diff --git a/app/dataviz/archimate-smart-gov/hints/value.html b/app/project/archimate-smart-gov/hints/value.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/value.html rename to app/project/archimate-smart-gov/hints/value.html diff --git a/app/dataviz/archimate-smart-gov/hints/value_stream.html b/app/project/archimate-smart-gov/hints/value_stream.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/value_stream.html rename to app/project/archimate-smart-gov/hints/value_stream.html diff --git a/app/dataviz/archimate-smart-gov/hints/view.html b/app/project/archimate-smart-gov/hints/view.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/view.html rename to app/project/archimate-smart-gov/hints/view.html diff --git a/app/dataviz/archimate-smart-gov/hints/view_ref.html b/app/project/archimate-smart-gov/hints/view_ref.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/view_ref.html rename to app/project/archimate-smart-gov/hints/view_ref.html diff --git a/app/dataviz/archimate-smart-gov/hints/vp_application_cooperation.html b/app/project/archimate-smart-gov/hints/vp_application_cooperation.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/vp_application_cooperation.html rename to app/project/archimate-smart-gov/hints/vp_application_cooperation.html diff --git a/app/dataviz/archimate-smart-gov/hints/vp_application_structure.html b/app/project/archimate-smart-gov/hints/vp_application_structure.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/vp_application_structure.html rename to app/project/archimate-smart-gov/hints/vp_application_structure.html diff --git a/app/dataviz/archimate-smart-gov/hints/vp_application_usage.html b/app/project/archimate-smart-gov/hints/vp_application_usage.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/vp_application_usage.html rename to app/project/archimate-smart-gov/hints/vp_application_usage.html diff --git a/app/dataviz/archimate-smart-gov/hints/vp_business_process_cooperation.html b/app/project/archimate-smart-gov/hints/vp_business_process_cooperation.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/vp_business_process_cooperation.html rename to app/project/archimate-smart-gov/hints/vp_business_process_cooperation.html diff --git a/app/dataviz/archimate-smart-gov/hints/vp_capability.html b/app/project/archimate-smart-gov/hints/vp_capability.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/vp_capability.html rename to app/project/archimate-smart-gov/hints/vp_capability.html diff --git a/app/dataviz/archimate-smart-gov/hints/vp_goal_realization.html b/app/project/archimate-smart-gov/hints/vp_goal_realization.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/vp_goal_realization.html rename to app/project/archimate-smart-gov/hints/vp_goal_realization.html diff --git a/app/dataviz/archimate-smart-gov/hints/vp_implementation_deployment.html b/app/project/archimate-smart-gov/hints/vp_implementation_deployment.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/vp_implementation_deployment.html rename to app/project/archimate-smart-gov/hints/vp_implementation_deployment.html diff --git a/app/dataviz/archimate-smart-gov/hints/vp_implementation_migration.html b/app/project/archimate-smart-gov/hints/vp_implementation_migration.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/vp_implementation_migration.html rename to app/project/archimate-smart-gov/hints/vp_implementation_migration.html diff --git a/app/dataviz/archimate-smart-gov/hints/vp_information_structure.html b/app/project/archimate-smart-gov/hints/vp_information_structure.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/vp_information_structure.html rename to app/project/archimate-smart-gov/hints/vp_information_structure.html diff --git a/app/dataviz/archimate-smart-gov/hints/vp_layered.html b/app/project/archimate-smart-gov/hints/vp_layered.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/vp_layered.html rename to app/project/archimate-smart-gov/hints/vp_layered.html diff --git a/app/dataviz/archimate-smart-gov/hints/vp_migration.html b/app/project/archimate-smart-gov/hints/vp_migration.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/vp_migration.html rename to app/project/archimate-smart-gov/hints/vp_migration.html diff --git a/app/dataviz/archimate-smart-gov/hints/vp_motivation.html b/app/project/archimate-smart-gov/hints/vp_motivation.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/vp_motivation.html rename to app/project/archimate-smart-gov/hints/vp_motivation.html diff --git a/app/dataviz/archimate-smart-gov/hints/vp_organization.html b/app/project/archimate-smart-gov/hints/vp_organization.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/vp_organization.html rename to app/project/archimate-smart-gov/hints/vp_organization.html diff --git a/app/dataviz/archimate-smart-gov/hints/vp_outcome_realization.html b/app/project/archimate-smart-gov/hints/vp_outcome_realization.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/vp_outcome_realization.html rename to app/project/archimate-smart-gov/hints/vp_outcome_realization.html diff --git a/app/dataviz/archimate-smart-gov/hints/vp_physical.html b/app/project/archimate-smart-gov/hints/vp_physical.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/vp_physical.html rename to app/project/archimate-smart-gov/hints/vp_physical.html diff --git a/app/dataviz/archimate-smart-gov/hints/vp_product.html b/app/project/archimate-smart-gov/hints/vp_product.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/vp_product.html rename to app/project/archimate-smart-gov/hints/vp_product.html diff --git a/app/dataviz/archimate-smart-gov/hints/vp_project.html b/app/project/archimate-smart-gov/hints/vp_project.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/vp_project.html rename to app/project/archimate-smart-gov/hints/vp_project.html diff --git a/app/dataviz/archimate-smart-gov/hints/vp_requirements_realization.html b/app/project/archimate-smart-gov/hints/vp_requirements_realization.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/vp_requirements_realization.html rename to app/project/archimate-smart-gov/hints/vp_requirements_realization.html diff --git a/app/dataviz/archimate-smart-gov/hints/vp_resource.html b/app/project/archimate-smart-gov/hints/vp_resource.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/vp_resource.html rename to app/project/archimate-smart-gov/hints/vp_resource.html diff --git a/app/dataviz/archimate-smart-gov/hints/vp_service_realization.html b/app/project/archimate-smart-gov/hints/vp_service_realization.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/vp_service_realization.html rename to app/project/archimate-smart-gov/hints/vp_service_realization.html diff --git a/app/dataviz/archimate-smart-gov/hints/vp_stakeholder.html b/app/project/archimate-smart-gov/hints/vp_stakeholder.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/vp_stakeholder.html rename to app/project/archimate-smart-gov/hints/vp_stakeholder.html diff --git a/app/dataviz/archimate-smart-gov/hints/vp_strategy.html b/app/project/archimate-smart-gov/hints/vp_strategy.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/vp_strategy.html rename to app/project/archimate-smart-gov/hints/vp_strategy.html diff --git a/app/dataviz/archimate-smart-gov/hints/vp_technology.html b/app/project/archimate-smart-gov/hints/vp_technology.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/vp_technology.html rename to app/project/archimate-smart-gov/hints/vp_technology.html diff --git a/app/dataviz/archimate-smart-gov/hints/vp_technology_usage.html b/app/project/archimate-smart-gov/hints/vp_technology_usage.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/vp_technology_usage.html rename to app/project/archimate-smart-gov/hints/vp_technology_usage.html diff --git a/app/dataviz/archimate-smart-gov/hints/vp_value_stream.html b/app/project/archimate-smart-gov/hints/vp_value_stream.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/vp_value_stream.html rename to app/project/archimate-smart-gov/hints/vp_value_stream.html diff --git a/app/dataviz/archimate-smart-gov/hints/workpackage.html b/app/project/archimate-smart-gov/hints/workpackage.html similarity index 100% rename from app/dataviz/archimate-smart-gov/hints/workpackage.html rename to app/project/archimate-smart-gov/hints/workpackage.html diff --git a/app/dataviz/archimate-smart-gov/index.html b/app/project/archimate-smart-gov/index.html similarity index 100% rename from app/dataviz/archimate-smart-gov/index.html rename to app/project/archimate-smart-gov/index.html diff --git a/app/dataviz/archimate-smart-gov/js/frame.js b/app/project/archimate-smart-gov/js/frame.js similarity index 100% rename from app/dataviz/archimate-smart-gov/js/frame.js rename to app/project/archimate-smart-gov/js/frame.js diff --git a/app/dataviz/archimate-smart-gov/js/imageMapResizer.min.js b/app/project/archimate-smart-gov/js/imageMapResizer.min.js similarity index 100% rename from app/dataviz/archimate-smart-gov/js/imageMapResizer.min.js rename to app/project/archimate-smart-gov/js/imageMapResizer.min.js diff --git a/app/dataviz/archimate-smart-gov/js/model.js b/app/project/archimate-smart-gov/js/model.js similarity index 100% rename from app/dataviz/archimate-smart-gov/js/model.js rename to app/project/archimate-smart-gov/js/model.js diff --git a/app/dataviz/archimate-smart-gov/js/url-polyfill.min.js b/app/project/archimate-smart-gov/js/url-polyfill.min.js similarity index 100% rename from app/dataviz/archimate-smart-gov/js/url-polyfill.min.js rename to app/project/archimate-smart-gov/js/url-polyfill.min.js diff --git a/app/dataviz/archimate-smart-gov/lib/alasql/alasql.min.js b/app/project/archimate-smart-gov/lib/alasql/alasql.min.js similarity index 100% rename from app/dataviz/archimate-smart-gov/lib/alasql/alasql.min.js rename to app/project/archimate-smart-gov/lib/alasql/alasql.min.js diff --git a/app/dataviz/archimate-smart-gov/lib/bootstrap/css/bootstrap-3.3.2.min.css b/app/project/archimate-smart-gov/lib/bootstrap/css/bootstrap-3.3.2.min.css similarity index 100% rename from app/dataviz/archimate-smart-gov/lib/bootstrap/css/bootstrap-3.3.2.min.css rename to app/project/archimate-smart-gov/lib/bootstrap/css/bootstrap-3.3.2.min.css diff --git a/app/dataviz/archimate-smart-gov/lib/bootstrap/css/bootstrap-theme-3.3.2.min.css b/app/project/archimate-smart-gov/lib/bootstrap/css/bootstrap-theme-3.3.2.min.css similarity index 100% rename from app/dataviz/archimate-smart-gov/lib/bootstrap/css/bootstrap-theme-3.3.2.min.css rename to app/project/archimate-smart-gov/lib/bootstrap/css/bootstrap-theme-3.3.2.min.css diff --git a/app/dataviz/archimate-smart-gov/lib/bootstrap/css/bootstrap.min.yeti.css b/app/project/archimate-smart-gov/lib/bootstrap/css/bootstrap.min.yeti.css similarity index 100% rename from app/dataviz/archimate-smart-gov/lib/bootstrap/css/bootstrap.min.yeti.css rename to app/project/archimate-smart-gov/lib/bootstrap/css/bootstrap.min.yeti.css diff --git a/app/project/archimate-smart-gov/lib/bootstrap/fonts/glyphicons-halflings-regular.eot b/app/project/archimate-smart-gov/lib/bootstrap/fonts/glyphicons-halflings-regular.eot new file mode 100644 index 00000000..b93a4953 Binary files /dev/null and b/app/project/archimate-smart-gov/lib/bootstrap/fonts/glyphicons-halflings-regular.eot differ diff --git a/app/project/archimate-smart-gov/lib/bootstrap/fonts/glyphicons-halflings-regular.svg b/app/project/archimate-smart-gov/lib/bootstrap/fonts/glyphicons-halflings-regular.svg new file mode 100644 index 00000000..94fb5490 --- /dev/null +++ b/app/project/archimate-smart-gov/lib/bootstrap/fonts/glyphicons-halflings-regular.svg @@ -0,0 +1,288 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/project/archimate-smart-gov/lib/bootstrap/fonts/glyphicons-halflings-regular.ttf b/app/project/archimate-smart-gov/lib/bootstrap/fonts/glyphicons-halflings-regular.ttf new file mode 100644 index 00000000..1413fc60 Binary files /dev/null and b/app/project/archimate-smart-gov/lib/bootstrap/fonts/glyphicons-halflings-regular.ttf differ diff --git a/app/project/archimate-smart-gov/lib/bootstrap/fonts/glyphicons-halflings-regular.woff b/app/project/archimate-smart-gov/lib/bootstrap/fonts/glyphicons-halflings-regular.woff new file mode 100644 index 00000000..9e612858 Binary files /dev/null and b/app/project/archimate-smart-gov/lib/bootstrap/fonts/glyphicons-halflings-regular.woff differ diff --git a/app/project/archimate-smart-gov/lib/bootstrap/fonts/glyphicons-halflings-regular.woff2 b/app/project/archimate-smart-gov/lib/bootstrap/fonts/glyphicons-halflings-regular.woff2 new file mode 100644 index 00000000..64539b54 Binary files /dev/null and b/app/project/archimate-smart-gov/lib/bootstrap/fonts/glyphicons-halflings-regular.woff2 differ diff --git a/app/dataviz/archimate-smart-gov/lib/bootstrap/js/bootstrap-3.3.2.min.js b/app/project/archimate-smart-gov/lib/bootstrap/js/bootstrap-3.3.2.min.js similarity index 100% rename from app/dataviz/archimate-smart-gov/lib/bootstrap/js/bootstrap-3.3.2.min.js rename to app/project/archimate-smart-gov/lib/bootstrap/js/bootstrap-3.3.2.min.js diff --git a/app/dataviz/archimate-smart-gov/lib/jquery-ui-layout/css/layout-default-1.4.4.css b/app/project/archimate-smart-gov/lib/jquery-ui-layout/css/layout-default-1.4.4.css similarity index 100% rename from app/dataviz/archimate-smart-gov/lib/jquery-ui-layout/css/layout-default-1.4.4.css rename to app/project/archimate-smart-gov/lib/jquery-ui-layout/css/layout-default-1.4.4.css diff --git a/app/dataviz/archimate-smart-gov/lib/jquery-ui-layout/js/jquery.layout-1.4.4.js b/app/project/archimate-smart-gov/lib/jquery-ui-layout/js/jquery.layout-1.4.4.js similarity index 100% rename from app/dataviz/archimate-smart-gov/lib/jquery-ui-layout/js/jquery.layout-1.4.4.js rename to app/project/archimate-smart-gov/lib/jquery-ui-layout/js/jquery.layout-1.4.4.js diff --git a/app/dataviz/archimate-smart-gov/lib/jquery-ui/css/jquery-ui-1.11.2.min.css b/app/project/archimate-smart-gov/lib/jquery-ui/css/jquery-ui-1.11.2.min.css similarity index 100% rename from app/dataviz/archimate-smart-gov/lib/jquery-ui/css/jquery-ui-1.11.2.min.css rename to app/project/archimate-smart-gov/lib/jquery-ui/css/jquery-ui-1.11.2.min.css diff --git a/app/dataviz/archimate-smart-gov/lib/jquery-ui/js/jquery-ui-1.11.2.min.js b/app/project/archimate-smart-gov/lib/jquery-ui/js/jquery-ui-1.11.2.min.js similarity index 100% rename from app/dataviz/archimate-smart-gov/lib/jquery-ui/js/jquery-ui-1.11.2.min.js rename to app/project/archimate-smart-gov/lib/jquery-ui/js/jquery-ui-1.11.2.min.js diff --git a/app/dataviz/archimate-smart-gov/lib/jquery/js/jquery-1.11.2.min.js b/app/project/archimate-smart-gov/lib/jquery/js/jquery-1.11.2.min.js similarity index 100% rename from app/dataviz/archimate-smart-gov/lib/jquery/js/jquery-1.11.2.min.js rename to app/project/archimate-smart-gov/lib/jquery/js/jquery-1.11.2.min.js diff --git a/app/dataviz/archimate-viewer/archimate/ArchiSurance_V3.archimate b/app/project/archimate-viewer/archimate/ArchiSurance_V3.archimate similarity index 100% rename from app/dataviz/archimate-viewer/archimate/ArchiSurance_V3.archimate rename to app/project/archimate-viewer/archimate/ArchiSurance_V3.archimate diff --git a/app/dataviz/archimate-viewer/archimate/everything.archimate b/app/project/archimate-viewer/archimate/everything.archimate similarity index 100% rename from app/dataviz/archimate-viewer/archimate/everything.archimate rename to app/project/archimate-viewer/archimate/everything.archimate diff --git a/app/dataviz/archimate-viewer/asset-manifest.json b/app/project/archimate-viewer/asset-manifest.json similarity index 100% rename from app/dataviz/archimate-viewer/asset-manifest.json rename to app/project/archimate-viewer/asset-manifest.json diff --git a/app/dataviz/archimate-viewer/favicon-32x32.png b/app/project/archimate-viewer/favicon-32x32.png similarity index 100% rename from app/dataviz/archimate-viewer/favicon-32x32.png rename to app/project/archimate-viewer/favicon-32x32.png diff --git a/app/dataviz/archimate-viewer/index.html b/app/project/archimate-viewer/index.html similarity index 100% rename from app/dataviz/archimate-viewer/index.html rename to app/project/archimate-viewer/index.html diff --git a/app/dataviz/archimate-viewer/logo192.png b/app/project/archimate-viewer/logo192.png similarity index 100% rename from app/dataviz/archimate-viewer/logo192.png rename to app/project/archimate-viewer/logo192.png diff --git a/app/dataviz/archimate-viewer/logo512.png b/app/project/archimate-viewer/logo512.png similarity index 100% rename from app/dataviz/archimate-viewer/logo512.png rename to app/project/archimate-viewer/logo512.png diff --git a/app/dataviz/archimate-viewer/manifest.json b/app/project/archimate-viewer/manifest.json similarity index 100% rename from app/dataviz/archimate-viewer/manifest.json rename to app/project/archimate-viewer/manifest.json diff --git a/app/dataviz/archimate-viewer/precache-manifest.85446bd97476a4a2675cfe1500a8e5b7.js b/app/project/archimate-viewer/precache-manifest.85446bd97476a4a2675cfe1500a8e5b7.js similarity index 100% rename from app/dataviz/archimate-viewer/precache-manifest.85446bd97476a4a2675cfe1500a8e5b7.js rename to app/project/archimate-viewer/precache-manifest.85446bd97476a4a2675cfe1500a8e5b7.js diff --git a/app/dataviz/archimate-viewer/robots.txt b/app/project/archimate-viewer/robots.txt similarity index 100% rename from app/dataviz/archimate-viewer/robots.txt rename to app/project/archimate-viewer/robots.txt diff --git a/app/dataviz/archimate-viewer/service-worker.js b/app/project/archimate-viewer/service-worker.js similarity index 100% rename from app/dataviz/archimate-viewer/service-worker.js rename to app/project/archimate-viewer/service-worker.js diff --git a/app/dataviz/archimate-viewer/static/css/2.42c6bb7e.chunk.css b/app/project/archimate-viewer/static/css/2.42c6bb7e.chunk.css similarity index 100% rename from app/dataviz/archimate-viewer/static/css/2.42c6bb7e.chunk.css rename to app/project/archimate-viewer/static/css/2.42c6bb7e.chunk.css diff --git a/app/dataviz/archimate-viewer/static/css/main.8196904e.chunk.css b/app/project/archimate-viewer/static/css/main.8196904e.chunk.css similarity index 100% rename from app/dataviz/archimate-viewer/static/css/main.8196904e.chunk.css rename to app/project/archimate-viewer/static/css/main.8196904e.chunk.css diff --git a/app/dataviz/archimate-viewer/static/js/2.8a1908c2.chunk.js b/app/project/archimate-viewer/static/js/2.8a1908c2.chunk.js similarity index 100% rename from app/dataviz/archimate-viewer/static/js/2.8a1908c2.chunk.js rename to app/project/archimate-viewer/static/js/2.8a1908c2.chunk.js diff --git a/app/dataviz/archimate-viewer/static/js/main.fa5da65d.chunk.js b/app/project/archimate-viewer/static/js/main.fa5da65d.chunk.js similarity index 100% rename from app/dataviz/archimate-viewer/static/js/main.fa5da65d.chunk.js rename to app/project/archimate-viewer/static/js/main.fa5da65d.chunk.js diff --git a/app/dataviz/archimate-viewer/static/js/runtime-main.89b10739.js b/app/project/archimate-viewer/static/js/runtime-main.89b10739.js similarity index 100% rename from app/dataviz/archimate-viewer/static/js/runtime-main.89b10739.js rename to app/project/archimate-viewer/static/js/runtime-main.89b10739.js diff --git a/app/dataviz/gui-sparql-data.md b/app/project/gui-sparql-data.md similarity index 100% rename from app/dataviz/gui-sparql-data.md rename to app/project/gui-sparql-data.md diff --git a/app/project/loan-application.cmmn b/app/project/loan-application.cmmn new file mode 100644 index 00000000..f4300492 --- /dev/null +++ b/app/project/loan-application.cmmn @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + ${false} + + + + + + + ${false} + + + + + + + + complete + + complete + + + 3}]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/dataviz/sparql-data-gui/gui-sparql.html b/app/project/sparql-data-gui/gui-sparql.html similarity index 100% rename from app/dataviz/sparql-data-gui/gui-sparql.html rename to app/project/sparql-data-gui/gui-sparql.html diff --git a/app/dataviz/sparql-data-gui/index.html b/app/project/sparql-data-gui/index.html similarity index 100% rename from app/dataviz/sparql-data-gui/index.html rename to app/project/sparql-data-gui/index.html diff --git a/app/dataviz/sparql-data-gui/lib/ontodia-custom.min.js b/app/project/sparql-data-gui/lib/ontodia-custom.min.js similarity index 100% rename from app/dataviz/sparql-data-gui/lib/ontodia-custom.min.js rename to app/project/sparql-data-gui/lib/ontodia-custom.min.js diff --git a/app/dataviz/sparql-data-gui/lib/react-dom.min.js b/app/project/sparql-data-gui/lib/react-dom.min.js similarity index 100% rename from app/dataviz/sparql-data-gui/lib/react-dom.min.js rename to app/project/sparql-data-gui/lib/react-dom.min.js diff --git a/app/dataviz/sparql-data-gui/lib/react.min.js b/app/project/sparql-data-gui/lib/react.min.js similarity index 100% rename from app/dataviz/sparql-data-gui/lib/react.min.js rename to app/project/sparql-data-gui/lib/react.min.js diff --git a/app/dataviz/sparql-data-gui/lib/script.js b/app/project/sparql-data-gui/lib/script.js similarity index 100% rename from app/dataviz/sparql-data-gui/lib/script.js rename to app/project/sparql-data-gui/lib/script.js diff --git a/app/dataviz/sparql-data-gui/lib/style.css b/app/project/sparql-data-gui/lib/style.css similarity index 100% rename from app/dataviz/sparql-data-gui/lib/style.css rename to app/project/sparql-data-gui/lib/style.css