first commit

This commit is contained in:
Josh Trotter-Wanner 2021-03-08 18:36:09 -08:00
commit 3200d5491e
86 changed files with 6587 additions and 0 deletions

BIN
Research/1911.08265.pdf Normal file

Binary file not shown.

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,72 @@
<!DOCTYPE html>
<!-- saved from url=(0057)https://medium.com/media/37989df7e0c024c98a85ab9154886677 -->
<html><link type="text/css" id="dark-mode" rel="stylesheet" href="https://medium.com/media/37989df7e0c024c98a85ab9154886677"><style type="text/css" id="dark-mode-custom-style"></style><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>MuZero pseudocode (https://arxiv.org/src/1911.08265v1/anc/pseudocode.py) Medium</title><meta name="description" content="You can&#39;t perform that action at this time. You signed in with another tab or window. You signed out in another tab or window. Reload to refresh your session. Reload to refresh your session."><meta name="twitter:widgets:csp" content="on"><meta name="robots" content="noindex"><!--<base target="_blank">--><base href="." target="_blank"><style>body {text-rendering: optimizeLegibility; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; font-family: "ff-tisa-web-pro", Georgia, Cambria, "Times New Roman", Times, serif; font-weight: 400; color: #333332; font-size: 18px; line-height: 1.4; margin: 0; background-color: white; overflow: hidden;}iframe {max-width: 100%;}</style></head><body><style>.gist .gist-file { margin-bottom: 0 !important; }.gist { text-rendering: auto; }</style><script src="./95d78debdbb8309bb77f90799d18ea3d.js" charset="utf-8"></script><link rel="stylesheet" href="./gist-embed-4e64bbf96c31ed6c9ee61f08cea01836.css"><div id="gist99758597" class="gist">
<div class="gist-file">
<div class="gist-data">
<div class="js-gist-file-update-container js-task-list-container file-box">
<div id="file-pseudocode-py" class="file my-2">
<div itemprop="text" class="Box-body p-0 blob-wrapper data type-python ">
<table class="highlight tab-size js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">
<tbody><tr>
<td id="file-pseudocode-py-L1" class="blob-num js-line-number" data-line-number="1"></td>
<td id="file-pseudocode-py-LC1" class="blob-code blob-code-inner js-file-line"><span class="pl-k">def</span> <span class="pl-en">muzero</span>(<span class="pl-s1">config</span>: <span class="pl-v">MuZeroConfig</span>):</td>
</tr>
<tr>
<td id="file-pseudocode-py-L2" class="blob-num js-line-number" data-line-number="2"></td>
<td id="file-pseudocode-py-LC2" class="blob-code blob-code-inner js-file-line"> <span class="pl-s1">storage</span> <span class="pl-c1">=</span> <span class="pl-v">SharedStorage</span>()</td>
</tr>
<tr>
<td id="file-pseudocode-py-L3" class="blob-num js-line-number" data-line-number="3"></td>
<td id="file-pseudocode-py-LC3" class="blob-code blob-code-inner js-file-line"> <span class="pl-s1">replay_buffer</span> <span class="pl-c1">=</span> <span class="pl-v">ReplayBuffer</span>(<span class="pl-s1">config</span>)</td>
</tr>
<tr>
<td id="file-pseudocode-py-L4" class="blob-num js-line-number" data-line-number="4"></td>
<td id="file-pseudocode-py-LC4" class="blob-code blob-code-inner js-file-line">
</td>
</tr>
<tr>
<td id="file-pseudocode-py-L5" class="blob-num js-line-number" data-line-number="5"></td>
<td id="file-pseudocode-py-LC5" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">for</span> <span class="pl-s1">_</span> <span class="pl-c1">in</span> <span class="pl-en">range</span>(<span class="pl-s1">config</span>.<span class="pl-s1">num_actors</span>):</td>
</tr>
<tr>
<td id="file-pseudocode-py-L6" class="blob-num js-line-number" data-line-number="6"></td>
<td id="file-pseudocode-py-LC6" class="blob-code blob-code-inner js-file-line"> <span class="pl-en">launch_job</span>(<span class="pl-s1">run_selfplay</span>, <span class="pl-s1">config</span>, <span class="pl-s1">storage</span>, <span class="pl-s1">replay_buffer</span>)</td>
</tr>
<tr>
<td id="file-pseudocode-py-L7" class="blob-num js-line-number" data-line-number="7"></td>
<td id="file-pseudocode-py-LC7" class="blob-code blob-code-inner js-file-line">
</td>
</tr>
<tr>
<td id="file-pseudocode-py-L8" class="blob-num js-line-number" data-line-number="8"></td>
<td id="file-pseudocode-py-LC8" class="blob-code blob-code-inner js-file-line"> <span class="pl-en">train_network</span>(<span class="pl-s1">config</span>, <span class="pl-s1">storage</span>, <span class="pl-s1">replay_buffer</span>)</td>
</tr>
<tr>
<td id="file-pseudocode-py-L9" class="blob-num js-line-number" data-line-number="9"></td>
<td id="file-pseudocode-py-LC9" class="blob-code blob-code-inner js-file-line">
</td>
</tr>
<tr>
<td id="file-pseudocode-py-L10" class="blob-num js-line-number" data-line-number="10"></td>
<td id="file-pseudocode-py-LC10" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">return</span> <span class="pl-s1">storage</span>.<span class="pl-en">latest_network</span>()</td>
</tr>
</tbody></table>
</div>
</div>
</div>
</div>
<div class="gist-meta">
<a href="https://gist.github.com/davidADSP/95d78debdbb8309bb77f90799d18ea3d/raw/16c8c7ad17b0d0c76464bf2dbefa3f06cdd80da3/pseudocode.py" style="float:right">view raw</a>
<a href="https://gist.github.com/davidADSP/95d78debdbb8309bb77f90799d18ea3d#file-pseudocode-py">pseudocode.py</a>
hosted with ❤ by <a href="https://github.com/">GitHub</a>
</div>
</div>
</div>
<script>var height = -1; var delayMs = 200; if (document) {document.domain = document.domain;}function notifyResize(height) {height = height ? height : document.documentElement.offsetHeight; var resized = false; if (window.donkey && donkey.resize) {donkey.resize(height);var elements = document.getElementsByClassName("gist-data"); for (var i = 0; i < elements.length; i++) {elements[i].style.overflow = "visible"}resized = true;}if (parent && parent._resizeIframe) {var obj = {iframe: window.frameElement, height: height}; parent._resizeIframe(obj); resized = true;}if (window.location && window.location.hash === "#amp=1" && window.parent && window.parent.postMessage) {window.parent.postMessage({sentinel: "amp", type: "embed-size", height: height}, "*");}if (window.webkit && window.webkit.messageHandlers && window.webkit.messageHandlers.resize) {window.webkit.messageHandlers.resize.postMessage(height); resized = true;}return resized;}function maybeResize() {try {if (document.documentElement.offsetHeight != height && notifyResize()) {height = document.documentElement.offsetHeight;}delayMs = Math.min(delayMs * 2, 1000000); setTimeout(maybeResize, delayMs);} catch(error) {console.log('maybeResize error: ', error)}}maybeResize();</script></body></html>

View File

@ -0,0 +1,2 @@
(self.webpackChunklite=self.webpackChunklite||[]).push([[4964],{77412:r=>{r.exports=function(r,t){for(var e=-1,n=null==r?0:r.length;++e<n&&!1!==t(r[e],e,r););return r}},44037:(r,t,e)=>{var n=e(98363),o=e(3674);r.exports=function(r,t){return r&&n(t,o(t),r)}},63886:(r,t,e)=>{var n=e(98363),o=e(81704);r.exports=function(r,t){return r&&n(t,o(t),r)}},85990:(r,t,e)=>{var n=e(46384),o=e(77412),c=e(34865),a=e(44037),u=e(63886),i=e(64626),s=e(278),b=e(18805),f=e(1911),j=e(58234),p=e(46904),l=e(64160),v=e(43824),y=e(29148),x=e(38517),A=e(1469),h=e(44144),w=e(56688),d=e(13218),g=e(72928),S=e(3674),m=e(81704),I="[object Arguments]",O="[object Function]",U="[object Object]",E={};E[I]=E["[object Array]"]=E["[object ArrayBuffer]"]=E["[object DataView]"]=E["[object Boolean]"]=E["[object Date]"]=E["[object Float32Array]"]=E["[object Float64Array]"]=E["[object Int8Array]"]=E["[object Int16Array]"]=E["[object Int32Array]"]=E["[object Map]"]=E["[object Number]"]=E[U]=E["[object RegExp]"]=E["[object Set]"]=E["[object String]"]=E["[object Symbol]"]=E["[object Uint8Array]"]=E["[object Uint8ClampedArray]"]=E["[object Uint16Array]"]=E["[object Uint32Array]"]=!0,E["[object Error]"]=E[O]=E["[object WeakMap]"]=!1,r.exports=function r(t,e,F,k,M,B){var C,D=1&e,N=2&e,P=4&e;if(F&&(C=M?F(t,k,M,B):F(t)),void 0!==C)return C;if(!d(t))return t;var R=A(t);if(R){if(C=v(t),!D)return s(t,C)}else{var V=l(t),G=V==O||"[object GeneratorFunction]"==V;if(h(t))return i(t,D);if(V==U||V==I||G&&!M){if(C=N||G?{}:x(t),!D)return N?f(t,u(C,t)):b(t,a(C,t))}else{if(!E[V])return M?t:{};C=y(t,V,D)}}B||(B=new n);var L=B.get(t);if(L)return L;B.set(t,C),g(t)?t.forEach((function(n){C.add(r(n,e,F,n,t,B))})):w(t)&&t.forEach((function(n,o){C.set(o,r(n,e,F,o,t,B))}));var T=R?void 0:(P?N?p:j:N?m:S)(t);return o(T||t,(function(n,o){T&&(n=t[o=n]),c(C,o,r(n,e,F,o,t,B))})),C}},25588:(r,t,e)=>{var n=e(64160),o=e(37005);r.exports=function(r){return o(r)&&"[object Map]"==n(r)}},29221:(r,t,e)=>{var n=e(64160),o=e(37005);r.exports=function(r){return o(r)&&"[object Set]"==n(r)}},63012:(r,t,e)=>{var n=e(97786),o=e(10611),c=e(71811);r.exports=function(r,t,e){for(var a=-1,u=t.length,i={};++a<u;){var s=t[a],b=n(r,s);e(b,s)&&o(i,c(s,r),b)}return i}},57157:(r,t,e)=>{var n=e(40214);r.exports=function(r,t){var e=t?n(r.buffer):r.buffer;return new r.constructor(e,r.byteOffset,r.byteLength)}},93147:r=>{var t=/\w*$/;r.exports=function(r){var e=new r.constructor(r.source,t.exec(r));return e.lastIndex=r.lastIndex,e}},40419:(r,t,e)=>{var n=e(62705),o=n?n.prototype:void 0,c=o?o.valueOf:void 0;r.exports=function(r){return c?Object(c.call(r)):{}}},18805:(r,t,e)=>{var n=e(98363),o=e(99551);r.exports=function(r,t){return n(r,o(r),t)}},1911:(r,t,e)=>{var n=e(98363),o=e(51442);r.exports=function(r,t){return n(r,o(r),t)}},46904:(r,t,e)=>{var n=e(68866),o=e(51442),c=e(81704);r.exports=function(r){return n(r,c,o)}},51442:(r,t,e)=>{var n=e(62488),o=e(85924),c=e(99551),a=e(70479),u=Object.getOwnPropertySymbols?function(r){for(var t=[];r;)n(t,c(r)),r=o(r);return t}:a;r.exports=u},43824:r=>{var t=Object.prototype.hasOwnProperty;r.exports=function(r){var e=r.length,n=new r.constructor(e);return e&&"string"==typeof r[0]&&t.call(r,"index")&&(n.index=r.index,n.input=r.input),n}},29148:(r,t,e)=>{var n=e(40214),o=e(57157),c=e(93147),a=e(40419),u=e(77133);r.exports=function(r,t,e){var i=r.constructor;switch(t){case"[object ArrayBuffer]":return n(r);case"[object Boolean]":case"[object Date]":return new i(+r);case"[object DataView]":return o(r,e);case"[object Float32Array]":case"[object Float64Array]":case"[object Int8Array]":case"[object Int16Array]":case"[object Int32Array]":case"[object Uint8Array]":case"[object Uint8ClampedArray]":case"[object Uint16Array]":case"[object Uint32Array]":return u(r,e);case"[object Map]":return new i;case"[object Number]":case"[object String]":return new i(r);case"[object RegExp]":return c(r);case"[object Set]":return new i;case"[object Symbol]":return a(r)}}},50361:(r,t,e)=>{var n=e(85990);r.exports=function(r){return n(r,5)}},56688:(r,t,e)=>{var n=e(25588),o=e(7518),c=e(31167),a=c&&c.isMap,u=a?o(a):n;r.exports=u},45220:r=>{r.exports=function(r){return null===r}},72928:(r,t,e)=>{var n=e(29221),o=e(7518),c=e(31167),a=c&&c.isSet,u=a?o(a):n;r.exports=u},94885:r=>{r.exports=function(r){if("function"!=typeof r)throw new TypeError("Expected a function");return function(){var t=arguments;switch(t.length){case 0:return!r.call(this);case 1:return!r.call(this,t[0]);case 2:return!r.call(this,t[0],t[1]);case 3:return!r.call(this,t[0],t[1],t[2])}return!r.apply(this,t)}}},14176:(r,t,e)=>{var n=e(67206),o=e(94885),c=e(35937);r.exports=function(r,t){return c(r,o(n(t)))}},35937:(r,t,e)=>{var n=e(29932),o=e(67206),c=e(63012),a=e(46904);r.exports=function(r,t){if(null==r)return{};var e=n(a(r),(function(r){return[r]}));return t=o(t),c(r,e,(function(r,e){return t(r,e[0])}))}}}]);
//# sourceMappingURL=https://stats.medium.build/lite/sourcemaps/4964.fb36722e.chunk.js.map

View File

@ -0,0 +1,88 @@
<!DOCTYPE html>
<!-- saved from url=(0057)https://medium.com/media/57eaa5c07fa0d54806a3c01079a6365c -->
<html><link type="text/css" id="dark-mode" rel="stylesheet" href="https://medium.com/media/57eaa5c07fa0d54806a3c01079a6365c"><style type="text/css" id="dark-mode-custom-style"></style><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>SharedStorage (https://arxiv.org/src/1911.08265v1/anc/pseudocode.py) Medium</title><meta name="description" content="You can&#39;t perform that action at this time. You signed in with another tab or window. You signed out in another tab or window. Reload to refresh your session. Reload to refresh your session."><meta name="twitter:widgets:csp" content="on"><meta name="robots" content="noindex"><!--<base target="_blank">--><base href="." target="_blank"><style>body {text-rendering: optimizeLegibility; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; font-family: "ff-tisa-web-pro", Georgia, Cambria, "Times New Roman", Times, serif; font-weight: 400; color: #333332; font-size: 18px; line-height: 1.4; margin: 0; background-color: white; overflow: hidden;}iframe {max-width: 100%;}</style></head><body><style>.gist .gist-file { margin-bottom: 0 !important; }.gist { text-rendering: auto; }</style><script src="./0f723c9f48100eca4e842c551d8ac03b.js" charset="utf-8"></script><link rel="stylesheet" href="./gist-embed-4e64bbf96c31ed6c9ee61f08cea01836.css"><div id="gist99758814" class="gist">
<div class="gist-file">
<div class="gist-data">
<div class="js-gist-file-update-container js-task-list-container file-box">
<div id="file-pseudocode-py" class="file my-2">
<div itemprop="text" class="Box-body p-0 blob-wrapper data type-python ">
<table class="highlight tab-size js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">
<tbody><tr>
<td id="file-pseudocode-py-L1" class="blob-num js-line-number" data-line-number="1"></td>
<td id="file-pseudocode-py-LC1" class="blob-code blob-code-inner js-file-line"><span class="pl-k">class</span> <span class="pl-v">SharedStorage</span>(<span class="pl-s1">object</span>):</td>
</tr>
<tr>
<td id="file-pseudocode-py-L2" class="blob-num js-line-number" data-line-number="2"></td>
<td id="file-pseudocode-py-LC2" class="blob-code blob-code-inner js-file-line">
</td>
</tr>
<tr>
<td id="file-pseudocode-py-L3" class="blob-num js-line-number" data-line-number="3"></td>
<td id="file-pseudocode-py-LC3" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">def</span> <span class="pl-en">__init__</span>(<span class="pl-s1">self</span>):</td>
</tr>
<tr>
<td id="file-pseudocode-py-L4" class="blob-num js-line-number" data-line-number="4"></td>
<td id="file-pseudocode-py-LC4" class="blob-code blob-code-inner js-file-line"> <span class="pl-s1">self</span>.<span class="pl-s1">_networks</span> <span class="pl-c1">=</span> {}</td>
</tr>
<tr>
<td id="file-pseudocode-py-L5" class="blob-num js-line-number" data-line-number="5"></td>
<td id="file-pseudocode-py-LC5" class="blob-code blob-code-inner js-file-line">
</td>
</tr>
<tr>
<td id="file-pseudocode-py-L6" class="blob-num js-line-number" data-line-number="6"></td>
<td id="file-pseudocode-py-LC6" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">def</span> <span class="pl-en">latest_network</span>(<span class="pl-s1">self</span>) <span class="pl-c1">-&gt;</span> <span class="pl-v">Network</span>:</td>
</tr>
<tr>
<td id="file-pseudocode-py-L7" class="blob-num js-line-number" data-line-number="7"></td>
<td id="file-pseudocode-py-LC7" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> <span class="pl-s1">self</span>.<span class="pl-s1">_networks</span>:</td>
</tr>
<tr>
<td id="file-pseudocode-py-L8" class="blob-num js-line-number" data-line-number="8"></td>
<td id="file-pseudocode-py-LC8" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">return</span> <span class="pl-s1">self</span>.<span class="pl-s1">_networks</span>[<span class="pl-en">max</span>(<span class="pl-s1">self</span>.<span class="pl-s1">_networks</span>.<span class="pl-en">keys</span>())]</td>
</tr>
<tr>
<td id="file-pseudocode-py-L9" class="blob-num js-line-number" data-line-number="9"></td>
<td id="file-pseudocode-py-LC9" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">else</span>:</td>
</tr>
<tr>
<td id="file-pseudocode-py-L10" class="blob-num js-line-number" data-line-number="10"></td>
<td id="file-pseudocode-py-LC10" class="blob-code blob-code-inner js-file-line"> <span class="pl-c"># policy -&gt; uniform, value -&gt; 0, reward -&gt; 0</span></td>
</tr>
<tr>
<td id="file-pseudocode-py-L11" class="blob-num js-line-number" data-line-number="11"></td>
<td id="file-pseudocode-py-LC11" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">return</span> <span class="pl-en">make_uniform_network</span>()</td>
</tr>
<tr>
<td id="file-pseudocode-py-L12" class="blob-num js-line-number" data-line-number="12"></td>
<td id="file-pseudocode-py-LC12" class="blob-code blob-code-inner js-file-line">
</td>
</tr>
<tr>
<td id="file-pseudocode-py-L13" class="blob-num js-line-number" data-line-number="13"></td>
<td id="file-pseudocode-py-LC13" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">def</span> <span class="pl-en">save_network</span>(<span class="pl-s1">self</span>, <span class="pl-s1">step</span>: <span class="pl-s1">int</span>, <span class="pl-s1">network</span>: <span class="pl-v">Network</span>):</td>
</tr>
<tr>
<td id="file-pseudocode-py-L14" class="blob-num js-line-number" data-line-number="14"></td>
<td id="file-pseudocode-py-LC14" class="blob-code blob-code-inner js-file-line"> <span class="pl-s1">self</span>.<span class="pl-s1">_networks</span>[<span class="pl-s1">step</span>] <span class="pl-c1">=</span> <span class="pl-s1">network</span></td>
</tr>
</tbody></table>
</div>
</div>
</div>
</div>
<div class="gist-meta">
<a href="https://gist.github.com/davidADSP/0f723c9f48100eca4e842c551d8ac03b/raw/3194ccfc1ab7c3803f53dc6f5d8e6076e5cbcdfe/pseudocode.py" style="float:right">view raw</a>
<a href="https://gist.github.com/davidADSP/0f723c9f48100eca4e842c551d8ac03b#file-pseudocode-py">pseudocode.py</a>
hosted with ❤ by <a href="https://github.com/">GitHub</a>
</div>
</div>
</div>
<script>var height = -1; var delayMs = 200; if (document) {document.domain = document.domain;}function notifyResize(height) {height = height ? height : document.documentElement.offsetHeight; var resized = false; if (window.donkey && donkey.resize) {donkey.resize(height);var elements = document.getElementsByClassName("gist-data"); for (var i = 0; i < elements.length; i++) {elements[i].style.overflow = "visible"}resized = true;}if (parent && parent._resizeIframe) {var obj = {iframe: window.frameElement, height: height}; parent._resizeIframe(obj); resized = true;}if (window.location && window.location.hash === "#amp=1" && window.parent && window.parent.postMessage) {window.parent.postMessage({sentinel: "amp", type: "embed-size", height: height}, "*");}if (window.webkit && window.webkit.messageHandlers && window.webkit.messageHandlers.resize) {window.webkit.messageHandlers.resize.postMessage(height); resized = true;}return resized;}function maybeResize() {try {if (document.documentElement.offsetHeight != height && notifyResize()) {height = document.documentElement.offsetHeight;}delayMs = Math.min(delayMs * 2, 1000000); setTimeout(maybeResize, delayMs);} catch(error) {console.log('maybeResize error: ', error)}}maybeResize();</script></body></html>

View File

@ -0,0 +1,84 @@
<!DOCTYPE html>
<!-- saved from url=(0057)https://medium.com/media/83100f618299e154eaa27d3b5cfef9e4 -->
<html><link type="text/css" id="dark-mode" rel="stylesheet" href="https://medium.com/media/83100f618299e154eaa27d3b5cfef9e4"><style type="text/css" id="dark-mode-custom-style"></style><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>ReplayBuffer (https://arxiv.org/src/1911.08265v1/anc/pseudocode.py) Medium</title><meta name="description" content="You can&#39;t perform that action at this time. You signed in with another tab or window. You signed out in another tab or window. Reload to refresh your session. Reload to refresh your session."><meta name="twitter:widgets:csp" content="on"><meta name="robots" content="noindex"><!--<base target="_blank">--><base href="." target="_blank"><style>body {text-rendering: optimizeLegibility; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; font-family: "ff-tisa-web-pro", Georgia, Cambria, "Times New Roman", Times, serif; font-weight: 400; color: #333332; font-size: 18px; line-height: 1.4; margin: 0; background-color: white; overflow: hidden;}iframe {max-width: 100%;}</style></head><body><style>.gist .gist-file { margin-bottom: 0 !important; }.gist { text-rendering: auto; }</style><script src="./2bb4814c4d4a2b3528fc466d974796d6.js" charset="utf-8"></script><link rel="stylesheet" href="./gist-embed-4e64bbf96c31ed6c9ee61f08cea01836.css"><div id="gist99758972" class="gist">
<div class="gist-file">
<div class="gist-data">
<div class="js-gist-file-update-container js-task-list-container file-box">
<div id="file-pseudocode-py" class="file my-2">
<div itemprop="text" class="Box-body p-0 blob-wrapper data type-python ">
<table class="highlight tab-size js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">
<tbody><tr>
<td id="file-pseudocode-py-L1" class="blob-num js-line-number" data-line-number="1"></td>
<td id="file-pseudocode-py-LC1" class="blob-code blob-code-inner js-file-line"><span class="pl-k">class</span> <span class="pl-v">ReplayBuffer</span>(<span class="pl-s1">object</span>):</td>
</tr>
<tr>
<td id="file-pseudocode-py-L2" class="blob-num js-line-number" data-line-number="2"></td>
<td id="file-pseudocode-py-LC2" class="blob-code blob-code-inner js-file-line">
</td>
</tr>
<tr>
<td id="file-pseudocode-py-L3" class="blob-num js-line-number" data-line-number="3"></td>
<td id="file-pseudocode-py-LC3" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">def</span> <span class="pl-en">__init__</span>(<span class="pl-s1">self</span>, <span class="pl-s1">config</span>: <span class="pl-v">MuZeroConfig</span>):</td>
</tr>
<tr>
<td id="file-pseudocode-py-L4" class="blob-num js-line-number" data-line-number="4"></td>
<td id="file-pseudocode-py-LC4" class="blob-code blob-code-inner js-file-line"> <span class="pl-s1">self</span>.<span class="pl-s1">window_size</span> <span class="pl-c1">=</span> <span class="pl-s1">config</span>.<span class="pl-s1">window_size</span></td>
</tr>
<tr>
<td id="file-pseudocode-py-L5" class="blob-num js-line-number" data-line-number="5"></td>
<td id="file-pseudocode-py-LC5" class="blob-code blob-code-inner js-file-line"> <span class="pl-s1">self</span>.<span class="pl-s1">batch_size</span> <span class="pl-c1">=</span> <span class="pl-s1">config</span>.<span class="pl-s1">batch_size</span></td>
</tr>
<tr>
<td id="file-pseudocode-py-L6" class="blob-num js-line-number" data-line-number="6"></td>
<td id="file-pseudocode-py-LC6" class="blob-code blob-code-inner js-file-line"> <span class="pl-s1">self</span>.<span class="pl-s1">buffer</span> <span class="pl-c1">=</span> []</td>
</tr>
<tr>
<td id="file-pseudocode-py-L7" class="blob-num js-line-number" data-line-number="7"></td>
<td id="file-pseudocode-py-LC7" class="blob-code blob-code-inner js-file-line">
</td>
</tr>
<tr>
<td id="file-pseudocode-py-L8" class="blob-num js-line-number" data-line-number="8"></td>
<td id="file-pseudocode-py-LC8" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">def</span> <span class="pl-en">save_game</span>(<span class="pl-s1">self</span>, <span class="pl-s1">game</span>):</td>
</tr>
<tr>
<td id="file-pseudocode-py-L9" class="blob-num js-line-number" data-line-number="9"></td>
<td id="file-pseudocode-py-LC9" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> <span class="pl-en">len</span>(<span class="pl-s1">self</span>.<span class="pl-s1">buffer</span>) <span class="pl-c1">&gt;</span> <span class="pl-s1">self</span>.<span class="pl-s1">window_size</span>:</td>
</tr>
<tr>
<td id="file-pseudocode-py-L10" class="blob-num js-line-number" data-line-number="10"></td>
<td id="file-pseudocode-py-LC10" class="blob-code blob-code-inner js-file-line"> <span class="pl-s1">self</span>.<span class="pl-s1">buffer</span>.<span class="pl-en">pop</span>(<span class="pl-c1">0</span>)</td>
</tr>
<tr>
<td id="file-pseudocode-py-L11" class="blob-num js-line-number" data-line-number="11"></td>
<td id="file-pseudocode-py-LC11" class="blob-code blob-code-inner js-file-line"> <span class="pl-s1">self</span>.<span class="pl-s1">buffer</span>.<span class="pl-en">append</span>(<span class="pl-s1">game</span>)</td>
</tr>
<tr>
<td id="file-pseudocode-py-L12" class="blob-num js-line-number" data-line-number="12"></td>
<td id="file-pseudocode-py-LC12" class="blob-code blob-code-inner js-file-line">
</td>
</tr>
<tr>
<td id="file-pseudocode-py-L13" class="blob-num js-line-number" data-line-number="13"></td>
<td id="file-pseudocode-py-LC13" class="blob-code blob-code-inner js-file-line"> ...</td>
</tr>
</tbody></table>
</div>
</div>
</div>
</div>
<div class="gist-meta">
<a href="https://gist.github.com/davidADSP/2bb4814c4d4a2b3528fc466d974796d6/raw/00ad54507e4bc6322a6eafe6d66c69fd9002dc83/pseudocode.py" style="float:right">view raw</a>
<a href="https://gist.github.com/davidADSP/2bb4814c4d4a2b3528fc466d974796d6#file-pseudocode-py">pseudocode.py</a>
hosted with ❤ by <a href="https://github.com/">GitHub</a>
</div>
</div>
</div>
<script>var height = -1; var delayMs = 200; if (document) {document.domain = document.domain;}function notifyResize(height) {height = height ? height : document.documentElement.offsetHeight; var resized = false; if (window.donkey && donkey.resize) {donkey.resize(height);var elements = document.getElementsByClassName("gist-data"); for (var i = 0; i < elements.length; i++) {elements[i].style.overflow = "visible"}resized = true;}if (parent && parent._resizeIframe) {var obj = {iframe: window.frameElement, height: height}; parent._resizeIframe(obj); resized = true;}if (window.location && window.location.hash === "#amp=1" && window.parent && window.parent.postMessage) {window.parent.postMessage({sentinel: "amp", type: "embed-size", height: height}, "*");}if (window.webkit && window.webkit.messageHandlers && window.webkit.messageHandlers.resize) {window.webkit.messageHandlers.resize.postMessage(height); resized = true;}return resized;}function maybeResize() {try {if (document.documentElement.offsetHeight != height && notifyResize()) {height = document.documentElement.offsetHeight;}delayMs = Math.min(delayMs * 2, 1000000); setTimeout(maybeResize, delayMs);} catch(error) {console.log('maybeResize error: ', error)}}maybeResize();</script></body></html>

View File

@ -0,0 +1,2 @@
document.write('<link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-4e64bbf96c31ed6c9ee61f08cea01836.css">')
document.write('<div id=\"gist99758597\" class=\"gist\">\n <div class=\"gist-file\">\n <div class=\"gist-data\">\n <div class=\"js-gist-file-update-container js-task-list-container file-box\">\n <div id=\"file-pseudocode-py\" class=\"file my-2\">\n \n\n <div itemprop=\"text\" class=\"Box-body p-0 blob-wrapper data type-python \">\n \n<table class=\"highlight tab-size js-file-line-container\" data-tab-size=\"8\" data-paste-markdown-skip>\n <tr>\n <td id=\"file-pseudocode-py-L1\" class=\"blob-num js-line-number\" data-line-number=\"1\"><\/td>\n <td id=\"file-pseudocode-py-LC1\" class=\"blob-code blob-code-inner js-file-line\"><span class=pl-k>def<\/span> <span class=pl-en>muzero<\/span>(<span class=pl-s1>config<\/span>: <span class=pl-v>MuZeroConfig<\/span>):<\/td>\n <\/tr>\n <tr>\n <td id=\"file-pseudocode-py-L2\" class=\"blob-num js-line-number\" data-line-number=\"2\"><\/td>\n <td id=\"file-pseudocode-py-LC2\" class=\"blob-code blob-code-inner js-file-line\"> <span class=pl-s1>storage<\/span> <span class=pl-c1>=<\/span> <span class=pl-v>SharedStorage<\/span>()<\/td>\n <\/tr>\n <tr>\n <td id=\"file-pseudocode-py-L3\" class=\"blob-num js-line-number\" data-line-number=\"3\"><\/td>\n <td id=\"file-pseudocode-py-LC3\" class=\"blob-code blob-code-inner js-file-line\"> <span class=pl-s1>replay_buffer<\/span> <span class=pl-c1>=<\/span> <span class=pl-v>ReplayBuffer<\/span>(<span class=pl-s1>config<\/span>)<\/td>\n <\/tr>\n <tr>\n <td id=\"file-pseudocode-py-L4\" class=\"blob-num js-line-number\" data-line-number=\"4\"><\/td>\n <td id=\"file-pseudocode-py-LC4\" class=\"blob-code blob-code-inner js-file-line\">\n<\/td>\n <\/tr>\n <tr>\n <td id=\"file-pseudocode-py-L5\" class=\"blob-num js-line-number\" data-line-number=\"5\"><\/td>\n <td id=\"file-pseudocode-py-LC5\" class=\"blob-code blob-code-inner js-file-line\"> <span class=pl-k>for<\/span> <span class=pl-s1>_<\/span> <span class=pl-c1>in<\/span> <span class=pl-en>range<\/span>(<span class=pl-s1>config<\/span>.<span class=pl-s1>num_actors<\/span>):<\/td>\n <\/tr>\n <tr>\n <td id=\"file-pseudocode-py-L6\" class=\"blob-num js-line-number\" data-line-number=\"6\"><\/td>\n <td id=\"file-pseudocode-py-LC6\" class=\"blob-code blob-code-inner js-file-line\"> <span class=pl-en>launch_job<\/span>(<span class=pl-s1>run_selfplay<\/span>, <span class=pl-s1>config<\/span>, <span class=pl-s1>storage<\/span>, <span class=pl-s1>replay_buffer<\/span>)<\/td>\n <\/tr>\n <tr>\n <td id=\"file-pseudocode-py-L7\" class=\"blob-num js-line-number\" data-line-number=\"7\"><\/td>\n <td id=\"file-pseudocode-py-LC7\" class=\"blob-code blob-code-inner js-file-line\">\n<\/td>\n <\/tr>\n <tr>\n <td id=\"file-pseudocode-py-L8\" class=\"blob-num js-line-number\" data-line-number=\"8\"><\/td>\n <td id=\"file-pseudocode-py-LC8\" class=\"blob-code blob-code-inner js-file-line\"> <span class=pl-en>train_network<\/span>(<span class=pl-s1>config<\/span>, <span class=pl-s1>storage<\/span>, <span class=pl-s1>replay_buffer<\/span>)<\/td>\n <\/tr>\n <tr>\n <td id=\"file-pseudocode-py-L9\" class=\"blob-num js-line-number\" data-line-number=\"9\"><\/td>\n <td id=\"file-pseudocode-py-LC9\" class=\"blob-code blob-code-inner js-file-line\">\n<\/td>\n <\/tr>\n <tr>\n <td id=\"file-pseudocode-py-L10\" class=\"blob-num js-line-number\" data-line-number=\"10\"><\/td>\n <td id=\"file-pseudocode-py-LC10\" class=\"blob-code blob-code-inner js-file-line\"> <span class=pl-k>return<\/span> <span class=pl-s1>storage<\/span>.<span class=pl-en>latest_network<\/span>()<\/td>\n <\/tr>\n<\/table>\n\n\n <\/div>\n\n <\/div>\n<\/div>\n\n <\/div>\n <div class=\"gist-meta\">\n <a href=\"https://gist.github.com/davidADSP/95d78debdbb8309bb77f90799d18ea3d/raw/16c8c7ad17b0d0c76464bf2dbefa3f06cdd80da3/pseudocode.py\" style=\"float:right\">view raw<\/a>\n <a href=\"https://gist.github.com/davidADSP/95d78debdbb8309bb77f90799d18ea3d#file-pseudocode-py\">pseudocode.py<\/a>\n hosted with &#10084; by <a href=\"https://github.com\">GitHub<\/a>\n <\/div>\n <\/div>\n<\/div>\n')

View File

@ -0,0 +1,9 @@
<!-- saved from url=(0072)https://a16180790160.cdn.optimizely.com/client_storage/a16180790160.html -->
<html><link type="text/css" id="dark-mode" rel="stylesheet" href="https://a16180790160.cdn.optimizely.com/client_storage/a16180790160.html"><style type="text/css" id="dark-mode-custom-style"></style><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><script>
var allowedOrigins = [["^https?://(.+\\.)?medium\\.com$", ""], ["^https?://(.+\\.)?hatch\\.dm$", ""]];
var blockedOrigins = [];
!function(){"use strict";var d,l,r,c;try{d=window.localStorage}catch(e){l=e}function u(e){return!c||0!==e.indexOf(c.origin)}function v(e,i){return new RegExp(i[0],i[1]).test(e)}function p(e){if(!r){var i={id:"iframeerror",type:"ERROR",response:"Error accessing localStorage: "+(r=e?e.toString():"Localstorage is undefined")};0,event.source.postMessage(JSON.stringify(i),event.origin)}}window.addEventListener("message",function(e){var i,r,t,n,o,s=!1;for(o=0;o<allowedOrigins.length;o++)if(v(e.origin,allowedOrigins[o])){s=!0;break}if(s)for(o=0;o<blockedOrigins.length;o++)if(v(e.origin,blockedOrigins[o])){0,s=!1;break}if(s){c=e;try{i=JSON.parse(e.data)}catch(e){return void 0}if(t=e.origin+"_"+i.key,!d)return p(l);if("GET"===i.type)r=d.getItem(t);else if("PUT"===i.type)try{r=d.setItem(t,i.value)}catch(e){return p(e)}else if("GETALL"===i.type)for(var a in r={},d)d.hasOwnProperty(a)&&u(a)&&(r[a]=d.getItem(a));else{if("DELETE"!==i.type)return void 0;for(var a in d)if(d.hasOwnProperty(a)&&!u(a)){var g=(void 0,1===(f=a.split("$$")).length?null:f[0].split("_")[1]);g&&g!==i.visitorId&&d.removeItem(a)}}var f;void 0!==i.id&&(n={id:i.id,response:r},e.source.postMessage(JSON.stringify(n),e.origin))}},!0),window.addEventListener("storage",function(e){c&&u(e.key)&&c.source.postMessage(JSON.stringify({type:"SYNC",response:{key:e.key,value:e.newValue}}),c.origin)},!0)}();
</script></head><body></body></html>

View File

@ -0,0 +1,89 @@
(function(){/*
Copyright The Closure Library Authors.
SPDX-License-Identifier: Apache-2.0
*/
var n=this||self,p=function(a,b){a=a.split(".");var c=n;a[0]in c||"undefined"==typeof c.execScript||c.execScript("var "+a[0]);for(var d;a.length&&(d=a.shift());)a.length||void 0===b?c=c[d]&&c[d]!==Object.prototype[d]?c[d]:c[d]={}:c[d]=b};var q=function(a,b){for(var c in b)b.hasOwnProperty(c)&&(a[c]=b[c])},r=function(a){for(var b in a)if(a.hasOwnProperty(b))return!0;return!1};var t=/^(?:(?:https?|mailto|ftp):|[^:/?#]*(?:[/?#]|$))/i;var v=window,x=document,y=function(a,b){x.addEventListener?x.addEventListener(a,b,!1):x.attachEvent&&x.attachEvent("on"+a,b)};var z={},A=function(){z.TAGGING=z.TAGGING||[];z.TAGGING[1]=!0};var B=/:[0-9]+$/,C=function(a,b,c){a=a.split("&");for(var d=0;d<a.length;d++){var e=a[d].split("=");if(decodeURIComponent(e[0]).replace(/\+/g," ")===b)return b=e.slice(1).join("="),c?b:decodeURIComponent(b).replace(/\+/g," ")}},F=function(a,b){b&&(b=String(b).toLowerCase());if("protocol"===b||"port"===b)a.protocol=D(a.protocol)||D(v.location.protocol);"port"===b?a.port=String(Number(a.hostname?a.port:v.location.port)||("http"==a.protocol?80:"https"==a.protocol?443:"")):"host"===b&&(a.hostname=(a.hostname||
v.location.hostname).replace(B,"").toLowerCase());return E(a,b,void 0,void 0,void 0)},E=function(a,b,c,d,e){var f=D(a.protocol);b&&(b=String(b).toLowerCase());switch(b){case "url_no_fragment":d="";a&&a.href&&(d=a.href.indexOf("#"),d=0>d?a.href:a.href.substr(0,d));a=d;break;case "protocol":a=f;break;case "host":a=a.hostname.replace(B,"").toLowerCase();c&&(d=/^www\d*\./.exec(a))&&d[0]&&(a=a.substr(d[0].length));break;case "port":a=String(Number(a.port)||("http"==f?80:"https"==f?443:""));break;case "path":a.pathname||
a.hostname||A();a="/"==a.pathname.substr(0,1)?a.pathname:"/"+a.pathname;a=a.split("/");a:if(d=d||[],c=a[a.length-1],Array.prototype.indexOf)d=d.indexOf(c),d="number"==typeof d?d:-1;else{for(e=0;e<d.length;e++)if(d[e]===c){d=e;break a}d=-1}0<=d&&(a[a.length-1]="");a=a.join("/");break;case "query":a=a.search.replace("?","");e&&(a=C(a,e,void 0));break;case "extension":a=a.pathname.split(".");a=1<a.length?a[a.length-1]:"";a=a.split("/")[0];break;case "fragment":a=a.hash.replace("#","");break;default:a=
a&&a.href}return a},D=function(a){return a?a.replace(":","").toLowerCase():""},G=function(a){var b=x.createElement("a");a&&(b.href=a);var c=b.pathname;"/"!==c[0]&&(a||A(),c="/"+c);a=b.hostname.replace(B,"");return{href:b.href,protocol:b.protocol,host:b.host,hostname:a,pathname:c,search:b.search,hash:b.hash,port:b.port}};function H(){for(var a=I,b={},c=0;c<a.length;++c)b[a[c]]=c;return b}function J(){var a="ABCDEFGHIJKLMNOPQRSTUVWXYZ";a+=a.toLowerCase()+"0123456789-_";return a+"."}var I,K;
function aa(a){function b(k){for(;d<a.length;){var m=a.charAt(d++),l=K[m];if(null!=l)return l;if(!/^[\s\xa0]*$/.test(m))throw Error("Unknown base64 encoding at char: "+m);}return k}I=I||J();K=K||H();for(var c="",d=0;;){var e=b(-1),f=b(0),g=b(64),h=b(64);if(64===h&&-1===e)return c;c+=String.fromCharCode(e<<2|f>>4);64!=g&&(c+=String.fromCharCode(f<<4&240|g>>2),64!=h&&(c+=String.fromCharCode(g<<6&192|h)))}};var L;var N=function(){var a=ba,b=ca,c=M(),d=function(g){a(g.target||g.srcElement||{})},e=function(g){b(g.target||g.srcElement||{})};if(!c.init){y("mousedown",d);y("keyup",d);y("submit",e);var f=HTMLFormElement.prototype.submit;HTMLFormElement.prototype.submit=function(){b(this);f.call(this)};c.init=!0}},O=function(a,b,c,d,e){a={callback:a,domains:b,fragment:2===c,placement:c,forms:d,sameHost:e};M().decorators.push(a)},P=function(a,b,c){for(var d=M().decorators,e={},f=0;f<d.length;++f){var g=d[f],h;if(h=
!c||g.forms)a:{h=g.domains;var k=a,m=!!g.sameHost;if(h&&(m||k!==x.location.hostname))for(var l=0;l<h.length;l++)if(h[l]instanceof RegExp){if(h[l].test(k)){h=!0;break a}}else if(0<=k.indexOf(h[l])||m&&0<=h[l].indexOf(k)){h=!0;break a}h=!1}h&&(h=g.placement,void 0==h&&(h=g.fragment?2:1),h===b&&q(e,g.callback()))}return e},M=function(){var a={};var b=v.google_tag_data;v.google_tag_data=void 0===b?a:b;a=v.google_tag_data;b=a.gl;b&&b.decorators||(b={decorators:[]},a.gl=b);return b};var da=/(.*?)\*(.*?)\*(.*)/,ea=/([^?#]+)(\?[^#]*)?(#.*)?/;function Q(a){return new RegExp("(.*?)(^|&)"+a+"=([^&]*)&?(.*)")}
var S=function(a){var b=[],c;for(c in a)if(a.hasOwnProperty(c)){var d=a[c];if(void 0!==d&&d===d&&null!==d&&"[object Object]"!==d.toString()){b.push(c);var e=b,f=e.push;d=String(d);I=I||J();K=K||H();for(var g=[],h=0;h<d.length;h+=3){var k=h+1<d.length,m=h+2<d.length,l=d.charCodeAt(h),u=k?d.charCodeAt(h+1):0,w=m?d.charCodeAt(h+2):0,fa=l>>2;l=(l&3)<<4|u>>4;u=(u&15)<<2|w>>6;w&=63;m||(w=64,k||(u=64));g.push(I[fa],I[l],I[u],I[w])}f.call(e,g.join(""))}}a=b.join("*");return["1",R(a),a].join("*")},R=function(a,
b){a=[window.navigator.userAgent,(new Date).getTimezoneOffset(),window.navigator.userLanguage||window.navigator.language,Math.floor((new Date).getTime()/60/1E3)-(void 0===b?0:b),a].join("*");if(!(b=L)){b=Array(256);for(var c=0;256>c;c++){for(var d=c,e=0;8>e;e++)d=d&1?d>>>1^3988292384:d>>>1;b[c]=d}}L=b;b=4294967295;for(c=0;c<a.length;c++)b=b>>>8^L[(b^a.charCodeAt(c))&255];return((b^-1)>>>0).toString(36)},ia=function(a){return function(b){var c=G(v.location.href),d=c.search.replace("?","");var e=C(d,
"_gl",!0);b.query=T(e||"")||{};e=F(c,"fragment");var f=e.match(Q("_gl"));b.fragment=T(f&&f[3]||"")||{};a&&ha(c,d,e)}};function U(a,b){if(a=Q(a).exec(b)){var c=a[2],d=a[4];b=a[1];d&&(b=b+c+d)}return b}
var ha=function(a,b,c){function d(f,g){f=U("_gl",f);f.length&&(f=g+f);return f}if(v.history&&v.history.replaceState){var e=Q("_gl");if(e.test(b)||e.test(c))a=F(a,"path"),b=d(b,"?"),c=d(c,"#"),v.history.replaceState({},void 0,""+a+b+c)}},T=function(a){var b=void 0===b?3:b;try{if(a){a:{for(var c=0;3>c;++c){var d=da.exec(a);if(d){var e=d;break a}a=decodeURIComponent(a)}e=void 0}if(e&&"1"===e[1]){var f=e[2],g=e[3];a:{for(e=0;e<b;++e)if(f===R(g,e)){var h=!0;break a}h=!1}if(h){b={};var k=g?g.split("*"):
[];for(g=0;g<k.length;g+=2)b[k[g]]=aa(k[g+1]);return b}}}}catch(m){}};function V(a,b,c,d){function e(k){k=U(a,k);var m=k.charAt(k.length-1);k&&"&"!==m&&(k+="&");return k+h}d=void 0===d?!1:d;var f=ea.exec(c);if(!f)return"";c=f[1];var g=f[2]||"";f=f[3]||"";var h=a+"="+b;d?f="#"+e(f.substring(1)):g="?"+e(g.substring(1));return""+c+g+f}
function W(a,b){var c="FORM"===(a.tagName||"").toUpperCase(),d=P(b,1,c),e=P(b,2,c);b=P(b,3,c);r(d)&&(d=S(d),c?X("_gl",d,a):Y("_gl",d,a,!1));!c&&r(e)&&(c=S(e),Y("_gl",c,a,!0));for(var f in b)b.hasOwnProperty(f)&&Z(f,b[f],a)}function Z(a,b,c,d){if(c.tagName){if("a"===c.tagName.toLowerCase())return Y(a,b,c,d);if("form"===c.tagName.toLowerCase())return X(a,b,c)}if("string"==typeof c)return V(a,b,c,d)}function Y(a,b,c,d){c.href&&(a=V(a,b,c.href,void 0===d?!1:d),t.test(a)&&(c.href=a))}
function X(a,b,c){if(c&&c.action){var d=(c.method||"").toLowerCase();if("get"===d){d=c.childNodes||[];for(var e=!1,f=0;f<d.length;f++){var g=d[f];if(g.name===a){g.setAttribute("value",b);e=!0;break}}e||(d=x.createElement("input"),d.setAttribute("type","hidden"),d.setAttribute("name",a),d.setAttribute("value",b),c.appendChild(d))}else"post"===d&&(a=V(a,b,c.action),t.test(a)&&(c.action=a))}}
var ba=function(a){try{a:{for(var b=100;a&&0<b;){if(a.href&&a.nodeName.match(/^a(?:rea)?$/i)){var c=a;break a}a=a.parentNode;b--}c=null}if(c){var d=c.protocol;"http:"!==d&&"https:"!==d||W(c,c.hostname)}}catch(e){}},ca=function(a){try{if(a.action){var b=F(G(a.action),"host");W(a,b)}}catch(c){}};p("google_tag_data.glBridge.auto",function(a,b,c,d){N();O(a,b,"fragment"===c?2:1,!!d,!1)});p("google_tag_data.glBridge.passthrough",function(a,b,c){N();O(a,[E(v.location,"host",!0)],b,!!c,!0)});p("google_tag_data.glBridge.decorate",function(a,b,c){a=S(a);return Z("_gl",a,b,!!c)});p("google_tag_data.glBridge.generate",S);p("google_tag_data.glBridge.get",function(a,b){var c=ia(!!b);b=M();b.data||(b.data={query:{},fragment:{}},c(b.data));c={};if(b=b.data)q(c,b.query),a&&q(c,b.fragment);return c});})(window);
(function(){function La(a){var b=1,c;if(a)for(b=0,c=a.length-1;0<=c;c--){var d=a.charCodeAt(c);b=(b<<6&268435455)+d+(d<<14);d=b&266338304;b=0!=d?b^d>>21:b}return b};/*
Copyright The Closure Library Authors.
SPDX-License-Identifier: Apache-2.0
*/
var $c=function(a){this.C=a||[]};$c.prototype.set=function(a){this.C[a]=!0};$c.prototype.encode=function(){for(var a=[],b=0;b<this.C.length;b++)this.C[b]&&(a[Math.floor(b/6)]^=1<<b%6);for(b=0;b<a.length;b++)a[b]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_".charAt(a[b]||0);return a.join("")+"~"};var ha=window.GoogleAnalyticsObject,wa;if(wa=void 0!=ha)wa=-1<(ha.constructor+"").indexOf("String");var ya;if(ya=wa){var fc=window.GoogleAnalyticsObject;ya=fc?fc.replace(/^[\s\xa0]+|[\s\xa0]+$/g,""):""}var gb=ya||"ga",jd=/^(?:utma\.)?\d+\.\d+$/,kd=/^amp-[\w.-]{22,64}$/,Ba=!1;var vd=new $c;function J(a){vd.set(a)}var Td=function(a){a=Dd(a);a=new $c(a);for(var b=vd.C.slice(),c=0;c<a.C.length;c++)b[c]=b[c]||a.C[c];return(new $c(b)).encode()},Dd=function(a){a=a.get(Gd);ka(a)||(a=[]);return a};var ea=function(a){return"function"==typeof a},ka=function(a){return"[object Array]"==Object.prototype.toString.call(Object(a))},qa=function(a){return void 0!=a&&-1<(a.constructor+"").indexOf("String")},D=function(a,b){return 0==a.indexOf(b)},sa=function(a){return a?a.replace(/^[\s\xa0]+|[\s\xa0]+$/g,""):""},ra=function(){for(var a=O.navigator.userAgent+(M.cookie?M.cookie:"")+(M.referrer?M.referrer:""),b=a.length,c=O.history.length;0<c;)a+=c--^b++;return[hd()^La(a)&2147483647,Math.round((new Date).getTime()/
1E3)].join(".")},ta=function(a){var b=M.createElement("img");b.width=1;b.height=1;b.src=a;return b},ua=function(){},K=function(a){if(encodeURIComponent instanceof Function)return encodeURIComponent(a);J(28);return a},L=function(a,b,c,d){try{a.addEventListener?a.addEventListener(b,c,!!d):a.attachEvent&&a.attachEvent("on"+b,c)}catch(e){J(27)}},f=/^[\w\-:/.?=&%!\[\]]+$/,Nd=/^[\w+/_-]+[=]{0,2}$/,Id=function(a,b,c,d,e){if(a){var g=M.querySelector&&M.querySelector("script[nonce]")||null;g=g?g.nonce||g.getAttribute&&
g.getAttribute("nonce")||"":"";c?(e=d="",b&&f.test(b)&&(d=' id="'+b+'"'),g&&Nd.test(g)&&(e=' nonce="'+g+'"'),f.test(a)&&M.write("<script"+d+e+' src="'+a+'">\x3c/script>')):(c=M.createElement("script"),c.type="text/javascript",c.async=!0,c.src=a,d&&(c.onload=d),e&&(c.onerror=e),b&&(c.id=b),g&&c.setAttribute("nonce",g),a=M.getElementsByTagName("script")[0],a.parentNode.insertBefore(c,a))}},be=function(a,b){return E(M.location[b?"href":"search"],a)},E=function(a,b){return(a=a.match("(?:&|#|\\?)"+K(b).replace(/([.*+?^=!:${}()|\[\]\/\\])/g,
"\\$1")+"=([^&#]*)"))&&2==a.length?a[1]:""},xa=function(){var a=""+M.location.hostname;return 0==a.indexOf("www.")?a.substring(4):a},de=function(a,b){var c=a.indexOf(b);if(5==c||6==c)if(a=a.charAt(c+b.length),"/"==a||"?"==a||""==a||":"==a)return!0;return!1},za=function(a,b){if(1==b.length&&null!=b[0]&&"object"===typeof b[0])return b[0];for(var c={},d=Math.min(a.length+1,b.length),e=0;e<d;e++)if("object"===typeof b[e]){for(var g in b[e])b[e].hasOwnProperty(g)&&(c[g]=b[e][g]);break}else e<a.length&&
(c[a[e]]=b[e]);return c};var ee=function(){this.oa=[];this.ea={};this.m={}};ee.prototype.set=function(a,b,c){this.oa.push(a);c?this.m[":"+a]=b:this.ea[":"+a]=b};ee.prototype.get=function(a){return this.m.hasOwnProperty(":"+a)?this.m[":"+a]:this.ea[":"+a]};ee.prototype.map=function(a){for(var b=0;b<this.oa.length;b++){var c=this.oa[b],d=this.get(c);d&&a(c,d)}};var O=window,M=document,va=function(a,b){return setTimeout(a,b)};var Qa=window,Za=document,G=function(a){var b=Qa._gaUserPrefs;if(b&&b.ioo&&b.ioo()||a&&!0===Qa["ga-disable-"+a])return!0;try{var c=Qa.external;if(c&&c._gaUserPrefs&&"oo"==c._gaUserPrefs)return!0}catch(g){}a=[];b=String(Za.cookie).split(";");for(c=0;c<b.length;c++){var d=b[c].split("="),e=d[0].replace(/^\s*|\s*$/g,"");e&&"AMP_TOKEN"==e&&((d=d.slice(1).join("=").replace(/^\s*|\s*$/g,""))&&(d=decodeURIComponent(d)),a.push(d))}for(b=0;b<a.length;b++)if("$OPT_OUT"==a[b])return!0;return Za.getElementById("__gaOptOutExtension")?
!0:!1};var Ca=function(a){var b=[],c=M.cookie.split(";");a=new RegExp("^\\s*"+a+"=\\s*(.*?)\\s*$");for(var d=0;d<c.length;d++){var e=c[d].match(a);e&&b.push(e[1])}return b},zc=function(a,b,c,d,e,g,ca){e=G(e)?!1:eb.test(M.location.hostname)||"/"==c&&vc.test(d)?!1:!0;if(!e)return!1;b&&1200<b.length&&(b=b.substring(0,1200));c=a+"="+b+"; path="+c+"; ";g&&(c+="expires="+(new Date((new Date).getTime()+g)).toGMTString()+"; ");d&&"none"!==d&&(c+="domain="+d+";");ca&&(c+=ca+";");d=M.cookie;M.cookie=c;if(!(d=d!=M.cookie))a:{a=
Ca(a);for(d=0;d<a.length;d++)if(b==a[d]){d=!0;break a}d=!1}return d},Cc=function(a){return encodeURIComponent?encodeURIComponent(a).replace(/\(/g,"%28").replace(/\)/g,"%29"):a},vc=/^(www\.)?google(\.com?)?(\.[a-z]{2})?$/,eb=/(^|\.)doubleclick\.net$/i;var Fa,Ga,fb,Ab,ja=/^https?:\/\/[^/]*cdn\.ampproject\.org\//,Ue=/^(?:www\.|m\.|amp\.)+/,Ub=[],da=function(a){if(ye(a[Kd])){if(void 0===Ab){var b;if(b=(b=De.get())&&b._ga||void 0)Ab=b,J(81)}if(void 0!==Ab)return a[Q]||(a[Q]=Ab),!1}if(a[Kd]){J(67);if(a[ac]&&"cookie"!=a[ac])return!1;if(void 0!==Ab)a[Q]||(a[Q]=Ab);else{a:{b=String(a[W]||xa());var c=String(a[Yb]||"/"),d=Ca(String(a[U]||"_ga"));b=na(d,b,c);if(!b||jd.test(b))b=!0;else if(b=Ca("AMP_TOKEN"),0==b.length)b=!0;else{if(1==b.length&&(b=decodeURIComponent(b[0]),
"$RETRIEVING"==b||"$OPT_OUT"==b||"$ERROR"==b||"$NOT_FOUND"==b)){b=!0;break a}b=!1}}if(b&&tc(ic,String(a[Na])))return!0}}return!1},ic=function(){Z.D([ua])},tc=function(a,b){var c=Ca("AMP_TOKEN");if(1<c.length)return J(55),!1;c=decodeURIComponent(c[0]||"");if("$OPT_OUT"==c||"$ERROR"==c||G(b))return J(62),!1;if(!ja.test(M.referrer)&&"$NOT_FOUND"==c)return J(68),!1;if(void 0!==Ab)return J(56),va(function(){a(Ab)},0),!0;if(Fa)return Ub.push(a),!0;if("$RETRIEVING"==c)return J(57),va(function(){tc(a,b)},
1E4),!0;Fa=!0;c&&"$"!=c[0]||(xc("$RETRIEVING",3E4),setTimeout(Mc,3E4),c="");return Pc(c,b)?(Ub.push(a),!0):!1},Pc=function(a,b,c){if(!window.JSON)return J(58),!1;var d=O.XMLHttpRequest;if(!d)return J(59),!1;var e=new d;if(!("withCredentials"in e))return J(60),!1;e.open("POST",(c||"https://ampcid.google.com/v1/publisher:getClientId")+"?key=AIzaSyA65lEHUEizIsNtlbNo-l2K18dT680nsaM",!0);e.withCredentials=!0;e.setRequestHeader("Content-Type","text/plain");e.onload=function(){Fa=!1;if(4==e.readyState){try{200!=
e.status&&(J(61),Qc("","$ERROR",3E4));var g=JSON.parse(e.responseText);g.optOut?(J(63),Qc("","$OPT_OUT",31536E6)):g.clientId?Qc(g.clientId,g.securityToken,31536E6):!c&&g.alternateUrl?(Ga&&clearTimeout(Ga),Fa=!0,Pc(a,b,g.alternateUrl)):(J(64),Qc("","$NOT_FOUND",36E5))}catch(ca){J(65),Qc("","$ERROR",3E4)}e=null}};d={originScope:"AMP_ECID_GOOGLE"};a&&(d.securityToken=a);e.send(JSON.stringify(d));Ga=va(function(){J(66);Qc("","$ERROR",3E4)},1E4);return!0},Mc=function(){Fa=!1},xc=function(a,b){if(void 0===
fb){fb="";for(var c=id(),d=0;d<c.length;d++){var e=c[d];if(zc("AMP_TOKEN",encodeURIComponent(a),"/",e,"",b)){fb=e;return}}}zc("AMP_TOKEN",encodeURIComponent(a),"/",fb,"",b)},Qc=function(a,b,c){Ga&&clearTimeout(Ga);b&&xc(b,c);Ab=a;b=Ub;Ub=[];for(c=0;c<b.length;c++)b[c](a)},ye=function(a){a:{if(ja.test(M.referrer)){var b=M.location.hostname.replace(Ue,"");b:{var c=M.referrer;c=c.replace(/^https?:\/\//,"");var d=c.replace(/^[^/]+/,"").split("/"),e=d[2];d=(d="s"==e?d[3]:e)?decodeURIComponent(d):d;if(!d){if(0==
c.indexOf("xn--")){c="";break b}(c=c.match(/(.*)\.cdn\.ampproject\.org\/?$/))&&2==c.length&&(d=c[1].replace(/-/g,".").replace(/\.\./g,"-"))}c=d?d.replace(Ue,""):""}(d=b===c)||(c="."+c,d=b.substring(b.length-c.length,b.length)===c);if(d){b=!0;break a}else J(78)}b=!1}return b&&!1!==a};var bd=function(a){return(a?"https:":Ba||"https:"==M.location.protocol?"https:":"http:")+"//www.google-analytics.com"},Ge=function(a){switch(a){default:case 1:return"https://www.google-analytics.com/gtm/js?id=";case 2:return"https://www.googletagmanager.com/gtag/js?id="}},Da=function(a){this.name="len";this.message=a+"-8192"},ba=function(a,b,c){c=c||ua;if(2036>=b.length)wc(a,b,c);else if(8192>=b.length)x(a,b,c)||wd(a,b,c)||wc(a,b,c);else throw ge("len",b.length),new Da(b.length);},pe=function(a,b,
c,d){d=d||ua;wd(a+"?"+b,"",d,c)},wc=function(a,b,c){var d=ta(a+"?"+b);d.onload=d.onerror=function(){d.onload=null;d.onerror=null;c()}},wd=function(a,b,c,d){var e=O.XMLHttpRequest;if(!e)return!1;var g=new e;if(!("withCredentials"in g))return!1;a=a.replace(/^http:/,"https:");g.open("POST",a,!0);g.withCredentials=!0;g.setRequestHeader("Content-Type","text/plain");g.onreadystatechange=function(){if(4==g.readyState){if(d&&"text/plain"===g.getResponseHeader("Content-Type"))try{Ea(d,g.responseText,c)}catch(ca){ge("xhr",
"rsp"),c()}else c();g=null}};g.send(b);return!0},Ea=function(a,b,c){if(1>b.length)ge("xhr","ver","0"),c();else if(3<a.count++)ge("xhr","tmr",""+a.count),c();else{var d=b.charAt(0);if("1"===d)oc(a,b.substring(1),c);else if(a.V&&"2"===d){var e=b.substring(1).split(","),g=0;b=function(){++g===e.length&&c()};for(d=0;d<e.length;d++)oc(a,e[d],b)}else ge("xhr","ver",String(b.length)),c()}},oc=function(a,b,c){if(0===b.length)c();else{var d=b.charAt(0);switch(d){case "d":pe("https://stats.g.doubleclick.net/j/collect",
a.U,a,c);break;case "g":wc("https://www.google.%/ads/ga-audiences".replace("%","com"),a.google,c);(b=b.substring(1))&&(/^[a-z.]{1,6}$/.test(b)?wc("https://www.google.%/ads/ga-audiences".replace("%",b),a.google,ua):ge("tld","bcc",b));break;case "G":if(a.V){a.V("G-"+b.substring(1));c();break}case "x":if(a.V){a.V();c();break}default:ge("xhr","brc",d),c()}}},x=function(a,b,c){return O.navigator.sendBeacon?O.navigator.sendBeacon(a,b)?(c(),!0):!1:!1},ge=function(a,b,c){1<=100*Math.random()||G("?")||(a=
["t=error","_e="+a,"_v=j88","sr=1"],b&&a.push("_f="+b),c&&a.push("_m="+K(c.substring(0,100))),a.push("aip=1"),a.push("z="+hd()),wc(bd(!0)+"/u/d",a.join("&"),ua))};var qc=function(){return O.gaData=O.gaData||{}},h=function(a){var b=qc();return b[a]=b[a]||{}};var Ha=function(){this.M=[]};Ha.prototype.add=function(a){this.M.push(a)};Ha.prototype.D=function(a){try{for(var b=0;b<this.M.length;b++){var c=a.get(this.M[b]);c&&ea(c)&&c.call(O,a)}}catch(d){}b=a.get(Ia);b!=ua&&ea(b)&&(a.set(Ia,ua,!0),setTimeout(b,10))};function Ja(a){if(100!=a.get(Ka)&&La(P(a,Q))%1E4>=100*R(a,Ka))throw"abort";}function Ma(a){if(G(P(a,Na)))throw"abort";}function Oa(){var a=M.location.protocol;if("http:"!=a&&"https:"!=a)throw"abort";}
function Pa(a){try{O.navigator.sendBeacon?J(42):O.XMLHttpRequest&&"withCredentials"in new O.XMLHttpRequest&&J(40)}catch(c){}a.set(ld,Td(a),!0);a.set(Ac,R(a,Ac)+1);var b=[];ue.map(function(c,d){d.F&&(c=a.get(c),void 0!=c&&c!=d.defaultValue&&("boolean"==typeof c&&(c*=1),b.push(d.F+"="+K(""+c))))});!1===a.get(xe)&&b.push("npa=1");b.push("z="+Bd());a.set(Ra,b.join("&"),!0)}
function Sa(a){var b=P(a,fa);!b&&a.get(Vd)&&(b="beacon");var c=P(a,gd),d=P(a,oe),e=c||(d||bd(!1)+"")+"/collect";switch(P(a,ad)){case "d":e=c||(d||bd(!1)+"")+"/j/collect";b=a.get(qe)||void 0;pe(e,P(a,Ra),b,a.Z(Ia));break;default:b?(c=P(a,Ra),d=(d=a.Z(Ia))||ua,"image"==b?wc(e,c,d):"xhr"==b&&wd(e,c,d)||"beacon"==b&&x(e,c,d)||ba(e,c,d)):ba(e,P(a,Ra),a.Z(Ia))}e=P(a,Na);e=h(e);b=e.hitcount;e.hitcount=b?b+1:1;e.first_hit||(e.first_hit=(new Date).getTime());e=P(a,Na);delete h(e).pending_experiments;a.set(Ia,
ua,!0)}function Hc(a){qc().expId&&a.set(Nc,qc().expId);qc().expVar&&a.set(Oc,qc().expVar);var b=P(a,Na);if(b=h(b).pending_experiments){var c=[];for(d in b)b.hasOwnProperty(d)&&b[d]&&c.push(encodeURIComponent(d)+"."+encodeURIComponent(b[d]));var d=c.join("!")}else d=void 0;d&&((b=a.get(m))&&(d=b+"!"+d),a.set(m,d,!0))}function cd(){if(O.navigator&&"preview"==O.navigator.loadPurpose)throw"abort";}
function yd(a){var b=O.gaDevIds||[];if(ka(b)){var c=a.get("&did");qa(c)&&0<c.length&&(b=b.concat(c.split(",")));c=[];for(var d=0;d<b.length;d++){var e;a:{for(e=0;e<c.length;e++)if(b[d]==c[e]){e=!0;break a}e=!1}e||c.push(b[d])}0!=c.length&&a.set("&did",c.join(","),!0)}}function vb(a){if(!a.get(Na))throw"abort";};var hd=function(){return Math.round(2147483647*Math.random())},Bd=function(){try{var a=new Uint32Array(1);O.crypto.getRandomValues(a);return a[0]&2147483647}catch(b){return hd()}};function Ta(a){var b=R(a,Ua);500<=b&&J(15);var c=P(a,Va);if("transaction"!=c&&"item"!=c){c=R(a,Wa);var d=(new Date).getTime(),e=R(a,Xa);0==e&&a.set(Xa,d);e=Math.round(2*(d-e)/1E3);0<e&&(c=Math.min(c+e,20),a.set(Xa,d));if(0>=c)throw"abort";a.set(Wa,--c)}a.set(Ua,++b)};var Ya=function(){this.data=new ee};Ya.prototype.get=function(a){var b=$a(a),c=this.data.get(a);b&&void 0==c&&(c=ea(b.defaultValue)?b.defaultValue():b.defaultValue);return b&&b.Z?b.Z(this,a,c):c};var P=function(a,b){a=a.get(b);return void 0==a?"":""+a},R=function(a,b){a=a.get(b);return void 0==a||""===a?0:Number(a)};Ya.prototype.Z=function(a){return(a=this.get(a))&&ea(a)?a:ua};
Ya.prototype.set=function(a,b,c){if(a)if("object"==typeof a)for(var d in a)a.hasOwnProperty(d)&&ab(this,d,a[d],c);else ab(this,a,b,c)};var ab=function(a,b,c,d){if(void 0!=c)switch(b){case Na:wb.test(c)}var e=$a(b);e&&e.o?e.o(a,b,c,d):a.data.set(b,c,d)};var ue=new ee,ve=[],bb=function(a,b,c,d,e){this.name=a;this.F=b;this.Z=d;this.o=e;this.defaultValue=c},$a=function(a){var b=ue.get(a);if(!b)for(var c=0;c<ve.length;c++){var d=ve[c],e=d[0].exec(a);if(e){b=d[1](e);ue.set(b.name,b);break}}return b},yc=function(a){var b;ue.map(function(c,d){d.F==a&&(b=d)});return b&&b.name},S=function(a,b,c,d,e){a=new bb(a,b,c,d,e);ue.set(a.name,a);return a.name},cb=function(a,b){ve.push([new RegExp("^"+a+"$"),b])},T=function(a,b,c){return S(a,b,c,void 0,db)},db=function(){};var hb=T("apiVersion","v"),ib=T("clientVersion","_v");S("anonymizeIp","aip");var jb=S("adSenseId","a"),Va=S("hitType","t"),Ia=S("hitCallback"),Ra=S("hitPayload");S("nonInteraction","ni");S("currencyCode","cu");S("dataSource","ds");var Vd=S("useBeacon",void 0,!1),fa=S("transport");S("sessionControl","sc","");S("sessionGroup","sg");S("queueTime","qt");var Ac=S("_s","_s");S("screenName","cd");var kb=S("location","dl",""),lb=S("referrer","dr"),mb=S("page","dp","");S("hostname","dh");
var nb=S("language","ul"),ob=S("encoding","de");S("title","dt",function(){return M.title||void 0});cb("contentGroup([0-9]+)",function(a){return new bb(a[0],"cg"+a[1])});var pb=S("screenColors","sd"),qb=S("screenResolution","sr"),rb=S("viewportSize","vp"),sb=S("javaEnabled","je"),tb=S("flashVersion","fl");S("campaignId","ci");S("campaignName","cn");S("campaignSource","cs");S("campaignMedium","cm");S("campaignKeyword","ck");S("campaignContent","cc");
var ub=S("eventCategory","ec"),xb=S("eventAction","ea"),yb=S("eventLabel","el"),zb=S("eventValue","ev"),Bb=S("socialNetwork","sn"),Cb=S("socialAction","sa"),Db=S("socialTarget","st"),Eb=S("l1","plt"),Fb=S("l2","pdt"),Gb=S("l3","dns"),Hb=S("l4","rrt"),Ib=S("l5","srt"),Jb=S("l6","tcp"),Kb=S("l7","dit"),Lb=S("l8","clt"),Ve=S("l9","_gst"),We=S("l10","_gbt"),Xe=S("l11","_cst"),Ye=S("l12","_cbt"),Mb=S("timingCategory","utc"),Nb=S("timingVar","utv"),Ob=S("timingLabel","utl"),Pb=S("timingValue","utt");
S("appName","an");S("appVersion","av","");S("appId","aid","");S("appInstallerId","aiid","");S("exDescription","exd");S("exFatal","exf");var Nc=S("expId","xid"),Oc=S("expVar","xvar"),m=S("exp","exp"),Rc=S("_utma","_utma"),Sc=S("_utmz","_utmz"),Tc=S("_utmht","_utmht"),Ua=S("_hc",void 0,0),Xa=S("_ti",void 0,0),Wa=S("_to",void 0,20);cb("dimension([0-9]+)",function(a){return new bb(a[0],"cd"+a[1])});cb("metric([0-9]+)",function(a){return new bb(a[0],"cm"+a[1])});S("linkerParam",void 0,void 0,Bc,db);
var Ze=T("_cd2l",void 0,!1),ld=S("usage","_u"),Gd=S("_um");S("forceSSL",void 0,void 0,function(){return Ba},function(a,b,c){J(34);Ba=!!c});var ed=S("_j1","jid"),ia=S("_j2","gjid");cb("\\&(.*)",function(a){var b=new bb(a[0],a[1]),c=yc(a[0].substring(1));c&&(b.Z=function(d){return d.get(c)},b.o=function(d,e,g,ca){d.set(c,g,ca)},b.F=void 0);return b});
var Qb=T("_oot"),dd=S("previewTask"),Rb=S("checkProtocolTask"),md=S("validationTask"),Sb=S("checkStorageTask"),Uc=S("historyImportTask"),Tb=S("samplerTask"),Vb=S("_rlt"),Wb=S("buildHitTask"),Xb=S("sendHitTask"),Vc=S("ceTask"),zd=S("devIdTask"),Cd=S("timingTask"),Ld=S("displayFeaturesTask"),oa=S("customTask"),ze=S("fpsCrossDomainTask"),V=T("name"),Q=T("clientId","cid"),n=T("clientIdTime"),xd=T("storedClientId"),Ad=S("userId","uid"),Na=T("trackingId","tid"),U=T("cookieName",void 0,"_ga"),W=T("cookieDomain"),
Yb=T("cookiePath",void 0,"/"),Zb=T("cookieExpires",void 0,63072E3),Hd=T("cookieUpdate",void 0,!0),Be=T("cookieFlags",void 0,""),$b=T("legacyCookieDomain"),Wc=T("legacyHistoryImport",void 0,!0),ac=T("storage",void 0,"cookie"),bc=T("allowLinker",void 0,!1),cc=T("allowAnchor",void 0,!0),Ka=T("sampleRate","sf",100),dc=T("siteSpeedSampleRate",void 0,1),ec=T("alwaysSendReferrer",void 0,!1),I=T("_gid","_gid"),la=T("_gcn"),Kd=T("useAmpClientId"),ce=T("_gclid"),fe=T("_gt"),he=T("_ge",void 0,7776E6),ie=T("_gclsrc"),
je=T("storeGac",void 0,!0),oe=S("_x_19"),Ae=S("_fplc","_fplc"),F=T("_cs"),Je=T("_useUp",void 0,!1),Le=S("up","up"),gd=S("transportUrl"),Md=S("_r","_r"),Od=S("_slc","_slc"),qe=S("_dp"),ad=S("_jt",void 0,"n"),Ud=S("allowAdFeatures",void 0,!0),xe=S("allowAdPersonalizationSignals",void 0,!0);function X(a,b,c,d){b[a]=function(){try{return d&&J(d),c.apply(this,arguments)}catch(e){throw ge("exc",a,e&&e.name),e;}}};var Ed=function(a){if("cookie"==a.get(ac))return a=Ca("FPLC"),0<a.length?a[0]:void 0},Fe=function(a){var b;if(b=P(a,oe)&&a.get(Ze))b=De.get(a.get(cc)),b=!(b&&b._fplc);b&&a.set(Ae,Ed(a)||"0")};var aa=function(a){var b=Math.min(R(a,dc),100);return La(P(a,Q))%100>=b?!1:!0},gc=function(a){var b={};if(Ec(b)||Fc(b)){var c=b[Eb];void 0==c||Infinity==c||isNaN(c)||(0<c?(Y(b,Gb),Y(b,Jb),Y(b,Ib),Y(b,Fb),Y(b,Hb),Y(b,Kb),Y(b,Lb),Y(b,Ve),Y(b,We),Y(b,Xe),Y(b,Ye),va(function(){a(b)},10)):L(O,"load",function(){gc(a)},!1))}},Ec=function(a){var b=O.performance||O.webkitPerformance;b=b&&b.timing;if(!b)return!1;var c=b.navigationStart;if(0==c)return!1;a[Eb]=b.loadEventStart-c;a[Gb]=b.domainLookupEnd-b.domainLookupStart;
a[Jb]=b.connectEnd-b.connectStart;a[Ib]=b.responseStart-b.requestStart;a[Fb]=b.responseEnd-b.responseStart;a[Hb]=b.fetchStart-c;a[Kb]=b.domInteractive-c;a[Lb]=b.domContentLoadedEventStart-c;a[Ve]=N.L-c;a[We]=N.ya-c;O.google_tag_manager&&O.google_tag_manager._li&&(b=O.google_tag_manager._li,a[Xe]=b.cst,a[Ye]=b.cbt);return!0},Fc=function(a){if(O.top!=O)return!1;var b=O.external,c=b&&b.onloadT;b&&!b.isValidLoadTime&&(c=void 0);2147483648<c&&(c=void 0);0<c&&b.setPageReadyTime();if(void 0==c)return!1;
a[Eb]=c;return!0},Y=function(a,b){var c=a[b];if(isNaN(c)||Infinity==c||0>c)a[b]=void 0},Fd=function(a){return function(b){if("pageview"==b.get(Va)&&!a.I){a.I=!0;var c=aa(b),d=0<E(P(b,kb),"gclid").length;(c||d)&&gc(function(e){c&&a.send("timing",e);d&&a.send("adtiming",e)})}}};var hc=!1,mc=function(a){if("cookie"==P(a,ac)){if(a.get(Hd)||P(a,xd)!=P(a,Q)){var b=1E3*R(a,Zb);ma(a,Q,U,b);a.data.set(xd,P(a,Q))}(a.get(Hd)||uc(a)!=P(a,I))&&ma(a,I,la,864E5);if(a.get(je)){var c=P(a,ce);if(c){var d=Math.min(R(a,he),1E3*R(a,Zb));d=Math.min(d,1E3*R(a,fe)+d-(new Date).getTime());a.data.set(he,d);b={};var e=P(a,fe),g=P(a,ie),ca=kc(P(a,Yb)),l=lc(P(a,W)),k=P(a,Na);a=P(a,Be);g&&"aw.ds"!=g?b&&(b.ua=!0):(c=["1",e,Cc(c)].join("."),0<d&&(b&&(b.ta=!0),zc("_gac_"+Cc(k),c,ca,l,k,d,a)));le(b)}}else J(75)}},
ma=function(a,b,c,d){var e=nd(a,b);if(e){c=P(a,c);var g=kc(P(a,Yb)),ca=lc(P(a,W)),l=P(a,Be),k=P(a,Na);if("auto"!=ca)zc(c,e,g,ca,k,d,l)&&(hc=!0);else{J(32);for(var w=id(),Ce=0;Ce<w.length;Ce++)if(ca=w[Ce],a.data.set(W,ca),e=nd(a,b),zc(c,e,g,ca,k,d,l)){hc=!0;return}a.data.set(W,"auto")}}},uc=function(a){var b=Ca(P(a,la));return Xd(a,b)},nc=function(a){if("cookie"==P(a,ac)&&!hc&&(mc(a),!hc))throw"abort";},Yc=function(a){if(a.get(Wc)){var b=P(a,W),c=P(a,$b)||xa(),d=Xc("__utma",c,b);d&&(J(19),a.set(Tc,
(new Date).getTime(),!0),a.set(Rc,d.R),(b=Xc("__utmz",c,b))&&d.hash==b.hash&&a.set(Sc,b.R))}},nd=function(a,b){b=Cc(P(a,b));var c=lc(P(a,W)).split(".").length;a=jc(P(a,Yb));1<a&&(c+="-"+a);return b?["GA1",c,b].join("."):""},Xd=function(a,b){return na(b,P(a,W),P(a,Yb))},na=function(a,b,c){if(!a||1>a.length)J(12);else{for(var d=[],e=0;e<a.length;e++){var g=a[e];var ca=g.split(".");var l=ca.shift();("GA1"==l||"1"==l)&&1<ca.length?(g=ca.shift().split("-"),1==g.length&&(g[1]="1"),g[0]*=1,g[1]*=1,ca={H:g,
s:ca.join(".")}):ca=kd.test(g)?{H:[0,0],s:g}:void 0;ca&&d.push(ca)}if(1==d.length)return J(13),d[0].s;if(0==d.length)J(12);else{J(14);d=Gc(d,lc(b).split(".").length,0);if(1==d.length)return d[0].s;d=Gc(d,jc(c),1);1<d.length&&J(41);return d[0]&&d[0].s}}},Gc=function(a,b,c){for(var d=[],e=[],g,ca=0;ca<a.length;ca++){var l=a[ca];l.H[c]==b?d.push(l):void 0==g||l.H[c]<g?(e=[l],g=l.H[c]):l.H[c]==g&&e.push(l)}return 0<d.length?d:e},lc=function(a){return 0==a.indexOf(".")?a.substr(1):a},id=function(){var a=
[],b=xa().split(".");if(4==b.length){var c=b[b.length-1];if(parseInt(c,10)==c)return["none"]}for(c=b.length-2;0<=c;c--)a.push(b.slice(c).join("."));b=M.location.hostname;eb.test(b)||vc.test(b)||a.push("none");return a},kc=function(a){if(!a)return"/";1<a.length&&a.lastIndexOf("/")==a.length-1&&(a=a.substr(0,a.length-1));0!=a.indexOf("/")&&(a="/"+a);return a},jc=function(a){a=kc(a);return"/"==a?1:a.split("/").length},le=function(a){a.ta&&J(77);a.na&&J(74);a.pa&&J(73);a.ua&&J(69)};function Xc(a,b,c){"none"==b&&(b="");var d=[],e=Ca(a);a="__utma"==a?6:2;for(var g=0;g<e.length;g++){var ca=(""+e[g]).split(".");ca.length>=a&&d.push({hash:ca[0],R:e[g],O:ca})}if(0!=d.length)return 1==d.length?d[0]:Zc(b,d)||Zc(c,d)||Zc(null,d)||d[0]}function Zc(a,b){if(null==a)var c=a=1;else c=La(a),a=La(D(a,".")?a.substring(1):"."+a);for(var d=0;d<b.length;d++)if(b[d].hash==c||b[d].hash==a)return b[d]};var Jc=new RegExp(/^https?:\/\/([^\/:]+)/),De=O.google_tag_data.glBridge,Kc=/(.*)([?&#])(?:_ga=[^&#]*)(?:&?)(.*)/,od=/(.*)([?&#])(?:_gac=[^&#]*)(?:&?)(.*)/;function Bc(a){if(a.get(Ze))return J(35),De.generate($e(a));var b=P(a,Q),c=P(a,I)||"";b="_ga=2."+K(pa(c+b,0)+"."+c+"-"+b);(a=af(a))?(J(44),a="&_gac=1."+K([pa(a.qa,0),a.timestamp,a.qa].join("."))):a="";return b+a}
function Ic(a,b){var c=new Date,d=O.navigator,e=d.plugins||[];a=[a,d.userAgent,c.getTimezoneOffset(),c.getYear(),c.getDate(),c.getHours(),c.getMinutes()+b];for(b=0;b<e.length;++b)a.push(e[b].description);return La(a.join("."))}function pa(a,b){var c=new Date,d=O.navigator,e=c.getHours()+Math.floor((c.getMinutes()+b)/60);return La([a,d.userAgent,d.language||"",c.getTimezoneOffset(),c.getYear(),c.getDate()+Math.floor(e/24),(24+e)%24,(60+c.getMinutes()+b)%60].join("."))}
var Dc=function(a){J(48);this.target=a;this.T=!1};Dc.prototype.ca=function(a,b){if(a){if(this.target.get(Ze))return De.decorate($e(this.target),a,b);if(a.tagName){if("a"==a.tagName.toLowerCase()){a.href&&(a.href=qd(this,a.href,b));return}if("form"==a.tagName.toLowerCase())return rd(this,a)}if("string"==typeof a)return qd(this,a,b)}};
var qd=function(a,b,c){var d=Kc.exec(b);d&&3<=d.length&&(b=d[1]+(d[3]?d[2]+d[3]:""));(d=od.exec(b))&&3<=d.length&&(b=d[1]+(d[3]?d[2]+d[3]:""));a=a.target.get("linkerParam");var e=b.indexOf("?");d=b.indexOf("#");c?b+=(-1==d?"#":"&")+a:(c=-1==e?"?":"&",b=-1==d?b+(c+a):b.substring(0,d)+c+a+b.substring(d));b=b.replace(/&+_ga=/,"&_ga=");return b=b.replace(/&+_gac=/,"&_gac=")},rd=function(a,b){if(b&&b.action)if("get"==b.method.toLowerCase()){a=a.target.get("linkerParam").split("&");for(var c=0;c<a.length;c++){var d=
a[c].split("="),e=d[1];d=d[0];for(var g=b.childNodes||[],ca=!1,l=0;l<g.length;l++)if(g[l].name==d){g[l].setAttribute("value",e);ca=!0;break}ca||(g=M.createElement("input"),g.setAttribute("type","hidden"),g.setAttribute("name",d),g.setAttribute("value",e),b.appendChild(g))}}else"post"==b.method.toLowerCase()&&(b.action=qd(a,b.action))};
Dc.prototype.S=function(a,b,c){function d(g){try{g=g||O.event;a:{var ca=g.target||g.srcElement;for(g=100;ca&&0<g;){if(ca.href&&ca.nodeName.match(/^a(?:rea)?$/i)){var l=ca;break a}ca=ca.parentNode;g--}l={}}("http:"==l.protocol||"https:"==l.protocol)&&sd(a,l.hostname||"")&&l.href&&(l.href=qd(e,l.href,b))}catch(k){J(26)}}var e=this;this.target.get(Ze)?De.auto(function(){return $e(e.target)},a,b?"fragment":"",c):(this.T||(this.T=!0,L(M,"mousedown",d,!1),L(M,"keyup",d,!1)),c&&L(M,"submit",function(g){g=
g||O.event;if((g=g.target||g.srcElement)&&g.action){var ca=g.action.match(Jc);ca&&sd(a,ca[1])&&rd(e,g)}}))};Dc.prototype.$=function(a){if(a){var b=this,c=b.target.get(F);void 0!==c&&De.passthrough(function(){if(c("analytics_storage"))return{};var d={};return d._ga=b.target.get(Q),d._up="1",d},1,!0)}};function sd(a,b){if(b==M.location.hostname)return!1;for(var c=0;c<a.length;c++)if(a[c]instanceof RegExp){if(a[c].test(b))return!0}else if(0<=b.indexOf(a[c]))return!0;return!1}
function ke(a,b){return b!=Ic(a,0)&&b!=Ic(a,-1)&&b!=Ic(a,-2)&&b!=pa(a,0)&&b!=pa(a,-1)&&b!=pa(a,-2)}function $e(a){var b=af(a),c={};c._ga=a.get(Q);c._gid=a.get(I)||void 0;c._gac=b?[b.qa,b.timestamp].join("."):void 0;b=a.get(Ae);a=Ed(a);return c._fplc=b&&"0"!==b?b:a,c}function af(a){function b(e){return void 0==e||""===e?0:Number(e)}var c=a.get(ce);if(c&&a.get(je)){var d=b(a.get(fe));if(1E3*d+b(a.get(he))<=(new Date).getTime())J(76);else return{timestamp:d,qa:c}}};var p=/^(GTM|OPT)-[A-Z0-9]+$/,Ie=/^G-[A-Z0-9]+$/,q=/;_gaexp=[^;]*/g,r=/;((__utma=)|([^;=]+=GAX?\d+\.))[^;]*/g,Aa=/^https?:\/\/[\w\-.]+\.google.com(:\d+)?\/optimize\/opt-launch\.html\?.*$/,t=function(a){function b(d,e){e&&(c+="&"+d+"="+K(e))}var c=Ge(a.type)+K(a.id);"dataLayer"!=a.B&&b("l",a.B);b("cx",a.context);b("t",a.target);b("cid",a.clientId);b("cidt",a.ka);b("gac",a.la);b("aip",a.ia);a.sync&&b("m","sync");b("cycle",a.G);a.qa&&b("gclid",a.qa);Aa.test(M.referrer)&&b("cb",String(hd()));return c},
He=function(a,b){var c=(new Date).getTime();O[a.B]=O[a.B]||[];c={"gtm.start":c};a.sync||(c.event="gtm.js");O[a.B].push(c);2===a.type&&function(d,e,g){O[a.B].push(arguments)}("config",a.id,b)},Ke=function(a,b,c,d){c=c||{};var e=1;Ie.test(b)&&(e=2);var g={id:b,type:e,B:c.dataLayer||"dataLayer",G:!1},ca=void 0;a.get("&gtm")==b&&(g.G=!0);1===e?(g.ia=!!a.get("anonymizeIp"),g.sync=d,b=String(a.get("name")),"t0"!=b&&(g.target=b),G(String(a.get("trackingId")))||(g.clientId=String(a.get(Q)),g.ka=Number(a.get(n)),
c=c.palindrome?r:q,c=(c=M.cookie.replace(/^|(; +)/g,";").match(c))?c.sort().join("").substring(1):void 0,g.la=c,g.qa=E(P(a,kb),"gclid"))):2===e&&(g.context="c",ca={allow_google_signals:a.get(Ud),allow_ad_personalization_signals:a.get(xe)});He(g,ca);return t(g)};var H={},Jd=function(a,b){b||(b=(b=P(a,V))&&"t0"!=b?Wd.test(b)?"_gat_"+Cc(P(a,Na)):"_gat_"+Cc(b):"_gat");this.Y=b},Rd=function(a,b){var c=b.get(Wb);b.set(Wb,function(e){Pd(a,e,ed);Pd(a,e,ia);var g=c(e);Qd(a,e);return g});var d=b.get(Xb);b.set(Xb,function(e){var g=d(e);if(se(e)){J(80);var ca={U:re(e,1),google:re(e,2),count:0};pe("https://stats.g.doubleclick.net/j/collect",ca.U,ca);e.set(ed,"",!0)}return g})},Pd=function(a,b,c){!1===b.get(Ud)||b.get(c)||("1"==Ca(a.Y)[0]?b.set(c,"",!0):b.set(c,""+hd(),
!0))},Qd=function(a,b){se(b)&&zc(a.Y,"1",P(b,Yb),P(b,W),P(b,Na),6E4,P(b,Be))},se=function(a){return!!a.get(ed)&&!1!==a.get(Ud)},Ne=function(a){return!H[P(a,Na)]&&void 0===a.get("&gtm")&&void 0===a.get(fa)&&void 0===a.get(gd)&&void 0===a.get(oe)},re=function(a,b){var c=new ee,d=function(g){$a(g).F&&c.set($a(g).F,a.get(g))};d(hb);d(ib);d(Na);d(Q);d(ed);1==b&&(d(Ad),d(ia),d(I));!1===a.get(xe)&&c.set("npa","1");c.set($a(ld).F,Td(a));var e="";c.map(function(g,ca){e+=K(g)+"=";e+=K(""+ca)+"&"});e+="z="+
hd();1==b?e="t=dc&aip=1&_r=3&"+e:2==b&&(e="t=sr&aip=1&_r=4&slf_rd=1&"+e);return e},Me=function(a){if(Ne(a))return H[P(a,Na)]=!0,function(b){if(b&&!H[b]){var c=Ke(a,b);Id(c);H[b]=!0}}},Wd=/^gtm\d+$/;var fd=function(a,b){a=a.model;if(!a.get("dcLoaded")){var c=new $c(Dd(a));c.set(29);a.set(Gd,c.C);b=b||{};var d;b[U]&&(d=Cc(b[U]));b=new Jd(a,d);Rd(b,a);a.set("dcLoaded",!0)}};var Sd=function(a){if(!a.get("dcLoaded")&&"cookie"==a.get(ac)){var b=new Jd(a);Pd(b,a,ed);Pd(b,a,ia);Qd(b,a);b=se(a);var c=Ne(a);b&&a.set(Md,1,!0);c&&a.set(Od,1,!0);if(b||c)a.set(ad,"d",!0),J(79),a.set(qe,{U:re(a,1),google:re(a,2),V:Me(a),count:0},!0)}};var Lc=function(){var a=O.gaGlobal=O.gaGlobal||{};return a.hid=a.hid||hd()};var wb=/^(UA|YT|MO|GP)-(\d+)-(\d+)$/,pc=function(a){function b(e,g){d.model.data.set(e,g)}function c(e,g){b(e,g);d.filters.add(e)}var d=this;this.model=new Ya;this.filters=new Ha;b(V,a[V]);b(Na,sa(a[Na]));b(U,a[U]);b(W,a[W]||xa());b(Yb,a[Yb]);b(Zb,a[Zb]);b(Hd,a[Hd]);b(Be,a[Be]);b($b,a[$b]);b(Wc,a[Wc]);b(bc,a[bc]);b(cc,a[cc]);b(Ka,a[Ka]);b(dc,a[dc]);b(ec,a[ec]);b(ac,a[ac]);b(Ad,a[Ad]);b(n,a[n]);b(Kd,a[Kd]);b(je,a[je]);b(Ze,a[Ze]);b(oe,a[oe]);b(Je,a[Je]);b(F,a[F]);b(hb,1);b(ib,"j88");c(Qb,Ma);c(oa,
ua);c(dd,cd);c(Rb,Oa);c(md,vb);c(Sb,nc);c(Uc,Yc);c(Tb,Ja);c(Vb,Ta);c(Vc,Hc);c(zd,yd);c(Ld,Sd);c(ze,Fe);c(Wb,Pa);c(Xb,Sa);c(Cd,Fd(this));pd(this.model);td(this.model,a[Q]);this.model.set(jb,Lc())};pc.prototype.get=function(a){return this.model.get(a)};pc.prototype.set=function(a,b){this.model.set(a,b)};
pc.prototype.send=function(a){if(!(1>arguments.length)){if("string"===typeof arguments[0]){var b=arguments[0];var c=[].slice.call(arguments,1)}else b=arguments[0]&&arguments[0][Va],c=arguments;b&&(c=za(me[b]||[],c),c[Va]=b,this.model.set(c,void 0,!0),this.filters.D(this.model),this.model.data.m={})}};pc.prototype.ma=function(a,b){var c=this;u(a,c,b)||(v(a,function(){u(a,c,b)}),y(String(c.get(V)),a,void 0,b,!0))};
var td=function(a,b){var c=P(a,U);a.data.set(la,"_ga"==c?"_gid":c+"_gid");if("cookie"==P(a,ac)){hc=!1;c=Ca(P(a,U));c=Xd(a,c);if(!c){c=P(a,W);var d=P(a,$b)||xa();c=Xc("__utma",d,c);void 0!=c?(J(10),c=c.O[1]+"."+c.O[2]):c=void 0}c&&(hc=!0);if(d=c&&!a.get(Hd))if(d=c.split("."),2!=d.length)d=!1;else if(d=Number(d[1])){var e=R(a,Zb);d=d+e<(new Date).getTime()/1E3}else d=!1;d&&(c=void 0);c&&(a.data.set(xd,c),a.data.set(Q,c),(c=uc(a))&&a.data.set(I,c));if(a.get(je)&&(c=a.get(ce),d=a.get(ie),!c||d&&"aw.ds"!=
d)){c={};if(M){d=[];e=M.cookie.split(";");for(var g=/^\s*_gac_(UA-\d+-\d+)=\s*(.+?)\s*$/,ca=0;ca<e.length;ca++){var l=e[ca].match(g);l&&d.push({ja:l[1],value:l[2]})}e={};if(d&&d.length)for(g=0;g<d.length;g++)(ca=d[g].value.split("."),"1"!=ca[0]||3!=ca.length)?c&&(c.na=!0):ca[1]&&(e[d[g].ja]?c&&(c.pa=!0):e[d[g].ja]=[],e[d[g].ja].push({timestamp:ca[1],qa:ca[2]}));d=e}else d={};d=d[P(a,Na)];le(c);d&&0!=d.length&&(c=d[0],a.data.set(fe,c.timestamp),a.data.set(ce,c.qa))}}if(a.get(Hd)){c=be("_ga",!!a.get(cc));
g=be("_gl",!!a.get(cc));d=De.get(a.get(cc));e=d._ga;g&&0<g.indexOf("_ga*")&&!e&&J(30);if(b||!a.get(Je))g=!1;else if(g=a.get(F),void 0===g||g("analytics_storage"))g=!1;else{J(84);a.data.set(Le,1);if(g=d._up)(g=Jc.exec(M.referrer))?(g=g[1],ca=M.location.hostname,g=ca===g||0<=ca.indexOf("."+g)||0<=g.indexOf("."+ca)?!0:!1):g=!1;g=g?!0:!1}ca=d.gclid;l=d._gac;if(c||e||ca||l)if(c&&e&&J(36),a.get(bc)||ye(a.get(Kd))||g){e&&(J(38),a.data.set(Q,e),d._gid&&(J(51),a.data.set(I,d._gid)));ca?(J(82),a.data.set(ce,
ca),d.gclsrc&&a.data.set(ie,d.gclsrc)):l&&(e=l.split("."))&&2===e.length&&(J(37),a.data.set(ce,e[0]),a.data.set(fe,e[1]));if(d=d._fplc)J(83),a.data.set(Ae,d);if(c)b:if(d=c.indexOf("."),-1==d)J(22);else{e=c.substring(0,d);g=c.substring(d+1);d=g.indexOf(".");c=g.substring(0,d);g=g.substring(d+1);if("1"==e){if(d=g,ke(d,c)){J(23);break b}}else if("2"==e){d=g.indexOf("-");e="";0<d?(e=g.substring(0,d),d=g.substring(d+1)):d=g.substring(1);if(ke(e+d,c)){J(53);break b}e&&(J(2),a.data.set(I,e))}else{J(22);
break b}J(11);a.data.set(Q,d);if(c=be("_gac",!!a.get(cc)))c=c.split("."),"1"!=c[0]||4!=c.length?J(72):ke(c[3],c[1])?J(71):(a.data.set(ce,c[3]),a.data.set(fe,c[2]),J(70))}}else J(21)}b&&(J(9),a.data.set(Q,K(b)));a.get(Q)||(b=(b=O.gaGlobal)&&b.from_cookie&&"cookie"!==P(a,ac)?void 0:(b=b&&b.vid)&&-1!==b.search(jd)?b:void 0,b?(J(17),a.data.set(Q,b)):(J(8),a.data.set(Q,ra())));a.get(I)||(J(3),a.data.set(I,ra()));mc(a);b=O.gaGlobal=O.gaGlobal||{};c=P(a,Q);a=c===P(a,xd);if(void 0==b.vid||a&&!b.from_cookie)b.vid=
c,b.from_cookie=a},pd=function(a){var b=O.navigator,c=O.screen,d=M.location,e=a.set;a:{var g=!!a.get(ec),ca=!!a.get(Kd);var l=M.referrer;if(/^(https?|android-app):\/\//i.test(l)){if(g)break a;g="//"+M.location.hostname;if(!de(l,g)){if(ca&&(ca=g.replace(/\./g,"-")+".cdn.ampproject.org",de(l,ca))){l=void 0;break a}break a}}l=void 0}e.call(a,lb,l);d&&(e=d.pathname||"","/"!=e.charAt(0)&&(J(31),e="/"+e),a.set(kb,d.protocol+"//"+d.hostname+e+d.search));c&&a.set(qb,c.width+"x"+c.height);c&&a.set(pb,c.colorDepth+
"-bit");c=M.documentElement;l=(e=M.body)&&e.clientWidth&&e.clientHeight;ca=[];c&&c.clientWidth&&c.clientHeight&&("CSS1Compat"===M.compatMode||!l)?ca=[c.clientWidth,c.clientHeight]:l&&(ca=[e.clientWidth,e.clientHeight]);c=0>=ca[0]||0>=ca[1]?"":ca.join("x");a.set(rb,c);c=a.set;var k;if((e=(e=O.navigator)?e.plugins:null)&&e.length)for(l=0;l<e.length&&!k;l++)ca=e[l],-1<ca.name.indexOf("Shockwave Flash")&&(k=ca.description);if(!k)try{var w=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");k=w.GetVariable("$version")}catch(Ce){}if(!k)try{w=
new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6"),k="WIN 6,0,21,0",w.AllowScriptAccess="always",k=w.GetVariable("$version")}catch(Ce){}if(!k)try{w=new ActiveXObject("ShockwaveFlash.ShockwaveFlash"),k=w.GetVariable("$version")}catch(Ce){}k&&(w=k.match(/[\d]+/g))&&3<=w.length&&(k=w[0]+"."+w[1]+" r"+w[2]);c.call(a,tb,k||void 0);a.set(ob,M.characterSet||M.charset);a.set(sb,b&&"function"===typeof b.javaEnabled&&b.javaEnabled()||!1);a.set(nb,(b&&(b.language||b.browserLanguage)||"").toLowerCase());a.data.set(ce,
be("gclid",!0));a.data.set(ie,be("gclsrc",!0));a.data.set(fe,Math.round((new Date).getTime()/1E3));if(d&&a.get(cc)&&(b=M.location.hash)){b=b.split(/[?&#]+/);d=[];for(k=0;k<b.length;++k)(D(b[k],"utm_id")||D(b[k],"utm_campaign")||D(b[k],"utm_source")||D(b[k],"utm_medium")||D(b[k],"utm_term")||D(b[k],"utm_content")||D(b[k],"gclid")||D(b[k],"dclid")||D(b[k],"gclsrc"))&&d.push(b[k]);0<d.length&&(b="#"+d.join("&"),a.set(kb,a.get(kb)+b))}},me={pageview:[mb],event:[ub,xb,yb,zb],social:[Bb,Cb,Db],timing:[Mb,
Nb,Pb,Ob]};var rc=function(a){if("prerender"==M.visibilityState)return!1;a();return!0},z=function(a){if(!rc(a)){J(16);var b=!1,c=function(){if(!b&&rc(a)){b=!0;var d=c,e=M;e.removeEventListener?e.removeEventListener("visibilitychange",d,!1):e.detachEvent&&e.detachEvent("onvisibilitychange",d)}};L(M,"visibilitychange",c)}};var te=/^(?:(\w+)\.)?(?:(\w+):)?(\w+)$/,sc=function(a){if(ea(a[0]))this.u=a[0];else{var b=te.exec(a[0]);null!=b&&4==b.length&&(this.da=b[1]||"t0",this.K=b[2]||"",this.methodName=b[3],this.aa=[].slice.call(a,1),this.K||(this.A="create"==this.methodName,this.i="require"==this.methodName,this.g="provide"==this.methodName,this.ba="remove"==this.methodName),this.i&&(3<=this.aa.length?(this.X=this.aa[1],this.W=this.aa[2]):this.aa[1]&&(qa(this.aa[1])?this.X=this.aa[1]:this.W=this.aa[1])));b=a[1];a=a[2];
if(!this.methodName)throw"abort";if(this.i&&(!qa(b)||""==b))throw"abort";if(this.g&&(!qa(b)||""==b||!ea(a)))throw"abort";if(ud(this.da)||ud(this.K))throw"abort";if(this.g&&"t0"!=this.da)throw"abort";}};function ud(a){return 0<=a.indexOf(".")||0<=a.indexOf(":")};var Yd,Zd,$d,A;Yd=new ee;$d=new ee;A=new ee;Zd={ec:45,ecommerce:46,linkid:47};
var u=function(a,b,c){b==N||b.get(V);var d=Yd.get(a);if(!ea(d))return!1;b.plugins_=b.plugins_||new ee;if(b.plugins_.get(a))return!0;b.plugins_.set(a,new d(b,c||{}));return!0},y=function(a,b,c,d,e){if(!ea(Yd.get(b))&&!$d.get(b)){Zd.hasOwnProperty(b)&&J(Zd[b]);a=N.j(a);var g=c;c=void 0;if(p.test(b)){J(52);if(!a)return!0;g=Ke(a.model,b,d,e);c=function(){Z.D(["provide",b,function(){}]);var l=O[d&&d.dataLayer||"dataLayer"];l&&l.hide&&ea(l.hide.end)&&l.hide[b]&&(l.hide.end(),l.hide.end=void 0)}}!g&&Zd.hasOwnProperty(b)?
(J(39),g=b+".js"):J(43);if(g){if(a){var ca=a.get(oe);qa(ca)||(ca=void 0)}g&&0<=g.indexOf("/")||(g=(ca||bd(!1))+"/plugins/ua/"+g);ca=ae(g);ne(ca.protocol)&&B(ca)&&(Id(ca.url,void 0,e,void 0,c),$d.set(b,!0))}}},v=function(a,b){var c=A.get(a)||[];c.push(b);A.set(a,c)},C=function(a,b){Yd.set(a,b);b=A.get(a)||[];for(var c=0;c<b.length;c++)b[c]();A.set(a,[])},B=function(a){var b=ae(M.location.href);if(D(a.url,Ge(1))||D(a.url,Ge(2)))return!0;if(a.query||0<=a.url.indexOf("?")||0<=a.path.indexOf("://"))return!1;
if(a.host==b.host&&a.port==b.port)return!0;b="http:"==a.protocol?80:443;return"www.google-analytics.com"==a.host&&(a.port||b)==b&&D(a.path,"/plugins/")?!0:!1},ne=function(a){var b=M.location.protocol;return"https:"==a||a==b?!0:"http:"!=a?!1:"http:"==b},ae=function(a){function b(l){var k=l.hostname||"",w=0<=k.indexOf("]");k=k.split(w?"]":":")[0].toLowerCase();w&&(k+="]");w=(l.protocol||"").toLowerCase();w=1*l.port||("http:"==w?80:"https:"==w?443:"");l=l.pathname||"";D(l,"/")||(l="/"+l);return[k,""+
w,l]}var c=M.createElement("a");c.href=M.location.href;var d=(c.protocol||"").toLowerCase(),e=b(c),g=c.search||"",ca=d+"//"+e[0]+(e[1]?":"+e[1]:"");D(a,"//")?a=d+a:D(a,"/")?a=ca+a:!a||D(a,"?")?a=ca+e[2]+(a||g):0>a.split("/")[0].indexOf(":")&&(a=ca+e[2].substring(0,e[2].lastIndexOf("/"))+"/"+a);c.href=a;d=b(c);return{protocol:(c.protocol||"").toLowerCase(),host:d[0],port:d[1],path:d[2],query:c.search||"",url:a||""}};var Z={ga:function(){Z.fa=[]}};Z.ga();Z.D=function(a){var b=Z.J.apply(Z,arguments);b=Z.fa.concat(b);for(Z.fa=[];0<b.length&&!Z.v(b[0])&&!(b.shift(),0<Z.fa.length););Z.fa=Z.fa.concat(b)};Z.J=function(a){for(var b=[],c=0;c<arguments.length;c++)try{var d=new sc(arguments[c]);d.g?C(d.aa[0],d.aa[1]):(d.i&&(d.ha=y(d.da,d.aa[0],d.X,d.W)),b.push(d))}catch(e){}return b};
Z.v=function(a){try{if(a.u)a.u.call(O,N.j("t0"));else{var b=a.da==gb?N:N.j(a.da);if(a.A){if("t0"==a.da&&(b=N.create.apply(N,a.aa),null===b))return!0}else if(a.ba)N.remove(a.da);else if(b)if(a.i){if(a.ha&&(a.ha=y(a.da,a.aa[0],a.X,a.W)),!u(a.aa[0],b,a.W))return!0}else if(a.K){var c=a.methodName,d=a.aa,e=b.plugins_.get(a.K);e[c].apply(e,d)}else b[a.methodName].apply(b,a.aa)}}catch(g){}};var N=function(a){J(1);Z.D.apply(Z,[arguments])};N.h={};N.P=[];N.L=0;N.ya=0;N.answer=42;var we=[Na,W,V];N.create=function(a){var b=za(we,[].slice.call(arguments));b[V]||(b[V]="t0");var c=""+b[V];if(N.h[c])return N.h[c];if(da(b))return null;b=new pc(b);N.h[c]=b;N.P.push(b);c=qc().tracker_created;if(ea(c))try{c(b)}catch(d){}return b};N.remove=function(a){for(var b=0;b<N.P.length;b++)if(N.P[b].get(V)==a){N.P.splice(b,1);N.h[a]=null;break}};N.j=function(a){return N.h[a]};N.getAll=function(){return N.P.slice(0)};
N.N=function(){"ga"!=gb&&J(49);var a=O[gb];if(!a||42!=a.answer){N.L=a&&a.l;N.ya=1*new Date;N.loaded=!0;var b=O[gb]=N;X("create",b,b.create);X("remove",b,b.remove);X("getByName",b,b.j,5);X("getAll",b,b.getAll,6);b=pc.prototype;X("get",b,b.get,7);X("set",b,b.set,4);X("send",b,b.send);X("requireSync",b,b.ma);b=Ya.prototype;X("get",b,b.get);X("set",b,b.set);if("https:"!=M.location.protocol&&!Ba){a:{b=M.getElementsByTagName("script");for(var c=0;c<b.length&&100>c;c++){var d=b[c].src;if(d&&0==d.indexOf(bd(!0)+
"/analytics")){b=!0;break a}}b=!1}b&&(Ba=!0)}(O.gaplugins=O.gaplugins||{}).Linker=Dc;b=Dc.prototype;C("linker",Dc);X("decorate",b,b.ca,20);X("autoLink",b,b.S,25);X("passthrough",b,b.$,25);C("displayfeatures",fd);C("adfeatures",fd);a=a&&a.q;ka(a)?Z.D.apply(N,a):J(50)}};var Ee=N.N,Oe=O[gb];Oe&&Oe.r?Ee():z(Ee);z(function(){Z.D(["provide","render",ua])});})(window);

View File

@ -0,0 +1,173 @@
(function() {function aa(a,b,c){if(null==a)throw new TypeError("The 'this' value for String.prototype."+c+" must not be null or undefined");if(b instanceof RegExp)throw new TypeError("First argument to String.prototype."+c+" must not be a regular expression");return a+""}
var ba="function"==typeof Object.defineProperties?Object.defineProperty:function(a,b,c){if(c.get||c.set)throw new TypeError("ES3 does not support getters and setters.");a!=Array.prototype&&a!=Object.prototype&&(a[b]=c.value)},ca="undefined"!=typeof window&&window===this?this:"undefined"!=typeof global&&null!=global?global:this;
function da(a,b){if(b){for(var c=ca,d=a.split("."),e=0;e<d.length-1;e++){var f=d[e];f in c||(c[f]={});c=c[f]}d=d[d.length-1];e=c[d];f=b(e);f!=e&&null!=f&&ba(c,d,{configurable:!0,writable:!0,value:f})}}da("String.prototype.endsWith",function(a){return a?a:function(a,c){var b=aa(this,a,"endsWith");a+="";void 0===c&&(c=b.length);for(var e=Math.max(0,Math.min(c|0,b.length)),f=a.length;0<f&&0<e;)if(b[--e]!=a[--f])return!1;return 0>=f}});
da("String.prototype.includes",function(a){return a?a:function(a,c){return-1!==aa(this,a,"includes").indexOf(a,c||0)}});da("String.prototype.startsWith",function(a){return a?a:function(a,c){var b=aa(this,a,"startsWith");a+="";for(var e=b.length,f=a.length,k=Math.max(0,Math.min(c|0,b.length)),m=0;m<f&&k<e;)if(b[k++]!=a[m++])return!1;return m>=f}});da("Number.isFinite",function(a){return a?a:function(a){return"number"!==typeof a?!1:!isNaN(a)&&Infinity!==a&&-Infinity!==a}});
da("Number.isInteger",function(a){return a?a:function(a){return Number.isFinite(a)?a===Math.floor(a):!1}});
function ea(a){var b=typeof a;if("object"==b)if(a){if(a instanceof Array)return"array";if(a instanceof Object)return b;var c=Object.prototype.toString.call(a);if("[object Window]"==c)return"object";if("[object Array]"==c||"number"==typeof a.length&&"undefined"!=typeof a.splice&&"undefined"!=typeof a.propertyIsEnumerable&&!a.propertyIsEnumerable("splice"))return"array";if("[object Function]"==c||"undefined"!=typeof a.call&&"undefined"!=typeof a.propertyIsEnumerable&&!a.propertyIsEnumerable("call"))return"function"}else return"null";
else if("function"==b&&"undefined"==typeof a.call)return"object";return b}function fa(a,b,c){return a.call.apply(a.bind,arguments)}function ga(a,b,c){if(!a)throw Error();if(2<arguments.length){var d=Array.prototype.slice.call(arguments,2);return function(){var c=Array.prototype.slice.call(arguments);Array.prototype.unshift.apply(c,d);return a.apply(b,c)}}return function(){return a.apply(b,arguments)}}
function ha(a,b,c){ha=Function.prototype.bind&&-1!=Function.prototype.bind.toString().indexOf("native code")?fa:ga;return ha.apply(null,arguments)};function g(a){var b=[];ia(new ja,a,b);return b.join("")}function ja(){}
function ia(a,b,c){if(null==b)c.push("null");else{if("object"==typeof b){if("array"==ea(b)){var d=b;b=d.length;c.push("[");for(var e="",f=0;f<b;f++)c.push(e),e=d[f],ia(a,e,c),e=",";c.push("]");return}if(b instanceof String||b instanceof Number||b instanceof Boolean)b=b.valueOf();else{c.push("{");f="";for(d in b)Object.prototype.hasOwnProperty.call(b,d)&&(e=b[d],"function"!=typeof e&&(c.push(f),ka(d,c),c.push(":"),ia(a,e,c),f=","));c.push("}");return}}switch(typeof b){case "string":ka(b,c);break;case "number":c.push(isFinite(b)&&
!isNaN(b)?String(b):"null");break;case "boolean":c.push(String(b));break;case "function":c.push("null");break;default:throw Error("Unknown type: "+typeof b);}}}var la={'"':'\\"',"\\":"\\\\","/":"\\/","\b":"\\b","\f":"\\f","\n":"\\n","\r":"\\r","\t":"\\t","\x0B":"\\u000b"},ma=/\uffff/.test("\uffff")?/[\\\"\x00-\x1f\x7f-\uffff]/g:/[\\\"\x00-\x1f\x7f-\xff]/g;
function ka(a,b){b.push('"',a.replace(ma,function(a){var b=la[a];b||(b="\\u"+(a.charCodeAt(0)|65536).toString(16).substr(1),la[a]=b);return b}),'"')};function p(a){a=String(a);try{return JSON.parse(a)}catch(b){}throw Error("Invalid JSON string: "+a);}function q(a){try{return"object"===typeof JSON&&"function"===typeof JSON.stringify?JSON.stringify(a):g(a)}catch(b){}throw Error("Could not stringify object");};function na(){function a(){if(b.length)b[0](function(){b.shift();a()})}var b=[];return function(c){b.push(c);1===b.length&&a()}};var oa=2,pa=200,qa=5E3,r="",u={},ra="undefined"!==typeof window&&!!(window.performance&&window.performance.timing&&window.performance.timing.navigationStart),sa="";function ta(a){return a&&"number"===typeof a?(Date.now()-a).toString():null}var ua={didClickJourneyClose:"Button(X)",didClickJourneyContinue:"Dismiss Journey text"},v=!1,va={"/v1/open":{link_identifier:"\\d+"},"/v1/pageview":{event:"pageview"},"/v1/dismiss":{event:"dismiss"},"/v1/url":{}},wa=!1;
function xa(a,b){var c=document.createElement("a");c.href=a;var d=c.origin;d.endsWith("/")&&(d=d.substring(0,d.length-1));if(!["https://api2.branch.io","https://app.link","https://bnc.lt"].includes(d))return!1;c=c.pathname;"/"!=c[0]&&(c="/"+c);if(c.startsWith("/c/"))return!1;c=va[c];if(!c)return!0;if(0<Object.keys(c).length){if(!b)return!0;for(var e in c)if(d=new RegExp(c[e]),!b.hasOwnProperty(e)||!d.test(b[e]))return!0}return!1}
function ya(a,b){if(a||b){for(var c="https://bnc.lt/a/"+a+"?",d="tags alias channel feature stage campaign type duration sdk source data".split(" "),e=0;e<d.length;e++){var f=d[e],k=b[f];if(k)if("tags"===f&&Array.isArray(k))for(var m=0;m<k.length;m++)c=("?"===c[c.length-1]?c+f:c+"&"+f)+"="+encodeURIComponent(k[m]);else if("string"===typeof k&&0<k.length||"number"===typeof k)"data"===f&&"string"===typeof k&&(k=za(k)),c=("?"===c[c.length-1]?c+f:c+"&"+f)+"="+encodeURIComponent(k)}return c}}
function Aa(a){a&&(a.ha=null,a.N=null,a.H=null,a.j=null,a.g=null,a.D=null,a.v&&delete a.v,a.w&&delete a.w,a.c.remove("branch_view_enabled"),Ba(a.c,{},!0))}function x(a,b,c){a=a.replace(/\$(\d)/g,function(a,c){return b[parseInt(c,10)-1]});c&&(a+="\n Failure Code:"+c);return a}
function Ca(a){var b=a.has_app;return{data:a.data||"",data_parsed:a.data_parsed||{},has_app:void 0===b?null:b,identity:a.identity||null,developer_identity:a.identity||null,referring_identity:a.referring_identity||null,referring_link:a.referring_link||null}}function Da(a){var b=/^\$journeys_\S+$/,c=a.data,d={};if(!c)return{};switch(typeof c){case "string":try{c=p(c)}catch(e){c={}}break;case "object":break;default:c={}}Object.keys(c).forEach(function(a){b.test(a)&&(d[a]=c[a])});return d}
function Ea(){return y()?document.referrer:String(window.location)}
function z(a){a.source="web-sdk";var b=a.data;switch(typeof b){case "string":try{b=p(b)}catch(c){b={_bncNoEval:!0}}break;case "object":break;default:b={}}b.$canonical_url||(b.$canonical_url=Ea());b.$og_title||(b.$og_title=A("title"));b.$og_description||(b.$og_description=A("description"));b.$og_image_url||(b.$og_image_url=A("image"));b.$og_video||(b.$og_video=A("video"));b.$og_type||(b.$og_type=A("type"));"string"===typeof b.$desktop_url&&(b.$desktop_url=b.$desktop_url.replace(/#r:[a-z0-9-_]+$/i,
"").replace(/([\?\&]_branch_match_id=\d+)/,""));try{p(b)}catch(c){b=g(b)}a.data=b;return a}function Fa(a){function b(a){return""!==a}if(!a||"string"!==typeof a)return"";var c=document.createElement("a");c.href=a;a=c.pathname&&c.pathname.split("/").filter(b);return Array.isArray(a)&&a.length?a[a.length-1]+c.search:c.search}
function B(a,b,c){a&&"object"===typeof a||(a={});if(!b||"object"!==typeof b)return a;for(var d in b)if(b.hasOwnProperty(d)){var e=b[d];!c||void 0!==e&&null!==e?a[d]=e:delete a[d]}return a}function Ga(){try{var a=(y()&&Ha()?window.top.location.hash:window.location.hash).match(/r:([^&]*)/);if(a&&1<=a.length)return a[1]}catch(b){}}function Ia(a){return!!/^((?!chrome|android|crios|firefox|fxios|edg|yabrowser).)*safari/i.test(a)}
function Ja(a,b){b=b||11;var c=/version\/([^ ]*)/i.exec(a);if(c&&c[1])try{if(parseFloat(c[1])>=b)return!0}catch(d){}return!1}
function C(){var a=navigator.userAgent;return a.match(/android/i)?"android":a.match(/ipad/i)||a&&Ia(a)&&a&&-1<a.indexOf("Macintosh")&&Ja(a,13)&&screen.height>screen.width?"ipad":a.match(/i(os|p(hone|od))/i)?"ios":a.match(/\(BB[1-9][0-9]*\;/i)?"blackberry":a.match(/Windows Phone/i)?"windows_phone":a.match(/Kindle/i)||a.match(/Silk/i)||a.match(/KFTT/i)||a.match(/KFOT/i)||a.match(/KFJWA/i)||a.match(/KFJWI/i)||a.match(/KFSOWI/i)||a.match(/KFTHWA/i)||a.match(/KFTHWI/i)||a.match(/KFAPWA/i)||a.match(/KFAPWI/i)?
"kindle":!1}function Ka(){var a=navigator.userAgent;return Ia(a)?Ja(a,11):!1}function La(){var a=navigator.userAgent;return!!window.webkitURL&&a&&a&&/(iPad|iPod|iPhone)/.test(a)&&!/(chrome|crios)/i.test(a)&&!/(fxios|firefox)/i.test(a)&&!/edg/i.test(a)&&!/(opt|opr)/i.test(a)&&!/yabrowser/i.test(a)}function Ma(a){try{var b=(y()&&Ha()?window.top.location.search:window.location.search).substring(1).match(new RegExp(a+"=([^&]*)"));if(b&&1<=b.length)return b[1]}catch(c){}}
function Na(a){return a.replace(/(\-\w)/g,function(a){return a[1].toUpperCase()})}
function za(a){var b="",c,d,e,f,k,m,h=0;a=a.replace(/\r\n/g,"\n");d="";for(e=0;e<a.length;e++)f=a.charCodeAt(e),128>f?d+=String.fromCharCode(f):(127<f&&2048>f?d+=String.fromCharCode(f>>6|192):(d+=String.fromCharCode(f>>12|224),d+=String.fromCharCode(f>>6&63|128)),d+=String.fromCharCode(f&63|128));for(a=d;h<a.length;)c=a.charCodeAt(h++),d=a.charCodeAt(h++),e=a.charCodeAt(h++),f=c>>2,c=(c&3)<<4|d>>4,k=(d&15)<<2|e>>6,m=e&63,isNaN(d)?m=k=64:isNaN(e)&&(m=64),b=b+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".charAt(f)+
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".charAt(c)+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".charAt(k)+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".charAt(m);return b}function Oa(a){return Pa(a)?atob(a):a}function Pa(a){if("string"!==typeof a||""===a||""===a.trim())return!1;try{return btoa(atob(a))===a}catch(b){return!1}}
function Qa(a){a&&a.browser_fingerprint_id&&!Pa(a.browser_fingerprint_id)&&(a.browser_fingerprint_id=btoa(a.browser_fingerprint_id));a&&a.alternative_browser_fingerprint_id&&!Pa(a.alternative_browser_fingerprint_id)&&(a.alternative_browser_fingerprint_id=btoa(a.alternative_browser_fingerprint_id));return a}
function Ra(a){a&&Pa(a.browser_fingerprint_id)&&(a.browser_fingerprint_id=atob(a.browser_fingerprint_id));a&&Pa(a.alternative_browser_fingerprint_id)&&(a.alternative_browser_fingerprint_id=atob(a.alternative_browser_fingerprint_id));return a}function Sa(a,b,c){"function"===typeof a.addEventListener?a.addEventListener(b,c,void 0):"function"===typeof a.attachEvent?a.attachEvent("on"+b,c):a["on"+b]=c}
function Ta(a){if(!a)return null;-1<a.indexOf("://")&&(a=a.split("://")[1]);return a.substring(a.indexOf("/")+1)}function D(a){if(!a)return null;-1<a.indexOf("://")?a=a.split("://")[1]:"/"===a.charAt(0)&&(a=a.slice(1));return a}function A(a){var b;a=String(a);b=b||null;(a=document.querySelector('meta[property="og:'+a+'"]'))&&a.content&&(b=a.content);return b}
function Ua(){var a=document.getElementsByTagName("meta"),b={};if(!a||0===a.length)return b;for(var c={hostedIOS:null,hostedAndroid:null,applinksIOS:null,applinksAndroid:null,twitterIOS:null,twitterAndroid:null},d=0;d<a.length;d++)if((a[d].getAttribute("name")||a[d].getAttribute("property"))&&a[d].getAttribute("content")){var e=a[d].getAttribute("name"),f=a[d].getAttribute("property"),e=e||f,f=e.split(":");3===f.length&&"branch"===f[0]&&"deeplink"===f[1]&&("$ios_deeplink_path"===f[2]?c.hostedIOS=
D(a[d].getAttribute("content")):"$android_deeplink_path"===f[2]?c.hostedAndroid=D(a[d].getAttribute("content")):b[f[2]]=a[d].getAttribute("content"));"al:ios:url"===e&&(c.applinksIOS=D(a[d].getAttribute("content")));"twitter:app:url:iphone"===e&&(c.twitterIOS=D(a[d].getAttribute("content")));"al:android:url"===e&&(c.applinksAndroid=D(a[d].getAttribute("content")));"twitter:app:url:googleplay"===e&&(c.twitterAndroid=D(a[d].getAttribute("content")))}c&&"object"===typeof c&&Object.keys(c).length&&(c.hostedIOS?
b.$ios_deeplink_path=c.hostedIOS:c.applinksIOS?b.$ios_deeplink_path=c.applinksIOS:c.twitterIOS&&(b.$ios_deeplink_path=c.twitterIOS),c.hostedAndroid?b.$android_deeplink_path=c.hostedAndroid:c.applinksAndroid?b.$android_deeplink_path=c.applinksAndroid:c.twitterAndroid&&(b.$android_deeplink_path=c.twitterAndroid),b.hasOwnProperty("$ios_deeplink_path")&&b.hasOwnProperty("$android_deeplink_path")&&b.$ios_deeplink_path===b.$android_deeplink_path&&(b.$deeplink_path=b.$ios_deeplink_path));return b}
function Va(){var a;try{navigator.languages&&0<navigator.languages.length?a=navigator.languages[0]:navigator.language&&(a=navigator.language),a=a.substring(0,2).toUpperCase()}catch(b){a=null}return a}function Wa(a,b){var c=[];b.forEach(function(b){-1===a.indexOf(b)&&c.push(b)});return c}
var Xa=["purchase"],Ya={missingPurchaseEvent:"event name is either missing, of the wrong type or not valid. Please specify 'purchase' as the event name.",missingCommerceData:"commerce_data is either missing, of the wrong type or empty. Please ensure that commerce_data is constructed correctly.",invalidKeysForRoot:"Please remove the following keys from the root of commerce_data: ",invalidKeysForProducts:"Please remove the following keys from commerce_data.products: ",invalidProductListType:"commerce_data.products must be an array of objects",
invalidProductType:"Each product in the products list must be an object"};
function Za(a){var b="sku name price quantity brand category variant".split(" "),c=Wa("common type transaction_id currency revenue revenue_in_usd exchange_rate shipping tax coupon affiliation persona products".split(" "),Object.keys(a));if(c.length)return Ya.invalidKeysForRoot+c.join(", ");var d=[],e;if(a.hasOwnProperty("products")){if(!Array.isArray(a.products))return Ya.invalidProductListType;a.products.forEach(function(a){"object"!==typeof a&&(e=Ya.invalidProductType);d=d.concat(Wa(b,Object.keys(a)))});
if(e)return e;if(d.length)return Ya.invalidKeysForProducts+d.join(", ")}return null}function $a(a,b){if(!a||"string"!==typeof a||-1===Xa.indexOf(a.toLowerCase()))return Ya.missingPurchaseEvent;if(!b||"object"!==typeof b||!Object.keys(b).length)return Ya.missingCommerceData;var c=Za(b);return c?c:null}function E(a){return"string"!==typeof a?null:a.replace(/</g,"&lt;").replace(/>/g,"&gt;")}
function F(a,b,c){if(null!==c&&void 0!==c){if("object"===typeof c&&!Object.keys(c).length)return a;a[b]=c}return a}
function ab(){var a={},b;b={};b=F(b,"$og_title",A("title"));b=F(b,"$og_description",A("description"));b=F(b,"$og_image_url",A("image"));b=F(b,"$og_video",A("video"));b=(b=F(b,"$og_type",A("type")))&&0<Object.keys(b).length?b:null;a=F(a,"og_data",b);a=F(a,"hosted_deeplink_data",Ua());b=document.getElementsByTagName("title");a=F(a,"title",0<b.length?b[0].innerText:null);b=document.querySelector('meta[name="description"]');a=F(a,"description",b&&b.content?b.content:null);b=document.querySelector('link[rel="canonical"]');
return(a=F(a,"canonical_url",b&&b.href?b.href:null))&&0<Object.keys(a).length?a:{}}var bb="ADD_TO_CART ADD_TO_WISHLIST VIEW_CART INITIATE_PURCHASE ADD_PAYMENT_INFO PURCHASE SPEND_CREDITS SEARCH VIEW_ITEM VIEW_ITEMS RATE SHARE COMPLETE_REGISTRATION COMPLETE_TUTORIAL ACHIEVE_LEVEL UNLOCK_ACHIEVEMENT LOGIN SUBSCRIBE START_TRIAL INVITE RESERVE VIEW_AD CLICK_AD INITIATE_STREAM COMPLETE_STREAM".split(" "),cb="transaction_id revenue currency shipping tax coupon affiliation search_query description".split(" ");
function db(a){if(!a||!Object.keys(a).length)return null;for(var b=Wa(cb,Object.keys(a)),c={},d=0;d<b.length;d++){var e=b[d];c[e]=a[e];delete a[e]}return{custom_data:eb(c),event_data:a}}function G(a,b){return!b||null===a&&"object"===b?!1:"array"===b?Array.isArray(a):typeof a===b&&!Array.isArray(a)}
function fb(a){var b={},b=F(b,"http_origin",document.URL),b=F(b,"user_agent",navigator.userAgent),b=F(b,"language",Va()),b=F(b,"screen_width",screen.width||0),b=F(b,"screen_height",screen.height||0),b=F(b,"http_referrer",document.referrer),b=F(b,"browser_fingerprint_id",a.D),b=F(b,"developer_identity",a.g),b=F(b,"identity",a.g),b=F(b,"sdk","web");return b=F(b,"sdk_version","2.58.0")}function y(){return window.self!==window.top}
function Ha(){var a="true";try{window.top.location.search&&(a="true")}catch(b){return!1}return"true"===a}function gb(a){return a?a:y()?Ha()?window.top.document.referrer:"":document.referrer}function eb(a){if(!G(a,"object")||!Object.keys(a).length)return{};for(var b in a)a.hasOwnProperty(b)&&(a[b]=G(a[b],"object")||G(a[b],"array")?q(a[b]):a[b].toString());return a}function hb(a,b){var c=a?B({},a):{};return b&&0<Object.keys(b).length?0<Object.keys(c).length?B(c,b):B({},b):c}
function H(a){""!==r&&a.setAttribute("nonce",r)}function ib(a,b){isNaN(b)||0>=b?a():setTimeout(a,b)};function I(a,b){return function(c,d,e){if(v)return!1;if("number"===typeof e||e)if(0===b){if("object"!==typeof e)return x("API request $1, parameter $2 is not $3",[c,d,"an object"])}else if(3===b){if(!(e instanceof Array))return x("API request $1, parameter $2 is not $3",[c,d,"an array"])}else if(2===b){if("number"!==typeof e)return x("API request $1, parameter $2 is not $3",[c,d,"a number"])}else if(4===b){if("boolean"!==typeof e)return x("API request $1, parameter $2 is not $3",[c,d,"a boolean"])}else{if("string"!==
typeof e)return x("API request $1, parameter $2 is not $3",[c,d,"a string"]);if(1!==b&&!b.test(e))return x("API request $1, parameter $2 is not $3",[c,d,"in the proper format"])}else if(a)return x("API request $1 missing parameter $2",[c,d]);return!1}}function J(a){return B(a,{browser_fingerprint_id:I(!0,1),identity_id:I(!0,1),sdk:I(!0,1),session_id:I(!0,1)})}
var jb={destination:"https://api2.branch.io",endpoint:"/v1/open",method:"POST",a:{browser_fingerprint_id:I(!1,1),alternative_browser_fingerprint_id:I(!1,1),identity_id:I(!1,1),link_identifier:I(!1,1),sdk:I(!1,1),options:I(!1,0),initial_referrer:I(!1,1),tracking_disabled:I(!1,4),current_url:I(!1,1),screen_height:I(!1,2),screen_width:I(!1,2)}},kb={destination:"https://app.link",endpoint:"/_r",method:"GET",L:!0,a:{sdk:I(!0,1),_t:I(!1,1),branch_key:I(!0,1)}},lb={destination:"",endpoint:"",method:"GET",
f:{link_url:I(!0,1)},a:{click:I(!0,1)}},mb={destination:"https://bnc.lt",endpoint:"/c",method:"POST",f:{link_url:I(!0,1)},a:{sdk:I(!1,1),phone:I(!0,1)}},nb={destination:"https://api2.branch.io",endpoint:"/v1/referralcode",method:"POST",a:J({amount:I(!0,2),bucket:I(!1,1),calculation_type:I(!0,2),creation_source:I(!0,2),expiration:I(!1,1),location:I(!0,2),prefix:I(!1,1),type:I(!0,1)})},ob={destination:"https://api2.branch.io",endpoint:"/v1/referralcode",method:"POST",f:{code:I(!0,1)},a:J({})},pb={destination:"https://api2.branch.io",
endpoint:"/v1/applycode",method:"POST",f:{code:I(!0,1)},a:J({})},qb={destination:"https://api2.branch.io",endpoint:"/v1/logout",method:"POST",a:J({session_id:I(!0,1)})},rb={destination:"https://api2.branch.io",endpoint:"/v1/profile",method:"POST",a:J({identity_id:I(!0,1),identity:I(!0,1)})},sb={destination:"https://api2.branch.io",endpoint:"/v1/referrals",method:"GET",f:{identity_id:I(!0,1)},a:J({})},tb={destination:"https://api2.branch.io",endpoint:"/v1/credithistory",method:"GET",a:J({begin_after_id:I(!1,
1),bucket:I(!1,1),direction:I(!1,2),length:I(!1,2),link_click_id:I(!1,1)})},ub={destination:"https://api2.branch.io",endpoint:"/v1/credits",method:"GET",a:J({branch_key:I(!0,1),identity:I(!0,1)})},vb={destination:"https://api2.branch.io",endpoint:"/v1/redeem",method:"POST",a:J({amount:I(!0,2),bucket:I(!0,1),identity_id:I(!0,1)})},wb={destination:"https://api2.branch.io",endpoint:"/v1/url",method:"POST",qa:"obj",a:J({alias:I(!1,1),campaign:I(!1,1),channel:I(!1,1),data:I(!1,1),feature:I(!1,1),identity_id:I(!0,
1),stage:I(!1,1),tags:I(!1,3),type:I(!1,2),source:I(!1,1),instrumentation:I(!1,1)})},xb={destination:"https://api2.branch.io",endpoint:"/v1/qr-code",method:"POST",qa:"obj",a:J({alias:I(!1,1),campaign:I(!1,1),channel:I(!1,1),data:I(!1,1),qr_code_settings:I(!1,1),feature:I(!1,1),identity_id:I(!0,1),stage:I(!1,1),tags:I(!1,3),type:I(!1,2),source:I(!1,1)})},yb={destination:"https://api2.branch.io",endpoint:"/v1/deepview",L:!0,method:"POST",a:J({campaign:I(!1,1),_t:I(!1,1),channel:I(!1,1),data:I(!0,1),
feature:I(!1,1),link_click_id:I(!1,1),open_app:I(!1,4),append_deeplink_path:I(!1,4),stage:I(!1,1),tags:I(!1,3),deepview_type:I(!0,1),source:I(!0,1)})},zb={destination:"https://api2.branch.io",endpoint:"/v1/has-app",method:"GET",a:{browser_fingerprint_id:I(!0,1),instrumentation:I(!1,1)}},Ab={destination:"https://api2.branch.io",endpoint:"/v1/event",method:"POST",a:J({event:I(!0,1),metadata:I(!0,0),initial_referrer:I(!1,1),tracking_disabled:I(!1,4)})},Bb={destination:"https://api2.branch.io",endpoint:"/v1/event",
method:"POST",a:J({event:I(!0,1),metadata:I(!1,0),initial_referrer:I(!1,1),commerce_data:I(!0,0)})},Cb={destination:"https://api2.branch.io",endpoint:"/v2/event/standard",method:"POST",a:{name:I(!0,1),user_data:I(!0,1),custom_data:I(!1,1),event_data:I(!1,1),content_items:I(!1,1),customer_event_alias:I(!1,1)}},Db={destination:"https://api2.branch.io",endpoint:"/v2/event/custom",method:"POST",a:{name:I(!0,1),user_data:I(!0,1),custom_data:I(!1,1),content_items:I(!1,1),customer_event_alias:I(!1,1)}},
Eb={destination:"https://api2.branch.io",endpoint:"/v1/pageview",method:"POST",a:J({event:I(!0,1),metadata:I(!1,0),initial_referrer:I(!1,1),tracking_disabled:I(!1,4),branch_view_id:I(!1,1),no_journeys:I(!1,4),user_language:I(!1,1),open_app:I(!1,4),has_app_websdk:I(!1,4),source:I(!1,1),feature:I(!1,1),is_iframe:I(!1,4),data:I(!1,0),callback_string:I(!1,1),journey_displayed:I(!1,4),audience_rule_id:I(!1,1),journey_dismissals:I(!1,0),identity_id:I(!1,1)})},Fb={destination:"https://api2.branch.io",endpoint:"/v1/dismiss",
method:"POST",a:J({event:I(!0,1),metadata:I(!1,0),initial_referrer:I(!1,1),tracking_disabled:I(!1,4),branch_view_id:I(!1,1),no_journeys:I(!1,4),user_language:I(!1,1),open_app:I(!1,4),has_app_websdk:I(!1,4),source:I(!1,1),feature:I(!1,1),is_iframe:I(!1,4),data:I(!1,0),callback_string:I(!1,1),journey_displayed:I(!1,4),audience_rule_id:I(!1,1),journey_dismissals:I(!1,0),dismissal_source:I(!1,1)})},Gb={destination:"https://api2.branch.io",endpoint:"/v1/cpid",method:"POST",a:{user_data:I(!0,1)}},Ib={destination:"https://api2.branch.io",
endpoint:"/v1/cpid/latd",method:"POST",a:{user_data:I(!0,1)}};function Jb(a){for(var b=0;b<a.length;b++){var c=this[a[b]],c="function"===typeof c?c():c;if(c.isEnabled())return c.A={},c}}function K(a){return"branch_session"===a||"branch_session_first"===a?a:"BRANCH_WEBSDK_KEY"+a}function Kb(a){return"true"===a?!0:"false"===a?!1:a}function Lb(a){return"branch_session"===a||"branch_session_first"===a||0===a.indexOf("BRANCH_WEBSDK_KEY")}function Mb(a){a=a.trim();var b=a.indexOf("=");return{name:a.substring(0,b),value:Kb(a.substring(b+1,a.length))}}
function Nb(a){var b;try{b=a&&localStorage?localStorage:sessionStorage}catch(c){return{isEnabled:function(){return!1}}}return{getAll:function(){if("undefined"===typeof b)return null;var a=null,d;for(d in b)d.indexOf("BRANCH_WEBSDK_KEY")||(null===a&&(a={}),a[d.replace("BRANCH_WEBSDK_KEY","")]=Kb(b.getItem(d)));return Ra(a)},get:function(a,d){return"browser_fingerprint_id"===a||"alternative_browser_fingerprint_id"===a?d&&localStorage?Oa(localStorage.getItem(K(a))):Oa(b.getItem(K(a))):Kb(d&&localStorage?
localStorage.getItem(K(a)):b.getItem(K(a)))},set:function(a,d,e){e&&localStorage?localStorage.setItem(K(a),d):b.setItem(K(a),d)},remove:function(a,d){d&&localStorage?localStorage.removeItem(K(a)):b.removeItem(K(a))},clear:function(){Object.keys(b).forEach(function(a){a.indexOf("BRANCH_WEBSDK_KEY")||b.removeItem(a)})},isEnabled:function(){try{return b.setItem("test",""),b.removeItem("test"),!0}catch(c){return!1}}}}Jb.prototype.local=function(){return Nb(!0)};Jb.prototype.session=function(){return Nb(!1)};
function Ob(){function a(a,c){c&&(a=K(a));document.cookie=a+"=; expires=Thu, 01 Jan 1970 00:00:01 GMT; path=/"}return{getAll:function(){for(var a={},c=document.cookie.split(";"),d=0;d<c.length;d++){var e=Mb(c[d]);e&&e.hasOwnProperty("name")&&e.hasOwnProperty("value")&&Lb(e.name)&&(a[e.name.replace("BRANCH_WEBSDK_KEY","")]=e.value)}return a},get:function(a){a=K(a);for(var b=document.cookie.split(";"),d=0;d<b.length;d++){var e=Mb(b[d]);if(e&&e.hasOwnProperty("name")&&e.hasOwnProperty("value")&&e.name===
a)return e.value}return null},set:function(a,c){document.cookie=K(a)+"="+c+"; path=/"},remove:function(b){a(b,!0)},clear:function(){for(var b=document.cookie.split(";"),c=0;c<b.length;c++){var d=Mb(b[c]);d&&d.hasOwnProperty("name")&&Lb(d.name)&&a(d.name,!1)}},isEnabled:function(){return navigator.cookieEnabled}}}Jb.prototype.cookie=function(){return Ob()};
Jb.prototype.pojo={getAll:function(){return this.A},get:function(a){return this.A[a]||null},set:function(a,b){this.A[a]=b},remove:function(a){delete this.A[a]},clear:function(){this.A={}},isEnabled:function(){return!0}};function L(a,b){try{var c=p(a.get(b?"branch_session_first":"branch_session",b))||null;return Ra(c)}catch(d){return null}}function Ba(a,b,c){b=Qa(b);a.set("branch_session",g(b));c&&a.set("branch_session_first",g(b),!0)}function Pb(a,b){if(b){var c=L(a)||{},c=g(Qa(B(c,b)));a.set("branch_session",c)}}
function Qb(a,b,c){function d(a,b){return Qa(B(p(a),b,c))}var e=a.get("branch_session",!1)||{};a.set("branch_session",g(d(e,b)));e=a.get("branch_session_first",!0)||{};a.set("branch_session_first",g(d(e,b)),!0)};function Rb(){}Rb.prototype.h=0;function Sb(a,b,c){if("undefined"===typeof b)return"";var d=[];if(b instanceof Array){for(a=0;a<b.length;a++)d.push(encodeURIComponent(c)+"="+encodeURIComponent(b[a]));return d.join("&")}for(var e in b)b.hasOwnProperty(e)&&(b[e]instanceof Array||"object"===typeof b[e]?d.push(Sb(a,b[e],c?c+"."+e:e)):d.push(encodeURIComponent(c?c+"."+e:e)+"="+encodeURIComponent(b[e])));return d.join("&")}
function Tb(a,b,c){function d(a,c){"undefined"===typeof c&&(c={});if(a.branch_key&&h.test(a.branch_key))return c.branch_key=a.branch_key,c;if(a.app_id&&m.test(a.app_id))return c.app_id=a.app_id,c;if(a.instrumentation)c.instrumentation=a.instrumentation;else throw Error(x("API request $1 missing parameter $2",[b.endpoint,"branch_key or app_id"]));}var e,f,k=b.destination+b.endpoint,m=/^[0-9]{15,20}$/,h=/key_(live|test)_[A-Za-z0-9]{32}/;if("/v1/has-app"===b.endpoint)try{b.f=d(c,b.f)}catch(l){return{error:l.message}}if("undefined"!==
typeof b.f)for(e in b.f)if(b.f.hasOwnProperty(e)){if(f="function"===typeof b.f[e]?b.f[e](b.endpoint,e,c[e]):f)return{error:f};k+="/"+c[e]}var n={};if("undefined"!==typeof b.a&&"/v1/pageview"!==b.endpoint&&"/v1/dismiss"!==b.endpoint)for(e in b.a){if(b.a.hasOwnProperty(e)){if(f=b.a[e](b.endpoint,e,c[e]))return{error:f};f=c[e];"undefined"!==typeof f&&""!==f&&null!==f&&(n[e]=f)}}else"/v1/pageview"!==b.endpoint&&"/v1/dismiss"!==b.endpoint||B(n,c);if("POST"===b.method||"/v1/credithistory"===b.endpoint)try{c=
d(c,n)}catch(l){return{error:l.message}}"/v1/event"===b.endpoint&&(n.metadata=q(n.metadata||{}),n.hasOwnProperty("commerce_data")&&(n.commerce_data=q(n.commerce_data||{})));("/v1/pageview"===b.endpoint||"/v1/dismiss"===b.endpoint)&&n.metadata&&(n.metadata=q(n.metadata||{}));"/v1/open"===b.endpoint&&(n.options=q(n.options||{}));return{data:Sb(a,n,""),url:k.replace(/^\//,"")}}
function Ub(a,b,c){var d=document.createElement("script");d.type="text/javascript";d.async=!0;d.src=a;H(d);a=document.getElementsByTagName("head");!a||1>a.length?"function"===typeof b&&b():(a[0].appendChild(d),"function"===typeof b&&Sa(d,"error",b),"function"===typeof c&&Sa(d,"load",c))}
function Vb(a,b,c,d,e){var f=Date.now(),k=sa;!a.h&&Ka()&&a.h++;var m="branch_callback__"+a.h++;a=0<=b.indexOf("branch.io")?"&data=":"&post_data=";c="POST"===d?encodeURIComponent(za(g(c))):"";var h=window.setTimeout(function(){window[m]=function(){};F(u,k,ta(f));e(Error("Request timed out"),null,504)},qa);window[m]=function(a){window.clearTimeout(h);e(null,a)};Ub(b+(0>b.indexOf("?")?"?":"")+(c?a+c:"")+(0<=b.indexOf("/c/")?"&click=1":"")+"&callback="+m,function(){e(Error("Request blocked by client, probably adblock"),
null)},function(){F(u,k,ta(f));try{"function"===typeof this.remove?this.remove():this.parentNode.removeChild(this)}catch(n){}delete window[m]})}
function Wb(a,b,c,d,e,f,k,m){var h=Date.now(),n=sa,l=window.XMLHttpRequest?new XMLHttpRequest:new ActiveXObject("Microsoft.XMLHTTP");m&&(l.responseType=m);l.ontimeout=function(){F(u,n,ta(h));f(Error("Request timed out"),null,504)};l.onerror=function(a){f(Error(a.error||"Error in API: "+l.status),null,l.status)};l.onreadystatechange=function(){var a;if(4===l.readyState)if(F(u,n,ta(h)),200===l.status){if("arraybuffer"===l.responseType)a=l.response;else if(k)a=l.responseText;else try{a=p(l.responseText)}catch(w){a=
{}}f(null,a,l.status)}else if(402===l.status)f(Error("Not enough credits to redeem."),null,l.status);else if("4"===l.status.toString().substring(0,1)||"5"===l.status.toString().substring(0,1))l.responseURL&&l.responseURL.includes("v2/event")?f(l.responseText,null,l.status):f(Error("Error in API: "+l.status),null,l.status)};try{l.open(d,b,!0),l.timeout=qa,l.setRequestHeader("Content-Type","application/x-www-form-urlencoded"),l.send(c)}catch(t){e.set("use_jsonp",!0),Vb(a,b,c,d,f)}}
function Xb(a,b,c,d,e){function f(){d.get("use_jsonp")||b.L?Vb(a,n,c,b.method,k):Wb(a,n,l,b.method,d,k,W,Hb)}function k(c,d,h){"function"===typeof a.aa&&a.aa(n,b.method,t,c,h,d);c&&0<w&&"5"===(h||"").toString().substring(0,1)?(w--,window.setTimeout(function(){f()},pa)):e(c,d)}sa="/v1/pageview"===b.endpoint&&c&&c.journey_displayed?b.endpoint+"-1-brtt":b.endpoint+"-brtt";("/v1/url"===b.endpoint||"/v1/has-app"===b.endpoint)&&1<Object.keys(u).length&&(delete u["-brtt"],c.instrumentation=q(B({},u)),u=
{});if(v)for(var m=["browser_fingerprint_id","alternative_browser_fingerprint_id","identity_id","session_id"],h=0;h<m.length;h++)c.hasOwnProperty(m[h])&&delete c[m[h]];m=Tb(a,b,c);if(m.error)return e(Error(q({message:m.error,endpoint:b.endpoint,data:c})));var n,l="";"GET"===b.method?n=m.url+"?"+m.data:(n=m.url,l=m.data);var t;d.get("use_jsonp")||b.L?t=c:t=l;var w=oa;if(v&&xa(n,c))return wa?k(Error("Requested operation cannot be completed since tracking is disabled"),null,300):k(null,{},200);var W=
!1,Hb;"/v1/qr-code"===b.endpoint&&(W=!0,Hb="arraybuffer");f()};function M(a){a&&a.parentNode.removeChild(a)}function Yb(a,b){a&&!a.className.match(new RegExp("(\\s|^)"+b+"(\\s|$)"))&&(a.className+=" "+b)}function Zb(a){var b=document.body;b&&b.className.match(new RegExp("(\\s|^)"+a+"(\\s|$)"))&&(b.className=b.className.replace(new RegExp("(\\s|^)"+a+"(\\s|$)")," "))}function $b(a){var b=new Date;return b.setDate(b.getDate()+a)}
function ac(a){return document.body.currentStyle?document.body.currentStyle[Na(a)]:window.getComputedStyle(document.body).getPropertyValue(a)}
function bc(a){function b(a){function c(){return Math.max(document.documentElement.clientHeight,window.innerHeight||0)/100}function e(){return Math.max(document.documentElement.clientWidth,window.innerWidth||0)/100}if(!a)return 0;var f=a.replace(/[0-9,\.]/g,"");a=a.match(/\d+/g);var k=parseInt(0<a.length?a[0]:"0",10);return parseInt({px:function(a){return a},em:function(a){return document.body.currentStyle?a*b(document.body.currentStyle.fontSize):a*parseFloat(window.getComputedStyle(document.body).fontSize)},
rem:function(a){return document.documentElement.currentStyle?a*b(document.documentElement.currentStyle.fontSize):a*parseFloat(window.getComputedStyle(document.documentElement).fontSize)},vw:function(a){return a*e()},vh:function(a){return a*c()},vmin:function(a){return a*Math.min(c(),e())},vmax:function(a){return a*Math.max(c(),e())},"%":function(){return document.body.clientWidth/100*k}}[f](k),10)}return(b("76px")+b(a)).toString()+"px"}
function cc(a,b){var c=a.get("hideBanner",!0);if(b.ra&&navigator&&Number(navigator.doNotTrack))return!1;try{"string"===typeof c&&(c=p(c))}catch(e){c=!1}var c="number"===typeof c?new Date>=new Date(c):!c,d=b.K;"number"===typeof d&&(d=!1);return!document.getElementById("branch-banner")&&!document.getElementById("branch-banner-iframe")&&(c||d)&&(b.ta&&!C()||b.P&&"android"===C()||b.ua&&"ipad"===C()||b.U&&"ios"===C()||b.R&&"blackberry"===C()||b.T&&"windows_phone"===C()||b.S&&"kindle"===C())};function dc(a,b){return"#branch-banner-iframe { position: "+("top"!==b||a?"fixed":"absolute")+"; }\n"}
function ec(a,b){var c=".branch-banner-is-active { -webkit-transition: all 0.375s ease; transition: all 00.375s ease; }\n#branch-banner { width:100%; z-index: 99999; font-family: Helvetica Neue, Sans-serif; -webkit-font-smoothing: antialiased; -webkit-user-select: none; -moz-user-select: none; user-select: none; -webkit-transition: all 0.25s ease; transition: all 00.25s ease; }\n#branch-banner .button{ border: 1px solid "+(a.buttonBorderColor||("dark"===a.theme?"transparent":"#ccc"))+"; background: "+
(a.buttonBackgroundColor||"#fff")+"; color: "+(a.buttonFontColor||"#000")+"; cursor: pointer; margin-top: 0px; font-size: 14px; display: inline-block; margin-left: 5px; font-weight: 400; text-decoration: none; border-radius: 4px; padding: 6px 12px; transition: all .2s ease;}\n#branch-banner .button:hover { border: 1px solid "+(a.buttonBorderColorHover||("dark"===a.theme?"transparent":"#BABABA"))+"; background: "+(a.buttonBackgroundColorHover||"#E0E0E0")+"; color: "+(a.buttonFontColorHover||"#000")+
";}\n#branch-banner .button:focus { outline: none; }\n#branch-banner * { margin-right: 4px; position: relative; line-height: 1.2em; }\n#branch-banner-close { font-weight: 400; cursor: pointer; float: left; z-index: 2;padding: 0 5px 0 5px; margin-right: 0; }\n#branch-banner .content { width:100%; overflow: hidden; height: 76px; background: rgba(255, 255, 255, 0.95); color: #333; "+("top"===a.position?"border-bottom":"border-top")+': 1px solid #ddd; }\n#branch-banner-close { color: #000; font-size: 24px; top: 14px; opacity: .5; transition: opacity .3s ease; }\n#branch-banner-close:hover { opacity: 1; }\n#branch-banner .title { font-size: 18px; font-weight:bold; color: #555; }\n#branch-banner .description { font-size: 12px; font-weight: normal; color: #777; max-height: 30px; overflow: hidden; }\n#branch-banner .icon { float: left; padding-bottom: 40px; margin-right: 10px; margin-left: 5px; }\n#branch-banner .icon img { width: 63px; height: 63px; margin-right: 0; }\n#branch-banner .reviews { font-size:13px; margin: 1px 0 3px 0; color: #777; }\n#branch-banner .reviews .star { display:inline-block; position: relative; margin-right:0; }\n#branch-banner .reviews .star span { display: inline-block; margin-right: 0; color: #555; position: absolute; top: 0; left: 0; }\n#branch-banner .reviews .review-count { font-size:10px; }\n#branch-banner .reviews .star .half { width: 50%; overflow: hidden; display: block; }\n#branch-banner .content .left { padding: 6px 5px 6px 5px; }\n#branch-banner .vertically-align-middle { top: 50%; transform: translateY(-50%); -webkit-transform: translateY(-50%); -ms-transform: translateY(-50%); }\n#branch-banner .details > * { display: block; }\n#branch-banner .content .left { height: 63px; }\n#branch-banner .content .right { float: right; height: 63px; margin-bottom: 50px; padding-top: 22px; z-index: 1; }\n#branch-banner .right > div { float: left; }\n#branch-banner-action { top: 17px; }\n#branch-banner .content:after { content: ""; position: absolute; left: 0; right: 0; top: 100%; height: 1px; background: rgba(0, 0, 0, 0.2); }\n#branch-banner .theme-dark.content { background: rgba(51, 51, 51, 0.95); }\n#branch-banner .theme-dark #branch-banner-close{ color: #fff; text-shadow: 0 1px 1px rgba(0, 0, 0, .15); }\n#branch-banner .theme-dark .details { text-shadow: 0 1px 1px rgba(0, 0, 0, .15); }\n#branch-banner .theme-dark .title { color: #fff; }\n#branch-banner .theme-dark .description { color: #fff; }\n#branch-banner .theme-dark .reviews { color: #888; }\n#branch-banner .theme-dark .reviews .star span{ color: #fff; }\n#branch-banner .theme-dark .reviews .review-count{ color: #fff; }\n',
d=C();"ios"!==d&&"ipad"!==d||!a.U?"android"===d&&a.P?c+="#branch-banner { position: absolute; }\n#branch-banner .content .left .details .title { font-size: 12px; }\n#branch-mobile-action { white-space: nowrap; }\n#branch-banner .content .left .details .description { font-size: 11px; font-weight: normal; }\n@media only screen and (min-device-width: 320px) and (max-device-width: 350px) { #branch-banner .content .right { max-width: 120px; } }\n@media only screen and (min-device-width: 351px) and (max-device-width: 400px) and (orientation: landscape) { #branch-banner .content .right { max-width: 150px; } }\n@media only screen and (min-device-width: 401px) and (max-device-width: 480px) and (orientation: landscape) { #branch-banner .content .right { max-width: 180px; } }\n#branch-banner #branch-banner-close,#branch-banner .theme-dark #branch-banner-close { height:17px; width: 17px; text-align: center; font-size: 15px; top: 24px; border-radius:14px; border:0; line-height:14px; color:#b1b1b3; background:#efefef; padding: 0; opacity: 1; }\n#branch-banner .button { top: 0; text-decoration:none; border-bottom: 3px solid #A4C639; padding: 0 10px; height: 24px; line-height: 24px; text-align: center; color: #fff; margin-top: 2px; font-weight: bold; background-color: #A4C639; border-radius: 5px; }\n#branch-banner .button:hover { border-bottom:3px solid #8c9c29; background-color: #c1d739; }\n":
"blackberry"===d&&a.R?c+="#branch-banner { position: absolute; }\n#branch-banner .content .left .details .title { font-size: 12px; }\n#branch-mobile-action { white-space: nowrap; }\n#branch-banner .content .left .details .description { font-size: 11px; font-weight: normal; }\n@media only screen and (min-device-width: 320px) and (max-device-width: 350px) { #branch-banner .content .right { max-width: 120px; } }\n@media only screen and (min-device-width: 351px) and (max-device-width: 400px) and (orientation: landscape) { #branch-banner .content .right { max-width: 150px; } }\n@media only screen and (min-device-width: 401px) and (max-device-width: 480px) and (orientation: landscape) { #branch-banner .content .right { max-width: 180px; } }\n":
"windows_phone"===d&&a.T?c+="#branch-banner { position: absolute; }\n#branch-banner .content .left .details .title { font-size: 12px; }\n#branch-mobile-action { white-space: nowrap; }\n#branch-banner .content .left .details .description { font-size: 11px; font-weight: normal; }\n@media only screen and (min-device-width: 320px) and (max-device-width: 350px) { #branch-banner .content .right { max-width: 120px; } }\n@media only screen and (min-device-width: 351px) and (max-device-width: 400px) and (orientation: landscape) { #branch-banner .content .right { max-width: 150px; } }\n@media only screen and (min-device-width: 401px) and (max-device-width: 480px) and (orientation: landscape) { #branch-banner .content .right { max-width: 180px; } }\n":
"kindle"===d&&a.S?c+="#branch-banner { position: absolute; }\n#branch-banner .content .left .details .title { font-size: 12px; }\n#branch-mobile-action { white-space: nowrap; }\n#branch-banner .content .left .details .description { font-size: 11px; font-weight: normal; }\n@media only screen and (min-device-width: 320px) and (max-device-width: 350px) { #branch-banner .content .right { max-width: 120px; } }\n@media only screen and (min-device-width: 351px) and (max-device-width: 400px) and (orientation: landscape) { #branch-banner .content .right { max-width: 150px; } }\n@media only screen and (min-device-width: 401px) and (max-device-width: 480px) and (orientation: landscape) { #branch-banner .content .right { max-width: 180px; } }\n":
(c+="#branch-banner { position: fixed; min-width: 600px; }\n#branch-sms-block * { vertical-align: bottom; font-size: 15px; }\n#branch-sms-block { display: inline-block; }\n#branch-banner input{ border: 1px solid #ccc; font-weight: 400; border-radius: 4px; height: 30px; padding: 5px 7px 4px; width: 145px; font-size: 14px;}\n#branch-banner input:focus { outline: none; }\n#branch-banner input.error { color: rgb(194, 0, 0); border-color: rgb(194, 0, 0); }\n#branch-banner .branch-icon-wrapper { width:25px; height: 25px; vertical-align: middle; display: inline-block; margin-top: -18px; }\n@keyframes branch-spinner { 0% { transform: rotate(0deg); -webkit-transform: rotate(0deg); -ms-transform: rotate(0deg); } 100% { transform: rotate(360deg); -webkit-transform: rotate(360deg); -ms-transform: rotate(360deg); } }\n@-webkit-keyframes branch-spinner { 0% { transform: rotate(0deg); -webkit-transform: rotate(0deg); -ms-transform: rotate(0deg); } 100% { transform: rotate(360deg); -webkit-transform: rotate(360deg); -ms-transform: rotate(360deg); } }\n#branch-spinner { -webkit-animation: branch-spinner 1s ease-in-out infinite; animation: branch-spinner 1s ease-in-out infinite; transition: all 0.7s ease-in-out; border:2px solid #ddd; border-bottom-color:#428bca; width:80%; height:80%; border-radius:50%; -webkit-font-smoothing: antialiased !important; }\n#branch-banner .theme-dark input { border-color: transparent; }\n",
c=window.ActiveXObject?c+"#branch-banner .checkmark { color: #428bca; font-size: 22px; }\n":c+"#branch-banner .checkmark { stroke: #428bca; stroke-dashoffset: 745.74853515625; stroke-dasharray: 745.74853515625; -webkit-animation: dash 2s ease-out forwards; animation: dash 2s ease-out forwards; }\n@-webkit-keyframes dash { 0% { stroke-dashoffset: 745.748535 15625; } 100% { stroke-dashoffset: 0; } }\n@keyframes dash { 0% { stroke-dashoffset: 745.74853515625; } 100% { stroke-dashoffset: 0; } }\n"):c+=
"#branch-banner { position: absolute; }\n#branch-banner .content .left .details .title { font-size: 12px; }\n#branch-mobile-action { white-space: nowrap; }\n#branch-banner .content .left .details .description { font-size: 11px; font-weight: normal; }\n@media only screen and (min-device-width: 320px) and (max-device-width: 350px) { #branch-banner .content .right { max-width: 120px; } }\n@media only screen and (min-device-width: 351px) and (max-device-width: 400px) and (orientation: landscape) { #branch-banner .content .right { max-width: 150px; } }\n@media only screen and (min-device-width: 401px) and (max-device-width: 480px) and (orientation: landscape) { #branch-banner .content .right { max-width: 180px; } }\n";
c+=a.fa;a.F&&(c+="body { margin: 0; }\n",d=document.createElement("style"),d.type="text/css",d.id="branch-iframe-css",H(d),d.innerHTML="body { -webkit-transition: all 0.375s ease; transition: all 00.375s ease; }\n#branch-banner-iframe { box-shadow: 0 0 5px rgba(0, 0, 0, .35); width: 1px; min-width:100%; left: 0; right: 0; border: 0; height: 76px; z-index: 99999; -webkit-transition: all 0.25s ease; transition: all 00.25s ease; }\n"+(C()?dc(a.ma,a.position):dc(a.ga,a.position)),(document.head||document.getElementsByTagName("head")[0]).appendChild(d));
d=document.createElement("style");d.type="text/css";d.id="branch-css";d.innerHTML=c;H(d);c=a.F?b.contentWindow.document:document;(c=c.head||c.getElementsByTagName("head")[0])&&"function"===typeof c.appendChild&&c.appendChild(d);"top"===a.position?b.style.top="-76px":"bottom"===a.position&&(b.style.bottom="-76px")};function fc(a,b){var c;if(a.B||a.M){if(a.B){c="";for(var d=0;5>d;d++)c+='<span class="star"><svg class="star" fill="#555555" height="12" viewBox="3 2 20 19" width="12"><path d="M22 9.24l-7.19-.62L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21 12 17.27 18.18 21l-1.63-7.03L22 9.24zM12 15.4l-3.76 2.27 1-4.28-3.32-2.88 4.38-.38L12 6.1l1.71 4.04 4.38.38-3.32 2.88 1 4.28L12 15.4z"/><path d="M0 0h24v24H0z" fill="none"/><foreignObject display="none"><span class="star">\u2606</span></foreignObject></svg>',a.B>d&&
(c+=d+1>a.B&&a.B%1?'<span class="half"><svg fill="#555555" height="12" viewBox="3 2 20 19" width="12"><defs><path d="M0 0h24v24H0V0z" id="a"/></defs><clipPath id="b"><use overflow="visible" xlink:href="#a"/></clipPath><path clip-path="url(#b)" d="M22 9.24l-7.19-.62L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21 12 17.27 18.18 21l-1.63-7.03L22 9.24zM12 15.4V6.1l1.71 4.04 4.38.38-3.32 2.88 1 4.28L12 15.4z"/></svg><foreignObject display="none"><span class="half">\u2605</span></foreignObject></span>':'<span class="full"><svg fill="#555555" height="12" viewBox="3 2 20 19" width="12"><path d="M0 0h24v24H0z" fill="none"/><path d="M12 17.27L18.18 21l-1.64-7.03L22 9.24l-7.19-.61L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21z"/><path d="M0 0h24v24H0z" fill="none"/><foreignObject display="none"><span class="full">\u2605</span></foreignObject></svg> </span>'),
c+="</span>";c='<span class="stars">'+c+"</span>"}else c="";c='<div class="reviews">'+c+(a.M?'<span class="review-count">'+a.M+"</span>":"")+"</div>"}else c="";return'<div class="content'+(a.theme?" theme-"+a.theme:"")+'"><div class="right">'+b+'</div><div class="left">'+(a.ia?"":'<div id="branch-banner-close" class="branch-animation" aria-label="Close">&times;</div>')+'<div class="icon"><img src="'+a.icon+'" alt="Application icon"></div><div class="details vertically-align-middle"><div class="title">'+
a.title+"</div>"+c+'<div class="description">'+a.description+"</div></div></div></div>"}
function gc(a,b){var c='<div id="branch-sms-form-container">'+(C()?'<a id="branch-mobile-action" class="button" href="#" target="_parent">'+((L(b)||{}).has_app?a.na:a.ja)+"</a>":'<div class="branch-icon-wrapper" id="branch-loader-wrapper" style="opacity: 0;"><div id="branch-spinner"></div></div><div id="branch-sms-block"><form id="sms-form"><input type="phone" aria-label="Enter phone number" class="branch-animation" name="branch-sms-phone" id="branch-sms-phone" placeholder="'+a.pa+'"><button type="submit" id="branch-sms-send" class="branch-animation button">'+
a.sa+"</button></form></div>")+"</div>";if(a.F){var d=document.createElement("iframe");d.src="about:blank";d.style.overflow="hidden";d.scrolling="no";d.id="branch-banner-iframe";d.className="branch-animation";H(d);document.body.appendChild(d);var e=C(),c='<html><head></head><body class="'+("ios"===e||"ipad"===e?"branch-banner-ios":"android"===e?"branch-banner-android":"branch-banner-desktop")+'"><div id="branch-banner" class="branch-animation">'+fc(a,c)+"</body></html>";d.contentWindow.document.open();
d.contentWindow.document.write(c);d.contentWindow.document.close()}else d=document.createElement("div"),d.id="branch-banner",d.className="branch-animation",d.innerHTML=fc(a,c),document.body.appendChild(d);return c=d};function hc(a,b,c,d){function e(){k();h.style.background="#FFD4D4";m.className="error";setTimeout(function(){h.style.background="#FFFFFF";m.className=""},2E3)}function f(){t=a.createElement("div");t.className="branch-icon-wrapper";t.id="branch-checkmark";t.style="opacity: 0;";t.innerHTML=window.ActiveXObject?'<span class="checkmark">&#x2713;</span>':'<svg version="1.1" id="Layer_1" x="0px" y="0px" viewBox="0 0 98.5 98.5" enable-background="new 0 0 98.5 98.5" xml:space="preserve"><path class="checkmark" fill="none" stroke-width="8" stroke-miterlimit="10" d="M81.7,17.8C73.5,9.3,62,4,49.2,4C24.3,4,4,24.3,4,49.2s20.3,45.2,45.2,45.2s45.2-20.3,45.2-45.2c0-8.6-2.4-16.6-6.5-23.4l0,0L45.6,68.2L24.7,47.3"/></svg>';
l.appendChild(t);h.style.opacity="0";m.style.opacity="0";n.style.opacity="0";setTimeout(function(){t.style.opacity="1"},20);m.value=""}function k(){h.removeAttribute("disabled");m.removeAttribute("disabled");h.style.opacity="1";m.style.opacity="1";n.style.opacity="0"}var m=a.getElementById("branch-sms-phone"),h=a.getElementById("branch-sms-send"),n=a.getElementById("branch-loader-wrapper"),l=a.getElementById("branch-sms-form-container"),t;if(m){var w=m.value;/^\d{7,}$/.test(w.replace(/[\s()+\-\.]|ext/gi,
""))?(N(b,"willSendBannerSMS"),h.setAttribute("disabled",""),m.setAttribute("disabled",""),h.style.opacity=".4",m.style.opacity=".4",n.style.opacity="1",m.className="",b.sendSMS(w,d,c,function(a){a?(N(b,"sendBannerSMSError"),e()):(N(b,"didSendBannerSMS"),f(),setTimeout(function(){l.removeChild(t);k()},3E3))})):e()}}
function ic(a,b,c,d){function e(a,c){"function"===typeof a&&(c=a,a={});a=a||{};"top"===b.position?k.style.top="-76px":"bottom"===b.position&&(k.style.bottom="-76px");"number"===typeof b.K?d.set("hideBanner",$b(b.K),!0):d.set("hideBanner",!0,!0);a.Z?("top"===b.position?document.body.style.marginTop=n:"bottom"===b.position&&(document.body.style.marginBottom=t),Zb("branch-banner-is-active"),M(k),M(document.getElementById("branch-css")),c()):(setTimeout(function(){M(k);M(document.getElementById("branch-css"));
c()},270),setTimeout(function(){"top"===b.position?document.body.style.marginTop=n:"bottom"===b.position&&(document.body.style.marginBottom=t);Zb("branch-banner-is-active")},20))}function f(){"top"===b.position?k.style.top="0":"bottom"===b.position&&(k.style.bottom="0");N(a,"didShowBanner")}if(!cc(d,b))return N(a,"willNotShowBanner"),null;N(a,"willShowBanner");var k=gc(b,d);ec(b,k);c.channel=c.channel||"app banner";var m=b.F?k.contentWindow.document:document;if(C()){b.open_app=b.oa;b.append_deeplink_path=
b.da;b.make_new_link=b.la;b.deepview_type="banner";a.deepview(c,b);var h=m.getElementById("branch-mobile-action");h&&(h.onclick=function(b){b.preventDefault();a.deepviewCta()})}else m.getElementById("sms-form")?m.getElementById("sms-form").addEventListener("submit",function(d){d.preventDefault();hc(m,a,b,c)}):k.onload=function(){m=k.contentWindow.document;m.getElementById("sms-form")&&m.getElementById("sms-form").addEventListener("submit",function(d){d.preventDefault();hc(m,a,b,c)})};var h=ac("margin-top"),
n=document.body.style.marginTop,l=ac("margin-bottom"),t=document.body.style.marginBottom,w=m.getElementById("branch-banner-close");w&&(w.onclick=function(b){b.preventDefault();N(a,"willCloseBanner");e({},function(){N(a,"didCloseBanner")})});Yb(document.body,"branch-banner-is-active");"top"===b.position?document.body.style.marginTop=bc(h):"bottom"===b.position&&(document.body.style.marginBottom=bc(l));b.Z?f():setTimeout(f,20);return e};var jc={},kc,lc=1,O="top",mc="absolute",P="76px",nc=!1,oc=!1,Q=[],pc=!1,qc=window.innerHeight,rc=window.innerWidth;window.innerHeight<window.innerWidth&&(qc=window.innerWidth,rc=window.innerHeight);
var sc=0,tc=0,uc=!1,vc=/<script type="application\/json">((.|\s)*?)<\/script>/,wc=/<script type="text\/javascript">((.|\s)*?)<\/script>/,xc=/<style type="text\/css" id="branch-css">((.|\s)*?)<\/style>/,yc=/<style type="text\/css" id="branch-iframe-css">((.|\s)*?)<\/style>/,zc=/#branch-banner-spacer {((.|\s)*?)}/,Ac=/margin-bottom: (.*?);/,R=null,Bc=null,Cc=!1,Dc=!1,Ec=!1,Fc=!1,Gc=!1,Hc="",Ic=[],S=null;function Jc(a){if(a=a.match(vc))return p(a[1])}
function Kc(a){var b=document.createElement("style");b.type="text/css";b.id="branch-iframe-css";sc=ac("margin-top");var c=+sc.slice(0,-2);tc=ac("margin-bottom");var d=+tc.slice(0,-2),e=+P.slice(0,-2);a||("top"===O?document.body.style.marginTop=(+e+c).toString()+"px":"bottom"===O&&(document.body.style.marginBottom=(+e+d).toString()+"px"));0<Q.length&&Q.forEach(function(a){var b,c=window.getComputedStyle(a);c&&(b=nc&&"fixed"===c.getPropertyValue("position"));b||(a.style.marginTop=P)});"top"===Hc&&Hc!==
O&&Gc&&Ic&&0<Ic.length&&Ic.forEach(function(a){a.style.marginTop=0});Gc=!1;Hc="";Ic=[];Fc=!1;a?b.innerHTML=a:b.innerHTML=Lc();H(b);document.head.appendChild(b)}
function Lc(){var a="",b="";document.body.style.transition="";document.getElementById("branch-banner-iframe")&&(document.getElementById("branch-banner-iframe").style.transition="");Ec||(a="body { -webkit-transition: all 0.375s ease; }\n",document.body.style.transition="all 00.375s ease",b="-webkit-transition: all 0.25s ease; transition: all 00.25s ease;");return(a?a:"")+("#branch-banner-iframe { box-shadow: 0 0 5px rgba(0, 0, 0, .35); width: 1px; min-width:100%; left: 0; right: 0; border: 0; height: "+
P+"; z-index: 99999; "+b+" }\n#branch-banner-iframe { position: "+mc+"; }\n@media only screen and (orientation: landscape) { body { "+("top"===O?"margin-top: ":"margin-bottom: ")+(nc?rc+"px":P)+"; }\n#branch-banner-iframe { height: "+(nc?rc+"px":P)+"; }")}
function Mc(a,b){Yb(document.body,"branch-banner-is-active");nc&&"fixed"===mc&&Yb(document.body,"branch-banner-no-scroll");setTimeout(function(){b?(a.style.top=null,a.style.bottom=null):"top"===O?a.style.top="0":"bottom"===O&&(S&&S.journey_link_data&&!S.journey_link_data.safeAreaRequired?a.style.bottom="0":(pc=!0,document.getElementById("branch-banner-iframe").style.transition="all 0s",Nc(!1,!0),window.addEventListener("resize",Oc),window.addEventListener("scroll",Pc)));N(R,"didShowJourney",S);Cc=
!0},20)}function Oc(){pc&&Nc(!1,!1)}function Pc(){pc&&(window.pageYOffset>window.innerHeight?Nc(!0,!1):Nc(!1,!1))}function Nc(a,b){var c=document.getElementById("branch-banner-iframe"),d=c.offsetHeight,e=c.offsetTop,f=window.innerHeight;b&&window.pageYOffset?c.style.bottom="0":a?c.style.top=f-d+d/2+"px":f-e!=d&&(c.style.top=""+(f-d)+"px")}function Qc(a){a=a.globalDismissPeriod;if("number"===typeof a){if(-1===a)a=!0;else{var b=new Date;a=b.setSeconds(b.getSeconds()+a)}return a}}
function Rc(a,b,c,d,e,f,k){var m=T;d&&e&&(Array.prototype.forEach.call(e.contentWindow.document.querySelectorAll("#branch-mobile-action"),function(a){a.addEventListener("click",function(){N(R,"didClickJourneyCTA",S);Fc=!0;d();Sc(e)})}),Tc(".branch-banner-continue","didClickJourneyContinue",c,e,a,b,f,k,m),Tc(".branch-banner-close","didClickJourneyClose",c,e,a,b,f,k,m))}
function Tc(a,b,c,d,e,f,k,m,h){Array.prototype.forEach.call(d.contentWindow.document.querySelectorAll(a),function(a){a.addEventListener("click",function(){Uc(b,c,d,e,f,k,m,h)})})}function Vc(a,b,c){var d=a.get("journeyDismissals",!0),d=d?p(d):{};d[c]={view_id:b,dismiss_time:Date.now()};a.set("journeyDismissals",q(d),!0)}
function Wc(a){return void 0===a||null===a?null:a.replace(/&lt;/g,"<").replace(/&gt;/g,">").replace(/&amp;/g,"&").replace(/&quot;/g,'"').replace(/&apos;/g,"'").replace(/&brvbar;/g,"\u00a6").replace(/&laquo;/g,"\u00ab").replace(/&acute;/g,"\u00b4").replace(/&middot;/g,"\u00b7").replace(/&raquo;/g,"\u00bb").replace(/&amp;/g,"&").replace(/&iquest;/g,"\u00bf").replace(/&times;/g,"\u00d7").replace(/&divide;/g,"\u00f7").replace(/&Agrave;/g,"\u00c0").replace(/&Aacute;/g,"\u00c1").replace(/&Acirc;/g,"\u00c2").replace(/&Atilde;/g,
"\u00c3").replace(/&Auml;/g,"\u00c4").replace(/&Aring;/g,"\u00c5").replace(/&AElig;/g,"\u00c6").replace(/&Ccedil;/g,"\u00c7").replace(/&Egrave;/g,"\u00c8").replace(/&Eacute;/g,"\u00c9").replace(/&Ecirc;/g,"\u00ca").replace(/&Euml;/g,"\u00cb").replace(/&Igrave;/g,"\u00cc").replace(/&Iacute;/g,"\u00cd").replace(/&Icirc;/g,"\u00ce").replace(/&Iuml;/g,"\u00cf").replace(/&ETH;/g,"\u00d0").replace(/&Ntilde;/g,"\u00d1").replace(/&Ograve;/g,"\u00d2").replace(/&Oacute;/g,"\u00d3").replace(/&Ocirc;/g,"\u00d4").replace(/&Otilde;/g,
"\u00d5").replace(/&Ouml;/g,"\u00d6").replace(/&Oslash;/g,"\u00d8").replace(/&Ugrave;/g,"\u00d9").replace(/&Uacute;/g,"\u00da").replace(/&Ucirc;/g,"\u00db").replace(/&Uuml;/g,"\u00dc").replace(/&Yacute;/g,"\u00dd").replace(/&THORN;/g,"\u00de").replace(/&szlig;/g,"\u00df").replace(/&agrave;/g,"\u00e0").replace(/&aacute;/g,"\u00e1").replace(/&acirc;/g,"\u00e2").replace(/&atilde;/g,"\u00e3").replace(/&auml;/g,"\u00e4").replace(/&aring;/g,"\u00e5").replace(/&aelig;/g,"\u00e6").replace(/&ccedil;/g,"\u00e7").replace(/&egrave;/g,
"\u00e8").replace(/&eacute;/g,"\u00e9").replace(/&ecirc;/g,"\u00ea").replace(/&euml;/g,"\u00eb").replace(/&igrave;/g,"\u00ec").replace(/&iacute;/g,"\u00ed").replace(/&icirc;/g,"\u00ee").replace(/&iuml;/g,"\u00ef").replace(/&eth;/g,"\u00f0").replace(/&ntilde;/g,"\u00f1").replace(/&ograve;/g,"\u00f2").replace(/&oacute;/g,"\u00f3").replace(/&ocirc;/g,"\u00f4").replace(/&otilde;/g,"\u00f5").replace(/&ouml;/g,"\u00f6").replace(/&oslash;/g,"\u00f8").replace(/&ugrave;/g,"\u00f9").replace(/&uacute;/g,"\u00fa").replace(/&ucirc;/g,
"\u00fb").replace(/&uuml;/g,"\u00fc").replace(/&yacute;/g,"\u00fd").replace(/&thorn;/g,"\u00fe").replace(/&yuml;/g,"\u00ff")}
function Xc(a,b){var c={},d=Ua();d&&0<Object.keys(d).length&&(c.hosted_deeplink_data=d);c=a.I(Yc(null,c),null,R,!0);if(S&&S.journey_link_data){F(c,"journey_id",S.journey_link_data.journey_id);F(c,"journey_name",Wc(S.journey_link_data.journey_name));F(c,"view_id",S.journey_link_data.view_id);F(c,"view_name",Wc(S.journey_link_data.view_name));F(c,"channel",Wc(S.journey_link_data.channel));F(c,"campaign",Wc(S.journey_link_data.campaign));try{F(c,"tags",JSON.stringify(S.journey_link_data.tags))}catch(e){c.tags=
JSON.stringify([])}}F(c,"dismissal_source",b);return c}
function Uc(a,b,c,d,e,f,k,m){var h=k?0:Qc(f);N(R,a,S);Fc=!0;Sc(c);if(!k)if(void 0!==h&&b.set("globalJourneysDismiss",h,!0),Vc(b,d,e),f.dismissRedirect)window.location=f.dismissRedirect;else{var n=function(){R.removeListener(n);var b=Xc(m,ua[a]);R.b(Fb,b,function(a,c){!a&&"object"===typeof c&&c.template&&m.O(c,null,!1)&&m.J(c.template,b,b.branch_view_id||c.event_data.branch_view_data.id,c.event_data.branch_view_data,!1,c.journey_link_data)})};R.addListener("branch_internal_event_didCloseJourney",n)}}
function Yc(a,b){return B({url:a&&a.url||Ea(),user_agent:navigator.userAgent,language:navigator.language,screen_width:screen.width||-1,screen_height:screen.height||-1,window_device_pixel_ratio:window.devicePixelRatio||1},b||{})}
function Sc(a,b){Dc||(uc=!0);if(Ec&&!Dc){document.body.style.transition="all 00.375s ease";document.getElementById("branch-banner-iframe").style.transition="all 00.25s ease";var c=document.getElementById("branch-iframe-css").innerHTML+"\n";document.getElementById("branch-iframe-css").innerHTML="";document.getElementById("branch-iframe-css").innerHTML=c+"body { -webkit-transition: all 0.375s ease; }\n#branch-banner-iframe { -webkit-transition: all 0.25s ease; }\n"}"top"===O?a.style.top="-"+P:"bottom"===
O&&(a.style.bottom="-"+P);N(R,"willCloseJourney",S);setTimeout(function(){M(a);M(document.getElementById("branch-css"));M(document.getElementById("branch-iframe-css"));M(document.getElementById("branch-journey-cta"));(!Dc||Fc)&&Q&&0<Q.length?Q.forEach(function(a){a.style.marginTop=0}):(Gc=Dc,Hc=O,Ic=Q);"top"===O?document.body.style.marginTop=sc:"bottom"===O&&(document.body.style.marginBottom=tc);Zb("branch-banner-is-active");Zb("branch-banner-no-scroll");pc&&(pc=!1,window.removeEventListener("resize",
Oc),window.removeEventListener("scroll",Pc));N(R,"didCloseJourney",S);b||N(R,"branch_internal_event_didCloseJourney",S);Cc=!1;setTimeout(function(){uc=!1},250)},Dc?0:270)}
function Zc(a){var b={banner_id:kc};if(a&&"object"===typeof a&&0<Object.keys(a).length){var c=["browser_fingerprint_id","app_id","source","open_app","link_click_id"];if(a&&"object"===typeof a&&!Array.isArray(a)&&0<Object.keys(a).length&&c&&Array.isArray(c)&&0<c.length)for(var d in a)a.hasOwnProperty(d)&&-1<c.indexOf(d)&&delete a[d];b.journey_link_data={};B(b.journey_link_data,a)}S=b}function $c(){return jc&&R&&R.m&&R.m.data?R.m.data.$journeys_cta:!1}
function ad(){if($c())return R.m.data.$journeys_cta}function bd(a){try{if($c()&&0<ad().length)return a.replace(/validate[(].+[)];/g,'validate("'+ad()+'")').replace("window.top.location.replace(","window.top.location = ")}catch(b){}return a};var T={};
function cd(a,b){var c=b?"OPEN":"GET",d=a,e=Jc(d);e&&e.bannerHeight&&e.position&&e.sticky?(P=e.bannerHeight,O=e.position,mc=e.sticky):(d=d.match(zc))?(O="top",(d=d[1].match(Ac))&&(P=d[1]),mc="absolute"):(O="bottom",mc="fixed");if(-1!==P.indexOf("vh")||-1!==P.indexOf("%"))d=P.indexOf("vh")?P.slice(0,-2):P.slice(0,-1),P=d/100*qc+"px",100>d?oc=!0:nc=!0;if(d=Jc(a)){var f;b&&d&&d.ctaText&&d.ctaText.has_app?f=d.ctaText.has_app:d&&d.ctaText&&d.ctaText.no_app&&(f=d.ctaText.no_app);c=f;Q=[];if(d&&d.injectorSelector&&
(f=document.querySelectorAll(d.injectorSelector)))for(d=0;d<f.length;d++)Q.push(f[d].parentElement)}f=(f=a.match(xc))?f[1]:void 0;if(d=a.match(wc))d=d[1],e=document.createElement("script"),e.id="branch-journey-cta",H(e),e.innerHTML=d,document.body.appendChild(e);d=(d=a.match(yc))?d[1]:void 0;var e=a,k=e.match(vc),m=e.match(wc),h=e.match(xc),n=e.match(yc);k&&(e=e.replace(vc,""));m&&(e=e.replace(wc,""));h&&(e=e.replace(xc,""));n&&(e=e.replace(yc,""));a=e;e=document.createElement("iframe");e.src="about:blank";
e.style.overflow="hidden";e.scrolling="no";e.id="branch-banner-iframe";e.className="branch-animation";e.title="Branch Banner";e.setAttribute("aria-label","Branch Banner");H(e);document.body.appendChild(e);k=C();k='<html><head></head><body class="'+("ios"===k||"ipad"===k?"branch-banner-ios":"android"===k?"branch-banner-android":"branch-banner-desktop")+'">'+a+"</body></html>";e.contentWindow.document.open();e.contentWindow.document.write(k);e.contentWindow.document.close();Kc(d);k=document.createElement("style");
k.type="text/css";k.id="branch-css";k.innerHTML=f;H(k);f=e.contentWindow.document;f.head.appendChild(k);if(oc||nc){var l=f.getElementsByClassName("branch-banner-content")[0];l&&(l.style.height=P)}"top"===O?e.style.top="-"+P:"bottom"===O&&(e.style.bottom="-"+P);try{var l=f.getElementsByClassName("branch-banner-content")[0],t=window.getComputedStyle(l).getPropertyValue("background-color").split(", ");t[3]&&!parseFloat(t[3])&&(e.style.boxShadow="none")}catch(w){}e.contentWindow.document.getElementById("branch-mobile-action").innerHTML=
c;N(R,"willShowJourney",S);Mc(e,d);return e}T.O=function(a,b,c){if(document.getElementById("branch-banner")||document.getElementById("branch-banner-iframe")||document.getElementById("branch-banner-container")||!C()||!a.event_data||!a.template)return!1;if(c)return!0;(a=!a.event_data.branch_view_data.id||b&&b.no_journeys)||(a=R,b=a.c.get("globalJourneysDismiss",!0),!0===b||b>Date.now()?a=!0:(a.c.remove("globalJourneysDismiss",!0),a=!1));return a?(T.Ba=1,!1):!0};
T.ka=function(a){R.b(Eb,{event:"pageview",journey_displayed:!0,audience_rule_id:a.audience_rule_id,branch_view_id:a.branch_view_id},function(){})};
T.J=function(a,b,c,d,e,f){if(!uc){kc=c;Zc(f);var k=d.audience_rule_id;(f=document.getElementById("branch-iframe-css"))&&f.parentElement.removeChild(f);f=document.createElement("div");f.id="branch-banner";document.body.insertBefore(f,null);Yb(f,"branch-banner-is-active");var m=!1,h=b.callback_string,n=null,l=null,t=R.c;if(a){var w=Jc(a)||{};a=bd(a);var W=window.setTimeout(function(){window[h]=function(){}},qa);window[h]=function(a){window.clearTimeout(W);m||(l=a,Rc(c,k,t,l,n,w,e))};Bc=n=cd(a,b.has_app_websdk);
if(null===n){m=!0;return}Rc(c,k,t,l,n,w,e);ra&&(u["journey-load-time"]=(Date.now()-window.performance.timing.navigationStart).toString())}document.body.removeChild(f);v||e||T.ka(d)}};
T.I=function(a,b,c,d){R=c;b||(b={});a||(a={});Ec=b.disable_entry_animation||!1;Dc=b.disable_exit_animation||!1;var e=B({},c.m),f=L(c.c)||{},k=f.hasOwnProperty("has_app")?f.has_app:!1,m=c.c.get("journeyDismissals",!0),h=(b.user_language||Va()||"en").toLowerCase()||null,n=gb(U(c)),l;(l=b.branch_view_id)||(l="_branch_view_id".replace(/[\[\]]/g,"\\$&"),l=(l=(new RegExp("[?&]"+l+"(=([^&#]*)|&|#|$)")).exec(Ea()))&&l[2]?decodeURIComponent(l[2].replace(/\+/g," ")):"");l=l||null;c=b.make_new_link?null:Fa(U(c));
e.event=d?"dismiss":"pageview";e.metadata=a;e=F(e,"initial_referrer",n);e=F(e,"branch_view_id",l);e=F(e,"no_journeys",b.no_journeys);e=F(e,"is_iframe",y());e=F(e,"journey_dismissals",m);e.user_language=h;e.open_app=b.open_app||!1;e.has_app_websdk=k;e.feature="journeys";e.callback_string="branch_view_callback__"+lc++;e.data||(e.data={});e.data=B(Ua(),e.data);e.data=B(Da(f||{}),e.data);c&&(e.data.link_click_id=c);(a=f.data?p(f.data):null)&&a["+referrer"]&&(e.data["+referrer"]=a["+referrer"]);return e=
z(e)};var V={androidAppIndexingTagsPresent:!1,iosAppIndexingTagsPresent:!1,androidDetailsComplete:!1,iosDetailsComplete:!1},X={};function dd(a){var b;"android"===a&&V.androidDetailsComplete&&(b="android-app://"+X.androidPackageName+"/"+X.androidURL,b=ed(b),fd(b));"ios"===a&&V.iosDetailsComplete&&(b="ios-app://"+X.iosAppId+"/"+X.iosURL,b=ed(b),fd(b))}
function ed(a){var b={"~channel":"Firebase App Indexing","~feature":"Auto App Indexing",$canonical_url:Ea()};if("object"===typeof X.data)for(var c in X.data)X.data.hasOwnProperty(c)&&!b.hasOwnProperty(c)&&(b[c]=X.data[c]);return a+(-1<a.indexOf("?")?"&":"?")+"link_click_id=a-"+btoa(q(b))}function fd(a){var b=document.createElement("link");b.setAttribute("rel","alternate");b.setAttribute("href",a);document.head.appendChild(b)}
function gd(a){"android"===a&&"string"===typeof X.androidPackageName&&"string"===typeof X.androidURL&&(V.androidDetailsComplete=!0,dd("android"));"ios"===a&&"string"===typeof X.iosAppId&&"string"===typeof X.iosURL&&(V.iosDetailsComplete=!0,dd("ios"))}
function hd(a){for(var b=document.getElementsByTagName("meta"),c=0;c<b.length;c++){var d=b[c];"ios"===a&&"al:ios:app_store_id"===d.getAttribute("property")&&(X.iosAppId=d.getAttribute("content"));"ios"===a&&"al:ios:url"===d.getAttribute("property")&&(X.iosURL=d.getAttribute("content").replace("://","/"));"android"===a&&"al:android:package"===d.getAttribute("property")&&(X.androidPackageName=d.getAttribute("content"));"android"===a&&"al:android:url"===d.getAttribute("property")&&(X.androidURL=d.getAttribute("content").replace("://",
"/"))}gd(a)};var id;
function Y(a,b,c){return function(){var d=this,e,f,k=arguments[arguments.length-1];a&&"function"===typeof k?(e=Array.prototype.slice.call(arguments,0,arguments.length-1)||[],f=k):(f=function(){},e=Array.prototype.slice.call(arguments));d.ba(function(k){function h(b,c){try{if(b&&!a)throw b;1===a?f(b):2===a&&f(b,c)}finally{k()}}if(!c){if(1===d.o)return h(Error(x("Branch SDK initialization pending and a Branch method was called outside of the queue order")),null);if(2===d.o)return h(Error(x("Branch SDK initialization failed, so further methods cannot be called",d.l,
d.s)),null);if(0===d.o||!d.o)return h(Error(x("Branch SDK not initialized")),null)}e.unshift(h);b.apply(d,e)})}}function Z(){if(!(this instanceof Z))return id||(id=new Z),id;this.ba=na();this.c=new Jb(["session","cookie","pojo"]);this.V=new Rb;this.h=[];this.X="web2.58.0";this.l=this.o=0;this.s=null}
Z.prototype.b=function(a,b,c){this.W&&(b.app_id=this.W);this.i&&(b.branch_key=this.i);(a.a&&a.a.session_id||a.f&&a.f.session_id)&&this.H&&(b.session_id=this.H);(a.a&&a.a.identity_id||a.f&&a.f.identity_id)&&this.j&&(b.identity_id=this.j);0>a.endpoint.indexOf("/v1/")?(a.a&&a.a.developer_identity||a.f&&a.f.developer_identity)&&this.g&&(b.developer_identity=this.g):(a.a&&a.a.identity||a.f&&a.f.identity)&&this.g&&(b.identity=this.g);(a.a&&a.a.link_click_id||a.f&&a.f.link_click_id)&&this.$&&(b.link_click_id=
this.$);(a.a&&a.a.sdk||a.f&&a.f.sdk)&&this.X&&(b.sdk=this.X);(a.a&&a.a.browser_fingerprint_id||a.f&&a.f.browser_fingerprint_id)&&this.D&&(b.browser_fingerprint_id=this.D);v&&(b.tracking_disabled=v);return Xb(this.V,a,b,this.c,function(a,b){c(a,b)})};function U(a){var b=L(a.c);return(b=b&&b.referring_link)?b:(a=a.c.get("click_id"))?"https://bnc.lt/c/"+a:null}function N(a,b,c){for(var d=0;d<a.h.length;d++)a.h[d].event&&a.h[d].event!==b||a.h[d].listener(b,c)}
Z.prototype.init=Y(2,function(a,b,c){function d(){var a,b;"undefined"!==typeof document.hidden?(a="hidden",b="visibilitychange"):"undefined"!==typeof document.mozHidden?(a="mozHidden",b="mozvisibilitychange"):"undefined"!==typeof document.msHidden?(a="msHidden",b="msvisibilitychange"):"undefined"!==typeof document.webkitHidden&&(a="webkitHidden",b="webkitvisibilitychange");b&&!h.ea&&(h.ea=!0,document.addEventListener(b,function(){document[a]||(k(null),"function"===typeof h.w&&h.w())},!1))}function e(b,
d){d&&(d=m(d),v||(d=f(d),Ba(h.c,d,t)),h.o=3,d.data_parsed=d.data&&0!==d.data.length?p(d.data):{});if(b)return h.o=2,h.l||(h.l=1,h.s=b.message),a(b,d&&Ca(d));try{a(b,d&&Ca(d))}catch(od){}finally{h.renderFinalize()}var e=ab(),k=G(c.metadata,"object")?c.metadata:null;k&&(k=hb(e.hosted_deeplink_data,k))&&0<Object.keys(k).length&&(e.hosted_deeplink_data=k);var l=T.I(Yc(c,e),c,h,!1);h.renderQueue(function(){h.b(Eb,l,function(a,b){if(!a&&"object"===typeof b){var d=l.branch_view_id?!0:!1;T.O(b,c,d)?T.J(b.template,
l,l.branch_view_id||b.event_data.branch_view_data.id,b.event_data.branch_view_data,d,b.journey_link_data):((b.auto_branchify||!n&&Ma("branchify_url")&&U(h))&&this.branch.deepview({},{make_new_link:!1,open_app:!0,auto_branchify:!0}),N(R,"willNotShowJourney"))}v&&(wa=!0)})})}function f(a){t&&(a.identity=h.g);return a}function k(a){var b={sdk:"2.58.0",branch_key:h.i},c=L(h.c)||{},d=L(h.c,!0)||{};d.browser_fingerprint_id&&(b._t=d.browser_fingerprint_id);Ka()||La()||h.b(kb,b,function(a,b){a&&(h.l=3,h.s=
a.message);b&&(c.browser_fingerprint_id=b)});h.b(zb,{browser_fingerprint_id:c.browser_fingerprint_id},function(b,d){b&&(h.l=4,h.s=b.message);b||!d||c.has_app||(c.has_app=!0,Pb(h.c,c),N(h,"didDownloadApp"));a&&a(null,c)})}function m(a){a.link_click_id&&(h.$=a.link_click_id.toString());a.session_id&&(h.H=a.session_id.toString());a.identity_id&&(h.j=a.identity_id.toString());a.identity&&(h.g=a.identity.toString());a.link&&(h.N=a.link);if(a.referring_link){var b=a.referring_link;a.referring_link=b?"http"!==
b.substring(0,4)?"https://bnc.lt"+b:b:null}!a.click_id&&a.referring_link&&(a.click_id=Fa(a.referring_link));h.D=a.browser_fingerprint_id;return a}ra&&(u["init-began-at"]=(Date.now()-window.performance.timing.navigationStart).toString());var h=this;h.o=1;-1<b.indexOf("key_")?h.i=b:h.W=b;c=c&&G(c,"object")?c:{};oa=(h.G=c)&&c.retries&&Number.isInteger(c.retries)?c.retries:oa;pa=c&&c.retry_delay&&Number.isInteger(c.retry_delay)?c.retry_delay:pa;qa=c&&c.timeout&&Number.isInteger(c.timeout)?c.timeout:qa;
r=c&&c.nonce?c.nonce:r;v=c&&c.tracking_disabled&&!0===c.tracking_disabled?!0:!1;wa=!1;v&&Aa(h);b=L(h.c,!0);h.j=b&&b.identity_id;b=L(h.c);var n=c&&"undefined"!==typeof c.branch_match_id&&null!==c.branch_match_id?c.branch_match_id:null,l=n||Ma("_branch_match_id")||Ga(),t=!h.j;h.C=!!h.c.get("branch_view_enabled");if(b&&b.session_id&&!l&&!Ma("branchify_url"))Pb(h.c,{data:""}),Pb(h.c,{referring_link:""}),d(),k(e);else{b={sdk:"2.58.0",branch_key:h.i};var w=L(h.c,!0)||{};w.browser_fingerprint_id&&(b._t=
w.browser_fingerprint_id);w.identity&&(h.g=w.identity);var W=parseInt(Ma("[?&]_open_delay_ms"),10);Ka()||La()?ib(function(){h.b(jb,{link_identifier:l,browser_fingerprint_id:l||w.browser_fingerprint_id,alternative_browser_fingerprint_id:w.browser_fingerprint_id,options:c,initial_referrer:gb(U(h)),current_url:y()&&Ha()?window.top.location.href:window.location.href,screen_height:screen.height||0,screen_width:screen.width||0},function(a,b){a&&(h.l=2,h.s=a.message);a||"object"!==typeof b||(b.branch_view_enabled&&
(h.C=!!b.branch_view_enabled,h.c.set("branch_view_enabled",h.C)),l&&(b.click_id=l));d();e(a,b)})},W):h.b(kb,b,function(a,b){if(a)return h.l=3,h.s=a.message,e(a,null);ib(function(){h.b(jb,{link_identifier:l,browser_fingerprint_id:l||b,alternative_browser_fingerprint_id:w.browser_fingerprint_id,options:c,initial_referrer:gb(U(h)),current_url:y()&&Ha()?window.top.location.href:window.location.href,screen_height:screen.height||0,screen_width:screen.width||0},function(a,b){a&&(h.l=2,h.s=a.message);a||
"object"!==typeof b||(b.branch_view_enabled&&(h.C=!!b.branch_view_enabled,h.c.set("branch_view_enabled",h.C)),l&&(b.click_id=l));d();e(a,b)})},W)})}},!0);Z.prototype.renderQueue=Y(0,function(a,b){this.ca?b():(this.u=this.u||[],this.u.push(b));a(null,null)});Z.prototype.renderFinalize=Y(2,function(a){this.u&&0<this.u.length&&(this.u.forEach(function(a){a.call(this)}),delete this.u);this.ca=!0;a(null,null)});
Z.prototype.data=Y(2,function(a){var b=Ca(L(this.c));b.referring_link=U(this);b.data_parsed=b.data&&0!==b.data.length?p(b.data):{};a(null,b)});Z.prototype.first=Y(2,function(a){a(null,Ca(L(this.c,!0)))});
Z.prototype.setIdentity=Y(2,function(a,b){var c=this;this.b(rb,{identity:b},function(d,e){d&&a(d);e=e||{};c.j=e.identity_id?e.identity_id.toString():null;c.N=e.link;c.g=b;e.developer_identity=b;e.referring_data_parsed=e.referring_data?p(e.referring_data):null;Qb(c.c,{identity:b,identity_id:c.j});a(null,e)})});
Z.prototype.logout=Y(1,function(a){var b=this;this.b(qb,{},function(c,d){c&&a(c);d=d||{};d={data_parsed:null,data:null,referring_link:null,click_id:null,link_click_id:null,identity:null,session_id:d.session_id,identity_id:d.identity_id,link:d.link,device_fingerprint_id:b.ha||null};b.N=d.link;b.H=d.session_id;b.j=d.identity_id;b.g=null;Qb(b.c,d,!0);a(null)})});Z.prototype.getBrowserFingerprintId=Y(2,function(a){var b=L(this.c,!0)||{};a(null,b.browser_fingerprint_id||null)});
Z.prototype.crossPlatformIds=Y(2,function(a){this.b(Gb,{user_data:q(fb(this))},function(b,c){return a(b||null,c&&c.user_data||null)})});Z.prototype.lastAttributedTouchData=Y(2,function(a,b){b=G(b,"number")?b:null;var c=fb(this);F(c,"attribution_window",b);this.b(Ib,{user_data:q(c)},function(b,c){return a(b||null,c||null)})});
Z.prototype.track=Y(1,function(a,b,c,d){c=c||{};d=d||{};r=d.nonce?d.nonce:r;if("pageview"===b){(b=hb(Ua(),c))&&0<Object.keys(b).length&&(c.hosted_deeplink_data=b);var e=T.I(Yc(d,c),d,this,!1);this.b(Eb,e,function(b,c){if(!b&&"object"===typeof c){var f=e.branch_view_id?!0:!1;T.O(c,d,f)?T.J(c.template,e,e.branch_view_id||c.event_data.branch_view_data.id,c.event_data.branch_view_data,f,c.journey_link_data):N(R,"willNotShowJourney")}"function"===typeof a&&a.apply(this,arguments)})}else this.b(Ab,{event:b,
metadata:B({url:Ea(),user_agent:navigator.userAgent,language:navigator.language},c),initial_referrer:gb(U(this))},function(b,c){"function"===typeof a&&a.apply(this,arguments)})});
Z.prototype.logEvent=Y(1,function(a,b,c,d,e){b=G(b,"string")?b:null;c=G(c,"object")?c:null;e=G(e,"string")?e:null;b&&-1<bb.indexOf(b)?(d=G(d,"array")?d:null,c=db(c),this.b(Cb,{name:b,user_data:q(fb(this)),custom_data:q(c&&c.custom_data||{}),event_data:q(c&&c.event_data||{}),content_items:q(d||[]),customer_event_alias:e},function(b){return a(b||null)})):this.b(Db,{name:b,user_data:q(fb(this)),custom_data:q(eb(c||{})),content_items:q(d||[]),customer_event_alias:e},function(b){return a(b||null)})});
Z.prototype.link=Y(2,function(a,b){var c=z(b),d=this.i;this.b(wb,c,function(b,f){if(b)return a(b,ya(d,c));a(null,f&&f.url)})});
Z.prototype.sendSMS=Y(1,function(a,b,c,d){function e(c){f.b(mb,{link_url:c,phone:b},function(b){a(b||null)})}var f=this;if("function"===typeof d)d={};else if("undefined"===typeof d||null===d)d={};d.make_new_link=d.make_new_link||!1;c.channel&&"app banner"!==c.channel||(c.channel="sms");var k=U(f);k&&!d.make_new_link?e(Fa(k)):f.b(wb,z(c),function(b,c){if(b)return a(b);var d=c.url;/(bnc.lt\/|app\.link\/)/.test(d)||(d="https://bnc.lt/"+Ta(d));f.b(lb,{link_url:d,click:"click"},function(b,c){if(b)return a(b);
e(c.click_id)})})});Z.prototype.qrCode=Y(2,function(a,b,c){z(b).qr_code_settings=q(eb(c||{}));this.b(xb,z(b),function(b,c){function d(){}b||(d.rawBuffer=c,d.base64=function(){if(this.rawBuffer)return btoa(String.fromCharCode.apply(null,new Uint8Array(this.rawBuffer)));throw Error("QrCode.rawBuffer is empty.");});return a(b||null,d||null)})});
Z.prototype.deepview=Y(1,function(a,b,c){var d=this;c||(c={});c.deepview_type="undefined"===typeof c.deepview_type?"deepview":"banner";b.data=B(Ua(),b.data);b=y()?B({is_iframe:!0},b):b;b=z(b);var e=ya(this.i,b);if(c.open_app||null===c.open_app||"undefined"===typeof c.open_app)b.open_app=!0;b.append_deeplink_path=!!c.append_deeplink_path;b.deepview_type=c.deepview_type;var f=U(d);f&&!c.make_new_link&&(b.link_click_id=Fa(f));b.banner_options=c;c.auto_branchify&&(b.auto_branchify=!0);d.w=ha(this.b,d,
yb,b,function(b,c){if(b)return v||(d.v=function(){window.top.location=e}),a(b);"function"===typeof c&&(d.v=c);a(null)});d.w()});
Z.prototype.deepviewCta=Y(1,function(a){if("undefined"===typeof this.v)return v?a(Error("Requested operation cannot be completed since tracking is disabled"),null):a(Error("Cannot call Deepview CTA, please call branch.deepview() first"),null);window.event&&(window.event.preventDefault?window.event.preventDefault():window.event.returnValue=!1);N(this,"didDeepviewCTA");this.v();a()});Z.prototype.referrals=Y(2,function(a){this.b(sb,{},a)});
Z.prototype.getCode=Y(2,function(a,b){b.type="credit";b.creation_source=b.creation_source||2;this.b(nb,b,a)});Z.prototype.validateCode=Y(1,function(a,b){this.b(ob,{code:b},a)});Z.prototype.applyCode=Y(1,function(a,b){this.b(pb,{code:b},a)});Z.prototype.credits=Y(2,function(a){this.b(ub,{branch_key:this.i,identity:this.g},a)});Z.prototype.creditHistory=Y(2,function(a,b){this.b(tb,b||{},a)});Z.prototype.redeem=Y(1,function(a,b,c){this.b(vb,{amount:b,bucket:c},function(b){a(b||null)})});
Z.prototype.addListener=function(a,b){"function"===typeof a&&void 0===b&&(b=a,a=null);b&&this.h.push({listener:b,event:a||null})};Z.prototype.removeListener=function(a){a&&(this.h=this.h.filter(function(b){if(b.listener!==a)return b}))};function jd(a,b,c){c=c||{};try{a.m=p(q(c))}finally{a.m=a.m||{}}b()}Z.prototype.setBranchViewData=Y(1,function(a,b){jd.call(null,this,a,b)},!0);
Z.prototype.closeJourney=Y(1,function(a){var b=this;b.renderQueue(function(){if(Bc&&Cc)N(b,"didCallJourneyClose",S),Sc(Bc,!0);else return a("Journey already dismissed.")});a()});
Z.prototype.banner=Y(1,function(a,b,c){c=c||{};jd.call(null,this,function(){},c);"undefined"===typeof b.showAgain&&"undefined"!==typeof b.forgetHide&&(b.showAgain=b.forgetHide);var d={icon:E(b.icon)||"",title:E(b.title)||"",description:E(b.description)||"",M:"number"===typeof b.reviewCount&&0<b.reviewCount?Math.floor(b.reviewCount):null,B:"number"===typeof b.rating&&5>=b.rating&&0<b.rating?Math.round(2*b.rating)/2:null,na:E(b.openAppButtonText)||"View in app",ja:E(b.downloadAppButtonText)||"Download App",
sa:E(b.sendLinkText)||"Send Link",pa:E(b.phonePreviewText)||"(999) 999-9999",F:"undefined"===typeof b.iframe?!0:b.iframe,U:"undefined"===typeof b.showiOS?!0:b.showiOS,ua:"undefined"===typeof b.showiPad?!0:b.showiPad,P:"undefined"===typeof b.showAndroid?!0:b.showAndroid,R:"undefined"===typeof b.showBlackberry?!0:b.showBlackberry,T:"undefined"===typeof b.showWindowsPhone?!0:b.showWindowsPhone,S:"undefined"===typeof b.showKindle?!0:b.showKindle,ta:"undefined"===typeof b.showDesktop?!0:b.showDesktop,
ia:!!b.disableHide,K:"number"===typeof b.forgetHide?b.forgetHide:!!b.forgetHide,ra:"undefined"===typeof b.respectDNT?!1:b.respectDNT,position:b.position||"top",fa:b.customCSS||"",ma:"undefined"===typeof b.mobileSticky?!1:b.mobileSticky,ga:"undefined"===typeof b.desktopSticky?!0:b.desktopSticky,xa:b.buttonBorderColor||"",va:b.buttonBackgroundColor||"",za:b.buttonFontColor||"",ya:b.buttonBorderColorHover||"",wa:b.buttonBackgroundColorHover||"",Aa:b.buttonFontColorHover||"",la:!!b.make_new_link,oa:!!b.open_app,
Z:!!b.immediate,da:!!b.append_deeplink_path};"undefined"!==typeof b.showMobile&&(d.U=b.showMobile,d.P=b.showMobile,d.R=b.showMobile,d.T=b.showMobile,d.S=b.showMobile);c.data=B(Ua(),c.data);var e=this;e.renderQueue(function(){e.Y=ic(e,d,c,e.c)});a()});Z.prototype.closeBanner=Y(0,function(a){var b=this;b.renderQueue(function(){b.Y&&(N(b,"willCloseBanner"),b.Y(function(){N(b,"didCloseBanner")}))});a()});
Z.prototype.autoAppIndex=Y(1,function(a,b){b=b||{};var c=document.getElementsByTagName("link"),d=c.length;if(d)for(var e=0;e<d;e++){var f=c[e],k=f.href;k&&(k.includes("ios-app")&&(V.iosAppIndexingTagsPresent=!0,f.setAttribute("href",ed(k))),k.includes("android-app")&&(V.androidAppIndexingTagsPresent=!0,f.setAttribute("href",ed(k))))}X=b;V.androidAppIndexingTagsPresent||(gd("android"),V.androidDetailsComplete||hd("android"));V.iosAppIndexingTagsPresent||(gd("ios"),V.iosDetailsComplete||hd("ios"));
V.iosDetailsComplete||V.androidDetailsComplete?a(null):a("Firebase App Indexing tags were not added to your webpage. Please check your configuration.")});Z.prototype.trackCommerceEvent=Y(1,function(a,b,c,d){var e=this;e.renderQueue(function(){var f=$a(b,c);if(f)return a(Error(f));e.b(Bb,{event:b,metadata:B({url:document.URL,user_agent:navigator.userAgent,language:navigator.language},d||{}),initial_referrer:gb(U(e)),commerce_data:c},function(b){a(b||null)})});a()});
Z.prototype.disableTracking=Y(1,function(a,b){if(!1===b||"false"===b)wa=v=!1,this.i&&this.G&&(!0===this.G.tracking_disabled&&delete this.G.tracking_disabled,this.init(this.i,this.G));else if(void 0===b||!0===b||"true"===b)Aa(this),wa=v=!0,this.closeBanner(),this.closeJourney();a()},!0);Z.prototype.setAPIResponseCallback=Y(0,function(a,b){this.V.aa=b;a()},!0);var kd=new Z;if(window.branch&&window.branch._q)for(var ld=window.branch._q,md=0;md<ld.length;md++){var nd=ld[md];kd[nd[0]].apply(kd,nd[1])}"function"===typeof define&&define.amd?define("branch",function(){return kd}):"object"===typeof exports&&(module.exports=kd);window&&(window.branch=kd);})();

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,2 @@
(self.webpackChunklite=self.webpackChunklite||[]).push([[118],{8538:(n,e,r)=>{"use strict";r.r(e),r.d(e,{default:()=>A});var t=r(94725),o=r(67294),i=r(12291),s=r(99264),a=r(57168),u=r(72351),c=r(52837),l=r(61250),f=r(31235),d=r(31117),v=r(27737),p=r(67616),g=r(29035),m=r(63038),h=r.n(m),_=r(59713),b=r.n(_),w=r(44059),E=r(14034);function T(){for(var n=new E.y,e=arguments.length,r=new Array(e),t=0;t<e;t++)r[t]=arguments[t];if(0===r.length)return n;var o=r.map((function(){return[]}));return r.forEach((function(e,r){e.observe((function(e){o[r].push(e),o.every((function(n){return n.length>0}))&&n.set(o.map((function(n){return n.shift()})))}))})),n}var P=function(n){return function(e){return b()({},n,e)}};const A=function(){var n,e,r,m,_,b,E,A,M,S,y,C,k,L,O,F;return o.useEffect((function(){var n=T(p.sY,p.wZ,p.vY).map((function(n){var e=h()(n,3),r=e[0],t=e[1],o=e[2];return{responseEndToLCP:new p.jb(r.response.end,t.end),responseEndToFCP:new p.jb(r.response.end,o.end)}})),e=T(p.sY,p.qH.map(P("fid")),p.vY.map(P("fcp")),p.wZ.map(P("lcp")),n);p.cA.observe((function(n){n||e.observe((function(n){var e=n.reduce((function(n,e){return Object.assign(n,e)}),{}),r=Object.keys(e).reduce((function(n,r){var t=e[r].duration;return n[r]=t%1==0?t:Number(t.toFixed(1)),n}),{}),t=document.children[0],o={html:null==t?void 0:t.innerHTML.length,redux:JSON.stringify(window.__PRELOADED_STATE__).length,apollo:JSON.stringify(window.__APOLLO_STATE__).length};w.t.log("client hydrated",{perf:r,sizes:o})}))})),p.Df.observe((function(n){return w.t.log("client resource sizes",{resources:n})}))}),[]),n=(0,i.v9)((function(n){return n.tracing.tracer})),e=(0,i.v9)((function(n){return n.tracing.originalSpan})),r=(0,s.c)(),m=r.loading,_=r.isBot,b=(0,i.v9)((function(n){return n.client.routingEntity})),E=(0,i.v9)((function(n){return n.auroraPage.isAuroraPageEnabled})),A=(0,a.r)(),M=A.loading,S=A.viewerId,y=(0,i.v9)((function(n){return n.config.performanceTags})),C=(0,f.xg)(),k=(0,f.f$)(),L=(0,i.I0)(),O=(0,l.dh)(),F=(0,u.Av)(),o.useEffect((function(){var r;if(n&&F&&!m&&!_&&!M&&S){var o=O(window.location.pathname),i=null!==(r=null==o?void 0:o.route.metricName)&&void 0!==r?r:"unidentified",s=(0,v.j)(S),a=(0,g.ic)(navigator.userAgent),u=[];C?u.push("edge_cache_enabled"):k&&u.push("edge_cache_control");var l=u.join(","),f={"user.logged_in":s,"user.experiment":l,"device.mobile_or_tablet":a,"req.route_name":i,"req.route":i,"req.router":(null==b?void 0:b.type)||c.Cr.DEFAULT};y.forEach((function(n){return f["req.".concat(n)]=1}));var h={auroraPage:E,loggedIn:s,mobileOrTablet:a,experiment:l,route:i},w=function(n){return Math.round(1e3*n)},T=function(e,r,t,o){var i=t.start,s=t.end,a=n.startSpan("timing.".concat(r),{childOf:e,tags:f}).setBeginMicros(w(i)).setEndMicros(w(s));return null!=o&&o(a),a.finish(),a};p.sY.observe((function(r){var o,i,s,a;F.reportRender(h,r);var u=n.startSpan("timing.navigation",{references:e?[(0,t.followsFrom)(e)]:void 0,tags:f}).setBeginMicros(w(r.load.start)).setEndMicros(w(r.load.end)).log({redirect_count:null!==(o=null===(i=window)||void 0===i||null===(s=i.performance)||void 0===s||null===(a=s.navigation)||void 0===a?void 0:a.redirectCount)&&void 0!==o?o:0});T(u,"beforeDomainLookup",r.before_domain_lookup),T(u,"domainLookup",r.domain_lookup),T(u,"connect",r.connect),T(u,"request",r.request),T(u,"response",r.response),T(u,"processing",r.processing);var c=r.overall_fcp,l=r.client,v=r.render;null!=c&&T(u,"firstContentfulPaint",c),null!=l&&T(u,"client",l,(function(n){null!=v&&T(n,"render",v)})),u.finish(),L((0,d.YU)(u.generateTraceURL()))})),p.vY.observe((function(r){F.reportFirstContentfulPaint(h,r),n.startSpan("timing.firstContentfulPaint.v2",{references:e?[(0,t.followsFrom)(e)]:void 0,tags:f}).setBeginMicros(w(r.start)).setEndMicros(w(r.end)).finish()})),p.wZ.observe((function(r){F.reportLargestContentfulPaint(h,r),n.startSpan("timing.largestContentfulPaint",{references:e?[(0,t.followsFrom)(e)]:void 0,tags:f}).setBeginMicros(w(r.start)).setEndMicros(w(r.end)).finish()})),p.yI.observe((function(n){F.reportCumulativeLayoutShift(h,n)})),p.cA.observe((function(n){n&&F.reportUnsupportedPerfObserver(h)})),p.qH.observe((function(r){F.reportInput(h,r),n.startSpan("timing.input.first.delay",{references:e?[(0,t.followsFrom)(e)]:void 0,tags:f}).setBeginMicros(w(r.start)).setEndMicros(w(r.end)).finish()}))}}),[n,M,S,m,_]),null}},72864:(n,e,r)=>{"use strict";r.r(e),r.d(e,{init:()=>i,extractSpan:()=>s});var t=r(45573),o=r(94725),i=function(n){var e=n.name,r=n.host,i=n.token,s=n.appVersion,a=new t.Tracer({component_name:e,xhr_instrumentation:!1,access_token:i,collector_host:r,default_span_tags:{"component.version":s}});return(0,o.initGlobalTracer)(a),a},s=function(n,e){if(e)return n.extract(o.FORMAT_HTTP_HEADERS,e)}}}]);
//# sourceMappingURL=https://stats.medium.build/lite/sourcemaps/instrumentation.2774f137.chunk.js.map

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,2 @@
(self.webpackChunklite=self.webpackChunklite||[]).push([[9152],{76668:(n,e,t)=>{"use strict";t.r(e),t.d(e,{default:()=>d});var r=t(67294),a=t(12291),o=t(57168),i=t(72351),u=t(44059),l=t(61250),c=t(27737),f=t(67616),m=function(n){return Math.round(1e3*n)};const d=function(n){var e=n.to,t=n.from,d=r.useRef(null),v=(0,i.Av)(),g=(0,l.dh)(),h=(0,a.v9)((function(n){return n.debug.originalSpanCarrier})),p=(0,a.v9)((function(n){return n.tracing}),a.wU),s=p.originalSpan,w=p.tracer,k=(0,o.r)(),b=k.loading,C=k.viewerId;return r.useEffect((function(){if(w&&!b&&C)if(d.current||e.pathname===t.pathname){if(d.current){var n,r,a,o,i=d.current.pathname,l=d.current.time,p=Date.now();d.current=null;var k={to:null!==(n=null===(r=g(e.pathname))||void 0===r?void 0:r.route.name)&&void 0!==n?n:"unknown",from:null!==(a=null===(o=g(i))||void 0===o?void 0:o.route.name)&&void 0!==a?a:"unknown",loggedIn:(0,c.j)(C)},I={tags:k};h&&(I.childOf=s),w.startSpan("client.navigation",I).setBeginMicros(m(l)).setEndMicros(m(p)).finish(),v&&v.reportClientNav(k,new f.jb(l,p)),u.t.log("client navigation",{duration:p-l,to:e.pathname,toRouteName:k.to,from:i,fromRouteName:k.from,loggedIn:k.loggedIn})}}else d.current={pathname:t.pathname,time:Date.now()}}),[w,e.pathname,t.pathname,b,C]),null}}}]);
//# sourceMappingURL=https://stats.medium.build/lite/sourcemaps/reporting.0e714607.chunk.js.map

View File

@ -0,0 +1,2 @@
#credential_picker_container{border:none;height:330px;position:fixed;right:20px;top:20px;width:391px;z-index:9999}#credential_picker_container iframe{border:none;width:391px;height:330px}#g_a11y_announcement{height:1px;left:-10000px;overflow:hidden;position:absolute;top:auto;width:1px}.L5Fo6c-sM5MNb{border:0;display:block;left:0;position:relative;top:0}.L5Fo6c-bF1uUb{-webkit-border-radius:4px;border-radius:4px;bottom:0;cursor:pointer;left:0;position:absolute;right:0;top:0}.L5Fo6c-bF1uUb:focus{border:none;outline:none}sentinel{}
/*# sourceURL=/_/gsi/_/ss/k=gsi.gsi.n64yMIEPTMo.L.W.O/am=cg/d=1/ct=zgms/rs=AF0KOtV4Ub2H8p50TbLsIBxnE82DWYYB8g/m=gis_client_style */

View File

@ -0,0 +1,323 @@
/* latin */
@font-face {
font-family: 'charter';
font-weight: 400;
font-style: italic;
src: url('https://glyph.medium.com/font/81d2bf1/0-3j_4g_6bu_6c4_6c8_6c9_6cc_6cd_6ci_6cm/charter-400-italic.woff') format('woff');
unicode-range: U+0-7F,U+A0,U+200A,U+2014,U+2018,U+2019,U+201C,U+201D,U+2022,U+2026;
}
/* rest */
@font-face {
font-family: 'charter';
font-weight: 400;
font-style: italic;
src: url('https://glyph.medium.com/font/81d2bf1/3k-4f_4h-6bt_6bv-6c3_6c5-6c7_6ca-6cb_6ce-6ch_6cj-6cl_6cn-nvnj/charter-400-italic.woff') format('woff');
unicode-range: U+80-9F,U+A1-2009,U+200B-2013,U+2015-2017,U+201A-201B,U+201E-2021,U+2023-2025,U+2027-10FFFF;
}
/* latin */
@font-face {
font-family: 'charter';
font-weight: 400;
font-style: normal;
src: url('https://glyph.medium.com/font/be78681/0-3j_4g_6bu_6c4_6c8_6c9_6cc_6cd_6ci_6cm/charter-400-normal.woff') format('woff');
unicode-range: U+0-7F,U+A0,U+200A,U+2014,U+2018,U+2019,U+201C,U+201D,U+2022,U+2026;
}
/* rest */
@font-face {
font-family: 'charter';
font-weight: 400;
font-style: normal;
src: url('https://glyph.medium.com/font/be78681/3k-4f_4h-6bt_6bv-6c3_6c5-6c7_6ca-6cb_6ce-6ch_6cj-6cl_6cn-nvnj/charter-400-normal.woff') format('woff');
unicode-range: U+80-9F,U+A1-2009,U+200B-2013,U+2015-2017,U+201A-201B,U+201E-2021,U+2023-2025,U+2027-10FFFF;
}
/* latin */
@font-face {
font-family: 'charter';
font-weight: 700;
font-style: italic;
src: url('https://glyph.medium.com/font/77a0c0c/0-3j_4g_6bu_6c4_6c8_6c9_6cc_6cd_6ci_6cm/charter-700-italic.woff') format('woff');
unicode-range: U+0-7F,U+A0,U+200A,U+2014,U+2018,U+2019,U+201C,U+201D,U+2022,U+2026;
}
/* rest */
@font-face {
font-family: 'charter';
font-weight: 700;
font-style: italic;
src: url('https://glyph.medium.com/font/77a0c0c/3k-4f_4h-6bt_6bv-6c3_6c5-6c7_6ca-6cb_6ce-6ch_6cj-6cl_6cn-nvnj/charter-700-italic.woff') format('woff');
unicode-range: U+80-9F,U+A1-2009,U+200B-2013,U+2015-2017,U+201A-201B,U+201E-2021,U+2023-2025,U+2027-10FFFF;
}
/* latin */
@font-face {
font-family: 'charter';
font-weight: 700;
font-style: normal;
src: url('https://glyph.medium.com/font/f50d520/0-3j_4g_6bu_6c4_6c8_6c9_6cc_6cd_6ci_6cm/charter-700-normal.woff') format('woff');
unicode-range: U+0-7F,U+A0,U+200A,U+2014,U+2018,U+2019,U+201C,U+201D,U+2022,U+2026;
}
/* rest */
@font-face {
font-family: 'charter';
font-weight: 700;
font-style: normal;
src: url('https://glyph.medium.com/font/f50d520/3k-4f_4h-6bt_6bv-6c3_6c5-6c7_6ca-6cb_6ce-6ch_6cj-6cl_6cn-nvnj/charter-700-normal.woff') format('woff');
unicode-range: U+80-9F,U+A1-2009,U+200B-2013,U+2015-2017,U+201A-201B,U+201E-2021,U+2023-2025,U+2027-10FFFF;
}
/* latin */
@font-face {
font-family: 'fell';
font-weight: 400;
font-style: italic;
src: url('https://glyph.medium.com/font/415369b/0-3j_4g_6bu_6c4_6c8_6c9_6cc_6cd_6ci_6cm/fell-400-italic.woff') format('woff');
unicode-range: U+0-7F,U+A0,U+200A,U+2014,U+2018,U+2019,U+201C,U+201D,U+2022,U+2026;
}
/* rest */
@font-face {
font-family: 'fell';
font-weight: 400;
font-style: italic;
src: url('https://glyph.medium.com/font/415369b/3k-4f_4h-6bt_6bv-6c3_6c5-6c7_6ca-6cb_6ce-6ch_6cj-6cl_6cn-nvnj/fell-400-italic.woff') format('woff');
unicode-range: U+80-9F,U+A1-2009,U+200B-2013,U+2015-2017,U+201A-201B,U+201E-2021,U+2023-2025,U+2027-10FFFF;
}
/* latin */
@font-face {
font-family: 'fell';
font-weight: 400;
font-style: normal;
src: url('https://glyph.medium.com/font/78ce731/0-3j_4g_6bu_6c4_6c8_6c9_6cc_6cd_6ci_6cm/fell-400-normal.woff') format('woff');
unicode-range: U+0-7F,U+A0,U+200A,U+2014,U+2018,U+2019,U+201C,U+201D,U+2022,U+2026;
}
/* rest */
@font-face {
font-family: 'fell';
font-weight: 400;
font-style: normal;
src: url('https://glyph.medium.com/font/78ce731/3k-4f_4h-6bt_6bv-6c3_6c5-6c7_6ca-6cb_6ce-6ch_6cj-6cl_6cn-nvnj/fell-400-normal.woff') format('woff');
unicode-range: U+80-9F,U+A1-2009,U+200B-2013,U+2015-2017,U+201A-201B,U+201E-2021,U+2023-2025,U+2027-10FFFF;
}
/* latin */
@font-face {
font-family: 'gt-super';
font-weight: 400;
font-style: normal;
src: url('https://glyph.medium.com/font/4a44748/0-3j_4g_6bu_6c4_6c8_6c9_6cc_6cd_6ci_6cm/gt-super-400-normal.woff') format('woff');
unicode-range: U+0-7F,U+A0,U+200A,U+2014,U+2018,U+2019,U+201C,U+201D,U+2022,U+2026;
}
/* rest */
@font-face {
font-family: 'gt-super';
font-weight: 400;
font-style: normal;
src: url('https://glyph.medium.com/font/4a44748/3k-4f_4h-6bt_6bv-6c3_6c5-6c7_6ca-6cb_6ce-6ch_6cj-6cl_6cn-nvnj/gt-super-400-normal.woff') format('woff');
unicode-range: U+80-9F,U+A1-2009,U+200B-2013,U+2015-2017,U+201A-201B,U+201E-2021,U+2023-2025,U+2027-10FFFF;
}
/* latin */
@font-face {
font-family: 'noe';
font-weight: 500;
font-style: normal;
src: url('https://glyph.medium.com/font/b6752aa/0-3j_4g_6bu_6c4_6c8_6c9_6cc_6cd_6ci_6cm/noe-display-500-normal.woff') format('woff');
unicode-range: U+0-7F,U+A0,U+200A,U+2014,U+2018,U+2019,U+201C,U+201D,U+2022,U+2026;
}
/* rest */
@font-face {
font-family: 'noe';
font-weight: 500;
font-style: normal;
src: url('https://glyph.medium.com/font/b6752aa/3k-4f_4h-6bt_6bv-6c3_6c5-6c7_6ca-6cb_6ce-6ch_6cj-6cl_6cn-nvnj/noe-display-500-normal.woff') format('woff');
unicode-range: U+80-9F,U+A1-2009,U+200B-2013,U+2015-2017,U+201A-201B,U+201E-2021,U+2023-2025,U+2027-10FFFF;
}
/* latin */
@font-face {
font-family: 'opendyslexic';
font-weight: 400;
font-style: italic;
src: url('https://glyph.medium.com/font/1c491fd/0-3j_4g_6bu_6c4_6c8_6c9_6cc_6cd_6ci_6cm/opendyslexic-400-italic.woff') format('woff');
unicode-range: U+0-7F,U+A0,U+200A,U+2014,U+2018,U+2019,U+201C,U+201D,U+2022,U+2026;
}
/* rest */
@font-face {
font-family: 'opendyslexic';
font-weight: 400;
font-style: italic;
src: url('https://glyph.medium.com/font/1c491fd/3k-4f_4h-6bt_6bv-6c3_6c5-6c7_6ca-6cb_6ce-6ch_6cj-6cl_6cn-nvnj/opendyslexic-400-italic.woff') format('woff');
unicode-range: U+80-9F,U+A1-2009,U+200B-2013,U+2015-2017,U+201A-201B,U+201E-2021,U+2023-2025,U+2027-10FFFF;
}
/* latin */
@font-face {
font-family: 'opendyslexic';
font-weight: 400;
font-style: normal;
src: url('https://glyph.medium.com/font/0a6190b/0-3j_4g_6bu_6c4_6c8_6c9_6cc_6cd_6ci_6cm/opendyslexic-400-normal.woff') format('woff');
unicode-range: U+0-7F,U+A0,U+200A,U+2014,U+2018,U+2019,U+201C,U+201D,U+2022,U+2026;
}
/* rest */
@font-face {
font-family: 'opendyslexic';
font-weight: 400;
font-style: normal;
src: url('https://glyph.medium.com/font/0a6190b/3k-4f_4h-6bt_6bv-6c3_6c5-6c7_6ca-6cb_6ce-6ch_6cj-6cl_6cn-nvnj/opendyslexic-400-normal.woff') format('woff');
unicode-range: U+80-9F,U+A1-2009,U+200B-2013,U+2015-2017,U+201A-201B,U+201E-2021,U+2023-2025,U+2027-10FFFF;
}
/* latin */
@font-face {
font-family: 'sohne';
font-weight: 300;
font-style: italic;
src: url('https://glyph.medium.com/font/51a79f1/0-3j_4g_6bu_6c4_6c8_6c9_6cc_6cd_6ci_6cm/sohne-300-italic.woff') format('woff');
unicode-range: U+0-7F,U+A0,U+200A,U+2014,U+2018,U+2019,U+201C,U+201D,U+2022,U+2026;
}
/* rest */
@font-face {
font-family: 'sohne';
font-weight: 300;
font-style: italic;
src: url('https://glyph.medium.com/font/51a79f1/3k-4f_4h-6bt_6bv-6c3_6c5-6c7_6ca-6cb_6ce-6ch_6cj-6cl_6cn-nvnj/sohne-300-italic.woff') format('woff');
unicode-range: U+80-9F,U+A1-2009,U+200B-2013,U+2015-2017,U+201A-201B,U+201E-2021,U+2023-2025,U+2027-10FFFF;
}
/* latin */
@font-face {
font-family: 'sohne';
font-weight: 300;
font-style: normal;
src: url('https://glyph.medium.com/font/6fd11d6/0-3j_4g_6bu_6c4_6c8_6c9_6cc_6cd_6ci_6cm/sohne-300-normal.woff') format('woff');
unicode-range: U+0-7F,U+A0,U+200A,U+2014,U+2018,U+2019,U+201C,U+201D,U+2022,U+2026;
}
/* rest */
@font-face {
font-family: 'sohne';
font-weight: 300;
font-style: normal;
src: url('https://glyph.medium.com/font/6fd11d6/3k-4f_4h-6bt_6bv-6c3_6c5-6c7_6ca-6cb_6ce-6ch_6cj-6cl_6cn-nvnj/sohne-300-normal.woff') format('woff');
unicode-range: U+80-9F,U+A1-2009,U+200B-2013,U+2015-2017,U+201A-201B,U+201E-2021,U+2023-2025,U+2027-10FFFF;
}
/* latin */
@font-face {
font-family: 'sohne';
font-weight: 400;
font-style: italic;
src: url('https://glyph.medium.com/font/3887986/0-3j_4g_6bu_6c4_6c8_6c9_6cc_6cd_6ci_6cm/sohne-400-italic.woff') format('woff');
unicode-range: U+0-7F,U+A0,U+200A,U+2014,U+2018,U+2019,U+201C,U+201D,U+2022,U+2026;
}
/* rest */
@font-face {
font-family: 'sohne';
font-weight: 400;
font-style: italic;
src: url('https://glyph.medium.com/font/3887986/3k-4f_4h-6bt_6bv-6c3_6c5-6c7_6ca-6cb_6ce-6ch_6cj-6cl_6cn-nvnj/sohne-400-italic.woff') format('woff');
unicode-range: U+80-9F,U+A1-2009,U+200B-2013,U+2015-2017,U+201A-201B,U+201E-2021,U+2023-2025,U+2027-10FFFF;
}
/* latin */
@font-face {
font-family: 'sohne';
font-weight: 400;
font-style: normal;
src: url('https://glyph.medium.com/font/b492c44/0-3j_4g_6bu_6c4_6c8_6c9_6cc_6cd_6ci_6cm/sohne-400-normal.woff') format('woff');
unicode-range: U+0-7F,U+A0,U+200A,U+2014,U+2018,U+2019,U+201C,U+201D,U+2022,U+2026;
}
/* rest */
@font-face {
font-family: 'sohne';
font-weight: 400;
font-style: normal;
src: url('https://glyph.medium.com/font/b492c44/3k-4f_4h-6bt_6bv-6c3_6c5-6c7_6ca-6cb_6ce-6ch_6cj-6cl_6cn-nvnj/sohne-400-normal.woff') format('woff');
unicode-range: U+80-9F,U+A1-2009,U+200B-2013,U+2015-2017,U+201A-201B,U+201E-2021,U+2023-2025,U+2027-10FFFF;
}
/* latin */
@font-face {
font-family: 'sohne';
font-weight: 500;
font-style: italic;
src: url('https://glyph.medium.com/font/54b52d6/0-3j_4g_6bu_6c4_6c8_6c9_6cc_6cd_6ci_6cm/sohne-500-italic.woff') format('woff');
unicode-range: U+0-7F,U+A0,U+200A,U+2014,U+2018,U+2019,U+201C,U+201D,U+2022,U+2026;
}
/* rest */
@font-face {
font-family: 'sohne';
font-weight: 500;
font-style: italic;
src: url('https://glyph.medium.com/font/54b52d6/3k-4f_4h-6bt_6bv-6c3_6c5-6c7_6ca-6cb_6ce-6ch_6cj-6cl_6cn-nvnj/sohne-500-italic.woff') format('woff');
unicode-range: U+80-9F,U+A1-2009,U+200B-2013,U+2015-2017,U+201A-201B,U+201E-2021,U+2023-2025,U+2027-10FFFF;
}
/* latin */
@font-face {
font-family: 'sohne';
font-weight: 500;
font-style: normal;
src: url('https://glyph.medium.com/font/df9ba7f/0-3j_4g_6bu_6c4_6c8_6c9_6cc_6cd_6ci_6cm/sohne-500-normal.woff') format('woff');
unicode-range: U+0-7F,U+A0,U+200A,U+2014,U+2018,U+2019,U+201C,U+201D,U+2022,U+2026;
}
/* rest */
@font-face {
font-family: 'sohne';
font-weight: 500;
font-style: normal;
src: url('https://glyph.medium.com/font/df9ba7f/3k-4f_4h-6bt_6bv-6c3_6c5-6c7_6ca-6cb_6ce-6ch_6cj-6cl_6cn-nvnj/sohne-500-normal.woff') format('woff');
unicode-range: U+80-9F,U+A1-2009,U+200B-2013,U+2015-2017,U+201A-201B,U+201E-2021,U+2023-2025,U+2027-10FFFF;
}
/* latin */
@font-face {
font-family: 'sohne';
font-weight: 700;
font-style: italic;
src: url('https://glyph.medium.com/font/9da4d76/0-3j_4g_6bu_6c4_6c8_6c9_6cc_6cd_6ci_6cm/sohne-700-italic.woff') format('woff');
unicode-range: U+0-7F,U+A0,U+200A,U+2014,U+2018,U+2019,U+201C,U+201D,U+2022,U+2026;
}
/* rest */
@font-face {
font-family: 'sohne';
font-weight: 700;
font-style: italic;
src: url('https://glyph.medium.com/font/9da4d76/3k-4f_4h-6bt_6bv-6c3_6c5-6c7_6ca-6cb_6ce-6ch_6cj-6cl_6cn-nvnj/sohne-700-italic.woff') format('woff');
unicode-range: U+80-9F,U+A1-2009,U+200B-2013,U+2015-2017,U+201A-201B,U+201E-2021,U+2023-2025,U+2027-10FFFF;
}
/* latin */
@font-face {
font-family: 'sohne';
font-weight: 700;
font-style: normal;
src: url('https://glyph.medium.com/font/cf896f3/0-3j_4g_6bu_6c4_6c8_6c9_6cc_6cd_6ci_6cm/sohne-700-normal.woff') format('woff');
unicode-range: U+0-7F,U+A0,U+200A,U+2014,U+2018,U+2019,U+201C,U+201D,U+2022,U+2026;
}
/* rest */
@font-face {
font-family: 'sohne';
font-weight: 700;
font-style: normal;
src: url('https://glyph.medium.com/font/cf896f3/3k-4f_4h-6bt_6bv-6c3_6c5-6c7_6ca-6cb_6ce-6ch_6cj-6cl_6cn-nvnj/sohne-700-normal.woff') format('woff');
unicode-range: U+80-9F,U+A1-2009,U+200B-2013,U+2015-2017,U+201A-201B,U+201E-2021,U+2023-2025,U+2027-10FFFF;
}

614
Research/pseudocode.py Normal file
View File

@ -0,0 +1,614 @@
# Lint as: python3
"""Pseudocode description of the MuZero algorithm."""
# pylint: disable=unused-argument
# pylint: disable=missing-docstring
# pylint: disable=g-explicit-length-test
from __future__ import absolute_import
from __future__ import division
from __future__ import google_type_annotations
from __future__ import print_function
import collections
import math
import typing
from typing import Dict, List, Optional
import numpy
import tensorflow as tf
##########################
####### Helpers ##########
MAXIMUM_FLOAT_VALUE = float('inf')
KnownBounds = collections.namedtuple('KnownBounds', ['min', 'max'])
class MinMaxStats(object):
"""A class that holds the min-max values of the tree."""
def __init__(self, known_bounds: Optional[KnownBounds]):
self.maximum = known_bounds.max if known_bounds else -MAXIMUM_FLOAT_VALUE
self.minimum = known_bounds.min if known_bounds else MAXIMUM_FLOAT_VALUE
def update(self, value: float):
self.maximum = max(self.maximum, value)
self.minimum = min(self.minimum, value)
def normalize(self, value: float) -> float:
if self.maximum > self.minimum:
# We normalize only when we have set the maximum and minimum values.
return (value - self.minimum) / (self.maximum - self.minimum)
return value
class MuZeroConfig(object):
def __init__(self,
action_space_size: int,
max_moves: int,
discount: float,
dirichlet_alpha: float,
num_simulations: int,
batch_size: int,
td_steps: int,
num_actors: int,
lr_init: float,
lr_decay_steps: float,
visit_softmax_temperature_fn,
known_bounds: Optional[KnownBounds] = None):
### Self-Play
self.action_space_size = action_space_size
self.num_actors = num_actors
self.visit_softmax_temperature_fn = visit_softmax_temperature_fn
self.max_moves = max_moves
self.num_simulations = num_simulations
self.discount = discount
# Root prior exploration noise.
self.root_dirichlet_alpha = dirichlet_alpha
self.root_exploration_fraction = 0.25
# UCB formula
self.pb_c_base = 19652
self.pb_c_init = 1.25
# If we already have some information about which values occur in the
# environment, we can use them to initialize the rescaling.
# This is not strictly necessary, but establishes identical behaviour to
# AlphaZero in board games.
self.known_bounds = known_bounds
### Training
self.training_steps = int(1000e3)
self.checkpoint_interval = int(1e3)
self.window_size = int(1e6)
self.batch_size = batch_size
self.num_unroll_steps = 5
self.td_steps = td_steps
self.weight_decay = 1e-4
self.momentum = 0.9
# Exponential learning rate schedule
self.lr_init = lr_init
self.lr_decay_rate = 0.1
self.lr_decay_steps = lr_decay_steps
def new_game(self):
return Game(self.action_space_size, self.discount)
def make_board_game_config(action_space_size: int, max_moves: int,
dirichlet_alpha: float,
lr_init: float) -> MuZeroConfig:
def visit_softmax_temperature(num_moves, training_steps):
if num_moves < 30:
return 1.0
else:
return 0.0 # Play according to the max.
return MuZeroConfig(
action_space_size=action_space_size,
max_moves=max_moves,
discount=1.0,
dirichlet_alpha=dirichlet_alpha,
num_simulations=800,
batch_size=2048,
td_steps=max_moves, # Always use Monte Carlo return.
num_actors=3000,
lr_init=lr_init,
lr_decay_steps=400e3,
visit_softmax_temperature_fn=visit_softmax_temperature,
known_bounds=KnownBounds(-1, 1))
def make_go_config() -> MuZeroConfig:
return make_board_game_config(
action_space_size=362, max_moves=722, dirichlet_alpha=0.03, lr_init=0.01)
def make_chess_config() -> MuZeroConfig:
return make_board_game_config(
action_space_size=4672, max_moves=512, dirichlet_alpha=0.3, lr_init=0.1)
def make_shogi_config() -> MuZeroConfig:
return make_board_game_config(
action_space_size=11259, max_moves=512, dirichlet_alpha=0.15, lr_init=0.1)
def make_atari_config() -> MuZeroConfig:
def visit_softmax_temperature(num_moves, training_steps):
if training_steps < 500e3:
return 1.0
elif training_steps < 750e3:
return 0.5
else:
return 0.25
return MuZeroConfig(
action_space_size=18,
max_moves=27000, # Half an hour at action repeat 4.
discount=0.997,
dirichlet_alpha=0.25,
num_simulations=50,
batch_size=1024,
td_steps=10,
num_actors=350,
lr_init=0.05,
lr_decay_steps=350e3,
visit_softmax_temperature_fn=visit_softmax_temperature)
class Action(object):
def __init__(self, index: int):
self.index = index
def __hash__(self):
return self.index
def __eq__(self, other):
return self.index == other.index
def __gt__(self, other):
return self.index > other.index
class Player(object):
pass
class Node(object):
def __init__(self, prior: float):
self.visit_count = 0
self.to_play = -1
self.prior = prior
self.value_sum = 0
self.children = {}
self.hidden_state = None
self.reward = 0
def expanded(self) -> bool:
return len(self.children) > 0
def value(self) -> float:
if self.visit_count == 0:
return 0
return self.value_sum / self.visit_count
class ActionHistory(object):
"""Simple history container used inside the search.
Only used to keep track of the actions executed.
"""
def __init__(self, history: List[Action], action_space_size: int):
self.history = list(history)
self.action_space_size = action_space_size
def clone(self):
return ActionHistory(self.history, self.action_space_size)
def add_action(self, action: Action):
self.history.append(action)
def last_action(self) -> Action:
return self.history[-1]
def action_space(self) -> List[Action]:
return [Action(i) for i in range(self.action_space_size)]
def to_play(self) -> Player:
return Player()
class Environment(object):
"""The environment MuZero is interacting with."""
def step(self, action):
pass
class Game(object):
"""A single episode of interaction with the environment."""
def __init__(self, action_space_size: int, discount: float):
self.environment = Environment() # Game specific environment.
self.history = []
self.rewards = []
self.child_visits = []
self.root_values = []
self.action_space_size = action_space_size
self.discount = discount
def terminal(self) -> bool:
# Game specific termination rules.
pass
def legal_actions(self) -> List[Action]:
# Game specific calculation of legal actions.
return []
def apply(self, action: Action):
reward = self.environment.step(action)
self.rewards.append(reward)
self.history.append(action)
def store_search_statistics(self, root: Node):
sum_visits = sum(child.visit_count for child in root.children.values())
action_space = (Action(index) for index in range(self.action_space_size))
self.child_visits.append([
root.children[a].visit_count / sum_visits if a in root.children else 0
for a in action_space
])
self.root_values.append(root.value())
def make_image(self, state_index: int):
# Game specific feature planes.
return []
def make_target(self, state_index: int, num_unroll_steps: int, td_steps: int,
to_play: Player):
# The value target is the discounted root value of the search tree N steps
# into the future, plus the discounted sum of all rewards until then.
targets = []
for current_index in range(state_index, state_index + num_unroll_steps + 1):
bootstrap_index = current_index + td_steps
if bootstrap_index < len(self.root_values):
value = self.root_values[bootstrap_index] * self.discount**td_steps
else:
value = 0
for i, reward in enumerate(self.rewards[current_index:bootstrap_index]):
value += reward * self.discount**i # pytype: disable=unsupported-operands
if current_index < len(self.root_values):
targets.append((value, self.rewards[current_index],
self.child_visits[current_index]))
else:
# States past the end of games are treated as absorbing states.
targets.append((0, 0, []))
return targets
def to_play(self) -> Player:
return Player()
def action_history(self) -> ActionHistory:
return ActionHistory(self.history, self.action_space_size)
class ReplayBuffer(object):
def __init__(self, config: MuZeroConfig):
self.window_size = config.window_size
self.batch_size = config.batch_size
self.buffer = []
def save_game(self, game):
if len(self.buffer) > self.window_size:
self.buffer.pop(0)
self.buffer.append(game)
def sample_batch(self, num_unroll_steps: int, td_steps: int):
games = [self.sample_game() for _ in range(self.batch_size)]
game_pos = [(g, self.sample_position(g)) for g in games]
return [(g.make_image(i), g.history[i:i + num_unroll_steps],
g.make_target(i, num_unroll_steps, td_steps, g.to_play()))
for (g, i) in game_pos]
def sample_game(self) -> Game:
# Sample game from buffer either uniformly or according to some priority.
return self.buffer[0]
def sample_position(self, game) -> int:
# Sample position from game either uniformly or according to some priority.
return -1
class NetworkOutput(typing.NamedTuple):
value: float
reward: float
policy_logits: Dict[Action, float]
hidden_state: List[float]
class Network(object):
def initial_inference(self, image) -> NetworkOutput:
# representation + prediction function
return NetworkOutput(0, 0, {}, [])
def recurrent_inference(self, hidden_state, action) -> NetworkOutput:
# dynamics + prediction function
return NetworkOutput(0, 0, {}, [])
def get_weights(self):
# Returns the weights of this network.
return []
def training_steps(self) -> int:
# How many steps / batches the network has been trained for.
return 0
class SharedStorage(object):
def __init__(self):
self._networks = {}
def latest_network(self) -> Network:
if self._networks:
return self._networks[max(self._networks.keys())]
else:
# policy -> uniform, value -> 0, reward -> 0
return make_uniform_network()
def save_network(self, step: int, network: Network):
self._networks[step] = network
##### End Helpers ########
##########################
# MuZero training is split into two independent parts: Network training and
# self-play data generation.
# These two parts only communicate by transferring the latest network checkpoint
# from the training to the self-play, and the finished games from the self-play
# to the training.
def muzero(config: MuZeroConfig):
storage = SharedStorage()
replay_buffer = ReplayBuffer(config)
for _ in range(config.num_actors):
launch_job(run_selfplay, config, storage, replay_buffer)
train_network(config, storage, replay_buffer)
return storage.latest_network()
##################################
####### Part 1: Self-Play ########
# Each self-play job is independent of all others; it takes the latest network
# snapshot, produces a game and makes it available to the training job by
# writing it to a shared replay buffer.
def run_selfplay(config: MuZeroConfig, storage: SharedStorage,
replay_buffer: ReplayBuffer):
while True:
network = storage.latest_network()
game = play_game(config, network)
replay_buffer.save_game(game)
# Each game is produced by starting at the initial board position, then
# repeatedly executing a Monte Carlo Tree Search to generate moves until the end
# of the game is reached.
def play_game(config: MuZeroConfig, network: Network) -> Game:
game = config.new_game()
while not game.terminal() and len(game.history) < config.max_moves:
# At the root of the search tree we use the representation function to
# obtain a hidden state given the current observation.
root = Node(0)
current_observation = game.make_image(-1)
expand_node(root, game.to_play(), game.legal_actions(),
network.initial_inference(current_observation))
add_exploration_noise(config, root)
# We then run a Monte Carlo Tree Search using only action sequences and the
# model learned by the network.
run_mcts(config, root, game.action_history(), network)
action = select_action(config, len(game.history), root, network)
game.apply(action)
game.store_search_statistics(root)
return game
# Core Monte Carlo Tree Search algorithm.
# To decide on an action, we run N simulations, always starting at the root of
# the search tree and traversing the tree according to the UCB formula until we
# reach a leaf node.
def run_mcts(config: MuZeroConfig, root: Node, action_history: ActionHistory,
network: Network):
min_max_stats = MinMaxStats(config.known_bounds)
for _ in range(config.num_simulations):
history = action_history.clone()
node = root
search_path = [node]
while node.expanded():
action, node = select_child(config, node, min_max_stats)
history.add_action(action)
search_path.append(node)
# Inside the search tree we use the dynamics function to obtain the next
# hidden state given an action and the previous hidden state.
parent = search_path[-2]
network_output = network.recurrent_inference(parent.hidden_state,
history.last_action())
expand_node(node, history.to_play(), history.action_space(), network_output)
backpropagate(search_path, network_output.value, history.to_play(),
config.discount, min_max_stats)
def select_action(config: MuZeroConfig, num_moves: int, node: Node,
network: Network):
visit_counts = [
(child.visit_count, action) for action, child in node.children.items()
]
t = config.visit_softmax_temperature_fn(
num_moves=num_moves, training_steps=network.training_steps())
_, action = softmax_sample(visit_counts, t)
return action
# Select the child with the highest UCB score.
def select_child(config: MuZeroConfig, node: Node,
min_max_stats: MinMaxStats):
_, action, child = max(
(ucb_score(config, node, child, min_max_stats), action,
child) for action, child in node.children.items())
return action, child
# The score for a node is based on its value, plus an exploration bonus based on
# the prior.
def ucb_score(config: MuZeroConfig, parent: Node, child: Node,
min_max_stats: MinMaxStats) -> float:
pb_c = math.log((parent.visit_count + config.pb_c_base + 1) /
config.pb_c_base) + config.pb_c_init
pb_c *= math.sqrt(parent.visit_count) / (child.visit_count + 1)
prior_score = pb_c * child.prior
value_score = min_max_stats.normalize(child.value())
return prior_score + value_score
# We expand a node using the value, reward and policy prediction obtained from
# the neural network.
def expand_node(node: Node, to_play: Player, actions: List[Action],
network_output: NetworkOutput):
node.to_play = to_play
node.hidden_state = network_output.hidden_state
node.reward = network_output.reward
policy = {a: math.exp(network_output.policy_logits[a]) for a in actions}
policy_sum = sum(policy.values())
for action, p in policy.items():
node.children[action] = Node(p / policy_sum)
# At the end of a simulation, we propagate the evaluation all the way up the
# tree to the root.
def backpropagate(search_path: List[Node], value: float, to_play: Player,
discount: float, min_max_stats: MinMaxStats):
for node in search_path:
node.value_sum += value if node.to_play == to_play else -value
node.visit_count += 1
min_max_stats.update(node.value())
value = node.reward + discount * value
# At the start of each search, we add dirichlet noise to the prior of the root
# to encourage the search to explore new actions.
def add_exploration_noise(config: MuZeroConfig, node: Node):
actions = list(node.children.keys())
noise = numpy.random.dirichlet([config.root_dirichlet_alpha] * len(actions))
frac = config.root_exploration_fraction
for a, n in zip(actions, noise):
node.children[a].prior = node.children[a].prior * (1 - frac) + n * frac
######### End Self-Play ##########
##################################
##################################
####### Part 2: Training #########
def train_network(config: MuZeroConfig, storage: SharedStorage,
replay_buffer: ReplayBuffer):
network = Network()
learning_rate = config.lr_init * config.lr_decay_rate**(
tf.train.get_global_step() / config.lr_decay_steps)
optimizer = tf.train.MomentumOptimizer(learning_rate, config.momentum)
for i in range(config.training_steps):
if i % config.checkpoint_interval == 0:
storage.save_network(i, network)
batch = replay_buffer.sample_batch(config.num_unroll_steps, config.td_steps)
update_weights(optimizer, network, batch, config.weight_decay)
storage.save_network(config.training_steps, network)
def update_weights(optimizer: tf.train.Optimizer, network: Network, batch,
weight_decay: float):
loss = 0
for image, actions, targets in batch:
# Initial step, from the real observation.
value, reward, policy_logits, hidden_state = network.initial_inference(
image)
predictions = [(1.0, value, reward, policy_logits)]
# Recurrent steps, from action and previous hidden state.
for action in actions:
value, reward, policy_logits, hidden_state = network.recurrent_inference(
hidden_state, action)
predictions.append((1.0 / len(actions), value, reward, policy_logits))
hidden_state = tf.scale_gradient(hidden_state, 0.5)
for prediction, target in zip(predictions, targets):
gradient_scale, value, reward, policy_logits = prediction
target_value, target_reward, target_policy = target
l = (
scalar_loss(value, target_value) +
scalar_loss(reward, target_reward) +
tf.nn.softmax_cross_entropy_with_logits(
logits=policy_logits, labels=target_policy))
loss += tf.scale_gradient(l, gradient_scale)
for weights in network.get_weights():
loss += weight_decay * tf.nn.l2_loss(weights)
optimizer.minimize(loss)
def scalar_loss(prediction, target) -> float:
# MSE in board games, cross entropy between categorical values in Atari.
return -1
######### End Training ###########
##################################
################################################################################
############################# End of pseudocode ################################
################################################################################
# Stubs to make the typechecker happy.
def softmax_sample(distribution, temperature: float):
return 0, 0
def launch_job(f, *args):
f(*args)
def make_uniform_network():
return Network()

File diff suppressed because it is too large Load Diff