bachelor-thesis/data/in_silico_repertoire.html

1403 lines
4.5 MiB
HTML
Raw Permalink Normal View History

2021-06-26 18:05:40 +02:00
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="generator" content="pandoc" />
<meta http-equiv="X-UA-Compatible" content="IE=EDGE" />
<meta name="author" content="Maria S. Benitez-Cantos" />
<meta name="date" content="2021-12-02" />
<title>Generating in silico TCR repertoires</title>
<script src="data:application/x-javascript;base64,LyohIGpRdWVyeSB2MS4xMi40IHwgKGMpIGpRdWVyeSBGb3VuZGF0aW9uIHwganF1ZXJ5Lm9yZy9saWNlbnNlICovCiFmdW5jdGlvbihhLGIpeyJvYmplY3QiPT10eXBlb2YgbW9kdWxlJiYib2JqZWN0Ij09dHlwZW9mIG1vZHVsZS5leHBvcnRzP21vZHVsZS5leHBvcnRzPWEuZG9jdW1lbnQ/YihhLCEwKTpmdW5jdGlvbihhKXtpZighYS5kb2N1bWVudCl0aHJvdyBuZXcgRXJyb3IoImpRdWVyeSByZXF1aXJlcyBhIHdpbmRvdyB3aXRoIGEgZG9jdW1lbnQiKTtyZXR1cm4gYihhKX06YihhKX0oInVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93OnRoaXMsZnVuY3Rpb24oYSxiKXt2YXIgYz1bXSxkPWEuZG9jdW1lbnQsZT1jLnNsaWNlLGY9Yy5jb25jYXQsZz1jLnB1c2gsaD1jLmluZGV4T2YsaT17fSxqPWkudG9TdHJpbmcsaz1pLmhhc093blByb3BlcnR5LGw9e30sbT0iMS4xMi40IixuPWZ1bmN0aW9uKGEsYil7cmV0dXJuIG5ldyBuLmZuLmluaXQoYSxiKX0sbz0vXltcc1x1RkVGRlx4QTBdK3xbXHNcdUZFRkZceEEwXSskL2cscD0vXi1tcy0vLHE9Ly0oW1xkYS16XSkvZ2kscj1mdW5jdGlvbihhLGIpe3JldHVybiBiLnRvVXBwZXJDYXNlKCl9O24uZm49bi5wcm90b3R5cGU9e2pxdWVyeTptLGNvbnN0cnVjdG9yOm4sc2VsZWN0b3I6IiIsbGVuZ3RoOjAsdG9BcnJheTpmdW5jdGlvbigpe3JldHVybiBlLmNhbGwodGhpcyl9LGdldDpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbCE9YT8wPmE/dGhpc1thK3RoaXMubGVuZ3RoXTp0aGlzW2FdOmUuY2FsbCh0aGlzKX0scHVzaFN0YWNrOmZ1bmN0aW9uKGEpe3ZhciBiPW4ubWVyZ2UodGhpcy5jb25zdHJ1Y3RvcigpLGEpO3JldHVybiBiLnByZXZPYmplY3Q9dGhpcyxiLmNvbnRleHQ9dGhpcy5jb250ZXh0LGJ9LGVhY2g6ZnVuY3Rpb24oYSl7cmV0dXJuIG4uZWFjaCh0aGlzLGEpfSxtYXA6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKG4ubWFwKHRoaXMsZnVuY3Rpb24oYixjKXtyZXR1cm4gYS5jYWxsKGIsYyxiKX0pKX0sc2xpY2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soZS5hcHBseSh0aGlzLGFyZ3VtZW50cykpfSxmaXJzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKDApfSxsYXN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoLTEpfSxlcTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmxlbmd0aCxjPSthKygwPmE/YjowKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2soYz49MCYmYj5jP1t0aGlzW2NdXTpbXSl9LGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnByZXZPYmplY3R8fHRoaXMuY29uc3RydWN0b3IoKX0scHVzaDpnLHNvcnQ6Yy5zb3J0LHNwbGljZTpjLnNwbGljZX0sbi5leHRlbmQ9bi5mbi5leHRlbmQ9ZnVuY3Rpb24oKXt2YXIgYSxiLGMsZCxlLGYsZz1hcmd1bWVudHNbMF18fHt9LGg9MSxpPWFyZ3VtZW50cy5sZW5ndGgsaj0hMTtmb3IoImJvb2xlYW4iPT10eXBlb2YgZyYmKGo9ZyxnPWFyZ3VtZW50c1toXXx8e30saCsrKSwib2JqZWN0Ij09dHlwZW9mIGd8fG4uaXNGdW5jdGlvbihnKXx8KGc9e30pLGg9PT1pJiYoZz10aGlzLGgtLSk7aT5oO2grKylpZihudWxsIT0oZT1hcmd1bWVudHNbaF0pKWZvcihkIGluIGUpYT1nW2RdLGM9ZVtkXSxnIT09YyYmKGomJmMmJihuLmlzUGxhaW5PYmplY3QoYyl8fChiPW4uaXNBcnJheShjKSkpPyhiPyhiPSExLGY9YSYmbi5pc0FycmF5KGEpP2E6W10pOmY9YSYmbi5pc1BsYWluT2JqZWN0KGEpP2E6e30sZ1tkXT1uLmV4dGVuZChqLGYsYykpOnZvaWQgMCE9PWMmJihnW2RdPWMpKTtyZXR1cm4gZ30sbi5leHRlbmQoe2V4cGFuZG86ImpRdWVyeSIrKG0rTWF0aC5yYW5kb20oKSkucmVwbGFjZSgvXEQvZywiIiksaXNSZWFkeTohMCxlcnJvcjpmdW5jdGlvbihhKXt0aHJvdyBuZXcgRXJyb3IoYSl9LG5vb3A6ZnVuY3Rpb24oKXt9LGlzRnVuY3Rpb246ZnVuY3Rpb24oYSl7cmV0dXJuImZ1bmN0aW9uIj09PW4udHlwZShhKX0saXNBcnJheTpBcnJheS5pc0FycmF5fHxmdW5jdGlvbihhKXtyZXR1cm4iYXJyYXkiPT09bi50eXBlKGEpfSxpc1dpbmRvdzpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbCE9YSYmYT09YS53aW5kb3d9LGlzTnVtZXJpYzpmdW5jdGlvbihhKXt2YXIgYj1hJiZhLnRvU3RyaW5nKCk7cmV0dXJuIW4uaXNBcnJheShhKSYmYi1wYXJzZUZsb2F0KGIpKzE+PTB9LGlzRW1wdHlPYmplY3Q6ZnVuY3Rpb24oYSl7dmFyIGI7Zm9yKGIgaW4gYSlyZXR1cm4hMTtyZXR1cm4hMH0saXNQbGFpbk9iamVjdDpmdW5jdGlvbihhKXt2YXIgYjtpZighYXx8Im9iamVjdCIhPT1uLnR5cGUoYSl8fGEubm9kZVR5cGV8fG4uaXNXaW5kb3coYSkpcmV0dXJuITE7dHJ5e2lmKGEuY29uc3RydWN0b3ImJiFrLmNhbGwoYSwiY29uc3RydWN0b3IiKSYmIWsuY2FsbChhLmNvbnN0cnVjdG9yLnByb3RvdHlwZSwiaXNQcm90b3R5cGVPZiIpKXJldHVybiExfWNhdGNoKGMpe3JldHVybiExfWlmKCFsLm93bkZpcnN0KWZvcihiIGluIGEpcmV0dXJuIGsuY2FsbChhLGIpO2ZvcihiIGluIGEpO3JldHVybiB2b2lkIDA9PT1ifHxrLmNhbGwoYSxiKX0sdHlwZTpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbD09YT9hKyIiOiJvYmplY3QiPT10eXBlb2YgYXx8ImZ1bmN0aW9uIj09dHlwZW9mIGE/aVtqLmNhbGwoYSldfHwib2JqZWN0Ijp0eXBlb2YgYX0sZ2xvYmFsRXZhbDpmdW5jdGlvbihiKXtiJiZuLnRyaW0oYikmJihhLmV4ZWNTY3JpcHR8fGZ1bmN0aW9uKGIpe2EuZXZhbC5jYWxsKGEsYil9KShiKX0sY2FtZWxDYXNlOmZ1bmN0aW9uKGEpe3JldHVybiBhLnJlcGxhY2UocCwibXMtIikucmVwbGFjZShxLHIpfSxub2RlTmFtZTpmdW5jdGlvbihhLGIpe3JldHVybiBhLm5vZGVOYW1lJiZhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1iLnRvTG93ZXJDYXNlKCl9LGVhY2g6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPTA7aWYocyhhKSl7Zm9yKGM9YS5sZW5ndGg7Yz5kO2QrKylpZihiLmNhbGwoYVtkXSxkLGFbZF0pPT09ITEpYnJlYWt9ZWxzZSBmb3IoZCBpbiBhKWlmKGIuY2FsbChhW2RdLGQsYVtkXSk9PT0hMSlicmVhaztyZXR1cm4gY
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link href="data:text/css;charset=utf-8,%40font%2Dface%20%7B%0Afont%2Dfamily%3A%20%27Source%20Sans%20Pro%27%3B%0Afont%2Dstyle%3A%20normal%3B%0Afont%2Dweight%3A%20300%3B%0Asrc%3A%20url%28data%3Aapplication%2Fx%2Dfont%2Dtruetype%3Bbase64%2CAAEAAAARAQAABAAQR0RFRgNEA3IAAG%2BkAAAAQEdQT1PXveeXAABv5AAAGWRHU1VC8WfWVwAAiUgAAADgT1MvMlpQkwsAAGZkAAAAYGNtYXDzMPm1AABmxAAAAeZjdnQgDXMAuAAAamwAAAAoZnBnbQZZnDcAAGisAAABc2dhc3D%2F%2FwADAABvnAAAAAhnbHlm4G%2FpBAAAARwAAF8kaGVhZP4Fs%2FYAAGJEAAAANmhoZWEHlAOiAABmQAAAACRobXR4l6Yq6AAAYnwAAAPEbG9jYV5idvoAAGBgAAAB5G1heHADCwJJAABgQAAAACBuYW1lIvc8kwAAapQAAAHKcG9zdGxQSG8AAGxgAAADOXByZXAtaIB5AABqIAAAAEsABQBeAAACGgKUAAMABgAJAA8AFQBnALgAAEVYuAAALxu5AAAAED5ZuAAARVi4AAIvG7kAAgAEPlm6AAUAAgAAERI5ugAGAAIAABESOboABwACAAAREjm6AAgAAgAAERI5uQAKAAH0ugANAAIAABESObgAABC5ABIAAfQwMRMhESETAxEhEQMTLwEjDwETPwEhHwFeAbz%2BRMCTAWCRfF07BD1foDVW%2FuRXNgKU%2FWwBVAEE%2FfwCBP78%2FtOkaWmkAU1cm5tcAAIACAAAAgYCkwAJABEAVAC4AABFWLgADi8buQAOABA%2BWbgAAEVYuAAMLxu5AAwABD5ZuAAARVi4ABEvG7kAEQAEPlm6AAUADAAOERI5ugALAAwADhESObgACy%2B5AAkAAfQwMQEnLgEnIw4BDwEXIQcjEzMTIwF8KhQkEQQRJBQq9%2F77Ti7oLugwAQl7O2w9PWw7eyfiApP9bQAAAAMAYQAAAhUCkwARABoAIwBbALgAAEVYuAAALxu5AAAAED5ZuAAARVi4ABEvG7kAEQAEPlm6ACEAAAARERI5uAAhL7oACAAhABIREjm4AAAQuQAZAAH0uAAhELkAGgAB9LgAERC5ACMAAfQwMRMzMhYVFAYHFR4BFRQOAisBEzI2NTQmKwEVEzI2NTQmKwERYbJkdjs6SVQjQFo4v6BmWF5bd4VjcW5mhQKTTVM0TQ8EC09FMEgwGAFxQUJAOfz%2BtUpQR0X%2B2gAAAQA3%2F%2FQCDwKfACEAOQC4AABFWLgABS8buQAFABA%2BWbgAAEVYuAAdLxu5AB0ABD5ZuAAFELkADAAB9LgAHRC5ABYAAfQwMRM0PgIzMhYXBy4BIyIOAhUUHgIzMjY3Fw4BIyIuAjcpSmg%2FOVgaHBpILTZXPSAgPFU1M08kHCZeQD1mSSgBS05%2BWS8wHx4eJSpNbkVFb04rKCkdLDIwWX8AAAIAYQAAAiUCkwAMABkANQC4AABFWLgAAC8buQAAABA%2BWbgAAEVYuAAMLxu5AAwABD5ZuQANAAH0uAAAELkAFwAB9DAxEzMyHgIVFA4CKwE3Mj4CNTQuAisBEWGZTHFKJCRKcEyalENhPh4ePmFDZgKTLlZ4S0t7Vy8nK05rQUBqTCr9uwAAAAABAGEAAAHUApMACwBNALgAAEVYuAAALxu5AAAAED5ZuAAARVi4AAsvG7kACwAEPlm4AAAQuQADAAH0ugAHAAAACxESObgABy%2B5AAUAAfS4AAsQuQAIAAH0MDETIRUhFSEVIREhFSFhAWn%2BxQEI%2FvgBRf6NApMo%2BSj%2B3igAAQBhAAAByAKTAAkAQwC4AABFWLgAAC8buQAAABA%2BWbgAAEVYuAAJLxu5AAkABD5ZuAAAELkAAwAB9LoABwAAAAkREjm4AAcvuQAFAAH0MDETIRUhESEVIREjYQFn%2FscBCf73LgKTKP76KP7DAAAAAAEAN%2F%2F0AhUCnwAnAE0AuAAARVi4AAUvG7kABQAQPlm4AABFWLgAIy8buQAjAAQ%2BWbgABRC5AA4AAfS4ACMQuQAYAAH0ugAfAAUAIxESObgAHy%2B5AB0AAfQwMRM0PgIzMh4CFwcuASMiDgIVFB4CMzI2NzUjNTMRDgEjIi4CNypNa0IhNiwjDRsaSDY5Wj8iID1ZOC1PGJ7KH2NCP2hKKQFLTn5ZLw4XHA4eHCcqTW5FRW9OKxoYzSf%2B%2ByEqMFl%2FAAEAYQAAAh4CkwALAEkAuAAARVi4AAAvG7kAAAAQPlm4AABFWLgACy8buQALAAQ%2BWboACQAAAAsREjm4AAkvuQADAAH0uAAAELgABNC4AAsQuAAH0DAxEzMRIREzESMRIREjYS4BYS4u%2Fp8uApP%2B3wEh%2FW0BSv62AAEAYQAAAI8CkwADACUAuAAARVi4AAAvG7kAAAAQPlm4AABFWLgAAy8buQADAAQ%2BWTAxEzMRI2EuLgKT%2FW0AAAABACn%2F9AFvApMAEQArALgAAEVYuAAHLxu5AAcAED5ZuAAARVi4AA4vG7kADgAEPlm5AAMAAfQwMTceATMyNjURMxEUDgIjIiYnTBg9Kjw6LhInPi03UhlsKiRJUQHb%2FiAoRTQeMi8AAAEAYQAAAiQCkwAMAFsAuAAARVi4AAAvG7kAAAAQPlm4AABFWLgABC8buQAEABA%2BWbgAAEVYuAAMLxu5AAwABD5ZuAAARVi4AAgvG7kACAAEPlm6AAIAAAAMERI5ugAJAAQACBESOTAxEzMRMwEzBxMjAwcVI2EuAgE%2FN9LvNdqGLgKT%2FpIBbvT%2BYQF8meMAAAEAYQAAAb8CkwAFACsAuAAARVi4AAAvG7kAAAAQPlm4AABFWLgABS8buQAFAAQ%2BWbkAAgAB9DAxEzMRIRUhYS4BMP6iApP9lSgAAAABAGEAAAJhApMAGQBvALgAAEVYuAAALxu5AAAAED5ZuAAARVi4AAYvG7kABgAQPlm4AABFWLgAGS8buQAZAAQ%2BWbgAAEVYuAAJLxu5AAkABD5ZugADAAYACRESOboADgAGAAkREjm6ABEAGQAGERI5ugAUAAAAGRESOTAxEzMTFzM3EzMRIxE0NjcjBwMjAycjHgEVESNhQYo0BDKKQS0EAgQ0jSmONAQCBCsCk%2F59kpIBg%2F1tAbEpXyqR%2FnYBipEqXyn%2BTwAAAAEAYQAAAhsCkwATAFsAuAAARVi4AAAvG7kAAAAQPlm4AABFWLgACC8buQAIABA%2BWbgAAEVYuAATLxu5ABMABD5ZuAAARVi4AAsvG7kACwAEPlm6AAQACwAIERI5ugAOAAAAExESOTAxEzMBFzMuATURMxEjAScjHgEVESNhMAEWSgQCBCww%2FupKBAIELAKT%2Fi%2BDMGAwAZT9bQHRgzBbMP5nAAAAAgA3%2F%2FQCVgKfABMAJwA1ALgAAEVYuAAKLxu5AAoAED5ZuAAARVi4AAAvG7kAAAAEPlm5ABQAAfS4AAoQuQAeAAH0MDEFIi4CNTQ%2BAjMyHgIVFA4CJzI%2BAjU0LgIjIg4CFRQeAgFGO2RIKChIZDs8ZEgoKEhkPDJSOyAgO1IyMlM6ICA6UwwxWn9OTn1ZLy9ZfU5Of1oxKitPb0VEbk0qKk1uREVvTysAAgBhAAACAAKTAAwAFwBDALgAAEVYuAAALxu5AAAAED5ZuAAARVi4AAwvG7kADAAEPlm6AAoAAAAMERI5uAAKL7kADQAB9LgAABC5ABYAAfQwMRMzMh4CFRQGKwERIxMyNjU0LgIrARFhtDdXPSB8b4YuqWViGTFLMnsCkxMsRjNhX%2F7lAUJIUSo3Ig7%2B1gAAAgA3%2F2UCWAKfABMANABLALgAAEVYuAAkLxu5ACQAED5ZuAAARVi4ABovG7kAGgAEPlm7A
<script src="data:application/x-javascript;base64,LyohCiAqIEJvb3RzdHJhcCB2My4zLjUgKGh0dHA6Ly9nZXRib290c3RyYXAuY29tKQogKiBDb3B5cmlnaHQgMjAxMS0yMDE1IFR3aXR0ZXIsIEluYy4KICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlCiAqLwppZigidW5kZWZpbmVkIj09dHlwZW9mIGpRdWVyeSl0aHJvdyBuZXcgRXJyb3IoIkJvb3RzdHJhcCdzIEphdmFTY3JpcHQgcmVxdWlyZXMgalF1ZXJ5Iik7K2Z1bmN0aW9uKGEpeyJ1c2Ugc3RyaWN0Ijt2YXIgYj1hLmZuLmpxdWVyeS5zcGxpdCgiICIpWzBdLnNwbGl0KCIuIik7aWYoYlswXTwyJiZiWzFdPDl8fDE9PWJbMF0mJjk9PWJbMV0mJmJbMl08MSl0aHJvdyBuZXcgRXJyb3IoIkJvb3RzdHJhcCdzIEphdmFTY3JpcHQgcmVxdWlyZXMgalF1ZXJ5IHZlcnNpb24gMS45LjEgb3IgaGlnaGVyIil9KGpRdWVyeSksK2Z1bmN0aW9uKGEpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBiKCl7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYm9vdHN0cmFwIiksYj17V2Via2l0VHJhbnNpdGlvbjoid2Via2l0VHJhbnNpdGlvbkVuZCIsTW96VHJhbnNpdGlvbjoidHJhbnNpdGlvbmVuZCIsT1RyYW5zaXRpb246Im9UcmFuc2l0aW9uRW5kIG90cmFuc2l0aW9uZW5kIix0cmFuc2l0aW9uOiJ0cmFuc2l0aW9uZW5kIn07Zm9yKHZhciBjIGluIGIpaWYodm9pZCAwIT09YS5zdHlsZVtjXSlyZXR1cm57ZW5kOmJbY119O3JldHVybiExfWEuZm4uZW11bGF0ZVRyYW5zaXRpb25FbmQ9ZnVuY3Rpb24oYil7dmFyIGM9ITEsZD10aGlzO2EodGhpcykub25lKCJic1RyYW5zaXRpb25FbmQiLGZ1bmN0aW9uKCl7Yz0hMH0pO3ZhciBlPWZ1bmN0aW9uKCl7Y3x8YShkKS50cmlnZ2VyKGEuc3VwcG9ydC50cmFuc2l0aW9uLmVuZCl9O3JldHVybiBzZXRUaW1lb3V0KGUsYiksdGhpc30sYShmdW5jdGlvbigpe2Euc3VwcG9ydC50cmFuc2l0aW9uPWIoKSxhLnN1cHBvcnQudHJhbnNpdGlvbiYmKGEuZXZlbnQuc3BlY2lhbC5ic1RyYW5zaXRpb25FbmQ9e2JpbmRUeXBlOmEuc3VwcG9ydC50cmFuc2l0aW9uLmVuZCxkZWxlZ2F0ZVR5cGU6YS5zdXBwb3J0LnRyYW5zaXRpb24uZW5kLGhhbmRsZTpmdW5jdGlvbihiKXtyZXR1cm4gYShiLnRhcmdldCkuaXModGhpcyk/Yi5oYW5kbGVPYmouaGFuZGxlci5hcHBseSh0aGlzLGFyZ3VtZW50cyk6dm9pZCAwfX0pfSl9KGpRdWVyeSksK2Z1bmN0aW9uKGEpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBiKGIpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYz1hKHRoaXMpLGU9Yy5kYXRhKCJicy5hbGVydCIpO2V8fGMuZGF0YSgiYnMuYWxlcnQiLGU9bmV3IGQodGhpcykpLCJzdHJpbmciPT10eXBlb2YgYiYmZVtiXS5jYWxsKGMpfSl9dmFyIGM9J1tkYXRhLWRpc21pc3M9ImFsZXJ0Il0nLGQ9ZnVuY3Rpb24oYil7YShiKS5vbigiY2xpY2siLGMsdGhpcy5jbG9zZSl9O2QuVkVSU0lPTj0iMy4zLjUiLGQuVFJBTlNJVElPTl9EVVJBVElPTj0xNTAsZC5wcm90b3R5cGUuY2xvc2U9ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYygpe2cuZGV0YWNoKCkudHJpZ2dlcigiY2xvc2VkLmJzLmFsZXJ0IikucmVtb3ZlKCl9dmFyIGU9YSh0aGlzKSxmPWUuYXR0cigiZGF0YS10YXJnZXQiKTtmfHwoZj1lLmF0dHIoImhyZWYiKSxmPWYmJmYucmVwbGFjZSgvLiooPz0jW15cc10qJCkvLCIiKSk7dmFyIGc9YShmKTtiJiZiLnByZXZlbnREZWZhdWx0KCksZy5sZW5ndGh8fChnPWUuY2xvc2VzdCgiLmFsZXJ0IikpLGcudHJpZ2dlcihiPWEuRXZlbnQoImNsb3NlLmJzLmFsZXJ0IikpLGIuaXNEZWZhdWx0UHJldmVudGVkKCl8fChnLnJlbW92ZUNsYXNzKCJpbiIpLGEuc3VwcG9ydC50cmFuc2l0aW9uJiZnLmhhc0NsYXNzKCJmYWRlIik/Zy5vbmUoImJzVHJhbnNpdGlvbkVuZCIsYykuZW11bGF0ZVRyYW5zaXRpb25FbmQoZC5UUkFOU0lUSU9OX0RVUkFUSU9OKTpjKCkpfTt2YXIgZT1hLmZuLmFsZXJ0O2EuZm4uYWxlcnQ9YixhLmZuLmFsZXJ0LkNvbnN0cnVjdG9yPWQsYS5mbi5hbGVydC5ub0NvbmZsaWN0PWZ1bmN0aW9uKCl7cmV0dXJuIGEuZm4uYWxlcnQ9ZSx0aGlzfSxhKGRvY3VtZW50KS5vbigiY2xpY2suYnMuYWxlcnQuZGF0YS1hcGkiLGMsZC5wcm90b3R5cGUuY2xvc2UpfShqUXVlcnkpLCtmdW5jdGlvbihhKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gYihiKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGQ9YSh0aGlzKSxlPWQuZGF0YSgiYnMuYnV0dG9uIiksZj0ib2JqZWN0Ij09dHlwZW9mIGImJmI7ZXx8ZC5kYXRhKCJicy5idXR0b24iLGU9bmV3IGModGhpcyxmKSksInRvZ2dsZSI9PWI/ZS50b2dnbGUoKTpiJiZlLnNldFN0YXRlKGIpfSl9dmFyIGM9ZnVuY3Rpb24oYixkKXt0aGlzLiRlbGVtZW50PWEoYiksdGhpcy5vcHRpb25zPWEuZXh0ZW5kKHt9LGMuREVGQVVMVFMsZCksdGhpcy5pc0xvYWRpbmc9ITF9O2MuVkVSU0lPTj0iMy4zLjUiLGMuREVGQVVMVFM9e2xvYWRpbmdUZXh0OiJsb2FkaW5nLi4uIn0sYy5wcm90b3R5cGUuc2V0U3RhdGU9ZnVuY3Rpb24oYil7dmFyIGM9ImRpc2FibGVkIixkPXRoaXMuJGVsZW1lbnQsZT1kLmlzKCJpbnB1dCIpPyJ2YWwiOiJodG1sIixmPWQuZGF0YSgpO2IrPSJUZXh0IixudWxsPT1mLnJlc2V0VGV4dCYmZC5kYXRhKCJyZXNldFRleHQiLGRbZV0oKSksc2V0VGltZW91dChhLnByb3h5KGZ1bmN0aW9uKCl7ZFtlXShudWxsPT1mW2JdP3RoaXMub3B0aW9uc1tiXTpmW2JdKSwibG9hZGluZ1RleHQiPT1iPyh0aGlzLmlzTG9hZGluZz0hMCxkLmFkZENsYXNzKGMpLmF0dHIoYyxjKSk6dGhpcy5pc0xvYWRpbmcmJih0aGlzLmlzTG9hZGluZz0hMSxkLnJlbW92ZUNsYXNzKGMpLnJlbW92ZUF0dHIoYykpfSx0aGlzKSwwKX0sYy5wcm90b3R5cGUudG9nZ2xlPWZ1bmN0aW9uKCl7dmFyIGE9ITAsYj10aGlzLiRlbGVtZW50LmNsb3Nlc3QoJ1tkYXRhLXRvZ2dsZT0iYnV0dG9ucyJdJyk7aWYoYi5sZW5ndGgpe3ZhciBjPXRoaXMuJGVsZW1lbnQuZmluZCgiaW5wdXQiKTsicmFkaW8iPT1jLnByb3AoInR5cGUiKT8oYy5wcm9wKCJjaGVja2VkIikmJihhPSExKSxiLmZpbmQoI
<script src="data:application/x-javascript;base64,LyoqCiogQHByZXNlcnZlIEhUTUw1IFNoaXYgMy43LjIgfCBAYWZhcmthcyBAamRhbHRvbiBAam9uX25lYWwgQHJlbSB8IE1JVC9HUEwyIExpY2Vuc2VkCiovCi8vIE9ubHkgcnVuIHRoaXMgY29kZSBpbiBJRSA4CmlmICghIXdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKCJNU0lFIDgiKSkgewohZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKGEsYil7dmFyIGM9YS5jcmVhdGVFbGVtZW50KCJwIiksZD1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF18fGEuZG9jdW1lbnRFbGVtZW50O3JldHVybiBjLmlubmVySFRNTD0ieDxzdHlsZT4iK2IrIjwvc3R5bGU+IixkLmluc2VydEJlZm9yZShjLmxhc3RDaGlsZCxkLmZpcnN0Q2hpbGQpfWZ1bmN0aW9uIGQoKXt2YXIgYT10LmVsZW1lbnRzO3JldHVybiJzdHJpbmciPT10eXBlb2YgYT9hLnNwbGl0KCIgIik6YX1mdW5jdGlvbiBlKGEsYil7dmFyIGM9dC5lbGVtZW50czsic3RyaW5nIiE9dHlwZW9mIGMmJihjPWMuam9pbigiICIpKSwic3RyaW5nIiE9dHlwZW9mIGEmJihhPWEuam9pbigiICIpKSx0LmVsZW1lbnRzPWMrIiAiK2EsaihiKX1mdW5jdGlvbiBmKGEpe3ZhciBiPXNbYVtxXV07cmV0dXJuIGJ8fChiPXt9LHIrKyxhW3FdPXIsc1tyXT1iKSxifWZ1bmN0aW9uIGcoYSxjLGQpe2lmKGN8fChjPWIpLGwpcmV0dXJuIGMuY3JlYXRlRWxlbWVudChhKTtkfHwoZD1mKGMpKTt2YXIgZTtyZXR1cm4gZT1kLmNhY2hlW2FdP2QuY2FjaGVbYV0uY2xvbmVOb2RlKCk6cC50ZXN0KGEpPyhkLmNhY2hlW2FdPWQuY3JlYXRlRWxlbShhKSkuY2xvbmVOb2RlKCk6ZC5jcmVhdGVFbGVtKGEpLCFlLmNhbkhhdmVDaGlsZHJlbnx8by50ZXN0KGEpfHxlLnRhZ1Vybj9lOmQuZnJhZy5hcHBlbmRDaGlsZChlKX1mdW5jdGlvbiBoKGEsYyl7aWYoYXx8KGE9YiksbClyZXR1cm4gYS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7Yz1jfHxmKGEpO2Zvcih2YXIgZT1jLmZyYWcuY2xvbmVOb2RlKCksZz0wLGg9ZCgpLGk9aC5sZW5ndGg7aT5nO2crKyllLmNyZWF0ZUVsZW1lbnQoaFtnXSk7cmV0dXJuIGV9ZnVuY3Rpb24gaShhLGIpe2IuY2FjaGV8fChiLmNhY2hlPXt9LGIuY3JlYXRlRWxlbT1hLmNyZWF0ZUVsZW1lbnQsYi5jcmVhdGVGcmFnPWEuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCxiLmZyYWc9Yi5jcmVhdGVGcmFnKCkpLGEuY3JlYXRlRWxlbWVudD1mdW5jdGlvbihjKXtyZXR1cm4gdC5zaGl2TWV0aG9kcz9nKGMsYSxiKTpiLmNyZWF0ZUVsZW0oYyl9LGEuY3JlYXRlRG9jdW1lbnRGcmFnbWVudD1GdW5jdGlvbigiaCxmIiwicmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49Zi5jbG9uZU5vZGUoKSxjPW4uY3JlYXRlRWxlbWVudDtoLnNoaXZNZXRob2RzJiYoIitkKCkuam9pbigpLnJlcGxhY2UoL1tcd1wtOl0rL2csZnVuY3Rpb24oYSl7cmV0dXJuIGIuY3JlYXRlRWxlbShhKSxiLmZyYWcuY3JlYXRlRWxlbWVudChhKSwnYygiJythKyciKSd9KSsiKTtyZXR1cm4gbn0iKSh0LGIuZnJhZyl9ZnVuY3Rpb24gaihhKXthfHwoYT1iKTt2YXIgZD1mKGEpO3JldHVybiF0LnNoaXZDU1N8fGt8fGQuaGFzQ1NTfHwoZC5oYXNDU1M9ISFjKGEsImFydGljbGUsYXNpZGUsZGlhbG9nLGZpZ2NhcHRpb24sZmlndXJlLGZvb3RlcixoZWFkZXIsaGdyb3VwLG1haW4sbmF2LHNlY3Rpb257ZGlzcGxheTpibG9ja31tYXJre2JhY2tncm91bmQ6I0ZGMDtjb2xvcjojMDAwfXRlbXBsYXRle2Rpc3BsYXk6bm9uZX0iKSksbHx8aShhLGQpLGF9dmFyIGssbCxtPSIzLjcuMiIsbj1hLmh0bWw1fHx7fSxvPS9ePHxeKD86YnV0dG9ufG1hcHxzZWxlY3R8dGV4dGFyZWF8b2JqZWN0fGlmcmFtZXxvcHRpb258b3B0Z3JvdXApJC9pLHA9L14oPzphfGJ8Y29kZXxkaXZ8ZmllbGRzZXR8aDF8aDJ8aDN8aDR8aDV8aDZ8aXxsYWJlbHxsaXxvbHxwfHF8c3BhbnxzdHJvbmd8c3R5bGV8dGFibGV8dGJvZHl8dGR8dGh8dHJ8dWwpJC9pLHE9Il9odG1sNXNoaXYiLHI9MCxzPXt9OyFmdW5jdGlvbigpe3RyeXt2YXIgYT1iLmNyZWF0ZUVsZW1lbnQoImEiKTthLmlubmVySFRNTD0iPHh5ej48L3h5ej4iLGs9ImhpZGRlbiJpbiBhLGw9MT09YS5jaGlsZE5vZGVzLmxlbmd0aHx8ZnVuY3Rpb24oKXtiLmNyZWF0ZUVsZW1lbnQoImEiKTt2YXIgYT1iLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtyZXR1cm4idW5kZWZpbmVkIj09dHlwZW9mIGEuY2xvbmVOb2RlfHwidW5kZWZpbmVkIj09dHlwZW9mIGEuY3JlYXRlRG9jdW1lbnRGcmFnbWVudHx8InVuZGVmaW5lZCI9PXR5cGVvZiBhLmNyZWF0ZUVsZW1lbnR9KCl9Y2F0Y2goYyl7az0hMCxsPSEwfX0oKTt2YXIgdD17ZWxlbWVudHM6bi5lbGVtZW50c3x8ImFiYnIgYXJ0aWNsZSBhc2lkZSBhdWRpbyBiZGkgY2FudmFzIGRhdGEgZGF0YWxpc3QgZGV0YWlscyBkaWFsb2cgZmlnY2FwdGlvbiBmaWd1cmUgZm9vdGVyIGhlYWRlciBoZ3JvdXAgbWFpbiBtYXJrIG1ldGVyIG5hdiBvdXRwdXQgcGljdHVyZSBwcm9ncmVzcyBzZWN0aW9uIHN1bW1hcnkgdGVtcGxhdGUgdGltZSB2aWRlbyIsdmVyc2lvbjptLHNoaXZDU1M6bi5zaGl2Q1NTIT09ITEsc3VwcG9ydHNVbmtub3duRWxlbWVudHM6bCxzaGl2TWV0aG9kczpuLnNoaXZNZXRob2RzIT09ITEsdHlwZToiZGVmYXVsdCIsc2hpdkRvY3VtZW50OmosY3JlYXRlRWxlbWVudDpnLGNyZWF0ZURvY3VtZW50RnJhZ21lbnQ6aCxhZGRFbGVtZW50czplfTthLmh0bWw1PXQsaihiKX0odGhpcyxkb2N1bWVudCk7Cn07Cg=="></script>
<script src="data:application/x-javascript;base64,LyohIFJlc3BvbmQuanMgdjEuNC4yOiBtaW4vbWF4LXdpZHRoIG1lZGlhIHF1ZXJ5IHBvbHlmaWxsICogQ29weXJpZ2h0IDIwMTMgU2NvdHQgSmVobAogKiBMaWNlbnNlZCB1bmRlciBodHRwczovL2dpdGh1Yi5jb20vc2NvdHRqZWhsL1Jlc3BvbmQvYmxvYi9tYXN0ZXIvTElDRU5TRS1NSVQKICogICovCgovLyBPbmx5IHJ1biB0aGlzIGNvZGUgaW4gSUUgOAppZiAoISF3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgiTVNJRSA4IikpIHsKIWZ1bmN0aW9uKGEpeyJ1c2Ugc3RyaWN0IjthLm1hdGNoTWVkaWE9YS5tYXRjaE1lZGlhfHxmdW5jdGlvbihhKXt2YXIgYixjPWEuZG9jdW1lbnRFbGVtZW50LGQ9Yy5maXJzdEVsZW1lbnRDaGlsZHx8Yy5maXJzdENoaWxkLGU9YS5jcmVhdGVFbGVtZW50KCJib2R5IiksZj1hLmNyZWF0ZUVsZW1lbnQoImRpdiIpO3JldHVybiBmLmlkPSJtcS10ZXN0LTEiLGYuc3R5bGUuY3NzVGV4dD0icG9zaXRpb246YWJzb2x1dGU7dG9wOi0xMDBlbSIsZS5zdHlsZS5iYWNrZ3JvdW5kPSJub25lIixlLmFwcGVuZENoaWxkKGYpLGZ1bmN0aW9uKGEpe3JldHVybiBmLmlubmVySFRNTD0nJnNoeTs8c3R5bGUgbWVkaWE9IicrYSsnIj4gI21xLXRlc3QtMSB7IHdpZHRoOiA0MnB4OyB9PC9zdHlsZT4nLGMuaW5zZXJ0QmVmb3JlKGUsZCksYj00Mj09PWYub2Zmc2V0V2lkdGgsYy5yZW1vdmVDaGlsZChlKSx7bWF0Y2hlczpiLG1lZGlhOmF9fX0oYS5kb2N1bWVudCl9KHRoaXMpLGZ1bmN0aW9uKGEpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBiKCl7dSghMCl9dmFyIGM9e307YS5yZXNwb25kPWMsYy51cGRhdGU9ZnVuY3Rpb24oKXt9O3ZhciBkPVtdLGU9ZnVuY3Rpb24oKXt2YXIgYj0hMTt0cnl7Yj1uZXcgYS5YTUxIdHRwUmVxdWVzdH1jYXRjaChjKXtiPW5ldyBhLkFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxIVFRQIil9cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGJ9fSgpLGY9ZnVuY3Rpb24oYSxiKXt2YXIgYz1lKCk7YyYmKGMub3BlbigiR0VUIixhLCEwKSxjLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpezQhPT1jLnJlYWR5U3RhdGV8fDIwMCE9PWMuc3RhdHVzJiYzMDQhPT1jLnN0YXR1c3x8YihjLnJlc3BvbnNlVGV4dCl9LDQhPT1jLnJlYWR5U3RhdGUmJmMuc2VuZChudWxsKSl9O2lmKGMuYWpheD1mLGMucXVldWU9ZCxjLnJlZ2V4PXttZWRpYTovQG1lZGlhW15ce10rXHsoW15ce1x9XSpce1teXH1ce10qXH0pKy9naSxrZXlmcmFtZXM6L0AoPzpcLSg/Om98bW96fHdlYmtpdClcLSk/a2V5ZnJhbWVzW15ce10rXHsoPzpbXlx7XH1dKlx7W15cfVx7XSpcfSkrW15cfV0qXH0vZ2ksdXJsczovKHVybFwoKVsnIl0/KFteXC9cKSciXVteOlwpJyJdKylbJyJdPyhcKSkvZyxmaW5kU3R5bGVzOi9AbWVkaWEgKihbXlx7XSspXHsoW1xTXHNdKz8pJC8sb25seTovKG9ubHlccyspPyhbYS16QS1aXSspXHM/LyxtaW53Oi9cKFtcc10qbWluXC13aWR0aFxzKjpbXHNdKihbXHNdKlswLTlcLl0rKShweHxlbSlbXHNdKlwpLyxtYXh3Oi9cKFtcc10qbWF4XC13aWR0aFxzKjpbXHNdKihbXHNdKlswLTlcLl0rKShweHxlbSlbXHNdKlwpL30sYy5tZWRpYVF1ZXJpZXNTdXBwb3J0ZWQ9YS5tYXRjaE1lZGlhJiZudWxsIT09YS5tYXRjaE1lZGlhKCJvbmx5IGFsbCIpJiZhLm1hdGNoTWVkaWEoIm9ubHkgYWxsIikubWF0Y2hlcywhYy5tZWRpYVF1ZXJpZXNTdXBwb3J0ZWQpe3ZhciBnLGgsaSxqPWEuZG9jdW1lbnQsaz1qLmRvY3VtZW50RWxlbWVudCxsPVtdLG09W10sbj1bXSxvPXt9LHA9MzAscT1qLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF18fGsscj1qLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJiYXNlIilbMF0scz1xLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJsaW5rIiksdD1mdW5jdGlvbigpe3ZhciBhLGI9ai5jcmVhdGVFbGVtZW50KCJkaXYiKSxjPWouYm9keSxkPWsuc3R5bGUuZm9udFNpemUsZT1jJiZjLnN0eWxlLmZvbnRTaXplLGY9ITE7cmV0dXJuIGIuc3R5bGUuY3NzVGV4dD0icG9zaXRpb246YWJzb2x1dGU7Zm9udC1zaXplOjFlbTt3aWR0aDoxZW0iLGN8fChjPWY9ai5jcmVhdGVFbGVtZW50KCJib2R5IiksYy5zdHlsZS5iYWNrZ3JvdW5kPSJub25lIiksay5zdHlsZS5mb250U2l6ZT0iMTAwJSIsYy5zdHlsZS5mb250U2l6ZT0iMTAwJSIsYy5hcHBlbmRDaGlsZChiKSxmJiZrLmluc2VydEJlZm9yZShjLGsuZmlyc3RDaGlsZCksYT1iLm9mZnNldFdpZHRoLGY/ay5yZW1vdmVDaGlsZChjKTpjLnJlbW92ZUNoaWxkKGIpLGsuc3R5bGUuZm9udFNpemU9ZCxlJiYoYy5zdHlsZS5mb250U2l6ZT1lKSxhPWk9cGFyc2VGbG9hdChhKX0sdT1mdW5jdGlvbihiKXt2YXIgYz0iY2xpZW50V2lkdGgiLGQ9a1tjXSxlPSJDU1MxQ29tcGF0Ij09PWouY29tcGF0TW9kZSYmZHx8ai5ib2R5W2NdfHxkLGY9e30sbz1zW3MubGVuZ3RoLTFdLHI9KG5ldyBEYXRlKS5nZXRUaW1lKCk7aWYoYiYmZyYmcD5yLWcpcmV0dXJuIGEuY2xlYXJUaW1lb3V0KGgpLGg9YS5zZXRUaW1lb3V0KHUscCksdm9pZCAwO2c9cjtmb3IodmFyIHYgaW4gbClpZihsLmhhc093blByb3BlcnR5KHYpKXt2YXIgdz1sW3ZdLHg9dy5taW53LHk9dy5tYXh3LHo9bnVsbD09PXgsQT1udWxsPT09eSxCPSJlbSI7eCYmKHg9cGFyc2VGbG9hdCh4KSooeC5pbmRleE9mKEIpPi0xP2l8fHQoKToxKSkseSYmKHk9cGFyc2VGbG9hdCh5KSooeS5pbmRleE9mKEIpPi0xP2l8fHQoKToxKSksdy5oYXNxdWVyeSYmKHomJkF8fCEoenx8ZT49eCl8fCEoQXx8eT49ZSkpfHwoZlt3Lm1lZGlhXXx8KGZbdy5tZWRpYV09W10pLGZbdy5tZWRpYV0ucHVzaChtW3cucnVsZXNdKSl9Zm9yKHZhciBDIGluIG4pbi5oYXNPd25Qcm9wZXJ0eShDKSYmbltDXSYmbltDXS5wYXJlbnROb2RlPT09cSYmcS5yZW1vdmVDaGlsZChuW0NdKTtuLmxlbmd0aD0wO2Zvcih2YXIgRCBpbiBmKWlmKGYuaGFzT3duUHJvcGVydHkoRCkpe3ZhciBFPWouY3JlYXRlRWxlbWVudCgic3R5bGUiKSxGPWZbRF0uam9pbigiXG4iKTtFLnR5cGU9InRleHQvY3NzIixFLm1lZGlhPUQscS5pbnNlc
<script src="data:application/x-javascript;base64,LyohIGpRdWVyeSBVSSAtIHYxLjExLjQgLSAyMDE2LTAxLTA1CiogaHR0cDovL2pxdWVyeXVpLmNvbQoqIEluY2x1ZGVzOiBjb3JlLmpzLCB3aWRnZXQuanMsIG1vdXNlLmpzLCBwb3NpdGlvbi5qcywgZHJhZ2dhYmxlLmpzLCBkcm9wcGFibGUuanMsIHJlc2l6YWJsZS5qcywgc2VsZWN0YWJsZS5qcywgc29ydGFibGUuanMsIGFjY29yZGlvbi5qcywgYXV0b2NvbXBsZXRlLmpzLCBidXR0b24uanMsIGRpYWxvZy5qcywgbWVudS5qcywgcHJvZ3Jlc3NiYXIuanMsIHNlbGVjdG1lbnUuanMsIHNsaWRlci5qcywgc3Bpbm5lci5qcywgdGFicy5qcywgdG9vbHRpcC5qcywgZWZmZWN0LmpzLCBlZmZlY3QtYmxpbmQuanMsIGVmZmVjdC1ib3VuY2UuanMsIGVmZmVjdC1jbGlwLmpzLCBlZmZlY3QtZHJvcC5qcywgZWZmZWN0LWV4cGxvZGUuanMsIGVmZmVjdC1mYWRlLmpzLCBlZmZlY3QtZm9sZC5qcywgZWZmZWN0LWhpZ2hsaWdodC5qcywgZWZmZWN0LXB1ZmYuanMsIGVmZmVjdC1wdWxzYXRlLmpzLCBlZmZlY3Qtc2NhbGUuanMsIGVmZmVjdC1zaGFrZS5qcywgZWZmZWN0LXNpemUuanMsIGVmZmVjdC1zbGlkZS5qcywgZWZmZWN0LXRyYW5zZmVyLmpzCiogQ29weXJpZ2h0IGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnM7IExpY2Vuc2VkIE1JVCAqLwoKKGZ1bmN0aW9uKGUpeyJmdW5jdGlvbiI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKFsianF1ZXJ5Il0sZSk6ZShqUXVlcnkpfSkoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCh0LHMpe3ZhciBuLGEsbyxyPXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4iYXJlYSI9PT1yPyhuPXQucGFyZW50Tm9kZSxhPW4ubmFtZSx0LmhyZWYmJmEmJiJtYXAiPT09bi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPyhvPWUoImltZ1t1c2VtYXA9JyMiK2ErIiddIilbMF0sISFvJiZpKG8pKTohMSk6KC9eKGlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b258b2JqZWN0KSQvLnRlc3Qocik/IXQuZGlzYWJsZWQ6ImEiPT09cj90LmhyZWZ8fHM6cykmJmkodCl9ZnVuY3Rpb24gaSh0KXtyZXR1cm4gZS5leHByLmZpbHRlcnMudmlzaWJsZSh0KSYmIWUodCkucGFyZW50cygpLmFkZEJhY2soKS5maWx0ZXIoZnVuY3Rpb24oKXtyZXR1cm4iaGlkZGVuIj09PWUuY3NzKHRoaXMsInZpc2liaWxpdHkiKX0pLmxlbmd0aH1mdW5jdGlvbiBzKGUpe3JldHVybiBmdW5jdGlvbigpe3ZhciB0PXRoaXMuZWxlbWVudC52YWwoKTtlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLl9yZWZyZXNoKCksdCE9PXRoaXMuZWxlbWVudC52YWwoKSYmdGhpcy5fdHJpZ2dlcigiY2hhbmdlIil9fWUudWk9ZS51aXx8e30sZS5leHRlbmQoZS51aSx7dmVyc2lvbjoiMS4xMS40IixrZXlDb2RlOntCQUNLU1BBQ0U6OCxDT01NQToxODgsREVMRVRFOjQ2LERPV046NDAsRU5EOjM1LEVOVEVSOjEzLEVTQ0FQRToyNyxIT01FOjM2LExFRlQ6MzcsUEFHRV9ET1dOOjM0LFBBR0VfVVA6MzMsUEVSSU9EOjE5MCxSSUdIVDozOSxTUEFDRTozMixUQUI6OSxVUDozOH19KSxlLmZuLmV4dGVuZCh7c2Nyb2xsUGFyZW50OmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMuY3NzKCJwb3NpdGlvbiIpLHM9ImFic29sdXRlIj09PWksbj10Py8oYXV0b3xzY3JvbGx8aGlkZGVuKS86LyhhdXRvfHNjcm9sbCkvLGE9dGhpcy5wYXJlbnRzKCkuZmlsdGVyKGZ1bmN0aW9uKCl7dmFyIHQ9ZSh0aGlzKTtyZXR1cm4gcyYmInN0YXRpYyI9PT10LmNzcygicG9zaXRpb24iKT8hMTpuLnRlc3QodC5jc3MoIm92ZXJmbG93IikrdC5jc3MoIm92ZXJmbG93LXkiKSt0LmNzcygib3ZlcmZsb3cteCIpKX0pLmVxKDApO3JldHVybiJmaXhlZCIhPT1pJiZhLmxlbmd0aD9hOmUodGhpc1swXS5vd25lckRvY3VtZW50fHxkb2N1bWVudCl9LHVuaXF1ZUlkOmZ1bmN0aW9uKCl7dmFyIGU9MDtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dGhpcy5pZHx8KHRoaXMuaWQ9InVpLWlkLSIrICsrZSl9KX19KCkscmVtb3ZlVW5pcXVlSWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7L151aS1pZC1cZCskLy50ZXN0KHRoaXMuaWQpJiZlKHRoaXMpLnJlbW92ZUF0dHIoImlkIil9KX19KSxlLmV4dGVuZChlLmV4cHJbIjoiXSx7ZGF0YTplLmV4cHIuY3JlYXRlUHNldWRvP2UuZXhwci5jcmVhdGVQc2V1ZG8oZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGkpe3JldHVybiEhZS5kYXRhKGksdCl9fSk6ZnVuY3Rpb24odCxpLHMpe3JldHVybiEhZS5kYXRhKHQsc1szXSl9LGZvY3VzYWJsZTpmdW5jdGlvbihpKXtyZXR1cm4gdChpLCFpc05hTihlLmF0dHIoaSwidGFiaW5kZXgiKSkpfSx0YWJiYWJsZTpmdW5jdGlvbihpKXt2YXIgcz1lLmF0dHIoaSwidGFiaW5kZXgiKSxuPWlzTmFOKHMpO3JldHVybihufHxzPj0wKSYmdChpLCFuKX19KSxlKCI8YT4iKS5vdXRlcldpZHRoKDEpLmpxdWVyeXx8ZS5lYWNoKFsiV2lkdGgiLCJIZWlnaHQiXSxmdW5jdGlvbih0LGkpe2Z1bmN0aW9uIHModCxpLHMsYSl7cmV0dXJuIGUuZWFjaChuLGZ1bmN0aW9uKCl7aS09cGFyc2VGbG9hdChlLmNzcyh0LCJwYWRkaW5nIit0aGlzKSl8fDAscyYmKGktPXBhcnNlRmxvYXQoZS5jc3ModCwiYm9yZGVyIit0aGlzKyJXaWR0aCIpKXx8MCksYSYmKGktPXBhcnNlRmxvYXQoZS5jc3ModCwibWFyZ2luIit0aGlzKSl8fDApfSksaX12YXIgbj0iV2lkdGgiPT09aT9bIkxlZnQiLCJSaWdodCJdOlsiVG9wIiwiQm90dG9tIl0sYT1pLnRvTG93ZXJDYXNlKCksbz17aW5uZXJXaWR0aDplLmZuLmlubmVyV2lkdGgsaW5uZXJIZWlnaHQ6ZS5mbi5pbm5lckhlaWdodCxvdXRlcldpZHRoOmUuZm4ub3V0ZXJXaWR0aCxvdXRlckhlaWdodDplLmZuLm91dGVySGVpZ2h0fTtlLmZuWyJpbm5lciIraV09ZnVuY3Rpb24odCl7cmV0dXJuIHZvaWQgMD09PXQ/b1siaW5uZXIiK2ldLmNhbGwodGhpcyk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7ZSh0aGlzKS5jc3MoYSxzKHRoaXMsdCkrInB4Iil9KX0sZS5mblsib3V0ZXIiK2ldPWZ1bmN0aW9uKHQsbil7cmV0dXJuI
<link href="data:text/css;charset=utf-8,%0A%0A%2Etocify%20%7B%0Awidth%3A%2020%25%3B%0Amax%2Dheight%3A%2090%25%3B%0Aoverflow%3A%20auto%3B%0Amargin%2Dleft%3A%202%25%3B%0Aposition%3A%20fixed%3B%0Aborder%3A%201px%20solid%20%23ccc%3B%0Aborder%2Dradius%3A%206px%3B%0A%7D%0A%0A%2Etocify%20ul%2C%20%2Etocify%20li%20%7B%0Alist%2Dstyle%3A%20none%3B%0Amargin%3A%200%3B%0Apadding%3A%200%3B%0Aborder%3A%20none%3B%0Aline%2Dheight%3A%2030px%3B%0A%7D%0A%0A%2Etocify%2Dheader%20%7B%0Atext%2Dindent%3A%2010px%3B%0A%7D%0A%0A%2Etocify%2Dsubheader%20%7B%0Atext%2Dindent%3A%2020px%3B%0Adisplay%3A%20none%3B%0A%7D%0A%0A%2Etocify%2Dsubheader%20li%20%7B%0Afont%2Dsize%3A%2012px%3B%0A%7D%0A%0A%2Etocify%2Dsubheader%20%2Etocify%2Dsubheader%20%7B%0Atext%2Dindent%3A%2030px%3B%0A%7D%0A%2Etocify%2Dsubheader%20%2Etocify%2Dsubheader%20%2Etocify%2Dsubheader%20%7B%0Atext%2Dindent%3A%2040px%3B%0A%7D%0A%2Etocify%2Dsubheader%20%2Etocify%2Dsubheader%20%2Etocify%2Dsubheader%20%2Etocify%2Dsubheader%20%7B%0Atext%2Dindent%3A%2050px%3B%0A%7D%0A%2Etocify%2Dsubheader%20%2Etocify%2Dsubheader%20%2Etocify%2Dsubheader%20%2Etocify%2Dsubheader%20%2Etocify%2Dsubheader%20%7B%0Atext%2Dindent%3A%2060px%3B%0A%7D%0A%0A%2Etocify%20%2Etocify%2Ditem%20%3E%20a%2C%20%2Etocify%20%2Enav%2Dlist%20%2Enav%2Dheader%20%7B%0Amargin%3A%200px%3B%0A%7D%0A%0A%2Etocify%20%2Etocify%2Ditem%20a%2C%20%2Etocify%20%2Elist%2Dgroup%2Ditem%20%7B%0Apadding%3A%205px%3B%0A%7D%0A%2Etocify%20%2Enav%2Dpills%20%3E%20li%20%7B%0Afloat%3A%20none%3B%0A%7D%0A%0A%0A" rel="stylesheet" />
<script src="data:application/x-javascript;base64,LyoganF1ZXJ5IFRvY2lmeSAtIHYxLjkuMSAtIDIwMTMtMTAtMjIKICogaHR0cDovL3d3dy5ncmVnZnJhbmtvLmNvbS9qcXVlcnkudG9jaWZ5LmpzLwogKiBDb3B5cmlnaHQgKGMpIDIwMTMgR3JlZyBGcmFua287IExpY2Vuc2VkIE1JVCAqLwoKLy8gSW1tZWRpYXRlbHktSW52b2tlZCBGdW5jdGlvbiBFeHByZXNzaW9uIChJSUZFKSBbQmVuIEFsbWFuIEJsb2cgUG9zdF0oaHR0cDovL2JlbmFsbWFuLmNvbS9uZXdzLzIwMTAvMTEvaW1tZWRpYXRlbHktaW52b2tlZC1mdW5jdGlvbi1leHByZXNzaW9uLykgdGhhdCBjYWxscyBhbm90aGVyIElJRkUgdGhhdCBjb250YWlucyBhbGwgb2YgdGhlIHBsdWdpbiBsb2dpYy4gIEkgdXNlZCB0aGlzIHBhdHRlcm4gc28gdGhhdCBhbnlvbmUgdmlld2luZyB0aGlzIGNvZGUgd291bGQgbm90IGhhdmUgdG8gc2Nyb2xsIHRvIHRoZSBib3R0b20gb2YgdGhlIHBhZ2UgdG8gdmlldyB0aGUgbG9jYWwgcGFyYW1ldGVycyB0aGF0IHdlcmUgcGFzc2VkIHRvIHRoZSBtYWluIElJRkUuCihmdW5jdGlvbih0b2NpZnkpIHsKCiAgICAvLyBFQ01BU2NyaXB0IDUgU3RyaWN0IE1vZGU6IFtKb2huIFJlc2lnIEJsb2cgUG9zdF0oaHR0cDovL2Vqb2huLm9yZy9ibG9nL2VjbWFzY3JpcHQtNS1zdHJpY3QtbW9kZS1qc29uLWFuZC1tb3JlLykKICAgICJ1c2Ugc3RyaWN0IjsKCiAgICAvLyBDYWxscyB0aGUgc2Vjb25kIElJRkUgYW5kIGxvY2FsbHkgcGFzc2VzIGluIHRoZSBnbG9iYWwgalF1ZXJ5LCB3aW5kb3csIGFuZCBkb2N1bWVudCBvYmplY3RzCiAgICB0b2NpZnkod2luZG93LmpRdWVyeSwgd2luZG93LCBkb2N1bWVudCk7CgogIH0KCiAgLy8gTG9jYWxseSBwYXNzZXMgaW4gYGpRdWVyeWAsIHRoZSBgd2luZG93YCBvYmplY3QsIHRoZSBgZG9jdW1lbnRgIG9iamVjdCwgYW5kIGFuIGB1bmRlZmluZWRgIHZhcmlhYmxlLiAgVGhlIGBqUXVlcnlgLCBgd2luZG93YCBhbmQgYGRvY3VtZW50YCBvYmplY3RzIGFyZSBwYXNzZWQgaW4gbG9jYWxseSwgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZSwgc2luY2UgamF2YXNjcmlwdCBmaXJzdCBzZWFyY2hlcyBmb3IgYSB2YXJpYWJsZSBtYXRjaCB3aXRoaW4gdGhlIGxvY2FsIHZhcmlhYmxlcyBzZXQgYmVmb3JlIHNlYXJjaGluZyB0aGUgZ2xvYmFsIHZhcmlhYmxlcyBzZXQuICBBbGwgb2YgdGhlIGdsb2JhbCB2YXJpYWJsZXMgYXJlIGFsc28gcGFzc2VkIGluIGxvY2FsbHkgdG8gYmUgbWluaWZpZXIgZnJpZW5kbHkuIGB1bmRlZmluZWRgIGNhbiBiZSBwYXNzZWQgaW4gbG9jYWxseSwgYmVjYXVzZSBpdCBpcyBub3QgYSByZXNlcnZlZCB3b3JkIGluIEphdmFTY3JpcHQuCiAgKGZ1bmN0aW9uKCQsIHdpbmRvdywgZG9jdW1lbnQsIHVuZGVmaW5lZCkgewoKICAgIC8vIEVDTUFTY3JpcHQgNSBTdHJpY3QgTW9kZTogW0pvaG4gUmVzaWcgQmxvZyBQb3N0XShodHRwOi8vZWpvaG4ub3JnL2Jsb2cvZWNtYXNjcmlwdC01LXN0cmljdC1tb2RlLWpzb24tYW5kLW1vcmUvKQogICAgInVzZSBzdHJpY3QiOwoKICAgIHZhciB0b2NDbGFzc05hbWUgPSAidG9jaWZ5IiwKICAgICAgdG9jQ2xhc3MgPSAiLiIgKyB0b2NDbGFzc05hbWUsCiAgICAgIHRvY0ZvY3VzQ2xhc3NOYW1lID0gInRvY2lmeS1mb2N1cyIsCiAgICAgIHRvY0hvdmVyQ2xhc3NOYW1lID0gInRvY2lmeS1ob3ZlciIsCiAgICAgIGhpZGVUb2NDbGFzc05hbWUgPSAidG9jaWZ5LWhpZGUiLAogICAgICBoaWRlVG9jQ2xhc3MgPSAiLiIgKyBoaWRlVG9jQ2xhc3NOYW1lLAogICAgICBoZWFkZXJDbGFzc05hbWUgPSAidG9jaWZ5LWhlYWRlciIsCiAgICAgIGhlYWRlckNsYXNzID0gIi4iICsgaGVhZGVyQ2xhc3NOYW1lLAogICAgICBzdWJoZWFkZXJDbGFzc05hbWUgPSAidG9jaWZ5LXN1YmhlYWRlciIsCiAgICAgIHN1YmhlYWRlckNsYXNzID0gIi4iICsgc3ViaGVhZGVyQ2xhc3NOYW1lLAogICAgICBpdGVtQ2xhc3NOYW1lID0gInRvY2lmeS1pdGVtIiwKICAgICAgaXRlbUNsYXNzID0gIi4iICsgaXRlbUNsYXNzTmFtZSwKICAgICAgZXh0ZW5kUGFnZUNsYXNzTmFtZSA9ICJ0b2NpZnktZXh0ZW5kLXBhZ2UiLAogICAgICBleHRlbmRQYWdlQ2xhc3MgPSAiLiIgKyBleHRlbmRQYWdlQ2xhc3NOYW1lOwoKICAgIC8vIENhbGxpbmcgdGhlIGpRdWVyeVVJIFdpZGdldCBGYWN0b3J5IE1ldGhvZAogICAgJC53aWRnZXQoInRvYy50b2NpZnkiLCB7CgogICAgICAvL1BsdWdpbiB2ZXJzaW9uCiAgICAgIHZlcnNpb246ICIxLjkuMSIsCgogICAgICAvLyBUaGVzZSBvcHRpb25zIHdpbGwgYmUgdXNlZCBhcyBkZWZhdWx0cwogICAgICBvcHRpb25zOiB7CgogICAgICAgIC8vICoqY29udGV4dCoqOiBBY2NlcHRzIFN0cmluZzogQW55IGpRdWVyeSBzZWxlY3RvcgogICAgICAgIC8vIFRoZSBjb250YWluZXIgZWxlbWVudCB0aGF0IGhvbGRzIGFsbCBvZiB0aGUgZWxlbWVudHMgdXNlZCB0byBnZW5lcmF0ZSB0aGUgdGFibGUgb2YgY29udGVudHMKICAgICAgICBjb250ZXh0OiAiYm9keSIsCgogICAgICAgIC8vICoqaWdub3JlU2VsZWN0b3IqKjogQWNjZXB0cyBTdHJpbmc6IEFueSBqUXVlcnkgc2VsZWN0b3IKICAgICAgICAvLyBBIHNlbGVjdG9yIHRvIGFueSBlbGVtZW50IHRoYXQgd291bGQgYmUgbWF0Y2hlZCBieSBzZWxlY3RvcnMgdGhhdCB5b3Ugd2lzaCB0byBiZSBpZ25vcmVkCiAgICAgICAgaWdub3JlU2VsZWN0b3I6IG51bGwsCgogICAgICAgIC8vICoqc2VsZWN0b3JzKio6IEFjY2VwdHMgYW4gQXJyYXkgb2YgU3RyaW5nczogQW55IGpRdWVyeSBzZWxlY3RvcnMKICAgICAgICAvLyBUaGUgZWxlbWVudCdzIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIHRhYmxlIG9mIGNvbnRlbnRzLiAgVGhlIG9yZGVyIGlzIHZlcnkgaW1wb3J0YW50IHNpbmNlIGl0IHdpbGwgZGV0ZXJtaW5lIHRoZSB0YWJsZSBvZiBjb250ZW50J3MgbmVzdGluZyBzdHJ1Y3R1cmUKICAgICAgICBzZWxlY3RvcnM6ICJoMSwgaDIsIGgzIiwKCiAgICAgICAgLy8gKipzaG93QW5kSGlkZSoqOiBBY2NlcHRzIGEgYm9vbGVhbjogdHJ1ZSBvciBmYWxzZQogICAgICAgIC8vIFVzZWQgdG8gZ
<script src="data:application/x-javascript;base64,CgovKioKICogalF1ZXJ5IFBsdWdpbjogU3RpY2t5IFRhYnMKICoKICogQGF1dGhvciBBaWRhbiBMaXN0ZXIgPGFpZGFuQHBocC5uZXQ+CiAqIGFkYXB0ZWQgYnkgUnViZW4gQXJzbGFuIHRvIGFjdGl2YXRlIHBhcmVudCB0YWJzIHRvbwogKiBodHRwOi8vd3d3LmFpZGFubGlzdGVyLmNvbS8yMDE0LzAzL3BlcnNpc3RpbmctdGhlLXRhYi1zdGF0ZS1pbi1ib290c3RyYXAvCiAqLwooZnVuY3Rpb24oJCkgewogICJ1c2Ugc3RyaWN0IjsKICAkLmZuLnJtYXJrZG93blN0aWNreVRhYnMgPSBmdW5jdGlvbigpIHsKICAgIHZhciBjb250ZXh0ID0gdGhpczsKICAgIC8vIFNob3cgdGhlIHRhYiBjb3JyZXNwb25kaW5nIHdpdGggdGhlIGhhc2ggaW4gdGhlIFVSTCwgb3IgdGhlIGZpcnN0IHRhYgogICAgdmFyIHNob3dTdHVmZkZyb21IYXNoID0gZnVuY3Rpb24oKSB7CiAgICAgIHZhciBoYXNoID0gd2luZG93LmxvY2F0aW9uLmhhc2g7CiAgICAgIHZhciBzZWxlY3RvciA9IGhhc2ggPyAnYVtocmVmPSInICsgaGFzaCArICciXScgOiAnbGkuYWN0aXZlID4gYSc7CiAgICAgIHZhciAkc2VsZWN0b3IgPSAkKHNlbGVjdG9yLCBjb250ZXh0KTsKICAgICAgaWYoJHNlbGVjdG9yLmRhdGEoJ3RvZ2dsZScpID09PSAidGFiIikgewogICAgICAgICRzZWxlY3Rvci50YWIoJ3Nob3cnKTsKICAgICAgICAvLyB3YWxrIHVwIHRoZSBhbmNlc3RvcnMgb2YgdGhpcyBlbGVtZW50LCBzaG93IGFueSBoaWRkZW4gdGFicwogICAgICAgICRzZWxlY3Rvci5wYXJlbnRzKCcuc2VjdGlvbi50YWJzZXQnKS5lYWNoKGZ1bmN0aW9uKGksIGVsbSkgewogICAgICAgICAgdmFyIGxpbmsgPSAkKCdhW2hyZWY9IiMnICsgJChlbG0pLmF0dHIoJ2lkJykgKyAnIl0nKTsKICAgICAgICAgIGlmKGxpbmsuZGF0YSgndG9nZ2xlJykgPT09ICJ0YWIiKSB7CiAgICAgICAgICAgIGxpbmsudGFiKCJzaG93Iik7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH07CgoKICAgIC8vIFNldCB0aGUgY29ycmVjdCB0YWIgd2hlbiB0aGUgcGFnZSBsb2FkcwogICAgc2hvd1N0dWZmRnJvbUhhc2goY29udGV4dCk7CgogICAgLy8gU2V0IHRoZSBjb3JyZWN0IHRhYiB3aGVuIGEgdXNlciB1c2VzIHRoZWlyIGJhY2svZm9yd2FyZCBidXR0b24KICAgICQod2luZG93KS5vbignaGFzaGNoYW5nZScsIGZ1bmN0aW9uKCkgewogICAgICBzaG93U3R1ZmZGcm9tSGFzaChjb250ZXh0KTsKICAgIH0pOwoKICAgIC8vIENoYW5nZSB0aGUgVVJMIHdoZW4gdGFicyBhcmUgY2xpY2tlZAogICAgJCgnYScsIGNvbnRleHQpLm9uKCdjbGljaycsIGZ1bmN0aW9uKGUpIHsKICAgICAgaGlzdG9yeS5wdXNoU3RhdGUobnVsbCwgbnVsbCwgdGhpcy5ocmVmKTsKICAgICAgc2hvd1N0dWZmRnJvbUhhc2goY29udGV4dCk7CiAgICB9KTsKCiAgICByZXR1cm4gdGhpczsKICB9Owp9KGpRdWVyeSkpOwoKd2luZG93LmJ1aWxkVGFic2V0cyA9IGZ1bmN0aW9uKHRvY0lEKSB7CgogIC8vIGJ1aWxkIGEgdGFic2V0IGZyb20gYSBzZWN0aW9uIGRpdiB3aXRoIHRoZSAudGFic2V0IGNsYXNzCiAgZnVuY3Rpb24gYnVpbGRUYWJzZXQodGFic2V0KSB7CgogICAgLy8gY2hlY2sgZm9yIGZhZGUgYW5kIHBpbGxzIG9wdGlvbnMKICAgIHZhciBmYWRlID0gdGFic2V0Lmhhc0NsYXNzKCJ0YWJzZXQtZmFkZSIpOwogICAgdmFyIHBpbGxzID0gdGFic2V0Lmhhc0NsYXNzKCJ0YWJzZXQtcGlsbHMiKTsKICAgIHZhciBuYXZDbGFzcyA9IHBpbGxzID8gIm5hdi1waWxscyIgOiAibmF2LXRhYnMiOwoKICAgIC8vIGRldGVybWluZSB0aGUgaGVhZGluZyBsZXZlbCBvZiB0aGUgdGFic2V0IGFuZCB0YWJzCiAgICB2YXIgbWF0Y2ggPSB0YWJzZXQuYXR0cignY2xhc3MnKS5tYXRjaCgvbGV2ZWwoXGQpIC8pOwogICAgaWYgKG1hdGNoID09PSBudWxsKQogICAgICByZXR1cm47CiAgICB2YXIgdGFic2V0TGV2ZWwgPSBOdW1iZXIobWF0Y2hbMV0pOwogICAgdmFyIHRhYkxldmVsID0gdGFic2V0TGV2ZWwgKyAxOwoKICAgIC8vIGZpbmQgYWxsIHN1YmhlYWRpbmdzIGltbWVkaWF0ZWx5IGJlbG93CiAgICB2YXIgdGFicyA9IHRhYnNldC5maW5kKCJkaXYuc2VjdGlvbi5sZXZlbCIgKyB0YWJMZXZlbCk7CiAgICBpZiAoIXRhYnMubGVuZ3RoKQogICAgICByZXR1cm47CgogICAgLy8gY3JlYXRlIHRhYmxpc3QgYW5kIHRhYi1jb250ZW50IGVsZW1lbnRzCiAgICB2YXIgdGFiTGlzdCA9ICQoJzx1bCBjbGFzcz0ibmF2ICcgKyBuYXZDbGFzcyArICciIHJvbGU9InRhYmxpc3QiPjwvdWw+Jyk7CiAgICAkKHRhYnNbMF0pLmJlZm9yZSh0YWJMaXN0KTsKICAgIHZhciB0YWJDb250ZW50ID0gJCgnPGRpdiBjbGFzcz0idGFiLWNvbnRlbnQiPjwvZGl2PicpOwogICAgJCh0YWJzWzBdKS5iZWZvcmUodGFiQ29udGVudCk7CgogICAgLy8gYnVpbGQgdGhlIHRhYnNldAogICAgdmFyIGFjdGl2ZVRhYiA9IDA7CiAgICB0YWJzLmVhY2goZnVuY3Rpb24oaSkgewoKICAgICAgLy8gZ2V0IHRoZSB0YWIgZGl2CiAgICAgIHZhciB0YWIgPSAkKHRhYnNbaV0pOwoKICAgICAgLy8gZ2V0IHRoZSBpZCB0aGVuIHNhbml0aXplIGl0IGZvciB1c2Ugd2l0aCBib290c3RyYXAgdGFicwogICAgICB2YXIgaWQgPSB0YWIuYXR0cignaWQnKTsKCiAgICAgIC8vIHNlZSBpZiB0aGlzIGlzIG1hcmtlZCBhcyB0aGUgYWN0aXZlIHRhYgogICAgICBpZiAodGFiLmhhc0NsYXNzKCdhY3RpdmUnKSkKICAgICAgICBhY3RpdmVUYWIgPSBpOwoKICAgICAgLy8gcmVtb3ZlIGFueSB0YWJsZSBvZiBjb250ZW50cyBlbnRyaWVzIGFzc29jaWF0ZWQgd2l0aAogICAgICAvLyB0aGlzIElEIChzaW5jZSB3ZSdsbCBiZSByZW1vdmluZyB0aGUgaGVhZGluZyBlbGVtZW50KQogICAgICAkKCJkaXYjIiArIHRvY0lEICsgIiBsaSBhW2hyZWY9JyMiICsgaWQgKyAiJ10iKS5wYXJlbnQoKS5yZW1vdmUoKTsKCiAgICAgIC8vIHNhbml0aXplIHRoZSBpZCBmb3IgdXNlIHdpdGggYm9vdHN0cmFwIHRhYnMKICAgICAgaWQgPSBpZC5yZXBsYWNlKC9bLlwvPyYhIzw+XS9nLCAnJykucmVwbGFjZSgvXHMvZywgJ
<script src="data:application/x-javascript;base64,CndpbmRvdy5pbml0aWFsaXplQ29kZUZvbGRpbmcgPSBmdW5jdGlvbihzaG93KSB7CgogIC8vIGhhbmRsZXJzIGZvciBzaG93LWFsbCBhbmQgaGlkZSBhbGwKICAkKCIjcm1kLXNob3ctYWxsLWNvZGUiKS5jbGljayhmdW5jdGlvbigpIHsKICAgICQoJ2Rpdi5yLWNvZGUtY29sbGFwc2UnKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAkKHRoaXMpLmNvbGxhcHNlKCdzaG93Jyk7CiAgICB9KTsKICB9KTsKICAkKCIjcm1kLWhpZGUtYWxsLWNvZGUiKS5jbGljayhmdW5jdGlvbigpIHsKICAgICQoJ2Rpdi5yLWNvZGUtY29sbGFwc2UnKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAkKHRoaXMpLmNvbGxhcHNlKCdoaWRlJyk7CiAgICB9KTsKICB9KTsKCiAgLy8gaW5kZXggZm9yIHVuaXF1ZSBjb2RlIGVsZW1lbnQgaWRzCiAgdmFyIGN1cnJlbnRJbmRleCA9IDE7CgogIC8vIHNlbGVjdCBhbGwgUiBjb2RlIGJsb2NrcwogIHZhciByQ29kZUJsb2NrcyA9ICQoJ3ByZS5yLCBwcmUucHl0aG9uLCBwcmUuYmFzaCwgcHJlLnNxbCwgcHJlLmNwcCwgcHJlLnN0YW4sIHByZS5qdWxpYSwgcHJlLmZvbGRhYmxlJyk7CiAgckNvZGVCbG9ja3MuZWFjaChmdW5jdGlvbigpIHsKCiAgICAvLyBjcmVhdGUgYSBjb2xsYXBzYWJsZSBkaXYgdG8gd3JhcCB0aGUgY29kZSBpbgogICAgdmFyIGRpdiA9ICQoJzxkaXYgY2xhc3M9ImNvbGxhcHNlIHItY29kZS1jb2xsYXBzZSI+PC9kaXY+Jyk7CiAgICB2YXIgc2hvd1RoaXMgPSAoc2hvdyB8fCAkKHRoaXMpLmhhc0NsYXNzKCdmb2xkLXNob3cnKSkgJiYgISQodGhpcykuaGFzQ2xhc3MoJ2ZvbGQtaGlkZScpOwogICAgaWYgKHNob3dUaGlzKSBkaXYuYWRkQ2xhc3MoJ2luJyk7CiAgICB2YXIgaWQgPSAncmNvZGUtNjQzRTBGMzYnICsgY3VycmVudEluZGV4Kys7CiAgICBkaXYuYXR0cignaWQnLCBpZCk7CiAgICAkKHRoaXMpLmJlZm9yZShkaXYpOwogICAgJCh0aGlzKS5kZXRhY2goKS5hcHBlbmRUbyhkaXYpOwoKICAgIC8vIGFkZCBhIHNob3cgY29kZSBidXR0b24gcmlnaHQgYWJvdmUKICAgIHZhciBzaG93Q29kZVRleHQgPSAkKCc8c3Bhbj4nICsgKHNob3dUaGlzID8gJ0hpZGUnIDogJ0NvZGUnKSArICc8L3NwYW4+Jyk7CiAgICB2YXIgc2hvd0NvZGVCdXR0b24gPSAkKCc8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0biBidG4tZGVmYXVsdCBidG4teHMgY29kZS1mb2xkaW5nLWJ0biBwdWxsLXJpZ2h0Ij48L2J1dHRvbj4nKTsKICAgIHNob3dDb2RlQnV0dG9uLmFwcGVuZChzaG93Q29kZVRleHQpOwogICAgc2hvd0NvZGVCdXR0b24KICAgICAgICAuYXR0cignZGF0YS10b2dnbGUnLCAnY29sbGFwc2UnKQogICAgICAgIC5hdHRyKCdkYXRhLXRhcmdldCcsICcjJyArIGlkKQogICAgICAgIC5hdHRyKCdhcmlhLWV4cGFuZGVkJywgc2hvd1RoaXMpCiAgICAgICAgLmF0dHIoJ2FyaWEtY29udHJvbHMnLCBpZCk7CgogICAgdmFyIGJ1dHRvblJvdyA9ICQoJzxkaXYgY2xhc3M9InJvdyI+PC9kaXY+Jyk7CiAgICB2YXIgYnV0dG9uQ29sID0gJCgnPGRpdiBjbGFzcz0iY29sLW1kLTEyIj48L2Rpdj4nKTsKCiAgICBidXR0b25Db2wuYXBwZW5kKHNob3dDb2RlQnV0dG9uKTsKICAgIGJ1dHRvblJvdy5hcHBlbmQoYnV0dG9uQ29sKTsKCiAgICBkaXYuYmVmb3JlKGJ1dHRvblJvdyk7CgogICAgLy8gdXBkYXRlIHN0YXRlIG9mIGJ1dHRvbiBvbiBzaG93L2hpZGUKICAgIGRpdi5vbignaGlkZGVuLmJzLmNvbGxhcHNlJywgZnVuY3Rpb24gKCkgewogICAgICBzaG93Q29kZVRleHQudGV4dCgnQ29kZScpOwogICAgfSk7CiAgICBkaXYub24oJ3Nob3cuYnMuY29sbGFwc2UnLCBmdW5jdGlvbiAoKSB7CiAgICAgIHNob3dDb2RlVGV4dC50ZXh0KCdIaWRlJyk7CiAgICB9KTsKICB9KTsKCn0K"></script>
<link href="data:text/css;charset=utf-8,%2Ehljs%2Dliteral%20%7B%0Acolor%3A%20%23990073%3B%0A%7D%0A%2Ehljs%2Dnumber%20%7B%0Acolor%3A%20%23099%3B%0A%7D%0A%2Ehljs%2Dcomment%20%7B%0Acolor%3A%20%23998%3B%0Afont%2Dstyle%3A%20italic%3B%0A%7D%0A%2Ehljs%2Dkeyword%20%7B%0Acolor%3A%20%23900%3B%0Afont%2Dweight%3A%20bold%3B%0A%7D%0A%2Ehljs%2Dstring%20%7B%0Acolor%3A%20%23d14%3B%0A%7D%0A" rel="stylesheet" />
<script src="data:application/x-javascript;base64,LyohIGhpZ2hsaWdodC5qcyB2OS4xMi4wIHwgQlNEMyBMaWNlbnNlIHwgZ2l0LmlvL2hsanNsaWNlbnNlICovCiFmdW5jdGlvbihlKXt2YXIgbj0ib2JqZWN0Ij09dHlwZW9mIHdpbmRvdyYmd2luZG93fHwib2JqZWN0Ij09dHlwZW9mIHNlbGYmJnNlbGY7InVuZGVmaW5lZCIhPXR5cGVvZiBleHBvcnRzP2UoZXhwb3J0cyk6biYmKG4uaGxqcz1lKHt9KSwiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kJiZkZWZpbmUoW10sZnVuY3Rpb24oKXtyZXR1cm4gbi5obGpzfSkpfShmdW5jdGlvbihlKXtmdW5jdGlvbiBuKGUpe3JldHVybiBlLnJlcGxhY2UoLyYvZywiJmFtcDsiKS5yZXBsYWNlKC88L2csIiZsdDsiKS5yZXBsYWNlKC8+L2csIiZndDsiKX1mdW5jdGlvbiB0KGUpe3JldHVybiBlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCl9ZnVuY3Rpb24gcihlLG4pe3ZhciB0PWUmJmUuZXhlYyhuKTtyZXR1cm4gdCYmMD09PXQuaW5kZXh9ZnVuY3Rpb24gYShlKXtyZXR1cm4gay50ZXN0KGUpfWZ1bmN0aW9uIGkoZSl7dmFyIG4sdCxyLGksbz1lLmNsYXNzTmFtZSsiICI7aWYobys9ZS5wYXJlbnROb2RlP2UucGFyZW50Tm9kZS5jbGFzc05hbWU6IiIsdD1CLmV4ZWMobykpcmV0dXJuIHcodFsxXSk/dFsxXToibm8taGlnaGxpZ2h0Ijtmb3Iobz1vLnNwbGl0KC9ccysvKSxuPTAscj1vLmxlbmd0aDtyPm47bisrKWlmKGk9b1tuXSxhKGkpfHx3KGkpKXJldHVybiBpfWZ1bmN0aW9uIG8oZSl7dmFyIG4sdD17fSxyPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKTtmb3IobiBpbiBlKXRbbl09ZVtuXTtyZXR1cm4gci5mb3JFYWNoKGZ1bmN0aW9uKGUpe2ZvcihuIGluIGUpdFtuXT1lW25dfSksdH1mdW5jdGlvbiB1KGUpe3ZhciBuPVtdO3JldHVybiBmdW5jdGlvbiByKGUsYSl7Zm9yKHZhciBpPWUuZmlyc3RDaGlsZDtpO2k9aS5uZXh0U2libGluZykzPT09aS5ub2RlVHlwZT9hKz1pLm5vZGVWYWx1ZS5sZW5ndGg6MT09PWkubm9kZVR5cGUmJihuLnB1c2goe2V2ZW50OiJzdGFydCIsb2Zmc2V0OmEsbm9kZTppfSksYT1yKGksYSksdChpKS5tYXRjaCgvYnJ8aHJ8aW1nfGlucHV0Lyl8fG4ucHVzaCh7ZXZlbnQ6InN0b3AiLG9mZnNldDphLG5vZGU6aX0pKTtyZXR1cm4gYX0oZSwwKSxufWZ1bmN0aW9uIGMoZSxyLGEpe2Z1bmN0aW9uIGkoKXtyZXR1cm4gZS5sZW5ndGgmJnIubGVuZ3RoP2VbMF0ub2Zmc2V0IT09clswXS5vZmZzZXQ/ZVswXS5vZmZzZXQ8clswXS5vZmZzZXQ/ZTpyOiJzdGFydCI9PT1yWzBdLmV2ZW50P2U6cjplLmxlbmd0aD9lOnJ9ZnVuY3Rpb24gbyhlKXtmdW5jdGlvbiByKGUpe3JldHVybiIgIitlLm5vZGVOYW1lKyc9IicrbihlLnZhbHVlKS5yZXBsYWNlKCciJywiJnF1b3Q7IikrJyInfXMrPSI8Iit0KGUpK0UubWFwLmNhbGwoZS5hdHRyaWJ1dGVzLHIpLmpvaW4oIiIpKyI+In1mdW5jdGlvbiB1KGUpe3MrPSI8LyIrdChlKSsiPiJ9ZnVuY3Rpb24gYyhlKXsoInN0YXJ0Ij09PWUuZXZlbnQ/bzp1KShlLm5vZGUpfWZvcih2YXIgbD0wLHM9IiIsZj1bXTtlLmxlbmd0aHx8ci5sZW5ndGg7KXt2YXIgZz1pKCk7aWYocys9bihhLnN1YnN0cmluZyhsLGdbMF0ub2Zmc2V0KSksbD1nWzBdLm9mZnNldCxnPT09ZSl7Zi5yZXZlcnNlKCkuZm9yRWFjaCh1KTtkbyBjKGcuc3BsaWNlKDAsMSlbMF0pLGc9aSgpO3doaWxlKGc9PT1lJiZnLmxlbmd0aCYmZ1swXS5vZmZzZXQ9PT1sKTtmLnJldmVyc2UoKS5mb3JFYWNoKG8pfWVsc2Uic3RhcnQiPT09Z1swXS5ldmVudD9mLnB1c2goZ1swXS5ub2RlKTpmLnBvcCgpLGMoZy5zcGxpY2UoMCwxKVswXSl9cmV0dXJuIHMrbihhLnN1YnN0cihsKSl9ZnVuY3Rpb24gbChlKXtyZXR1cm4gZS52JiYhZS5jYWNoZWRfdmFyaWFudHMmJihlLmNhY2hlZF92YXJpYW50cz1lLnYubWFwKGZ1bmN0aW9uKG4pe3JldHVybiBvKGUse3Y6bnVsbH0sbil9KSksZS5jYWNoZWRfdmFyaWFudHN8fGUuZVcmJltvKGUpXXx8W2VdfWZ1bmN0aW9uIHMoZSl7ZnVuY3Rpb24gbihlKXtyZXR1cm4gZSYmZS5zb3VyY2V8fGV9ZnVuY3Rpb24gdCh0LHIpe3JldHVybiBuZXcgUmVnRXhwKG4odCksIm0iKyhlLmNJPyJpIjoiIikrKHI/ImciOiIiKSl9ZnVuY3Rpb24gcihhLGkpe2lmKCFhLmNvbXBpbGVkKXtpZihhLmNvbXBpbGVkPSEwLGEuaz1hLmt8fGEuYkssYS5rKXt2YXIgbz17fSx1PWZ1bmN0aW9uKG4sdCl7ZS5jSSYmKHQ9dC50b0xvd2VyQ2FzZSgpKSx0LnNwbGl0KCIgIikuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1lLnNwbGl0KCJ8Iik7b1t0WzBdXT1bbix0WzFdP051bWJlcih0WzFdKToxXX0pfTsic3RyaW5nIj09dHlwZW9mIGEuaz91KCJrZXl3b3JkIixhLmspOngoYS5rKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3UoZSxhLmtbZV0pfSksYS5rPW99YS5sUj10KGEubHx8L1x3Ky8sITApLGkmJihhLmJLJiYoYS5iPSJcXGIoIithLmJLLnNwbGl0KCIgIikuam9pbigifCIpKyIpXFxiIiksYS5ifHwoYS5iPS9cQnxcYi8pLGEuYlI9dChhLmIpLGEuZXx8YS5lV3x8KGEuZT0vXEJ8XGIvKSxhLmUmJihhLmVSPXQoYS5lKSksYS50RT1uKGEuZSl8fCIiLGEuZVcmJmkudEUmJihhLnRFKz0oYS5lPyJ8IjoiIikraS50RSkpLGEuaSYmKGEuaVI9dChhLmkpKSxudWxsPT1hLnImJihhLnI9MSksYS5jfHwoYS5jPVtdKSxhLmM9QXJyYXkucHJvdG90eXBlLmNvbmNhdC5hcHBseShbXSxhLmMubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBsKCJzZWxmIj09PWU/YTplKX0pKSxhLmMuZm9yRWFjaChmdW5jdGlvbihlKXtyKGUsYSl9KSxhLnN0YXJ0cyYmcihhLnN0YXJ0cyxpKTt2YXIgYz1hLmMubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBlLmJLPyJcXC4/KCIrZS5iKyIpXFwuPyI6ZS5ifSkuY29uY2F0KFthLnRFLGEuaV0pLm1hcChuKS5maWx0ZXIoQm9vbGVhbik7YS50PWMubGVuZ3RoP3QoYy5qb2luKCJ8IiksITApOntleGVjOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGx9fX19cihlKX1mdW5jdGlvbiBmKGUsdCxhLGkpe2Z1bmN0aW9uIG8oZSxuKXt2YXIgdCxhO2Zvcih0PTAsYT1uLmMubGVuZ3RoO2E+dDt0K
<link href="data:text/css;charset=utf-8,%0Aa%2Eanchor%2Dsection%20%7Bmargin%2Dleft%3A%2010px%3B%20visibility%3A%20hidden%3B%20color%3A%20inherit%3B%7D%0Aa%2Eanchor%2Dsection%3A%3Abefore%20%7Bcontent%3A%20%27%23%27%3B%7D%0A%2EhasAnchor%3Ahover%20a%2Eanchor%2Dsection%20%7Bvisibility%3A%20visible%3B%7D%0A" rel="stylesheet" />
<script src="data:application/x-javascript;base64,Ly8gQW5jaG9yIHNlY3Rpb25zIHYxLjAgd3JpdHRlbiBieSBBdHN1c2hpIFlhc3Vtb3RvIG9uIE9jdCAzcmQsIDIwMjAuCmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBmdW5jdGlvbigpIHsKICAvLyBEbyBub3RoaW5nIGlmIEFuY2hvckpTIGlzIHVzZWQKICBpZiAodHlwZW9mIHdpbmRvdy5hbmNob3JzID09PSAnb2JqZWN0JyAmJiBhbmNob3JzLmhhc093blByb3BlcnR5KCdoYXNBbmNob3JKU0xpbmsnKSkgewogICAgcmV0dXJuOwogIH0KCiAgY29uc3QgaCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2gxLCBoMiwgaDMsIGg0LCBoNSwgaDYnKTsKCiAgLy8gRG8gbm90aGluZyBpZiBzZWN0aW9ucyBhcmUgYWxyZWFkeSBhbmNob3JlZAogIGlmIChBcnJheS5mcm9tKGgpLnNvbWUoeCA9PiB4LmNsYXNzTGlzdC5jb250YWlucygnaGFzQW5jaG9yJykpKSB7CiAgICByZXR1cm4gbnVsbDsKICB9CgogIC8vIFVzZSBzZWN0aW9uIGlkIHdoZW4gcGFuZG9jIHJ1bnMgd2l0aCAtLXNlY3Rpb24tZGl2cwogIGNvbnN0IHNlY3Rpb25faWQgPSBmdW5jdGlvbih4KSB7CiAgICByZXR1cm4gKCh4LmNsYXNzTGlzdC5jb250YWlucygnc2VjdGlvbicpIHx8ICh4LnRhZ05hbWUgPT09ICdTRUNUSU9OJykpCiAgICAgICAgICAgID8geC5pZCA6ICcnKTsKICB9OwoKICAvLyBBZGQgYW5jaG9ycwogIGguZm9yRWFjaChmdW5jdGlvbih4KSB7CiAgICBjb25zdCBpZCA9IHguaWQgfHwgc2VjdGlvbl9pZCh4LnBhcmVudEVsZW1lbnQpOwogICAgaWYgKGlkID09PSAnJykgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGxldCBhbmNob3IgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7CiAgICBhbmNob3IuaHJlZiA9ICcjJyArIGlkOwogICAgYW5jaG9yLmNsYXNzTGlzdCA9IFsnYW5jaG9yLXNlY3Rpb24nXTsKICAgIHguY2xhc3NMaXN0LmFkZCgnaGFzQW5jaG9yJyk7CiAgICB4LmFwcGVuZENoaWxkKGFuY2hvcik7CiAgfSk7Cn0pOwo="></script>
<script src="data:application/x-javascript;base64,KGZ1bmN0aW9uKCkgewogIC8vIElmIHdpbmRvdy5IVE1MV2lkZ2V0cyBpcyBhbHJlYWR5IGRlZmluZWQsIHRoZW4gdXNlIGl0OyBvdGhlcndpc2UgY3JlYXRlIGEKICAvLyBuZXcgb2JqZWN0LiBUaGlzIGFsbG93cyBwcmVjZWRpbmcgY29kZSB0byBzZXQgb3B0aW9ucyB0aGF0IGFmZmVjdCB0aGUKICAvLyBpbml0aWFsaXphdGlvbiBwcm9jZXNzICh0aG91Z2ggbm9uZSBjdXJyZW50bHkgZXhpc3QpLgogIHdpbmRvdy5IVE1MV2lkZ2V0cyA9IHdpbmRvdy5IVE1MV2lkZ2V0cyB8fCB7fTsKCiAgLy8gU2VlIGlmIHdlJ3JlIHJ1bm5pbmcgaW4gYSB2aWV3ZXIgcGFuZS4gSWYgbm90LCB3ZSdyZSBpbiBhIHdlYiBicm93c2VyLgogIHZhciB2aWV3ZXJNb2RlID0gd2luZG93LkhUTUxXaWRnZXRzLnZpZXdlck1vZGUgPQogICAgICAvXGJ2aWV3ZXJfcGFuZT0xXGIvLnRlc3Qod2luZG93LmxvY2F0aW9uKTsKCiAgLy8gU2VlIGlmIHdlJ3JlIHJ1bm5pbmcgaW4gU2hpbnkgbW9kZS4gSWYgbm90LCBpdCdzIGEgc3RhdGljIGRvY3VtZW50LgogIC8vIE5vdGUgdGhhdCBzdGF0aWMgd2lkZ2V0cyBjYW4gYXBwZWFyIGluIGJvdGggU2hpbnkgYW5kIHN0YXRpYyBtb2RlcywgYnV0CiAgLy8gb2J2aW91c2x5LCBTaGlueSB3aWRnZXRzIGNhbiBvbmx5IGFwcGVhciBpbiBTaGlueSBhcHBzL2RvY3VtZW50cy4KICB2YXIgc2hpbnlNb2RlID0gd2luZG93LkhUTUxXaWRnZXRzLnNoaW55TW9kZSA9CiAgICAgIHR5cGVvZih3aW5kb3cuU2hpbnkpICE9PSAidW5kZWZpbmVkIiAmJiAhIXdpbmRvdy5TaGlueS5vdXRwdXRCaW5kaW5nczsKCiAgLy8gV2UgY2FuJ3QgY291bnQgb24galF1ZXJ5IGJlaW5nIGF2YWlsYWJsZSwgc28gd2UgaW1wbGVtZW50IG91ciBvd24KICAvLyB2ZXJzaW9uIGlmIG5lY2Vzc2FyeS4KICBmdW5jdGlvbiBxdWVyeVNlbGVjdG9yQWxsKHNjb3BlLCBzZWxlY3RvcikgewogICAgaWYgKHR5cGVvZihqUXVlcnkpICE9PSAidW5kZWZpbmVkIiAmJiBzY29wZSBpbnN0YW5jZW9mIGpRdWVyeSkgewogICAgICByZXR1cm4gc2NvcGUuZmluZChzZWxlY3Rvcik7CiAgICB9CiAgICBpZiAoc2NvcGUucXVlcnlTZWxlY3RvckFsbCkgewogICAgICByZXR1cm4gc2NvcGUucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBhc0FycmF5KHZhbHVlKSB7CiAgICBpZiAodmFsdWUgPT09IG51bGwpCiAgICAgIHJldHVybiBbXTsKICAgIGlmICgkLmlzQXJyYXkodmFsdWUpKQogICAgICByZXR1cm4gdmFsdWU7CiAgICByZXR1cm4gW3ZhbHVlXTsKICB9CgogIC8vIEltcGxlbWVudCBqUXVlcnkncyBleHRlbmQKICBmdW5jdGlvbiBleHRlbmQodGFyZ2V0IC8qLCAuLi4gKi8pIHsKICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHsKICAgICAgcmV0dXJuIHRhcmdldDsKICAgIH0KICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07CiAgICAgIGZvciAodmFyIHByb3AgaW4gc291cmNlKSB7CiAgICAgICAgaWYgKHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgewogICAgICAgICAgdGFyZ2V0W3Byb3BdID0gc291cmNlW3Byb3BdOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIHRhcmdldDsKICB9CgogIC8vIElFOCBkb2Vzbid0IHN1cHBvcnQgQXJyYXkuZm9yRWFjaC4KICBmdW5jdGlvbiBmb3JFYWNoKHZhbHVlcywgY2FsbGJhY2ssIHRoaXNBcmcpIHsKICAgIGlmICh2YWx1ZXMuZm9yRWFjaCkgewogICAgICB2YWx1ZXMuZm9yRWFjaChjYWxsYmFjaywgdGhpc0FyZyk7CiAgICB9IGVsc2UgewogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewogICAgICAgIGNhbGxiYWNrLmNhbGwodGhpc0FyZywgdmFsdWVzW2ldLCBpLCB2YWx1ZXMpOwogICAgICB9CiAgICB9CiAgfQoKICAvLyBSZXBsYWNlcyB0aGUgc3BlY2lmaWVkIG1ldGhvZCB3aXRoIHRoZSByZXR1cm4gdmFsdWUgb2YgZnVuY1NvdXJjZS4KICAvLwogIC8vIE5vdGUgdGhhdCBmdW5jU291cmNlIHNob3VsZCBub3QgQkUgdGhlIG5ldyBtZXRob2QsIGl0IHNob3VsZCBiZSBhIGZ1bmN0aW9uCiAgLy8gdGhhdCBSRVRVUk5TIHRoZSBuZXcgbWV0aG9kLiBmdW5jU291cmNlIHJlY2VpdmVzIGEgc2luZ2xlIGFyZ3VtZW50IHRoYXQgaXMKICAvLyB0aGUgb3ZlcnJpZGRlbiBtZXRob2QsIGl0IGNhbiBiZSBjYWxsZWQgZnJvbSB0aGUgbmV3IG1ldGhvZC4gVGhlIG92ZXJyaWRkZW4KICAvLyBtZXRob2QgY2FuIGJlIGNhbGxlZCBsaWtlIGEgcmVndWxhciBmdW5jdGlvbiwgaXQgaGFzIHRoZSB0YXJnZXQgcGVybWFuZW50bHkKICAvLyBib3VuZCB0byBpdCBzbyAidGhpcyIgd2lsbCB3b3JrIGNvcnJlY3RseS4KICBmdW5jdGlvbiBvdmVycmlkZU1ldGhvZCh0YXJnZXQsIG1ldGhvZE5hbWUsIGZ1bmNTb3VyY2UpIHsKICAgIHZhciBzdXBlckZ1bmMgPSB0YXJnZXRbbWV0aG9kTmFtZV0gfHwgZnVuY3Rpb24oKSB7fTsKICAgIHZhciBzdXBlckZ1bmNCb3VuZCA9IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gc3VwZXJGdW5jLmFwcGx5KHRhcmdldCwgYXJndW1lbnRzKTsKICAgIH07CiAgICB0YXJnZXRbbWV0aG9kTmFtZV0gPSBmdW5jU291cmNlKHN1cGVyRnVuY0JvdW5kKTsKICB9CgogIC8vIEFkZCBhIG1ldGhvZCB0byBkZWxlZ2F0b3IgdGhhdCwgd2hlbiBpbnZva2VkLCBjYWxscwogIC8vIGRlbGVnYXRlZS5tZXRob2ROYW1lLiBJZiB0aGVyZSBpcyBubyBzdWNoIG1ldGhvZCBvbgogIC8vIHRoZSBkZWxlZ2F0ZWUsIGJ1dCB0aGVyZSB3YXMgb25lIG9uIGRlbGVnYXRvciBiZWZvcmUKICAvLyBkZWxlZ2F0ZU1ldGhvZCB3YXMgY2FsbGVkLCB0aGVuIHRoZSBvcmlnaW5hbCB2ZXJzaW9uCiAgLy8gaXMgaW52b2tlZCBpbnN0ZWFkLgogIC8vIEZvciBleGFtcGxlOgogIC8vCiAgLy8gdmFyIGEgPSB7CiAgLy8gICBtZXRob2QxOiBmdW5jdGlvbigpIHsgY29uc29sZS5sb2coJ2ExJyk7IH0KICAvLyAgIG1ldGhvZDI6IGZ1bmN0a
<link href="data:text/css;charset=utf-8,%2Edt%2Dcrosstalk%2Dfade%20%7B%0Aopacity%3A%200%2E2%3B%0A%7D%0Ahtml%20body%20div%2EDTS%20div%2EdataTables%5FscrollBody%20%7B%0Abackground%3A%20none%3B%0A%7D%0A%0Atable%2EdataTable%20%7B%0Adisplay%3A%20table%3B%0A%7D%0A" rel="stylesheet" />
<script src="data:application/x-javascript;base64,KGZ1bmN0aW9uKCkgewoKLy8gc29tZSBoZWxwZXIgZnVuY3Rpb25zOiB1c2luZyBhIGdsb2JhbCBvYmplY3QgRFRXaWRnZXQgc28gdGhhdCBpdCBjYW4gYmUgdXNlZAovLyBpbiBKUygpIGNvZGUsIGUuZy4gZGF0YXRhYmxlKG9wdGlvbnMgPSBsaXN0KGZvbyA9IEpTKCdjb2RlJykpKTsgdW5saWtlIFIncwovLyBkeW5hbWljIHNjb3BpbmcsIHdoZW4gJ2NvZGUnIGlzIGV2YWwoKSdlZCwgSmF2YVNjcmlwdCBkb2VzIG5vdCBrbm93IG9iamVjdHMKLy8gZnJvbSB0aGUgInBhcmVudCBmcmFtZSIsIGUuZy4gSlMoJ0RUV2lkZ2V0Jykgd2lsbCBub3Qgd29yayB1bmxlc3MgaXQgd2FzIG1hZGUKLy8gYSBnbG9iYWwgb2JqZWN0CnZhciBEVFdpZGdldCA9IHt9OwoKLy8gMTIzNDU2NjY2Ljc4OTAgLT4gMTIzLDQ1Niw2NjYuNzg5MAp2YXIgbWFya0ludGVydmFsID0gZnVuY3Rpb24oZCwgZGlnaXRzLCBpbnRlcnZhbCwgbWFyaywgZGVjTWFyaywgcHJlY2lzaW9uKSB7CiAgeCA9IHByZWNpc2lvbiA/IGQudG9QcmVjaXNpb24oZGlnaXRzKSA6IGQudG9GaXhlZChkaWdpdHMpOwogIGlmICghL14tP1tcZC5dKyQvLnRlc3QoeCkpIHJldHVybiB4OwogIHZhciB4diA9IHguc3BsaXQoJy4nKTsKICBpZiAoeHYubGVuZ3RoID4gMikgcmV0dXJuIHg7ICAvLyBzaG91bGQgaGF2ZSBhdCBtb3N0IG9uZSBkZWNpbWFsIHBvaW50CiAgeHZbMF0gPSB4dlswXS5yZXBsYWNlKG5ldyBSZWdFeHAoJ1xcQig/PShcXGR7JyArIGludGVydmFsICsgJ30pKyg/IVxcZCkpJywgJ2cnKSwgbWFyayk7CiAgcmV0dXJuIHh2LmpvaW4oZGVjTWFyayk7Cn07CgpEVFdpZGdldC5mb3JtYXRDdXJyZW5jeSA9IGZ1bmN0aW9uKGRhdGEsIGN1cnJlbmN5LCBkaWdpdHMsIGludGVydmFsLCBtYXJrLCBkZWNNYXJrLCBiZWZvcmUpIHsKICB2YXIgZCA9IHBhcnNlRmxvYXQoZGF0YSk7CiAgaWYgKGlzTmFOKGQpKSByZXR1cm4gJyc7CiAgdmFyIHJlcyA9IG1hcmtJbnRlcnZhbChkLCBkaWdpdHMsIGludGVydmFsLCBtYXJrLCBkZWNNYXJrKTsKICByZXMgPSBiZWZvcmUgPyAoL14tLy50ZXN0KHJlcykgPyAnLScgKyBjdXJyZW5jeSArIHJlcy5yZXBsYWNlKC9eLS8sICcnKSA6IGN1cnJlbmN5ICsgcmVzKSA6CiAgICByZXMgKyBjdXJyZW5jeTsKICByZXR1cm4gcmVzOwp9OwoKRFRXaWRnZXQuZm9ybWF0U3RyaW5nID0gZnVuY3Rpb24oZGF0YSwgcHJlZml4LCBzdWZmaXgpIHsKICB2YXIgZCA9IGRhdGE7CiAgaWYgKGQgPT09IG51bGwpIHJldHVybiAnJzsKICByZXR1cm4gcHJlZml4ICsgZCArIHN1ZmZpeDsKfTsKCkRUV2lkZ2V0LmZvcm1hdFBlcmNlbnRhZ2UgPSBmdW5jdGlvbihkYXRhLCBkaWdpdHMsIGludGVydmFsLCBtYXJrLCBkZWNNYXJrKSB7CiAgdmFyIGQgPSBwYXJzZUZsb2F0KGRhdGEpOwogIGlmIChpc05hTihkKSkgcmV0dXJuICcnOwogIHJldHVybiBtYXJrSW50ZXJ2YWwoZCAqIDEwMCwgZGlnaXRzLCBpbnRlcnZhbCwgbWFyaywgZGVjTWFyaykgKyAnJSc7Cn07CgpEVFdpZGdldC5mb3JtYXRSb3VuZCA9IGZ1bmN0aW9uKGRhdGEsIGRpZ2l0cywgaW50ZXJ2YWwsIG1hcmssIGRlY01hcmspIHsKICB2YXIgZCA9IHBhcnNlRmxvYXQoZGF0YSk7CiAgaWYgKGlzTmFOKGQpKSByZXR1cm4gJyc7CiAgcmV0dXJuIG1hcmtJbnRlcnZhbChkLCBkaWdpdHMsIGludGVydmFsLCBtYXJrLCBkZWNNYXJrKTsKfTsKCkRUV2lkZ2V0LmZvcm1hdFNpZ25pZiA9IGZ1bmN0aW9uKGRhdGEsIGRpZ2l0cywgaW50ZXJ2YWwsIG1hcmssIGRlY01hcmspIHsKICB2YXIgZCA9IHBhcnNlRmxvYXQoZGF0YSk7CiAgaWYgKGlzTmFOKGQpKSByZXR1cm4gJyc7CiAgcmV0dXJuIG1hcmtJbnRlcnZhbChkLCBkaWdpdHMsIGludGVydmFsLCBtYXJrLCBkZWNNYXJrLCB0cnVlKTsKfTsKCkRUV2lkZ2V0LmZvcm1hdERhdGUgPSBmdW5jdGlvbihkYXRhLCBtZXRob2QsIHBhcmFtcykgewogIHZhciBkID0gZGF0YTsKICBpZiAoZCA9PT0gbnVsbCkgcmV0dXJuICcnOwogIC8vIChuZXcgRGF0ZSgnMjAxNS0xMC0yOCcpKS50b0RhdGVTdHJpbmcoKSBtYXkgcmV0dXJuIDIwMTUtMTAtMjcgYmVjYXVzZSB0aGUKICAvLyBhY3R1YWwgdGltZSBjcmVhdGVkIGNvdWxkIGJlIGxpa2UgJ1R1ZSBPY3QgMjcgMjAxNSAxOTowMDowMCBHTVQtMDUwMCAoQ0RUKScsCiAgLy8gaS5lLiB0aGUgZGF0ZS1vbmx5IHN0cmluZyBpcyB0cmVhdGVkIGFzIFVUQyB0aW1lIGluc3RlYWQgb2YgbG9jYWwgdGltZQogIGlmICgobWV0aG9kID09PSAndG9EYXRlU3RyaW5nJyB8fCBtZXRob2QgPT09ICd0b0xvY2FsZURhdGVTdHJpbmcnKSAmJiAvXlxkezQsfVxEXGR7Mn1cRFxkezJ9JC8udGVzdChkKSkgewogICAgZCA9IGQuc3BsaXQoL1xELyk7CiAgICBkID0gbmV3IERhdGUoZFswXSwgZFsxXSAtIDEsIGRbMl0pOwogIH0gZWxzZSB7CiAgICBkID0gbmV3IERhdGUoZCk7CiAgfQogIHJldHVybiBkW21ldGhvZF0uYXBwbHkoZCwgcGFyYW1zKTsKfTsKCndpbmRvdy5EVFdpZGdldCA9IERUV2lkZ2V0OwoKdmFyIHRyYW5zcG9zZUFycmF5MkQgPSBmdW5jdGlvbihhKSB7CiAgcmV0dXJuIGEubGVuZ3RoID09PSAwID8gYSA6IEhUTUxXaWRnZXRzLnRyYW5zcG9zZUFycmF5MkQoYSk7Cn07Cgp2YXIgY3Jvc3N0YWxrUGx1Z2luc0luc3RhbGxlZCA9IGZhbHNlOwoKZnVuY3Rpb24gbWF5YmVJbnN0YWxsQ3Jvc3N0YWxrUGx1Z2lucygpIHsKICBpZiAoY3Jvc3N0YWxrUGx1Z2luc0luc3RhbGxlZCkKICAgIHJldHVybjsKICBjcm9zc3RhbGtQbHVnaW5zSW5zdGFsbGVkID0gdHJ1ZTsKCiAgJC5mbi5kYXRhVGFibGUuZXh0LmFmbkZpbHRlcmluZy5wdXNoKAogICAgZnVuY3Rpb24ob1NldHRpbmdzLCBhRGF0YSwgaURhdGFJbmRleCkgewogICAgICB2YXIgY3RmaWx0ZXIgPSBvU2V0dGluZ3MublRhYmxlLmN0ZmlsdGVyOwogICAgICBpZiAoY3RmaWx0ZXIgJiYgIWN0ZmlsdGVyW2lEYXRhSW5kZXhdKQogICAgICAgIHJldHVybiBmYWxzZTsKCiAgICAgIHZhciBjdHNlbGVjdCA9IG9TZXR0aW5ncy5uVGFibGUuY3RzZWxlY3Q7CiAgICAgIGlmIChjdHNlbGVjdCAmJ
<link href="data:text/css;charset=utf-8,table%2EdataTable%7Bwidth%3A100%25%3Bmargin%3A0%20auto%3Bclear%3Aboth%3Bborder%2Dcollapse%3Aseparate%3Bborder%2Dspacing%3A0%7Dtable%2EdataTable%20thead%20th%2Ctable%2EdataTable%20tfoot%20th%7Bfont%2Dweight%3Abold%7Dtable%2EdataTable%20thead%20th%2Ctable%2EdataTable%20thead%20td%7Bpadding%3A10px%2018px%3Bborder%2Dbottom%3A1px%20solid%20%23111%7Dtable%2EdataTable%20thead%20th%3Aactive%2Ctable%2EdataTable%20thead%20td%3Aactive%7Boutline%3Anone%7Dtable%2EdataTable%20tfoot%20th%2Ctable%2EdataTable%20tfoot%20td%7Bpadding%3A10px%2018px%206px%2018px%3Bborder%2Dtop%3A1px%20solid%20%23111%7Dtable%2EdataTable%20thead%20%2Esorting%2Ctable%2EdataTable%20thead%20%2Esorting%5Fasc%2Ctable%2EdataTable%20thead%20%2Esorting%5Fdesc%2Ctable%2EdataTable%20thead%20%2Esorting%5Fasc%5Fdisabled%2Ctable%2EdataTable%20thead%20%2Esorting%5Fdesc%5Fdisabled%7Bcursor%3Apointer%3B%2Acursor%3Ahand%3Bbackground%2Drepeat%3Ano%2Drepeat%3Bbackground%2Dposition%3Acenter%20right%7Dtable%2EdataTable%20thead%20%2Esorting%7Bbackground%2Dimage%3Aurl%28data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABMAAAATCAQAAADYWf5HAAAAkElEQVQoz7XQMQ5AQBCF4dWQSJxC5wwax1Cq1e7BAdxD5SL%2BTq%2FQCM1oNiJidwox0355mXnG%2FDrEtIQ6azioNZQxI0ykPhTQIwhCR%2BBmBYtlK7kLJYwWCcJA9M4qdrZrd8pPjZWPtOqdRQy320YSV17OatFC4euts6z39GYMKRPCTKY9UnPQ6P%2BGtMRfGtPnBCiqhAeJPmkqAAAAAElFTkSuQmCC%29%7Dtable%2EdataTable%20thead%20%2Esorting%5Fasc%7Bbackground%2Dimage%3Aurl%28data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAZ0lEQVQ4y2NgGLKgquEuFxBPAGI2ahhWCsS%2FgDibUoO0gPgxEP8H4ttArEyuQYxAPBdqEAxPBImTY5gjEL9DM%2BwTENuQahAvEO9DMwiGdwAxOymGJQLxTyD%2BjgWDxCMZRsEoGAVoAADeemwtPcZI2wAAAABJRU5ErkJggg%3D%3D%29%7Dtable%2EdataTable%20thead%20%2Esorting%5Fdesc%7Bbackground%2Dimage%3Aurl%28data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAZUlEQVQ4y2NgGAWjYBSggaqGu5FA%2FBOIv2PBIPFEUgxjB%2BIdQPwfC94HxLykus4GiD%2BhGfQOiB3J8SojEE9EM2wuSJzcsFMG4ttQgx4DsRalkZENxL%2BAuJQaMcsGxBOAmGvopk8AVz1sLZgg0bsAAAAASUVORK5CYII%3D%29%7Dtable%2EdataTable%20thead%20%2Esorting%5Fasc%5Fdisabled%7Bbackground%2Dimage%3Aurl%28data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABMAAAATCAQAAADYWf5HAAAAW0lEQVQoz2NgoCm4w3Vnwh02wspK7%2Fy6k01Ikdadx3f%2B37l9RxmfIsY7c4GKQHDiHUbcyhzvvIMq%2B3THBpci3jv7oIpAcMcdduzKEu%2F8vPMdDn%2FeiWQYBYMKAAC3ykIEuYQJUgAAAABJRU5ErkJggg%3D%3D%29%7Dtable%2EdataTable%20thead%20%2Esorting%5Fdesc%5Fdisabled%7Bbackground%2Dimage%3Aurl%28data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABMAAAATCAQAAADYWf5HAAAAWUlEQVQoz2NgGAWDCtyJvPPzznc4%2FHknEbsy9js77vyHw313eHGZZ3PnE1TRuzuOuK1lvDMRqmzuHUZ87lO%2Bcxuo6PEdLUIeyb7z604pYf%2By3Zlwh4u2YQoAc7ZCBHH4jigAAAAASUVORK5CYII%3D%29%7Dtable%2EdataTable%20tbody%20tr%7Bbackground%2Dcolor%3A%23ffffff%7Dtable%2EdataTable%20tbody%20tr%2Eselected%7Bbackground%2Dcolor%3A%23B0BED9%7Dtable%2EdataTable%20tbody%20th%2Ctable%2EdataTable%20tbody%20td%7Bpadding%3A8px%2010px%7Dtable%2EdataTable%2Erow%2Dborder%20tbody%20th%2Ctable%2EdataTable%2Erow%2Dborder%20tbody%20td%2Ctable%2EdataTable%2Edisplay%20tbody%20th%2Ctable%2EdataTable%2Edisplay%20tbody%20td%7Bborder%2Dtop%3A1px%20solid%20%23ddd%7Dtable%2EdataTable%2Erow%2Dborder%20tbody%20tr%3Afirst%2Dchild%20th%2Ctable%2EdataTable%2Erow%2Dborder%20tbody%20tr%3Afirst%2Dchild%20td%2Ctable%2EdataTable%2Edisplay%20tbody%20tr%3Afirst%2Dchild%20th%2Ctable%2EdataTable%2Edisplay%20tbody%20tr%3Afirst%2Dchild%20td%7Bborder%2Dtop%3Anone%7Dtable%2EdataTable%2Ecell%2Dborder%20tbody%20th%2Ctable%2EdataTable%2Ecell%2Dborder%20tbody%20td%7Bborder%2Dtop%3A1px%20solid%20%23ddd%3Bborder%2Dright%3A1px%20solid%20%23ddd%7Dtable%2EdataTable%2Ecell%2Dborder%20tbody%20tr%20th%3Afirst%2Dchild%2Ctable%2EdataTable%2Ecell%2Dborder%20tbody%20tr%20td%3Afirst%2Dchild%7Bborder%2Dleft%3A1px%20solid%20%23ddd%7Dtable%2EdataTable%2Ecell%2Dborder%20tbody%20tr%3Afirst%2Dchild%20th%2Ctable%2EdataTable%2Ecell%2Dborder%20tbody%20tr%3Afirst%2Dchild%20td%7Bborder%2Dtop%3Anone%7Dtable%2EdataTable%2Estripe%20tbody%20tr%2Eodd%2Ctable%2EdataTable%2Edisplay%20tbody%20tr%2Eodd%7Bbackground%2Dcolor%3A%23f9f9f9%7D
<link href="data:text/css;charset=utf-8,%0Atable%2EdataTable%20tr%2Eselected%20td%2C%20table%2EdataTable%20td%2Eselected%20%7B%0Abackground%2Dcolor%3A%20%23b0bed9%20%21important%3B%0A%7D%0A%0A%2EdataTables%5FscrollBody%20%2EdataTables%5Fsizing%20%7B%0Avisibility%3A%20hidden%3B%0A%7D%0A%0Adiv%2Edatatables%20%7B%0Acolor%3A%20%23333%3B%0A%7D%0A" rel="stylesheet" />
<script src="data:application/x-javascript;base64,LyohCiAgIENvcHlyaWdodCAyMDA4LTIwMTkgU3ByeU1lZGlhIEx0ZC4KCiBUaGlzIHNvdXJjZSBmaWxlIGlzIGZyZWUgc29mdHdhcmUsIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIGxpY2Vuc2U6CiAgIE1JVCBsaWNlbnNlIC0gaHR0cDovL2RhdGF0YWJsZXMubmV0L2xpY2Vuc2UKCiBUaGlzIHNvdXJjZSBmaWxlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIGxpY2Vuc2UgZmlsZXMgZm9yIGRldGFpbHMuCgogRm9yIGRldGFpbHMgcGxlYXNlIHJlZmVyIHRvOiBodHRwOi8vd3d3LmRhdGF0YWJsZXMubmV0CiBEYXRhVGFibGVzIDEuMTAuMjAKIMKpMjAwOC0yMDE5IFNwcnlNZWRpYSBMdGQgLSBkYXRhdGFibGVzLm5ldC9saWNlbnNlCiovCnZhciAkanNjb21wPSRqc2NvbXB8fHt9OyRqc2NvbXAuc2NvcGU9e307JGpzY29tcC5maW5kSW50ZXJuYWw9ZnVuY3Rpb24oZix6LHkpe2YgaW5zdGFuY2VvZiBTdHJpbmcmJihmPVN0cmluZyhmKSk7Zm9yKHZhciBwPWYubGVuZ3RoLEg9MDtIPHA7SCsrKXt2YXIgTD1mW0hdO2lmKHouY2FsbCh5LEwsSCxmKSlyZXR1cm57aTpILHY6TH19cmV0dXJue2k6LTEsdjp2b2lkIDB9fTskanNjb21wLkFTU1VNRV9FUzU9ITE7JGpzY29tcC5BU1NVTUVfTk9fTkFUSVZFX01BUD0hMTskanNjb21wLkFTU1VNRV9OT19OQVRJVkVfU0VUPSExOyRqc2NvbXAuU0lNUExFX0ZST1VORF9QT0xZRklMTD0hMTsKJGpzY29tcC5kZWZpbmVQcm9wZXJ0eT0kanNjb21wLkFTU1VNRV9FUzV8fCJmdW5jdGlvbiI9PXR5cGVvZiBPYmplY3QuZGVmaW5lUHJvcGVydGllcz9PYmplY3QuZGVmaW5lUHJvcGVydHk6ZnVuY3Rpb24oZix6LHkpe2YhPUFycmF5LnByb3RvdHlwZSYmZiE9T2JqZWN0LnByb3RvdHlwZSYmKGZbel09eS52YWx1ZSl9OyRqc2NvbXAuZ2V0R2xvYmFsPWZ1bmN0aW9uKGYpe3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93JiZ3aW5kb3c9PT1mP2Y6InVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWwmJm51bGwhPWdsb2JhbD9nbG9iYWw6Zn07JGpzY29tcC5nbG9iYWw9JGpzY29tcC5nZXRHbG9iYWwodGhpcyk7CiRqc2NvbXAucG9seWZpbGw9ZnVuY3Rpb24oZix6LHkscCl7aWYoeil7eT0kanNjb21wLmdsb2JhbDtmPWYuc3BsaXQoIi4iKTtmb3IocD0wO3A8Zi5sZW5ndGgtMTtwKyspe3ZhciBIPWZbcF07SCBpbiB5fHwoeVtIXT17fSk7eT15W0hdfWY9ZltmLmxlbmd0aC0xXTtwPXlbZl07ej16KHApO3ohPXAmJm51bGwhPXomJiRqc2NvbXAuZGVmaW5lUHJvcGVydHkoeSxmLHtjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6en0pfX07JGpzY29tcC5wb2x5ZmlsbCgiQXJyYXkucHJvdG90eXBlLmZpbmQiLGZ1bmN0aW9uKGYpe3JldHVybiBmP2Y6ZnVuY3Rpb24oZix5KXtyZXR1cm4gJGpzY29tcC5maW5kSW50ZXJuYWwodGhpcyxmLHkpLnZ9fSwiZXM2IiwiZXMzIik7CihmdW5jdGlvbihmKXsiZnVuY3Rpb24iPT09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoWyJqcXVlcnkiXSxmdW5jdGlvbih6KXtyZXR1cm4gZih6LHdpbmRvdyxkb2N1bWVudCl9KToib2JqZWN0Ij09PXR5cGVvZiBleHBvcnRzP21vZHVsZS5leHBvcnRzPWZ1bmN0aW9uKHoseSl7enx8KHo9d2luZG93KTt5fHwoeT0idW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3c/cmVxdWlyZSgianF1ZXJ5Iik6cmVxdWlyZSgianF1ZXJ5IikoeikpO3JldHVybiBmKHkseix6LmRvY3VtZW50KX06ZihqUXVlcnksd2luZG93LGRvY3VtZW50KX0pKGZ1bmN0aW9uKGYseix5LHApe2Z1bmN0aW9uIEgoYSl7dmFyIGIsYyxkPXt9O2YuZWFjaChhLGZ1bmN0aW9uKGUsaCl7KGI9ZS5tYXRjaCgvXihbXkEtWl0rPykoW0EtWl0pLykpJiYtMSE9PSJhIGFhIGFpIGFvIGFzIGIgZm4gaSBtIG8gcyAiLmluZGV4T2YoYlsxXSsiICIpJiYoYz1lLnJlcGxhY2UoYlswXSxiWzJdLnRvTG93ZXJDYXNlKCkpLApkW2NdPWUsIm8iPT09YlsxXSYmSChhW2VdKSl9KTthLl9odW5nYXJpYW5NYXA9ZH1mdW5jdGlvbiBMKGEsYixjKXthLl9odW5nYXJpYW5NYXB8fEgoYSk7dmFyIGQ7Zi5lYWNoKGIsZnVuY3Rpb24oZSxoKXtkPWEuX2h1bmdhcmlhbk1hcFtlXTtkPT09cHx8IWMmJmJbZF0hPT1wfHwoIm8iPT09ZC5jaGFyQXQoMCk/KGJbZF18fChiW2RdPXt9KSxmLmV4dGVuZCghMCxiW2RdLGJbZV0pLEwoYVtkXSxiW2RdLGMpKTpiW2RdPWJbZV0pfSl9ZnVuY3Rpb24gR2EoYSl7dmFyIGI9cS5kZWZhdWx0cy5vTGFuZ3VhZ2UsYz1iLnNEZWNpbWFsO2MmJkhhKGMpO2lmKGEpe3ZhciBkPWEuc1plcm9SZWNvcmRzOyFhLnNFbXB0eVRhYmxlJiZkJiYiTm8gZGF0YSBhdmFpbGFibGUgaW4gdGFibGUiPT09Yi5zRW1wdHlUYWJsZSYmTShhLGEsInNaZXJvUmVjb3JkcyIsInNFbXB0eVRhYmxlIik7IWEuc0xvYWRpbmdSZWNvcmRzJiZkJiYiTG9hZGluZy4uLiI9PT1iLnNMb2FkaW5nUmVjb3JkcyYmTShhLGEsCiJzWmVyb1JlY29yZHMiLCJzTG9hZGluZ1JlY29yZHMiKTthLnNJbmZvVGhvdXNhbmRzJiYoYS5zVGhvdXNhbmRzPWEuc0luZm9UaG91c2FuZHMpOyhhPWEuc0RlY2ltYWwpJiZjIT09YSYmSGEoYSl9fWZ1bmN0aW9uIGpiKGEpe0YoYSwib3JkZXJpbmciLCJiU29ydCIpO0YoYSwib3JkZXJNdWx0aSIsImJTb3J0TXVsdGkiKTtGKGEsIm9yZGVyQ2xhc3NlcyIsImJTb3J0Q2xhc3NlcyIpO0YoYSwib3JkZXJDZWxsc1RvcCIsImJTb3J0Q2VsbHNUb3AiKTtGKGEsIm9yZGVyIiwiYWFTb3J0aW5nIik7RihhLCJvcmRlckZpeGVkIiwiYWFTb3J0aW5nRml4ZWQiKTtGKGEsInBhZ2luZyIsImJQYWdpbmF0ZSIpO0YoYSwicGFnaW5nVHlwZSIsInNQYWdpbmF0aW9uVHlwZSIpO0YoYSwicGFnZUxlbmd0aCIsImlEaXNwbGF5TGVuZ3RoIik7RihhLCJzZWFyY2hpbmciLCJiRmlsdGVyIik7I
<script src="data:application/x-javascript;base64,LyohCgpKU1ppcCAtIEEgSmF2YXNjcmlwdCBjbGFzcyBmb3IgZ2VuZXJhdGluZyBhbmQgcmVhZGluZyB6aXAgZmlsZXMKPGh0dHA6Ly9zdHVhcnRrLmNvbS9qc3ppcD4KCihjKSAyMDA5LTIwMTQgU3R1YXJ0IEtuaWdodGxleSA8c3R1YXJ0IFthdF0gc3R1YXJ0ay5jb20+CkR1YWwgbGljZW5jZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIG9yIEdQTHYzLiBTZWUgaHR0cHM6Ly9yYXcuZ2l0aHViLmNvbS9TdHVrL2pzemlwL21hc3Rlci9MSUNFTlNFLm1hcmtkb3duLgoKSlNaaXAgdXNlcyB0aGUgbGlicmFyeSBwYWtvIHJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSA6Cmh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlY2EvcGFrby9ibG9iL21hc3Rlci9MSUNFTlNFCiovCiFmdW5jdGlvbihhKXtpZigib2JqZWN0Ij09dHlwZW9mIGV4cG9ydHMmJiJ1bmRlZmluZWQiIT10eXBlb2YgbW9kdWxlKW1vZHVsZS5leHBvcnRzPWEoKTtlbHNlIGlmKCJmdW5jdGlvbiI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQpZGVmaW5lKFtdLGEpO2Vsc2V7dmFyIGI7InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/Yj13aW5kb3c6InVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWw/Yj1nbG9iYWw6InVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmJiYoYj1zZWxmKSxiLkpTWmlwPWEoKX19KGZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uIGEoYixjLGQpe2Z1bmN0aW9uIGUoZyxoKXtpZighY1tnXSl7aWYoIWJbZ10pe3ZhciBpPSJmdW5jdGlvbiI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlO2lmKCFoJiZpKXJldHVybiBpKGcsITApO2lmKGYpcmV0dXJuIGYoZywhMCk7dGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgZmluZCBtb2R1bGUgJyIrZysiJyIpfXZhciBqPWNbZ109e2V4cG9ydHM6e319O2JbZ11bMF0uY2FsbChqLmV4cG9ydHMsZnVuY3Rpb24oYSl7dmFyIGM9YltnXVsxXVthXTtyZXR1cm4gZShjP2M6YSl9LGosai5leHBvcnRzLGEsYixjLGQpfXJldHVybiBjW2ddLmV4cG9ydHN9Zm9yKHZhciBmPSJmdW5jdGlvbiI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlLGc9MDtnPGQubGVuZ3RoO2crKyllKGRbZ10pO3JldHVybiBlfSh7MTpbZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD0iQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iO2MuZW5jb2RlPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYixjLGUsZixnLGgsaSxqPSIiLGs9MDtrPGEubGVuZ3RoOyliPWEuY2hhckNvZGVBdChrKyspLGM9YS5jaGFyQ29kZUF0KGsrKyksZT1hLmNoYXJDb2RlQXQoaysrKSxmPWI+PjIsZz0oMyZiKTw8NHxjPj40LGg9KDE1JmMpPDwyfGU+PjYsaT02MyZlLGlzTmFOKGMpP2g9aT02NDppc05hTihlKSYmKGk9NjQpLGo9aitkLmNoYXJBdChmKStkLmNoYXJBdChnKStkLmNoYXJBdChoKStkLmNoYXJBdChpKTtyZXR1cm4gan0sYy5kZWNvZGU9ZnVuY3Rpb24oYSl7dmFyIGIsYyxlLGYsZyxoLGksaj0iIixrPTA7Zm9yKGE9YS5yZXBsYWNlKC9bXkEtWmEtejAtOVwrXC9cPV0vZywiIik7azxhLmxlbmd0aDspZj1kLmluZGV4T2YoYS5jaGFyQXQoaysrKSksZz1kLmluZGV4T2YoYS5jaGFyQXQoaysrKSksaD1kLmluZGV4T2YoYS5jaGFyQXQoaysrKSksaT1kLmluZGV4T2YoYS5jaGFyQXQoaysrKSksYj1mPDwyfGc+PjQsYz0oMTUmZyk8PDR8aD4+MixlPSgzJmgpPDw2fGksais9U3RyaW5nLmZyb21DaGFyQ29kZShiKSw2NCE9aCYmKGorPVN0cmluZy5mcm9tQ2hhckNvZGUoYykpLDY0IT1pJiYoais9U3RyaW5nLmZyb21DaGFyQ29kZShlKSk7cmV0dXJuIGp9fSx7fV0sMjpbZnVuY3Rpb24oYSxiKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gYygpe3RoaXMuY29tcHJlc3NlZFNpemU9MCx0aGlzLnVuY29tcHJlc3NlZFNpemU9MCx0aGlzLmNyYzMyPTAsdGhpcy5jb21wcmVzc2lvbk1ldGhvZD1udWxsLHRoaXMuY29tcHJlc3NlZENvbnRlbnQ9bnVsbH1jLnByb3RvdHlwZT17Z2V0Q29udGVudDpmdW5jdGlvbigpe3JldHVybiBudWxsfSxnZXRDb21wcmVzc2VkQ29udGVudDpmdW5jdGlvbigpe3JldHVybiBudWxsfX0sYi5leHBvcnRzPWN9LHt9XSwzOltmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO2MuU1RPUkU9e21hZ2ljOiJceDAwXHgwMCIsY29tcHJlc3M6ZnVuY3Rpb24oYSl7cmV0dXJuIGF9LHVuY29tcHJlc3M6ZnVuY3Rpb24oYSl7cmV0dXJuIGF9LGNvbXByZXNzSW5wdXRUeXBlOm51bGwsdW5jb21wcmVzc0lucHV0VHlwZTpudWxsfSxjLkRFRkxBVEU9YSgiLi9mbGF0ZSIpfSx7Ii4vZmxhdGUiOjh9XSw0OltmdW5jdGlvbihhLGIpeyJ1c2Ugc3RyaWN0Ijt2YXIgYz1hKCIuL3V0aWxzIiksZD1bMCwxOTk2OTU5ODk0LDM5OTM5MTk3ODgsMjU2NzUyNDc5NCwxMjQ2MzQxMzcsMTg4NjA1NzYxNSwzOTE1NjIxNjg1LDI2NTczOTIwMzUsMjQ5MjY4Mjc0LDIwNDQ1MDgzMjQsMzc3MjExNTIzMCwyNTQ3MTc3ODY0LDE2Mjk0MTk5NSwyMTI1NTYxMDIxLDM4ODc2MDcwNDcsMjQyODQ0NDA0OSw0OTg1MzY1NDgsMTc4OTkyNzY2Niw0MDg5MDE2NjQ4LDIyMjcwNjEyMTQsNDUwNTQ4ODYxLDE4NDMyNTg2MDMsNDEwNzU4MDc1MywyMjExNjc3NjM5LDMyNTg4Mzk5MCwxNjg0Nzc3MTUyLDQyNTExMjIwNDIsMjMyMTkyNjYzNiwzMzU2MzM0ODcsMTY2MTM2NTQ2NSw0MTk1MzAyNzU1LDIzNjYxMTUzMTcsOTk3MDczMDk2LDEyODE5NTM4ODYsMzU3OTg1NTMzMiwyNzI0Njg4MjQyLDEwMDY4ODgxNDUsMTI1ODYwNzY4NywzNTI0MTAxNjI5LDI3Njg5NDI0NDMsOTAxMDk3NzIyLDExMTkwMDA2ODQsMzY4NjUxNzIwNiwyODk4MDY1NzI4LDg1MzA0NDQ1MSwxMTcyMjY2MTAxLDM3MDUwMTU3NTksMjg4MjYxNjY2NSw2NTE3Njc5ODAsMTM3MzUwMzU0NiwzMzY5NTU0MzA0LDMyMTgxMDQ1OTgsNTY1NTA3MjUzLDE0NTQ2MjE3MzEsMzQ4NTExMTcwNSwzMDk5NDM2MzAzLDY3MTI2Njk3NCwxNTk0MTk4MDI0LDMzMjI3MzA5MzAsMjk3MDM0NzgxMiw3OTU4MzU1MjcsMTQ4MzIzMDIyNSwzMjQ0MzY3Mjc1LDMwNjAxNDk1NjUsMTk5NDE0N
<link href="data:text/css;charset=utf-8,%40keyframes%20dtb%2Dspinner%7B100%25%7Btransform%3Arotate%28360deg%29%7D%7D%40%2Do%2Dkeyframes%20dtb%2Dspinner%7B100%25%7B%2Do%2Dtransform%3Arotate%28360deg%29%3Btransform%3Arotate%28360deg%29%7D%7D%40%2Dms%2Dkeyframes%20dtb%2Dspinner%7B100%25%7B%2Dms%2Dtransform%3Arotate%28360deg%29%3Btransform%3Arotate%28360deg%29%7D%7D%40%2Dwebkit%2Dkeyframes%20dtb%2Dspinner%7B100%25%7B%2Dwebkit%2Dtransform%3Arotate%28360deg%29%3Btransform%3Arotate%28360deg%29%7D%7D%40%2Dmoz%2Dkeyframes%20dtb%2Dspinner%7B100%25%7B%2Dmoz%2Dtransform%3Arotate%28360deg%29%3Btransform%3Arotate%28360deg%29%7D%7Ddiv%2Edt%2Dbutton%2Dinfo%7Bposition%3Afixed%3Btop%3A50%25%3Bleft%3A50%25%3Bwidth%3A400px%3Bmargin%2Dtop%3A%2D100px%3Bmargin%2Dleft%3A%2D200px%3Bbackground%2Dcolor%3Awhite%3Bborder%3A2px%20solid%20%23111%3Bbox%2Dshadow%3A3px%203px%208px%20rgba%280%2C0%2C0%2C0%2E3%29%3Bborder%2Dradius%3A3px%3Btext%2Dalign%3Acenter%3Bz%2Dindex%3A21%7Ddiv%2Edt%2Dbutton%2Dinfo%20h2%7Bpadding%3A0%2E5em%3Bmargin%3A0%3Bfont%2Dweight%3Anormal%3Bborder%2Dbottom%3A1px%20solid%20%23ddd%3Bbackground%2Dcolor%3A%23f3f3f3%7Ddiv%2Edt%2Dbutton%2Dinfo%3Ediv%7Bpadding%3A1em%7Ddiv%2Edt%2Dbutton%2Dcollection%2Dtitle%7Btext%2Dalign%3Acenter%3Bpadding%3A0%2E3em%200%200%2E5em%3Bfont%2Dsize%3A0%2E9em%7Ddiv%2Edt%2Dbutton%2Dcollection%2Dtitle%3Aempty%7Bdisplay%3Anone%7Dbutton%2Edt%2Dbutton%2Cdiv%2Edt%2Dbutton%2Ca%2Edt%2Dbutton%7Bposition%3Arelative%3Bdisplay%3Ainline%2Dblock%3Bbox%2Dsizing%3Aborder%2Dbox%3Bmargin%2Dright%3A0%2E333em%3Bmargin%2Dbottom%3A0%2E333em%3Bpadding%3A0%2E5em%201em%3Bborder%3A1px%20solid%20%23999%3Bborder%2Dradius%3A2px%3Bcursor%3Apointer%3Bfont%2Dsize%3A0%2E88em%3Bline%2Dheight%3A1%2E6em%3Bcolor%3Ablack%3Bwhite%2Dspace%3Anowrap%3Boverflow%3Ahidden%3Bbackground%2Dcolor%3A%23e9e9e9%3Bbackground%2Dimage%3A%2Dwebkit%2Dlinear%2Dgradient%28top%2C%20%23fff%200%25%2C%20%23e9e9e9%20100%25%29%3Bbackground%2Dimage%3A%2Dmoz%2Dlinear%2Dgradient%28top%2C%20%23fff%200%25%2C%20%23e9e9e9%20100%25%29%3Bbackground%2Dimage%3A%2Dms%2Dlinear%2Dgradient%28top%2C%20%23fff%200%25%2C%20%23e9e9e9%20100%25%29%3Bbackground%2Dimage%3A%2Do%2Dlinear%2Dgradient%28top%2C%20%23fff%200%25%2C%20%23e9e9e9%20100%25%29%3Bbackground%2Dimage%3Alinear%2Dgradient%28to%20bottom%2C%20%23fff%200%25%2C%20%23e9e9e9%20100%25%29%3Bfilter%3Aprogid%3ADXImageTransform%2EMicrosoft%2Egradient%28GradientType%3D0%2CStartColorStr%3D%27white%27%2C%20EndColorStr%3D%27%23e9e9e9%27%29%3B%2Dwebkit%2Duser%2Dselect%3Anone%3B%2Dmoz%2Duser%2Dselect%3Anone%3B%2Dms%2Duser%2Dselect%3Anone%3Buser%2Dselect%3Anone%3Btext%2Ddecoration%3Anone%3Boutline%3Anone%3Btext%2Doverflow%3Aellipsis%7Dbutton%2Edt%2Dbutton%2Edisabled%2Cdiv%2Edt%2Dbutton%2Edisabled%2Ca%2Edt%2Dbutton%2Edisabled%7Bcolor%3A%23999%3Bborder%3A1px%20solid%20%23d0d0d0%3Bcursor%3Adefault%3Bbackground%2Dcolor%3A%23f9f9f9%3Bbackground%2Dimage%3A%2Dwebkit%2Dlinear%2Dgradient%28top%2C%20%23fff%200%25%2C%20%23f9f9f9%20100%25%29%3Bbackground%2Dimage%3A%2Dmoz%2Dlinear%2Dgradient%28top%2C%20%23fff%200%25%2C%20%23f9f9f9%20100%25%29%3Bbackground%2Dimage%3A%2Dms%2Dlinear%2Dgradient%28top%2C%20%23fff%200%25%2C%20%23f9f9f9%20100%25%29%3Bbackground%2Dimage%3A%2Do%2Dlinear%2Dgradient%28top%2C%20%23fff%200%25%2C%20%23f9f9f9%20100%25%29%3Bbackground%2Dimage%3Alinear%2Dgradient%28to%20bottom%2C%20%23fff%200%25%2C%20%23f9f9f9%20100%25%29%3Bfilter%3Aprogid%3ADXImageTransform%2EMicrosoft%2Egradient%28GradientType%3D0%2CStartColorStr%3D%27%23ffffff%27%2C%20EndColorStr%3D%27%23f9f9f9%27%29%7Dbutton%2Edt%2Dbutton%3Aactive%3Anot%28%2Edisabled%29%2Cbutton%2Edt%2Dbutton%2Eactive%3Anot%28%2Edisabled%29%2Cdiv%2Edt%2Dbutton%3Aactive%3Anot%28%2Edisabled%29%2Cdiv%2Edt%2Dbutton%2Eactive%3Anot%28%2Edisabled%29%2Ca%2Edt%2Dbutton%3Aactive%3Anot%28%2Edisabled%29%2Ca%2Edt%2Dbutton%2Eactive%3Anot%28%2Edisabled%29%7Bbackground%2Dcolor%3A%23e2e2e2%3Bbackground%2Dimage%3A%2Dwebkit%2Dlinear%2Dgradient%28top%2C%20%23f3f3f3%200%25%2C%20%23e2e2e2%20100%25%29%3Bbackground%2Dimage%3A%2Dmoz%2Dlinear%2Dgradient%28top%2C%20%23f3f3f3%200%25%2C%20%23e2e2e2%20100%25%29%3Bbackground%2Dimage%3A%2
<script src="data:application/x-javascript;base64,LyohCiBCdXR0b25zIGZvciBEYXRhVGFibGVzIDEuNi4xCiDCqTIwMTYtMjAxOSBTcHJ5TWVkaWEgTHRkIC0gZGF0YXRhYmxlcy5uZXQvbGljZW5zZQoqLwooZnVuY3Rpb24oZCl7ImZ1bmN0aW9uIj09PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKFsianF1ZXJ5IiwiZGF0YXRhYmxlcy5uZXQiXSxmdW5jdGlvbih1KXtyZXR1cm4gZCh1LHdpbmRvdyxkb2N1bWVudCl9KToib2JqZWN0Ij09PXR5cGVvZiBleHBvcnRzP21vZHVsZS5leHBvcnRzPWZ1bmN0aW9uKHUsdCl7dXx8KHU9d2luZG93KTt0JiZ0LmZuLmRhdGFUYWJsZXx8KHQ9cmVxdWlyZSgiZGF0YXRhYmxlcy5uZXQiKSh1LHQpLiQpO3JldHVybiBkKHQsdSx1LmRvY3VtZW50KX06ZChqUXVlcnksd2luZG93LGRvY3VtZW50KX0pKGZ1bmN0aW9uKGQsdSx0LHApe2Z1bmN0aW9uIHkoYSl7YT1uZXcgbS5BcGkoYSk7dmFyIGI9YS5pbml0KCkuYnV0dG9uc3x8bS5kZWZhdWx0cy5idXR0b25zO3JldHVybihuZXcgbihhLGIpKS5jb250YWluZXIoKX12YXIgbT1kLmZuLmRhdGFUYWJsZSxCPTAsQz0wLHE9bS5leHQuYnV0dG9ucyxuPWZ1bmN0aW9uKGEsYil7aWYoISh0aGlzIGluc3RhbmNlb2YKbikpcmV0dXJuIGZ1bmN0aW9uKGIpe3JldHVybihuZXcgbihiLGEpKS5jb250YWluZXIoKX07InVuZGVmaW5lZCI9PT10eXBlb2YgYiYmKGI9e30pOyEwPT09YiYmKGI9e30pO2QuaXNBcnJheShiKSYmKGI9e2J1dHRvbnM6Yn0pO3RoaXMuYz1kLmV4dGVuZCghMCx7fSxuLmRlZmF1bHRzLGIpO2IuYnV0dG9ucyYmKHRoaXMuYy5idXR0b25zPWIuYnV0dG9ucyk7dGhpcy5zPXtkdDpuZXcgbS5BcGkoYSksYnV0dG9uczpbXSxsaXN0ZW5LZXlzOiIiLG5hbWVzcGFjZToiZHRiIitCKyt9O3RoaXMuZG9tPXtjb250YWluZXI6ZCgiPCIrdGhpcy5jLmRvbS5jb250YWluZXIudGFnKyIvPiIpLmFkZENsYXNzKHRoaXMuYy5kb20uY29udGFpbmVyLmNsYXNzTmFtZSl9O3RoaXMuX2NvbnN0cnVjdG9yKCl9O2QuZXh0ZW5kKG4ucHJvdG90eXBlLHthY3Rpb246ZnVuY3Rpb24oYSxiKXthPXRoaXMuX25vZGVUb0J1dHRvbihhKTtpZihiPT09cClyZXR1cm4gYS5jb25mLmFjdGlvbjthLmNvbmYuYWN0aW9uPQpiO3JldHVybiB0aGlzfSxhY3RpdmU6ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLl9ub2RlVG9CdXR0b24oYSk7YT10aGlzLmMuZG9tLmJ1dHRvbi5hY3RpdmU7Yz1kKGMubm9kZSk7aWYoYj09PXApcmV0dXJuIGMuaGFzQ2xhc3MoYSk7Yy50b2dnbGVDbGFzcyhhLGI9PT1wPyEwOmIpO3JldHVybiB0aGlzfSxhZGQ6ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLnMuYnV0dG9ucztpZigic3RyaW5nIj09PXR5cGVvZiBiKXtiPWIuc3BsaXQoIi0iKTt2YXIgZT10aGlzLnM7Yz0wO2Zvcih2YXIgZD1iLmxlbmd0aC0xO2M8ZDtjKyspZT1lLmJ1dHRvbnNbMSpiW2NdXTtjPWUuYnV0dG9ucztiPTEqYltiLmxlbmd0aC0xXX10aGlzLl9leHBhbmRCdXR0b24oYyxhLGUhPT1wLGIpO3RoaXMuX2RyYXcoKTtyZXR1cm4gdGhpc30sY29udGFpbmVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tLmNvbnRhaW5lcn0sZGlzYWJsZTpmdW5jdGlvbihhKXthPXRoaXMuX25vZGVUb0J1dHRvbihhKTtkKGEubm9kZSkuYWRkQ2xhc3ModGhpcy5jLmRvbS5idXR0b24uZGlzYWJsZWQpOwpyZXR1cm4gdGhpc30sZGVzdHJveTpmdW5jdGlvbigpe2QoImJvZHkiKS5vZmYoImtleXVwLiIrdGhpcy5zLm5hbWVzcGFjZSk7dmFyIGE9dGhpcy5zLmJ1dHRvbnMuc2xpY2UoKSxiO3ZhciBjPTA7Zm9yKGI9YS5sZW5ndGg7YzxiO2MrKyl0aGlzLnJlbW92ZShhW2NdLm5vZGUpO3RoaXMuZG9tLmNvbnRhaW5lci5yZW1vdmUoKTthPXRoaXMucy5kdC5zZXR0aW5ncygpWzBdO2M9MDtmb3IoYj1hLmxlbmd0aDtjPGI7YysrKWlmKGEuaW5zdD09PXRoaXMpe2Euc3BsaWNlKGMsMSk7YnJlYWt9cmV0dXJuIHRoaXN9LGVuYWJsZTpmdW5jdGlvbihhLGIpe2lmKCExPT09YilyZXR1cm4gdGhpcy5kaXNhYmxlKGEpO2E9dGhpcy5fbm9kZVRvQnV0dG9uKGEpO2QoYS5ub2RlKS5yZW1vdmVDbGFzcyh0aGlzLmMuZG9tLmJ1dHRvbi5kaXNhYmxlZCk7cmV0dXJuIHRoaXN9LG5hbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jLm5hbWV9LG5vZGU6ZnVuY3Rpb24oYSl7aWYoIWEpcmV0dXJuIHRoaXMuZG9tLmNvbnRhaW5lcjsKYT10aGlzLl9ub2RlVG9CdXR0b24oYSk7cmV0dXJuIGQoYS5ub2RlKX0scHJvY2Vzc2luZzpmdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMucy5kdCxlPXRoaXMuX25vZGVUb0J1dHRvbihhKTtpZihiPT09cClyZXR1cm4gZChlLm5vZGUpLmhhc0NsYXNzKCJwcm9jZXNzaW5nIik7ZChlLm5vZGUpLnRvZ2dsZUNsYXNzKCJwcm9jZXNzaW5nIixiKTtkKGMudGFibGUoKS5ub2RlKCkpLnRyaWdnZXJIYW5kbGVyKCJidXR0b25zLXByb2Nlc3NpbmcuZHQiLFtiLGMuYnV0dG9uKGEpLGMsZChhKSxlLmNvbmZdKTtyZXR1cm4gdGhpc30scmVtb3ZlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuX25vZGVUb0J1dHRvbihhKSxjPXRoaXMuX25vZGVUb0hvc3QoYSksZT10aGlzLnMuZHQ7aWYoYi5idXR0b25zLmxlbmd0aClmb3IodmFyIGc9Yi5idXR0b25zLmxlbmd0aC0xOzA8PWc7Zy0tKXRoaXMucmVtb3ZlKGIuYnV0dG9uc1tnXS5ub2RlKTtiLmNvbmYuZGVzdHJveSYmYi5jb25mLmRlc3Ryb3kuY2FsbChlLmJ1dHRvbihhKSwKZSxkKGEpLGIuY29uZik7dGhpcy5fcmVtb3ZlS2V5KGIuY29uZik7ZChiLm5vZGUpLnJlbW92ZSgpO2E9ZC5pbkFycmF5KGIsYyk7Yy5zcGxpY2UoYSwxKTtyZXR1cm4gdGhpc30sdGV4dDpmdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMuX25vZGVUb0J1dHRvbihhKTthPXRoaXMuYy5kb20uY29sbGVjdGlvbi5idXR0b25MaW5lcjthPWMuaW5Db2xsZWN0aW9uJiZhJiZhLnRhZz9hLnRhZzp0aGlzLmMuZG9tLmJ1dHRvbkxpbmVyLnRhZzt2YXIgZT10aGlzLnMuZHQsZz1kKGMubm9kZSksZj1mdW5jdGlvbihhKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIGE/YShlLGcsYy5jb25mKTphfTtpZihiPT09cClyZXR1cm4gZ
<script src="data:application/x-javascript;base64,LyohCiBGbGFzaCBleHBvcnQgYnV0dG9ucyBmb3IgQnV0dG9ucyBhbmQgRGF0YVRhYmxlcy4KIDIwMTUtMjAxNyBTcHJ5TWVkaWEgTHRkIC0gZGF0YXRhYmxlcy5uZXQvbGljZW5zZQoKIFplcm9DbGlwYmFvcmQgLSBNSVQgbGljZW5zZQogQ29weXJpZ2h0IChjKSAyMDEyIEpvc2VwaCBIdWNrYWJ5CiovCihmdW5jdGlvbihnKXsiZnVuY3Rpb24iPT09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoWyJqcXVlcnkiLCJkYXRhdGFibGVzLm5ldCIsImRhdGF0YWJsZXMubmV0LWJ1dHRvbnMiXSxmdW5jdGlvbihuKXtyZXR1cm4gZyhuLHdpbmRvdyxkb2N1bWVudCl9KToib2JqZWN0Ij09PXR5cGVvZiBleHBvcnRzP21vZHVsZS5leHBvcnRzPWZ1bmN0aW9uKG4sbSl7bnx8KG49d2luZG93KTttJiZtLmZuLmRhdGFUYWJsZXx8KG09cmVxdWlyZSgiZGF0YXRhYmxlcy5uZXQiKShuLG0pLiQpO20uZm4uZGF0YVRhYmxlLkJ1dHRvbnN8fHJlcXVpcmUoImRhdGF0YWJsZXMubmV0LWJ1dHRvbnMiKShuLG0pO3JldHVybiBnKG0sbixuLmRvY3VtZW50KX06ZyhqUXVlcnksd2luZG93LGRvY3VtZW50KX0pKGZ1bmN0aW9uKGcsbixtLHUpe2Z1bmN0aW9uIEEoYSl7Zm9yKHZhciBiPSIiOzA8PWE7KWI9U3RyaW5nLmZyb21DaGFyQ29kZShhJTI2KzY1KStiLGE9TWF0aC5mbG9vcihhLzI2KS0xOwpyZXR1cm4gYn1mdW5jdGlvbiByKGEsYixjKXt2YXIgZD1hLmNyZWF0ZUVsZW1lbnQoYik7YyYmKGMuYXR0ciYmZyhkKS5hdHRyKGMuYXR0ciksYy5jaGlsZHJlbiYmZy5lYWNoKGMuY2hpbGRyZW4sZnVuY3Rpb24oYSxiKXtkLmFwcGVuZENoaWxkKGIpfSksbnVsbCE9PWMudGV4dCYmYy50ZXh0IT09dSYmZC5hcHBlbmRDaGlsZChhLmNyZWF0ZVRleHROb2RlKGMudGV4dCkpKTtyZXR1cm4gZH1mdW5jdGlvbiBHKGEsYil7dmFyIGM9YS5oZWFkZXJbYl0ubGVuZ3RoO2EuZm9vdGVyJiZhLmZvb3RlcltiXS5sZW5ndGg+YyYmKGM9YS5mb290ZXJbYl0ubGVuZ3RoKTtmb3IodmFyIGQ9MCxmPWEuYm9keS5sZW5ndGg7ZDxmO2QrKyl7dmFyIGU9YS5ib2R5W2RdW2JdO2U9bnVsbCE9PWUmJmUhPT11P2UudG9TdHJpbmcoKToiIjstMSE9PWUuaW5kZXhPZigiXG4iKT8oZT1lLnNwbGl0KCJcbiIpLGUuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBiLmxlbmd0aC1hLmxlbmd0aH0pLGU9ZVswXS5sZW5ndGgpOgplPWUubGVuZ3RoO2U+YyYmKGM9ZSk7aWYoNDA8YylyZXR1cm4gNTJ9Yyo9MS4zO3JldHVybiA2PGM/Yzo2fWZ1bmN0aW9uIEIoYSl7dj09PXUmJih2PS0xPT09ei5zZXJpYWxpemVUb1N0cmluZyhnLnBhcnNlWE1MKHRbInhsL3dvcmtzaGVldHMvc2hlZXQxLnhtbCJdKSkuaW5kZXhPZigieG1sbnM6ciIpKTtnLmVhY2goYSxmdW5jdGlvbihiLGMpe2lmKGcuaXNQbGFpbk9iamVjdChjKSlCKGMpO2Vsc2V7aWYodil7dmFyIGQ9Yy5jaGlsZE5vZGVzWzBdLGYsZT1bXTtmb3IoZj1kLmF0dHJpYnV0ZXMubGVuZ3RoLTE7MDw9ZjtmLS0pe3ZhciBoPWQuYXR0cmlidXRlc1tmXS5ub2RlTmFtZTt2YXIgaz1kLmF0dHJpYnV0ZXNbZl0ubm9kZVZhbHVlOy0xIT09aC5pbmRleE9mKCI6IikmJihlLnB1c2goe25hbWU6aCx2YWx1ZTprfSksZC5yZW1vdmVBdHRyaWJ1dGUoaCkpfWY9MDtmb3IoaD1lLmxlbmd0aDtmPGg7ZisrKWs9Yy5jcmVhdGVBdHRyaWJ1dGUoZVtmXS5uYW1lLnJlcGxhY2UoIjoiLAoiX2R0X2JfbmFtZXNwYWNlX3Rva2VuXyIpKSxrLnZhbHVlPWVbZl0udmFsdWUsZC5zZXRBdHRyaWJ1dGVOb2RlKGspfWM9ei5zZXJpYWxpemVUb1N0cmluZyhjKTt2JiYoLTE9PT1jLmluZGV4T2YoIjw/eG1sIikmJihjPSc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ieWVzIj8+JytjKSxjPWMucmVwbGFjZSgvX2R0X2JfbmFtZXNwYWNlX3Rva2VuXy9nLCI6IikpO2M9Yy5yZXBsYWNlKC88KFtePD5dKj8pIHhtbG5zPSIiKFtePD5dKj8pPi9nLCI8JDEgJDI+Iik7YVtiXT1jfX0pfXZhciBsPWcuZm4uZGF0YVRhYmxlLGg9e3ZlcnNpb246IjEuMC40LVRhYmxlVG9vbHMyIixjbGllbnRzOnt9LG1vdmllUGF0aDoiIixuZXh0SWQ6MSwkOmZ1bmN0aW9uKGEpeyJzdHJpbmciPT10eXBlb2YgYSYmKGE9bS5nZXRFbGVtZW50QnlJZChhKSk7YS5hZGRDbGFzc3x8KGEuaGlkZT1mdW5jdGlvbigpe3RoaXMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LGEuc2hvdz0KZnVuY3Rpb24oKXt0aGlzLnN0eWxlLmRpc3BsYXk9IiJ9LGEuYWRkQ2xhc3M9ZnVuY3Rpb24oYSl7dGhpcy5yZW1vdmVDbGFzcyhhKTt0aGlzLmNsYXNzTmFtZSs9IiAiK2F9LGEucmVtb3ZlQ2xhc3M9ZnVuY3Rpb24oYSl7dGhpcy5jbGFzc05hbWU9dGhpcy5jbGFzc05hbWUucmVwbGFjZShuZXcgUmVnRXhwKCJcXHMqIithKyJcXHMqIiksIiAiKS5yZXBsYWNlKC9eXHMrLywiIikucmVwbGFjZSgvXHMrJC8sIiIpfSxhLmhhc0NsYXNzPWZ1bmN0aW9uKGEpe3JldHVybiEhdGhpcy5jbGFzc05hbWUubWF0Y2gobmV3IFJlZ0V4cCgiXFxzKiIrYSsiXFxzKiIpKX0pO3JldHVybiBhfSxzZXRNb3ZpZVBhdGg6ZnVuY3Rpb24oYSl7dGhpcy5tb3ZpZVBhdGg9YX0sZGlzcGF0Y2g6ZnVuY3Rpb24oYSxiLGMpeyhhPXRoaXMuY2xpZW50c1thXSkmJmEucmVjZWl2ZUV2ZW50KGIsYyl9LGxvZzpmdW5jdGlvbihhKXtjb25zb2xlLmxvZygiRmxhc2g6ICIrYSl9LHJlZ2lzdGVyOmZ1bmN0aW9uKGEsCmIpe3RoaXMuY2xpZW50c1thXT1ifSxnZXRET01PYmplY3RQb3NpdGlvbjpmdW5jdGlvbihhKXt2YXIgYj17bGVmdDowLHRvcDowLHdpZHRoOmEud2lkdGg/YS53aWR0aDphLm9mZnNldFdpZHRoLGhlaWdodDphLmhlaWdodD9hLmhlaWdodDphLm9mZnNldEhlaWdodH07IiIhPT1hLnN0eWxlLndpZHRoJiYoYi53aWR0aD1hLnN0eWxlLndpZHRoLnJlcGxhY2UoInB4IiwiIikpOyIiIT09YS5zdHlsZS5oZWlnaHQmJihiLmhlaWdodD1hLnN0eWxlLmhlaWdodC5yZXBsYWNlKCJweCIsIiIpKTtmb3IoO2E7KWIubGVmdCs9YS5vZmZzZXRMZWZ0LGIudG9wKz1hLm9mZnNldFRvcCxhPWEub2Zmc2V0UGFyZ
<script src="data:application/x-javascript;base64,LyohCiBIVE1MNSBleHBvcnQgYnV0dG9ucyBmb3IgQnV0dG9ucyBhbmQgRGF0YVRhYmxlcy4KIDIwMTYgU3ByeU1lZGlhIEx0ZCAtIGRhdGF0YWJsZXMubmV0L2xpY2Vuc2UKCiBGaWxlU2F2ZXIuanMgKDEuMy4zKSAtIE1JVCBsaWNlbnNlCiBDb3B5cmlnaHQgwqkgMjAxNiBFbGkgR3JleSAtIGh0dHA6Ly9lbGlncmV5LmNvbQoqLwooZnVuY3Rpb24oZil7ImZ1bmN0aW9uIj09PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKFsianF1ZXJ5IiwiZGF0YXRhYmxlcy5uZXQiLCJkYXRhdGFibGVzLm5ldC1idXR0b25zIl0sZnVuY3Rpb24oZyl7cmV0dXJuIGYoZyx3aW5kb3csZG9jdW1lbnQpfSk6Im9iamVjdCI9PT10eXBlb2YgZXhwb3J0cz9tb2R1bGUuZXhwb3J0cz1mdW5jdGlvbihnLHAseix0KXtnfHwoZz13aW5kb3cpO3AmJnAuZm4uZGF0YVRhYmxlfHwocD1yZXF1aXJlKCJkYXRhdGFibGVzLm5ldCIpKGcscCkuJCk7cC5mbi5kYXRhVGFibGUuQnV0dG9uc3x8cmVxdWlyZSgiZGF0YXRhYmxlcy5uZXQtYnV0dG9ucyIpKGcscCk7cmV0dXJuIGYocCxnLGcuZG9jdW1lbnQseix0KX06ZihqUXVlcnksd2luZG93LGRvY3VtZW50KX0pKGZ1bmN0aW9uKGYsZyxwLHosdCx3KXtmdW5jdGlvbiBBKGEpe2Zvcih2YXIgYj0iIjswPD1hOyliPVN0cmluZy5mcm9tQ2hhckNvZGUoYSUyNis2NSkrYixhPU1hdGguZmxvb3IoYS8KMjYpLTE7cmV0dXJuIGJ9ZnVuY3Rpb24gRShhLGIpe3k9PT13JiYoeT0tMT09PUMuc2VyaWFsaXplVG9TdHJpbmcoZi5wYXJzZVhNTChGWyJ4bC93b3Jrc2hlZXRzL3NoZWV0MS54bWwiXSkpLmluZGV4T2YoInhtbG5zOnIiKSk7Zi5lYWNoKGIsZnVuY3Rpb24oYixjKXtpZihmLmlzUGxhaW5PYmplY3QoYykpYj1hLmZvbGRlcihiKSxFKGIsYyk7ZWxzZXtpZih5KXt2YXIgZD1jLmNoaWxkTm9kZXNbMF0sZSxoPVtdO2ZvcihlPWQuYXR0cmlidXRlcy5sZW5ndGgtMTswPD1lO2UtLSl7dmFyIG09ZC5hdHRyaWJ1dGVzW2VdLm5vZGVOYW1lO3ZhciBrPWQuYXR0cmlidXRlc1tlXS5ub2RlVmFsdWU7LTEhPT1tLmluZGV4T2YoIjoiKSYmKGgucHVzaCh7bmFtZTptLHZhbHVlOmt9KSxkLnJlbW92ZUF0dHJpYnV0ZShtKSl9ZT0wO2ZvcihtPWgubGVuZ3RoO2U8bTtlKyspaz1jLmNyZWF0ZUF0dHJpYnV0ZShoW2VdLm5hbWUucmVwbGFjZSgiOiIsIl9kdF9iX25hbWVzcGFjZV90b2tlbl8iKSksCmsudmFsdWU9aFtlXS52YWx1ZSxkLnNldEF0dHJpYnV0ZU5vZGUoayl9Yz1DLnNlcmlhbGl6ZVRvU3RyaW5nKGMpO3kmJigtMT09PWMuaW5kZXhPZigiPD94bWwiKSYmKGM9Jzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4nK2MpLGM9Yy5yZXBsYWNlKC9fZHRfYl9uYW1lc3BhY2VfdG9rZW5fL2csIjoiKSxjPWMucmVwbGFjZSgveG1sbnM6TlNbXGRdKz0iIiBOU1tcZF0rOi9nLCIiKSk7Yz1jLnJlcGxhY2UoLzwoW148Pl0qPykgeG1sbnM9IiIoW148Pl0qPyk+L2csIjwkMSAkMj4iKTthLmZpbGUoYixjKX19KX1mdW5jdGlvbiByKGEsYixkKXt2YXIgYz1hLmNyZWF0ZUVsZW1lbnQoYik7ZCYmKGQuYXR0ciYmZihjKS5hdHRyKGQuYXR0ciksZC5jaGlsZHJlbiYmZi5lYWNoKGQuY2hpbGRyZW4sZnVuY3Rpb24oYSxiKXtjLmFwcGVuZENoaWxkKGIpfSksbnVsbCE9PWQudGV4dCYmZC50ZXh0IT09dyYmYy5hcHBlbmRDaGlsZChhLmNyZWF0ZVRleHROb2RlKGQudGV4dCkpKTsKcmV0dXJuIGN9ZnVuY3Rpb24gTChhLGIpe3ZhciBkPWEuaGVhZGVyW2JdLmxlbmd0aDthLmZvb3RlciYmYS5mb290ZXJbYl0ubGVuZ3RoPmQmJihkPWEuZm9vdGVyW2JdLmxlbmd0aCk7Zm9yKHZhciBjPTAsZj1hLmJvZHkubGVuZ3RoO2M8ZjtjKyspe3ZhciBlPWEuYm9keVtjXVtiXTtlPW51bGwhPT1lJiZlIT09dz9lLnRvU3RyaW5nKCk6IiI7LTEhPT1lLmluZGV4T2YoIlxuIik/KGU9ZS5zcGxpdCgiXG4iKSxlLnNvcnQoZnVuY3Rpb24oYSxjKXtyZXR1cm4gYy5sZW5ndGgtYS5sZW5ndGh9KSxlPWVbMF0ubGVuZ3RoKTplPWUubGVuZ3RoO2U+ZCYmKGQ9ZSk7aWYoNDA8ZClyZXR1cm4gNTR9ZCo9MS4zNTtyZXR1cm4gNjxkP2Q6Nn12YXIgdj1mLmZuLmRhdGFUYWJsZTt2LkJ1dHRvbnMucGRmTWFrZT1mdW5jdGlvbihhKXtpZighYSlyZXR1cm4gdHx8Zy5wZGZNYWtlO3Q9bV9ha2V9O3YuQnV0dG9ucy5qc3ppcD1mdW5jdGlvbihhKXtpZighYSlyZXR1cm4genx8Zy5KU1ppcDt6PWF9Owp2YXIgQj1mdW5jdGlvbihhKXtpZighKCJ1bmRlZmluZWQiPT09dHlwZW9mIGF8fCJ1bmRlZmluZWQiIT09dHlwZW9mIG5hdmlnYXRvciYmL01TSUUgWzEtOV1cLi8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSkpe3ZhciBiPWEuZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiwiYSIpLGQ9ImRvd25sb2FkImluIGIsYz0vY29uc3RydWN0b3IvaS50ZXN0KGEuSFRNTEVsZW1lbnQpfHxhLnNhZmFyaSxmPS9DcmlPU1wvW1xkXSsvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCksZT1mdW5jdGlvbihjKXsoYS5zZXRJbW1lZGlhdGV8fGEuc2V0VGltZW91dCkoZnVuY3Rpb24oKXt0aHJvdyBjO30sMCl9LGg9ZnVuY3Rpb24oYyl7c2V0VGltZW91dChmdW5jdGlvbigpeyJzdHJpbmciPT09dHlwZW9mIGM/KGEuVVJMfHxhLndlYmtpdFVSTHx8YSkucmV2b2tlT2JqZWN0VVJMKGMpOmMucmVtb3ZlKCl9LDRFNCl9LG09ZnVuY3Rpb24oYSl7cmV0dXJuL15ccyooPzp0ZXh0XC9cUyp8YXBwbGljYXRpb25cL3htbHxcUypcL1xTKlwreG1sKVxzKjsuKmNoYXJzZXRccyo9XHMqdXRmLTgvaS50ZXN0KGEudHlwZSk/Cm5ldyBCbG9iKFtTdHJpbmcuZnJvbUNoYXJDb2RlKDY1Mjc5KSxhXSx7dHlwZTphLnR5cGV9KTphfSxrPWZ1bmN0aW9uKGsscSxuKXtufHwoaz1tKGspKTt2YXIgbD10aGlzLGc9ImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSI9PT1rLnR5cGUsRD1mdW5jdGlvbigpe3ZhciBhPVsid3JpdGVzdGFydCIsInByb2dyZXNzIiwid3JpdGUiLCJ3cml0ZWVuZCJdO2E9W10uY29uY2F0K
<script src="data:application/x-javascript;base64,LyohCiBDb2x1bW4gdmlzaWJpbGl0eSBidXR0b25zIGZvciBCdXR0b25zIGFuZCBEYXRhVGFibGVzLgogMjAxNiBTcHJ5TWVkaWEgTHRkIC0gZGF0YXRhYmxlcy5uZXQvbGljZW5zZQoqLwooZnVuY3Rpb24oZil7ImZ1bmN0aW9uIj09PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKFsianF1ZXJ5IiwiZGF0YXRhYmxlcy5uZXQiLCJkYXRhdGFibGVzLm5ldC1idXR0b25zIl0sZnVuY3Rpb24oYyl7cmV0dXJuIGYoYyx3aW5kb3csZG9jdW1lbnQpfSk6Im9iamVjdCI9PT10eXBlb2YgZXhwb3J0cz9tb2R1bGUuZXhwb3J0cz1mdW5jdGlvbihjLGUpe2N8fChjPXdpbmRvdyk7ZSYmZS5mbi5kYXRhVGFibGV8fChlPXJlcXVpcmUoImRhdGF0YWJsZXMubmV0IikoYyxlKS4kKTtlLmZuLmRhdGFUYWJsZS5CdXR0b25zfHxyZXF1aXJlKCJkYXRhdGFibGVzLm5ldC1idXR0b25zIikoYyxlKTtyZXR1cm4gZihlLGMsYy5kb2N1bWVudCl9OmYoalF1ZXJ5LHdpbmRvdyxkb2N1bWVudCl9KShmdW5jdGlvbihmLGMsZSxoKXtjPWYuZm4uZGF0YVRhYmxlO2YuZXh0ZW5kKGMuZXh0LmJ1dHRvbnMse2NvbHZpczpmdW5jdGlvbihhLGIpe3JldHVybntleHRlbmQ6ImNvbGxlY3Rpb24iLAp0ZXh0OmZ1bmN0aW9uKGIpe3JldHVybiBiLmkxOG4oImJ1dHRvbnMuY29sdmlzIiwiQ29sdW1uIHZpc2liaWxpdHkiKX0sY2xhc3NOYW1lOiJidXR0b25zLWNvbHZpcyIsYnV0dG9uczpbe2V4dGVuZDoiY29sdW1uc1RvZ2dsZSIsY29sdW1uczpiLmNvbHVtbnMsY29sdW1uVGV4dDpiLmNvbHVtblRleHR9XX19LGNvbHVtbnNUb2dnbGU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5jb2x1bW5zKGIuY29sdW1ucykuaW5kZXhlcygpLm1hcChmdW5jdGlvbihhKXtyZXR1cm57ZXh0ZW5kOiJjb2x1bW5Ub2dnbGUiLGNvbHVtbnM6YSxjb2x1bW5UZXh0OmIuY29sdW1uVGV4dH19KS50b0FycmF5KCl9LGNvbHVtblRvZ2dsZTpmdW5jdGlvbihhLGIpe3JldHVybntleHRlbmQ6ImNvbHVtblZpc2liaWxpdHkiLGNvbHVtbnM6Yi5jb2x1bW5zLGNvbHVtblRleHQ6Yi5jb2x1bW5UZXh0fX0sY29sdW1uc1Zpc2liaWxpdHk6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5jb2x1bW5zKGIuY29sdW1ucykuaW5kZXhlcygpLm1hcChmdW5jdGlvbihhKXtyZXR1cm57ZXh0ZW5kOiJjb2x1bW5WaXNpYmlsaXR5IiwKY29sdW1uczphLHZpc2liaWxpdHk6Yi52aXNpYmlsaXR5LGNvbHVtblRleHQ6Yi5jb2x1bW5UZXh0fX0pLnRvQXJyYXkoKX0sY29sdW1uVmlzaWJpbGl0eTp7Y29sdW1uczpoLHRleHQ6ZnVuY3Rpb24oYSxiLGQpe3JldHVybiBkLl9jb2x1bW5UZXh0KGEsZCl9LGNsYXNzTmFtZToiYnV0dG9ucy1jb2x1bW5WaXNpYmlsaXR5IixhY3Rpb246ZnVuY3Rpb24oYSxiLGQsZyl7YT1iLmNvbHVtbnMoZy5jb2x1bW5zKTtiPWEudmlzaWJsZSgpO2EudmlzaWJsZShnLnZpc2liaWxpdHkhPT1oP2cudmlzaWJpbGl0eTohKGIubGVuZ3RoJiZiWzBdKSl9LGluaXQ6ZnVuY3Rpb24oYSxiLGQpe3ZhciBnPXRoaXM7Yi5hdHRyKCJkYXRhLWN2LWlkeCIsZC5jb2x1bW5zKTthLm9uKCJjb2x1bW4tdmlzaWJpbGl0eS5kdCIrZC5uYW1lc3BhY2UsZnVuY3Rpb24oYixjKXtjLmJEZXN0cm95aW5nfHxjLm5UYWJsZSE9YS5zZXR0aW5ncygpWzBdLm5UYWJsZXx8Zy5hY3RpdmUoYS5jb2x1bW4oZC5jb2x1bW5zKS52aXNpYmxlKCkpfSkub24oImNvbHVtbi1yZW9yZGVyLmR0IisKZC5uYW1lc3BhY2UsZnVuY3Rpb24oYyxlLGYpezE9PT1hLmNvbHVtbnMoZC5jb2x1bW5zKS5jb3VudCgpJiYoYi50ZXh0KGQuX2NvbHVtblRleHQoYSxkKSksZy5hY3RpdmUoYS5jb2x1bW4oZC5jb2x1bW5zKS52aXNpYmxlKCkpKX0pO3RoaXMuYWN0aXZlKGEuY29sdW1uKGQuY29sdW1ucykudmlzaWJsZSgpKX0sZGVzdHJveTpmdW5jdGlvbihhLGIsZCl7YS5vZmYoImNvbHVtbi12aXNpYmlsaXR5LmR0IitkLm5hbWVzcGFjZSkub2ZmKCJjb2x1bW4tcmVvcmRlci5kdCIrZC5uYW1lc3BhY2UpfSxfY29sdW1uVGV4dDpmdW5jdGlvbihhLGIpe3ZhciBkPWEuY29sdW1uKGIuY29sdW1ucykuaW5kZXgoKSxjPWEuc2V0dGluZ3MoKVswXS5hb0NvbHVtbnNbZF0uc1RpdGxlLnJlcGxhY2UoL1xuL2csIiAiKS5yZXBsYWNlKC88YnJccypcLz8+L2dpLCIgIikucmVwbGFjZSgvPHNlbGVjdCguKj8pPFwvc2VsZWN0Pi9nLCIiKS5yZXBsYWNlKC88IVwtXC0uKj9cLVwtPi9nLCIiKS5yZXBsYWNlKC88Lio/Pi9nLAoiIikucmVwbGFjZSgvXlxzK3xccyskL2csIiIpO3JldHVybiBiLmNvbHVtblRleHQ/Yi5jb2x1bW5UZXh0KGEsZCxjKTpjfX0sY29sdmlzUmVzdG9yZTp7Y2xhc3NOYW1lOiJidXR0b25zLWNvbHZpc1Jlc3RvcmUiLHRleHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaTE4bigiYnV0dG9ucy5jb2x2aXNSZXN0b3JlIiwiUmVzdG9yZSB2aXNpYmlsaXR5Iil9LGluaXQ6ZnVuY3Rpb24oYSxiLGQpe2QuX3Zpc09yaWdpbmFsPWEuY29sdW1ucygpLmluZGV4ZXMoKS5tYXAoZnVuY3Rpb24oYil7cmV0dXJuIGEuY29sdW1uKGIpLnZpc2libGUoKX0pLnRvQXJyYXkoKX0sYWN0aW9uOmZ1bmN0aW9uKGEsYixkLGMpe2IuY29sdW1ucygpLmV2ZXJ5KGZ1bmN0aW9uKGEpe2E9Yi5jb2xSZW9yZGVyJiZiLmNvbFJlb3JkZXIudHJhbnNwb3NlP2IuY29sUmVvcmRlci50cmFuc3Bvc2UoYSwidG9PcmlnaW5hbCIpOmE7dGhpcy52aXNpYmxlKGMuX3Zpc09yaWdpbmFsW2FdKX0pfX0sY29sdmlzR3JvdXA6e2NsYXNzTmFtZToiYnV0dG9ucy1jb2x2aXNHcm91cCIsCmFjdGlvbjpmdW5jdGlvbihhLGIsZCxjKXtiLmNvbHVtbnMoYy5zaG93KS52aXNpYmxlKCEwLCExKTtiLmNvbHVtbnMoYy5oaWRlKS52aXNpYmxlKCExLCExKTtiLmNvbHVtbnMuYWRqdXN0KCl9LHNob3c6W10saGlkZTpbXX19KTtyZXR1cm4gYy5CdXR0b25zfSk7Cg=="></script>
<script src="data:application/x-javascript;base64,LyohCiBQcmludCBidXR0b24gZm9yIEJ1dHRvbnMgYW5kIERhdGFUYWJsZXMuCiAyMDE2IFNwcnlNZWRpYSBMdGQgLSBkYXRhdGFibGVzLm5ldC9saWNlbnNlCiovCihmdW5jdGlvbihjKXsiZnVuY3Rpb24iPT09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoWyJqcXVlcnkiLCJkYXRhdGFibGVzLm5ldCIsImRhdGF0YWJsZXMubmV0LWJ1dHRvbnMiXSxmdW5jdGlvbihlKXtyZXR1cm4gYyhlLHdpbmRvdyxkb2N1bWVudCl9KToib2JqZWN0Ij09PXR5cGVvZiBleHBvcnRzP21vZHVsZS5leHBvcnRzPWZ1bmN0aW9uKGUsYSl7ZXx8KGU9d2luZG93KTthJiZhLmZuLmRhdGFUYWJsZXx8KGE9cmVxdWlyZSgiZGF0YXRhYmxlcy5uZXQiKShlLGEpLiQpO2EuZm4uZGF0YVRhYmxlLkJ1dHRvbnN8fHJlcXVpcmUoImRhdGF0YWJsZXMubmV0LWJ1dHRvbnMiKShlLGEpO3JldHVybiBjKGEsZSxlLmRvY3VtZW50KX06YyhqUXVlcnksd2luZG93LGRvY3VtZW50KX0pKGZ1bmN0aW9uKGMsZSxhLHEpe3ZhciBrPWMuZm4uZGF0YVRhYmxlLGQ9YS5jcmVhdGVFbGVtZW50KCJhIikscD1mdW5jdGlvbihiKXtkLmhyZWY9YjtiPWQuaG9zdDstMT09PWIuaW5kZXhPZigiLyIpJiYKMCE9PWQucGF0aG5hbWUuaW5kZXhPZigiLyIpJiYoYis9Ii8iKTtyZXR1cm4gZC5wcm90b2NvbCsiLy8iK2IrZC5wYXRobmFtZStkLnNlYXJjaH07ay5leHQuYnV0dG9ucy5wcmludD17Y2xhc3NOYW1lOiJidXR0b25zLXByaW50Iix0ZXh0OmZ1bmN0aW9uKGIpe3JldHVybiBiLmkxOG4oImJ1dHRvbnMucHJpbnQiLCJQcmludCIpfSxhY3Rpb246ZnVuY3Rpb24oYixhLGQsZyl7Yj1hLmJ1dHRvbnMuZXhwb3J0RGF0YShjLmV4dGVuZCh7ZGVjb2RlRW50aXRpZXM6ITF9LGcuZXhwb3J0T3B0aW9ucykpO2Q9YS5idXR0b25zLmV4cG9ydEluZm8oZyk7dmFyIGs9YS5jb2x1bW5zKGcuZXhwb3J0T3B0aW9ucy5jb2x1bW5zKS5mbGF0dGVuKCkubWFwKGZ1bmN0aW9uKGIpe3JldHVybiBhLnNldHRpbmdzKClbMF0uYW9Db2x1bW5zW2EuY29sdW1uKGIpLmluZGV4KCldLnNDbGFzc30pLnRvQXJyYXkoKSxtPWZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBkPSI8dHI+IixjPTAsZT1iLmxlbmd0aDtjPGU7YysrKWQrPQoiPCIrYSsiICIrKGtbY10/J2NsYXNzPSInK2tbY10rJyInOiIiKSsiPiIrKG51bGw9PT1iW2NdfHxiW2NdPT09cT8iIjpiW2NdKSsiPC8iK2ErIj4iO3JldHVybiBkKyI8L3RyPiJ9LGg9Jzx0YWJsZSBjbGFzcz0iJythLnRhYmxlKCkubm9kZSgpLmNsYXNzTmFtZSsnIj4nO2cuaGVhZGVyJiYoaCs9Ijx0aGVhZD4iK20oYi5oZWFkZXIsInRoIikrIjwvdGhlYWQ+Iik7aCs9Ijx0Ym9keT4iO2Zvcih2YXIgbj0wLHI9Yi5ib2R5Lmxlbmd0aDtuPHI7bisrKWgrPW0oYi5ib2R5W25dLCJ0ZCIpO2grPSI8L3Rib2R5PiI7Zy5mb290ZXImJmIuZm9vdGVyJiYoaCs9Ijx0Zm9vdD4iK20oYi5mb290ZXIsInRoIikrIjwvdGZvb3Q+Iik7aCs9IjwvdGFibGU+Ijt2YXIgZj1lLm9wZW4oIiIsIiIpO2YuZG9jdW1lbnQuY2xvc2UoKTt2YXIgbD0iPHRpdGxlPiIrZC50aXRsZSsiPC90aXRsZT4iO2MoInN0eWxlLCBsaW5rIikuZWFjaChmdW5jdGlvbigpe3ZhciBiPWwsYT1jKHRoaXMpLmNsb25lKClbMF07CiJsaW5rIj09PWEubm9kZU5hbWUudG9Mb3dlckNhc2UoKSYmKGEuaHJlZj1wKGEuaHJlZikpO2w9YithLm91dGVySFRNTH0pO3RyeXtmLmRvY3VtZW50LmhlYWQuaW5uZXJIVE1MPWx9Y2F0Y2godCl7YyhmLmRvY3VtZW50LmhlYWQpLmh0bWwobCl9Zi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGgxPiIrZC50aXRsZSsiPC9oMT48ZGl2PiIrKGQubWVzc2FnZVRvcHx8IiIpKyI8L2Rpdj4iK2grIjxkaXY+IisoZC5tZXNzYWdlQm90dG9tfHwiIikrIjwvZGl2PiI7YyhmLmRvY3VtZW50LmJvZHkpLmFkZENsYXNzKCJkdC1wcmludC12aWV3Iik7YygiaW1nIixmLmRvY3VtZW50LmJvZHkpLmVhY2goZnVuY3Rpb24oYixhKXthLnNldEF0dHJpYnV0ZSgic3JjIixwKGEuZ2V0QXR0cmlidXRlKCJzcmMiKSkpfSk7Zy5jdXN0b21pemUmJmcuY3VzdG9taXplKGYsZyxhKTtiPWZ1bmN0aW9uKCl7Zy5hdXRvUHJpbnQmJihmLnByaW50KCksZi5jbG9zZSgpKX07bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvVHJpZGVudFwvXGQuXGQvKT8KYigpOmYuc2V0VGltZW91dChiLDFFMyl9LHRpdGxlOiIqIixtZXNzYWdlVG9wOiIqIixtZXNzYWdlQm90dG9tOiIqIixleHBvcnRPcHRpb25zOnt9LGhlYWRlcjohMCxmb290ZXI6ITEsYXV0b1ByaW50OiEwLGN1c3RvbWl6ZTpudWxsfTtyZXR1cm4gay5CdXR0b25zfSk7Cg=="></script>
<link href="data:text/css;charset=utf-8,table%2EDTFC%5FCloned%20thead%2Ctable%2EDTFC%5FCloned%20tfoot%7Bbackground%2Dcolor%3Awhite%7Ddiv%2EDTFC%5FBlocker%7Bbackground%2Dcolor%3Awhite%7Ddiv%2EDTFC%5FLeftWrapper%20table%2EdataTable%2Cdiv%2EDTFC%5FRightWrapper%20table%2EdataTable%7Bmargin%2Dbottom%3A0%3Bz%2Dindex%3A2%7Ddiv%2EDTFC%5FLeftWrapper%20table%2EdataTable%2Eno%2Dfooter%2Cdiv%2EDTFC%5FRightWrapper%20table%2EdataTable%2Eno%2Dfooter%7Bborder%2Dbottom%3Anone%7D%0A" rel="stylesheet" />
<script src="data:application/x-javascript;base64,LyohCiAgIENvcHlyaWdodCAyMDEwLTIwMTggU3ByeU1lZGlhIEx0ZC4KCiBUaGlzIHNvdXJjZSBmaWxlIGlzIGZyZWUgc29mdHdhcmUsIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIGxpY2Vuc2U6CiAgIE1JVCBsaWNlbnNlIC0gaHR0cDovL2RhdGF0YWJsZXMubmV0L2xpY2Vuc2UvbWl0CgogVGhpcyBzb3VyY2UgZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCiBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBsaWNlbnNlIGZpbGVzIGZvciBkZXRhaWxzLgoKIEZvciBkZXRhaWxzIHBsZWFzZSByZWZlciB0bzogaHR0cDovL3d3dy5kYXRhdGFibGVzLm5ldAogRml4ZWRDb2x1bW5zIDMuMy4wCiDCqTIwMTAtMjAxOCBTcHJ5TWVkaWEgTHRkIC0gZGF0YXRhYmxlcy5uZXQvbGljZW5zZQoqLwp2YXIgJGpzY29tcD0kanNjb21wfHx7fTskanNjb21wLnNjb3BlPXt9OyRqc2NvbXAuZmluZEludGVybmFsPWZ1bmN0aW9uKGMsZyxlKXtjIGluc3RhbmNlb2YgU3RyaW5nJiYoYz1TdHJpbmcoYykpO2Zvcih2YXIgcT1jLmxlbmd0aCxsPTA7bDxxO2wrKyl7dmFyIHU9Y1tsXTtpZihnLmNhbGwoZSx1LGwsYykpcmV0dXJue2k6bCx2OnV9fXJldHVybntpOi0xLHY6dm9pZCAwfX07JGpzY29tcC5BU1NVTUVfRVM1PSExOyRqc2NvbXAuQVNTVU1FX05PX05BVElWRV9NQVA9ITE7JGpzY29tcC5BU1NVTUVfTk9fTkFUSVZFX1NFVD0hMTskanNjb21wLlNJTVBMRV9GUk9VTkRfUE9MWUZJTEw9ITE7CiRqc2NvbXAuZGVmaW5lUHJvcGVydHk9JGpzY29tcC5BU1NVTUVfRVM1fHwiZnVuY3Rpb24iPT10eXBlb2YgT2JqZWN0LmRlZmluZVByb3BlcnRpZXM/T2JqZWN0LmRlZmluZVByb3BlcnR5OmZ1bmN0aW9uKGMsZyxlKXtjIT1BcnJheS5wcm90b3R5cGUmJmMhPU9iamVjdC5wcm90b3R5cGUmJihjW2ddPWUudmFsdWUpfTskanNjb21wLmdldEdsb2JhbD1mdW5jdGlvbihjKXtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyYmd2luZG93PT09Yz9jOiJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsJiZudWxsIT1nbG9iYWw/Z2xvYmFsOmN9OyRqc2NvbXAuZ2xvYmFsPSRqc2NvbXAuZ2V0R2xvYmFsKHRoaXMpOwokanNjb21wLnBvbHlmaWxsPWZ1bmN0aW9uKGMsZyxlLHEpe2lmKGcpe2U9JGpzY29tcC5nbG9iYWw7Yz1jLnNwbGl0KCIuIik7Zm9yKHE9MDtxPGMubGVuZ3RoLTE7cSsrKXt2YXIgbD1jW3FdO2wgaW4gZXx8KGVbbF09e30pO2U9ZVtsXX1jPWNbYy5sZW5ndGgtMV07cT1lW2NdO2c9ZyhxKTtnIT1xJiZudWxsIT1nJiYkanNjb21wLmRlZmluZVByb3BlcnR5KGUsYyx7Y29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmd9KX19OyRqc2NvbXAucG9seWZpbGwoIkFycmF5LnByb3RvdHlwZS5maW5kIixmdW5jdGlvbihjKXtyZXR1cm4gYz9jOmZ1bmN0aW9uKGMsZSl7cmV0dXJuICRqc2NvbXAuZmluZEludGVybmFsKHRoaXMsYyxlKS52fX0sImVzNiIsImVzMyIpOwooZnVuY3Rpb24oYyl7ImZ1bmN0aW9uIj09PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKFsianF1ZXJ5IiwiZGF0YXRhYmxlcy5uZXQiXSxmdW5jdGlvbihnKXtyZXR1cm4gYyhnLHdpbmRvdyxkb2N1bWVudCl9KToib2JqZWN0Ij09PXR5cGVvZiBleHBvcnRzP21vZHVsZS5leHBvcnRzPWZ1bmN0aW9uKGcsZSl7Z3x8KGc9d2luZG93KTtlJiZlLmZuLmRhdGFUYWJsZXx8KGU9cmVxdWlyZSgiZGF0YXRhYmxlcy5uZXQiKShnLGUpLiQpO3JldHVybiBjKGUsZyxnLmRvY3VtZW50KX06YyhqUXVlcnksd2luZG93LGRvY3VtZW50KX0pKGZ1bmN0aW9uKGMsZyxlLHEpe3ZhciBsPWMuZm4uZGF0YVRhYmxlLHUscD1mdW5jdGlvbihhLGIpe3ZhciBkPXRoaXM7aWYodGhpcyBpbnN0YW5jZW9mIHApe2lmKGI9PT1xfHwhMD09PWIpYj17fTt2YXIgaD1jLmZuLmRhdGFUYWJsZS5jYW1lbFRvSHVuZ2FyaWFuO2gmJihoKHAuZGVmYXVsdHMscC5kZWZhdWx0cywhMCksaChwLmRlZmF1bHRzLApiKSk7YT0obmV3IGMuZm4uZGF0YVRhYmxlLkFwaShhKSkuc2V0dGluZ3MoKVswXTt0aGlzLnM9e2R0OmEsaVRhYmxlQ29sdW1uczphLmFvQ29sdW1ucy5sZW5ndGgsYWlPdXRlcldpZHRoczpbXSxhaUlubmVyV2lkdGhzOltdLHJ0bDoicnRsIj09PWMoYS5uVGFibGUpLmNzcygiZGlyZWN0aW9uIil9O3RoaXMuZG9tPXtzY3JvbGxlcjpudWxsLGhlYWRlcjpudWxsLGJvZHk6bnVsbCxmb290ZXI6bnVsbCxncmlkOnt3cmFwcGVyOm51bGwsZHQ6bnVsbCxsZWZ0Ont3cmFwcGVyOm51bGwsaGVhZDpudWxsLGJvZHk6bnVsbCxmb290Om51bGx9LHJpZ2h0Ont3cmFwcGVyOm51bGwsaGVhZDpudWxsLGJvZHk6bnVsbCxmb290Om51bGx9fSxjbG9uZTp7bGVmdDp7aGVhZGVyOm51bGwsYm9keTpudWxsLGZvb3RlcjpudWxsfSxyaWdodDp7aGVhZGVyOm51bGwsYm9keTpudWxsLGZvb3RlcjpudWxsfX19O2lmKGEuX29GaXhlZENvbHVtbnMpdGhyb3ciRml4ZWRDb2x1bW5zIGFscmVhZHkgaW5pdGlhbGlzZWQgb24gdGhpcyB0YWJsZSI7CmEuX29GaXhlZENvbHVtbnM9dGhpczthLl9iSW5pdENvbXBsZXRlP3RoaXMuX2ZuQ29uc3RydWN0KGIpOmEub0FwaS5fZm5DYWxsYmFja1JlZyhhLCJhb0luaXRDb21wbGV0ZSIsZnVuY3Rpb24oKXtkLl9mbkNvbnN0cnVjdChiKX0sIkZpeGVkQ29sdW1ucyIpfWVsc2UgYWxlcnQoIkZpeGVkQ29sdW1ucyB3YXJuaW5nOiBGaXhlZENvbHVtbnMgbXVzdCBiZSBpbml0aWFsaXNlZCB3aXRoIHRoZSAnbmV3JyBrZXl3b3JkLiIpfTtjLmV4dGVuZChwLnByb3RvdHlwZSx7Zm5VcGRhdGU6ZnVuY3Rpb24oKXt0aGlzLl9mbkRyYXcoITApfSxmblJlZHJhd0xheW91dDpmdW5jdGlvbigpe3RoaXMuX2ZuQ29sQ2FsYygpO3RoaXMuX2ZuR3JpZExheW91dCgpO3RoaXMuZm5VcGRhdGUoKX0sZm5SZWNhbGN1bGF0ZUhlaWdodDpmdW5jdGlvbihhKXtkZ
<link href="data:text/css;charset=utf-8,%0A%2Econtainer%2Dfluid%2Ecrosstalk%2Dbscols%20%7B%0Amargin%2Dleft%3A%20%2D30px%3B%0Amargin%2Dright%3A%20%2D30px%3B%0Awhite%2Dspace%3A%20normal%3B%0A%7D%0A%0Abody%20%3E%20%2Econtainer%2Dfluid%2Ecrosstalk%2Dbscols%20%7B%0Amargin%2Dleft%3A%20auto%3B%0Amargin%2Dright%3A%20auto%3B%0A%7D%0A%2Ecrosstalk%2Dinput%2Dcheckboxgroup%20%2Ecrosstalk%2Doptions%2Dgroup%20%2Ecrosstalk%2Doptions%2Dcolumn%20%7B%0Adisplay%3A%20inline%2Dblock%3B%0Apadding%2Dright%3A%2012px%3B%0Avertical%2Dalign%3A%20top%3B%0A%7D%0A%40media%20only%20screen%20and%20%28max%2Dwidth%3A480px%29%20%7B%0A%2Ecrosstalk%2Dinput%2Dcheckboxgroup%20%2Ecrosstalk%2Doptions%2Dgroup%20%2Ecrosstalk%2Doptions%2Dcolumn%20%7B%0Adisplay%3A%20block%3B%0Apadding%2Dright%3A%20inherit%3B%0A%7D%0A%7D%0A" rel="stylesheet" />
<script src="data:application/x-javascript;base64,IWZ1bmN0aW9uIG8odSxhLGwpe2Z1bmN0aW9uIHMobixlKXtpZighYVtuXSl7aWYoIXVbbl0pe3ZhciB0PSJmdW5jdGlvbiI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlO2lmKCFlJiZ0KXJldHVybiB0KG4sITApO2lmKGYpcmV0dXJuIGYobiwhMCk7dmFyIHI9bmV3IEVycm9yKCJDYW5ub3QgZmluZCBtb2R1bGUgJyIrbisiJyIpO3Rocm93IHIuY29kZT0iTU9EVUxFX05PVF9GT1VORCIscn12YXIgaT1hW25dPXtleHBvcnRzOnt9fTt1W25dWzBdLmNhbGwoaS5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciB0PXVbbl1bMV1bZV07cmV0dXJuIHModHx8ZSl9LGksaS5leHBvcnRzLG8sdSxhLGwpfXJldHVybiBhW25dLmV4cG9ydHN9Zm9yKHZhciBmPSJmdW5jdGlvbiI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlLGU9MDtlPGwubGVuZ3RoO2UrKylzKGxbZV0pO3JldHVybiBzfSh7MTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkobiwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHI9ZnVuY3Rpb24oKXtmdW5jdGlvbiByKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLmtleSxyKX19cmV0dXJuIGZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdCYmcihlLnByb3RvdHlwZSx0KSxuJiZyKGUsbiksZX19KCk7dmFyIGk9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKCl7IWZ1bmN0aW9uKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9KHRoaXMsZSksdGhpcy5fdHlwZXM9e30sdGhpcy5fc2VxPTB9cmV0dXJuIHIoZSxbe2tleToib24iLHZhbHVlOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5fdHlwZXNbZV07bnx8KG49dGhpcy5fdHlwZXNbZV09e30pO3ZhciByPSJzdWIiK3RoaXMuX3NlcSsrO3JldHVybiBuW3JdPXQscn19LHtrZXk6Im9mZiIsdmFsdWU6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLl90eXBlc1tlXTtpZigiZnVuY3Rpb24iPT10eXBlb2YgdCl7Zm9yKHZhciByIGluIG4paWYobi5oYXNPd25Qcm9wZXJ0eShyKSYmbltyXT09PXQpcmV0dXJuIGRlbGV0ZSBuW3JdLHI7cmV0dXJuITF9aWYoInN0cmluZyI9PXR5cGVvZiB0KXJldHVybiEoIW58fCFuW3RdKSYmKGRlbGV0ZSBuW3RdLHQpO3Rocm93IG5ldyBFcnJvcigiVW5leHBlY3RlZCB0eXBlIGZvciBsaXN0ZW5lciIpfX0se2tleToidHJpZ2dlciIsdmFsdWU6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXRoaXMuX3R5cGVzW2VdO2Zvcih2YXIgaSBpbiByKXIuaGFzT3duUHJvcGVydHkoaSkmJnJbaV0uY2FsbChuLHQpfX1dKSxlfSgpO24uZGVmYXVsdD1pfSx7fV0sMjpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkobiwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksbi5GaWx0ZXJIYW5kbGU9dm9pZCAwO3ZhciByPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gcihlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsci5rZXkscil9fXJldHVybiBmdW5jdGlvbihlLHQsbil7cmV0dXJuIHQmJnIoZS5wcm90b3R5cGUsdCksbiYmcihlLG4pLGV9fSgpLGk9bChlKCIuL2V2ZW50cyIpKSxvPWwoZSgiLi9maWx0ZXJzZXQiKSksdT1sKGUoIi4vZ3JvdXAiKSksYT1mdW5jdGlvbihlKXt7aWYoZSYmZS5fX2VzTW9kdWxlKXJldHVybiBlO3ZhciB0PXt9O2lmKG51bGwhPWUpZm9yKHZhciBuIGluIGUpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsbikmJih0W25dPWVbbl0pO3JldHVybiB0LmRlZmF1bHQ9ZSx0fX0oZSgiLi91dGlsIikpO2Z1bmN0aW9uIGwoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOntkZWZhdWx0OmV9fXZhciBzPTE7bi5GaWx0ZXJIYW5kbGU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKGUsdCl7IWZ1bmN0aW9uKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9KHRoaXMsbiksdGhpcy5fZXZlbnRSZWxheT1uZXcgaS5kZWZhdWx0LHRoaXMuX2VtaXR0ZXI9bmV3IGEuU3Vic2NyaXB0aW9uVHJhY2tlcih0aGlzLl9ldmVudFJlbGF5KSx0aGlzLl9ncm91cD1udWxsLHRoaXMuX2ZpbHRlclNldD1udWxsLHRoaXMuX2ZpbHRlclZhcj1udWxsLHRoaXMuX3Zhck9uQ2hhbmdlU3ViPW51bGwsdGhpcy5fZXh0cmFJbmZvPWEuZXh0ZW5kKHtzZW5kZXI6dGhpc30sdCksdGhpcy5faWQ9ImZpbHRlciIrcysrLHRoaXMuc2V0R3JvdXAoZSl9cmV0dXJuIHIobixbe2tleToic2V0R3JvdXAiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0LG4scj10aGlzO2lmKHRoaXMuX2dyb3VwIT09ZSYmKCh0aGlzLl9ncm91cHx8ZSkmJih0aGlzLl9maWx0ZXJWYXImJih0aGlzLl9maWx0ZXJWYXIub2ZmKCJjaGFuZ2UiLHRoaXMuX3Zhck9uQ2hhbmdlU3ViKSx0aGlzLmNsZWFyKCksdGhpcy5fdmFyT25DaGFuZ2VTdWI9bnVsbCx0aGlzLl9maWx0ZXJWYXI9bnVsbCx0aGlzLl9maWx0ZXJTZXQ9bnVsbCksdGhpcy5fZ3JvdXA9ZSkpKXtlPSgwLHUuZGVmYXVsdCkoZSksdGhpcy5fZmlsdGVyU2V0PSh0PWUudmFyKCJmaWx0ZXJzZXQiKSwobj10LmdldCgpKXx8KG49bmV3IG8uZGVmYXVsdCx0LnNldChuKSksbiksdGhpcy5fZmlsdGVyVmFyPSgwLHUuZGVmYXVsdCkoZSkudmFyKCJmaWx0ZXIiKTt2YXIgaT10aGlzLl9maWx0ZXJWYXIub24oImNoYW5nZSIsZnVuY3Rpb24oZSl7ci5fZXZlbnRSZWxheS50cmlnZ2VyKCJjaGFuZ2UiLGUscil9KTt0aGlzLl92YXJPbkNoYW5nZVN1Yj1pfX19LHtrZXk6Il9tZXJnZUV4d
<link href="data:text/css;charset=utf-8,select%2Ebs%2Dselect%2Dhidden%2Cselect%2Eselectpicker%7Bdisplay%3Anone%21important%7D%2Ebootstrap%2Dselect%7Bwidth%3A220px%5C9%7D%2Ebootstrap%2Dselect%3E%2Edropdown%2Dtoggle%7Bwidth%3A100%25%3Bpadding%2Dright%3A25px%3Bz%2Dindex%3A1%7D%2Ebootstrap%2Dselect%3E%2Edropdown%2Dtoggle%2Ebs%2Dplaceholder%2C%2Ebootstrap%2Dselect%3E%2Edropdown%2Dtoggle%2Ebs%2Dplaceholder%3Aactive%2C%2Ebootstrap%2Dselect%3E%2Edropdown%2Dtoggle%2Ebs%2Dplaceholder%3Afocus%2C%2Ebootstrap%2Dselect%3E%2Edropdown%2Dtoggle%2Ebs%2Dplaceholder%3Ahover%7Bcolor%3A%23999%7D%2Ebootstrap%2Dselect%3Eselect%7Bposition%3Aabsolute%21important%3Bbottom%3A0%3Bleft%3A50%25%3Bdisplay%3Ablock%21important%3Bwidth%3A%2E5px%21important%3Bheight%3A100%25%21important%3Bpadding%3A0%21important%3Bopacity%3A0%21important%3Bborder%3Anone%7D%2Ebootstrap%2Dselect%3Eselect%2Emobile%2Ddevice%7Btop%3A0%3Bleft%3A0%3Bdisplay%3Ablock%21important%3Bwidth%3A100%25%21important%3Bz%2Dindex%3A2%7D%2Eerror%20%2Ebootstrap%2Dselect%20%2Edropdown%2Dtoggle%2C%2Ehas%2Derror%20%2Ebootstrap%2Dselect%20%2Edropdown%2Dtoggle%7Bborder%2Dcolor%3A%23b94a48%7D%2Ebootstrap%2Dselect%2Efit%2Dwidth%7Bwidth%3Aauto%21important%7D%2Ebootstrap%2Dselect%3Anot%28%5Bclass%2A%3Dcol%2D%5D%29%3Anot%28%5Bclass%2A%3Dform%2Dcontrol%5D%29%3Anot%28%2Einput%2Dgroup%2Dbtn%29%7Bwidth%3A220px%7D%2Ebootstrap%2Dselect%20%2Edropdown%2Dtoggle%3Afocus%7Boutline%3Athin%20dotted%20%23333%21important%3Boutline%3A5px%20auto%20%2Dwebkit%2Dfocus%2Dring%2Dcolor%21important%3Boutline%2Doffset%3A%2D2px%7D%2Ebootstrap%2Dselect%2Eform%2Dcontrol%7Bmargin%2Dbottom%3A0%3Bpadding%3A0%3Bborder%3Anone%7D%2Ebootstrap%2Dselect%2Eform%2Dcontrol%3Anot%28%5Bclass%2A%3Dcol%2D%5D%29%7Bwidth%3A100%25%7D%2Ebootstrap%2Dselect%2Eform%2Dcontrol%2Einput%2Dgroup%2Dbtn%7Bz%2Dindex%3Aauto%7D%2Ebootstrap%2Dselect%2Eform%2Dcontrol%2Einput%2Dgroup%2Dbtn%3Anot%28%3Afirst%2Dchild%29%3Anot%28%3Alast%2Dchild%29%3E%2Ebtn%7Bborder%2Dradius%3A0%7D%2Ebootstrap%2Dselect%2Ebtn%2Dgroup%3Anot%28%2Einput%2Dgroup%2Dbtn%29%2C%2Ebootstrap%2Dselect%2Ebtn%2Dgroup%5Bclass%2A%3Dcol%2D%5D%7Bfloat%3Anone%3Bdisplay%3Ainline%2Dblock%3Bmargin%2Dleft%3A0%7D%2Ebootstrap%2Dselect%2Ebtn%2Dgroup%2Edropdown%2Dmenu%2Dright%2C%2Ebootstrap%2Dselect%2Ebtn%2Dgroup%5Bclass%2A%3Dcol%2D%5D%2Edropdown%2Dmenu%2Dright%2C%2Erow%20%2Ebootstrap%2Dselect%2Ebtn%2Dgroup%5Bclass%2A%3Dcol%2D%5D%2Edropdown%2Dmenu%2Dright%7Bfloat%3Aright%7D%2Eform%2Dgroup%20%2Ebootstrap%2Dselect%2Ebtn%2Dgroup%2C%2Eform%2Dhorizontal%20%2Ebootstrap%2Dselect%2Ebtn%2Dgroup%2C%2Eform%2Dinline%20%2Ebootstrap%2Dselect%2Ebtn%2Dgroup%7Bmargin%2Dbottom%3A0%7D%2Eform%2Dgroup%2Dlg%20%2Ebootstrap%2Dselect%2Ebtn%2Dgroup%2Eform%2Dcontrol%2C%2Eform%2Dgroup%2Dsm%20%2Ebootstrap%2Dselect%2Ebtn%2Dgroup%2Eform%2Dcontrol%7Bpadding%3A0%7D%2Eform%2Dinline%20%2Ebootstrap%2Dselect%2Ebtn%2Dgroup%20%2Eform%2Dcontrol%7Bwidth%3A100%25%7D%2Ebootstrap%2Dselect%2Ebtn%2Dgroup%2Edisabled%2C%2Ebootstrap%2Dselect%2Ebtn%2Dgroup%3E%2Edisabled%7Bcursor%3Anot%2Dallowed%7D%2Ebootstrap%2Dselect%2Ebtn%2Dgroup%2Edisabled%3Afocus%2C%2Ebootstrap%2Dselect%2Ebtn%2Dgroup%3E%2Edisabled%3Afocus%7Boutline%3A0%21important%7D%2Ebootstrap%2Dselect%2Ebtn%2Dgroup%2Ebs%2Dcontainer%7Bposition%3Aabsolute%3Bheight%3A0%21important%3Bpadding%3A0%21important%7D%2Ebootstrap%2Dselect%2Ebtn%2Dgroup%2Ebs%2Dcontainer%20%2Edropdown%2Dmenu%7Bz%2Dindex%3A1060%7D%2Ebootstrap%2Dselect%2Ebtn%2Dgroup%20%2Edropdown%2Dtoggle%20%2Efilter%2Doption%7Bdisplay%3Ainline%2Dblock%3Boverflow%3Ahidden%3Bwidth%3A100%25%3Btext%2Dalign%3Aleft%7D%2Ebootstrap%2Dselect%2Ebtn%2Dgroup%20%2Edropdown%2Dtoggle%20%2Ecaret%7Bposition%3Aabsolute%3Btop%3A50%25%3Bright%3A12px%3Bmargin%2Dtop%3A%2D2px%3Bvertical%2Dalign%3Amiddle%7D%2Ebootstrap%2Dselect%2Ebtn%2Dgroup%5Bclass%2A%3Dcol%2D%5D%20%2Edropdown%2Dtoggle%7Bwidth%3A100%25%7D%2Ebootstrap%2Dselect%2Ebtn%2Dgroup%20%2Edropdown%2Dmenu%7Bmin%2Dwidth%3A100%25%3B%2Dwebkit%2Dbox%2Dsizing%3Aborder%2Dbox%3B%2Dmoz%2Dbox%2Dsizing%3Aborder%2Dbox%3Bbox%2Dsizing%3Aborder%2Dbox%7D%2Ebootstrap%2Dselect%2Ebtn%2Dgroup%20%2Edropdown%2Dmenu%2Einner%7Bposition%3Astatic
<script src="data:application/x-javascript;base64,LyohCiAqIEJvb3RzdHJhcC1zZWxlY3QgdjEuMTIuMSAoaHR0cDovL3NpbHZpb21vcmV0by5naXRodWIuaW8vYm9vdHN0cmFwLXNlbGVjdCkKICoKICogQ29weXJpZ2h0IDIwMTMtMjAxNiBib290c3RyYXAtc2VsZWN0CiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3NpbHZpb21vcmV0by9ib290c3RyYXAtc2VsZWN0L2Jsb2IvbWFzdGVyL0xJQ0VOU0UpCiAqLwohZnVuY3Rpb24oYSxiKXsiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShbImpxdWVyeSJdLGZ1bmN0aW9uKGEpe3JldHVybiBiKGEpfSk6Im9iamVjdCI9PXR5cGVvZiBtb2R1bGUmJm1vZHVsZS5leHBvcnRzP21vZHVsZS5leHBvcnRzPWIocmVxdWlyZSgianF1ZXJ5IikpOmIoYS5qUXVlcnkpfSh0aGlzLGZ1bmN0aW9uKGEpeyFmdW5jdGlvbihhKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gYihiKXt2YXIgYz1be3JlOi9bXHhDMC1ceEM2XS9nLGNoOiJBIn0se3JlOi9bXHhFMC1ceEU2XS9nLGNoOiJhIn0se3JlOi9bXHhDOC1ceENCXS9nLGNoOiJFIn0se3JlOi9bXHhFOC1ceEVCXS9nLGNoOiJlIn0se3JlOi9bXHhDQy1ceENGXS9nLGNoOiJJIn0se3JlOi9bXHhFQy1ceEVGXS9nLGNoOiJpIn0se3JlOi9bXHhEMi1ceEQ2XS9nLGNoOiJPIn0se3JlOi9bXHhGMi1ceEY2XS9nLGNoOiJvIn0se3JlOi9bXHhEOS1ceERDXS9nLGNoOiJVIn0se3JlOi9bXHhGOS1ceEZDXS9nLGNoOiJ1In0se3JlOi9bXHhDNy1ceEU3XS9nLGNoOiJjIn0se3JlOi9bXHhEMV0vZyxjaDoiTiJ9LHtyZTovW1x4RjFdL2csY2g6Im4ifV07cmV0dXJuIGEuZWFjaChjLGZ1bmN0aW9uKCl7Yj1iP2IucmVwbGFjZSh0aGlzLnJlLHRoaXMuY2gpOiIifSksYn1mdW5jdGlvbiBjKGIpe3ZhciBjPWFyZ3VtZW50cyxkPWI7W10uc2hpZnQuYXBwbHkoYyk7dmFyIGUsZj10aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYj1hKHRoaXMpO2lmKGIuaXMoInNlbGVjdCIpKXt2YXIgZj1iLmRhdGEoInNlbGVjdHBpY2tlciIpLGc9Im9iamVjdCI9PXR5cGVvZiBkJiZkO2lmKGYpe2lmKGcpZm9yKHZhciBoIGluIGcpZy5oYXNPd25Qcm9wZXJ0eShoKSYmKGYub3B0aW9uc1toXT1nW2hdKX1lbHNle3ZhciBpPWEuZXh0ZW5kKHt9LGsuREVGQVVMVFMsYS5mbi5zZWxlY3RwaWNrZXIuZGVmYXVsdHN8fHt9LGIuZGF0YSgpLGcpO2kudGVtcGxhdGU9YS5leHRlbmQoe30say5ERUZBVUxUUy50ZW1wbGF0ZSxhLmZuLnNlbGVjdHBpY2tlci5kZWZhdWx0cz9hLmZuLnNlbGVjdHBpY2tlci5kZWZhdWx0cy50ZW1wbGF0ZTp7fSxiLmRhdGEoKS50ZW1wbGF0ZSxnLnRlbXBsYXRlKSxiLmRhdGEoInNlbGVjdHBpY2tlciIsZj1uZXcgayh0aGlzLGkpKX0ic3RyaW5nIj09dHlwZW9mIGQmJihlPWZbZF1pbnN0YW5jZW9mIEZ1bmN0aW9uP2ZbZF0uYXBwbHkoZixjKTpmLm9wdGlvbnNbZF0pfX0pO3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgZT9lOmZ9U3RyaW5nLnByb3RvdHlwZS5pbmNsdWRlc3x8IWZ1bmN0aW9uKCl7dmFyIGE9e30udG9TdHJpbmcsYj1mdW5jdGlvbigpe3RyeXt2YXIgYT17fSxiPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSxjPWIoYSxhLGEpJiZifWNhdGNoKGEpe31yZXR1cm4gY30oKSxjPSIiLmluZGV4T2YsZD1mdW5jdGlvbihiKXtpZihudWxsPT10aGlzKXRocm93IG5ldyBUeXBlRXJyb3I7dmFyIGQ9U3RyaW5nKHRoaXMpO2lmKGImJiJbb2JqZWN0IFJlZ0V4cF0iPT1hLmNhbGwoYikpdGhyb3cgbmV3IFR5cGVFcnJvcjt2YXIgZT1kLmxlbmd0aCxmPVN0cmluZyhiKSxnPWYubGVuZ3RoLGg9YXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDAsaT1oP051bWJlcihoKTowO2khPWkmJihpPTApO3ZhciBqPU1hdGgubWluKE1hdGgubWF4KGksMCksZSk7cmV0dXJuIShnK2o+ZSkmJmMuY2FsbChkLGYsaSkhPS0xfTtiP2IoU3RyaW5nLnByb3RvdHlwZSwiaW5jbHVkZXMiLHt2YWx1ZTpkLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pOlN0cmluZy5wcm90b3R5cGUuaW5jbHVkZXM9ZH0oKSxTdHJpbmcucHJvdG90eXBlLnN0YXJ0c1dpdGh8fCFmdW5jdGlvbigpe3ZhciBhPWZ1bmN0aW9uKCl7dHJ5e3ZhciBhPXt9LGI9T2JqZWN0LmRlZmluZVByb3BlcnR5LGM9YihhLGEsYSkmJmJ9Y2F0Y2goYSl7fXJldHVybiBjfSgpLGI9e30udG9TdHJpbmcsYz1mdW5jdGlvbihhKXtpZihudWxsPT10aGlzKXRocm93IG5ldyBUeXBlRXJyb3I7dmFyIGM9U3RyaW5nKHRoaXMpO2lmKGEmJiJbb2JqZWN0IFJlZ0V4cF0iPT1iLmNhbGwoYSkpdGhyb3cgbmV3IFR5cGVFcnJvcjt2YXIgZD1jLmxlbmd0aCxlPVN0cmluZyhhKSxmPWUubGVuZ3RoLGc9YXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDAsaD1nP051bWJlcihnKTowO2ghPWgmJihoPTApO3ZhciBpPU1hdGgubWluKE1hdGgubWF4KGgsMCksZCk7aWYoZitpPmQpcmV0dXJuITE7Zm9yKHZhciBqPS0xOysrajxmOylpZihjLmNoYXJDb2RlQXQoaStqKSE9ZS5jaGFyQ29kZUF0KGopKXJldHVybiExO3JldHVybiEwfTthP2EoU3RyaW5nLnByb3RvdHlwZSwic3RhcnRzV2l0aCIse3ZhbHVlOmMsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwfSk6U3RyaW5nLnByb3RvdHlwZS5zdGFydHNXaXRoPWN9KCksT2JqZWN0LmtleXN8fChPYmplY3Qua2V5cz1mdW5jdGlvbihhLGIsYyl7Yz1bXTtmb3IoYiBpbiBhKWMuaGFzT3duUHJvcGVydHkuY2FsbChhLGIpJiZjLnB1c2goYik7cmV0dXJuIGN9KTt2YXIgZD17dXNlRGVmYXVsdDohMSxfc2V0OmEudmFsSG9va3Muc2VsZWN0LnNldH07YS52YWxIb29rcy5zZWxlY3Quc2V0PWZ1bmN0aW9uKGIsYyl7cmV0dXJuIGMmJiFkLnVzZURlZmF1bHQmJmEoYikuZGF0YSgic2VsZWN0ZWQiLCEwKSxkLl9zZXQuYXBwbHkodGhpcyxhcmd1bWVudHMpfTt2YXIgZT1udWxsO2EuZm4udHJpZ2dlck5hdGl2ZT1mdW5jdGlvbihhKXt2YXIgYixjPXRoaXNbMF07Yy5kaXNwYXRjaEV2ZW50PygiZnVuY3Rpb24iPT10eXBlb2YgRXZlbnQ/Yj1uZXcgRXZlbnQoYSx7YnViYmxlc
<script src="data:application/x-javascript;base64,SFRNTFdpZGdldHMud2lkZ2V0KHsKCiAgbmFtZTogJ2Jzc2VsZWN0UicsCgogIHR5cGU6ICdvdXRwdXQnLAoKICBmYWN0b3J5OiBmdW5jdGlvbihlbCwgd2lkdGgsIGhlaWdodCkgewoKICAgIC8vIFRPRE86IGRlZmluZSBzaGFyZWQgdmFyaWFibGVzIGZvciB0aGlzIGluc3RhbmNlCgogICAgcmV0dXJuIHsKCiAgICAgIHJlbmRlclZhbHVlOiBmdW5jdGlvbigpIHsKCiAgICAgIH0sCgogICAgICByZXNpemU6IGZ1bmN0aW9uKHdpZHRoLCBoZWlnaHQpIHsKCiAgICAgICAgLy8gVE9ETzogY29kZSB0byByZS1yZW5kZXIgdGhlIHdpZGdldCB3aXRoIGEgbmV3IHNpemUKCiAgICAgIH0KCiAgICB9OwogIH0KfSk7"></script>
<style type="text/css">
code{white-space: pre-wrap;}
span.smallcaps{font-variant: small-caps;}
span.underline{text-decoration: underline;}
div.column{display: inline-block; vertical-align: top; width: 50%;}
div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
ul.task-list{list-style: none;}
</style>
<style type="text/css">code{white-space: pre;}</style>
<style type="text/css">
pre:not([class]) {
background-color: white;
}
</style>
<script type="text/javascript">
if (window.hljs) {
hljs.configure({languages: []});
hljs.initHighlightingOnLoad();
if (document.readyState && document.readyState === "complete") {
window.setTimeout(function() { hljs.initHighlighting(); }, 0);
}
}
</script>
<style type="text/css">
h1 {
font-size: 34px;
}
h1.title {
font-size: 38px;
}
h2 {
font-size: 30px;
}
h3 {
font-size: 24px;
}
h4 {
font-size: 18px;
}
h5 {
font-size: 16px;
}
h6 {
font-size: 12px;
}
.table th:not([align]) {
text-align: left;
}
</style>
<style type="text/css">
.main-container {
max-width: 940px;
margin-left: auto;
margin-right: auto;
}
code {
color: inherit;
background-color: rgba(0, 0, 0, 0.04);
}
img {
max-width:100%;
}
.tabbed-pane {
padding-top: 12px;
}
.html-widget {
margin-bottom: 20px;
}
button.code-folding-btn:focus {
outline: none;
}
summary {
display: list-item;
}
</style>
<!-- tabsets -->
<style type="text/css">
.tabset-dropdown > .nav-tabs {
display: inline-table;
max-height: 500px;
min-height: 44px;
overflow-y: auto;
background: white;
border: 1px solid #ddd;
border-radius: 4px;
}
.tabset-dropdown > .nav-tabs > li.active:before {
content: "";
font-family: 'Glyphicons Halflings';
display: inline-block;
padding: 10px;
border-right: 1px solid #ddd;
}
.tabset-dropdown > .nav-tabs.nav-tabs-open > li.active:before {
content: "";
border: none;
}
.tabset-dropdown > .nav-tabs.nav-tabs-open:before {
content: "";
font-family: 'Glyphicons Halflings';
display: inline-block;
padding: 10px;
border-right: 1px solid #ddd;
}
.tabset-dropdown > .nav-tabs > li.active {
display: block;
}
.tabset-dropdown > .nav-tabs > li > a,
.tabset-dropdown > .nav-tabs > li > a:focus,
.tabset-dropdown > .nav-tabs > li > a:hover {
border: none;
display: inline-block;
border-radius: 4px;
background-color: transparent;
}
.tabset-dropdown > .nav-tabs.nav-tabs-open > li {
display: block;
float: none;
}
.tabset-dropdown > .nav-tabs > li {
display: none;
}
</style>
<!-- code folding -->
<style type="text/css">
.code-folding-btn { margin-bottom: 4px; }
</style>
<style type="text/css">
#TOC {
margin: 25px 0px 20px 0px;
}
@media (max-width: 768px) {
#TOC {
position: relative;
width: 100%;
}
}
@media print {
.toc-content {
/* see https://github.com/w3c/csswg-drafts/issues/4434 */
float: right;
}
}
.toc-content {
padding-left: 30px;
padding-right: 40px;
}
div.main-container {
max-width: 1200px;
}
div.tocify {
width: 20%;
max-width: 260px;
max-height: 85%;
}
@media (min-width: 768px) and (max-width: 991px) {
div.tocify {
width: 25%;
}
}
@media (max-width: 767px) {
div.tocify {
width: 100%;
max-width: none;
}
}
.tocify ul, .tocify li {
line-height: 20px;
}
.tocify-subheader .tocify-item {
font-size: 0.90em;
}
.tocify .list-group-item {
border-radius: 0px;
}
</style>
</head>
<body>
<div class="container-fluid main-container">
<!-- setup 3col/9col grid for toc_float and main content -->
<div class="row-fluid">
<div class="col-xs-12 col-sm-4 col-md-3">
<div id="TOC" class="tocify">
</div>
</div>
<div class="toc-content col-xs-12 col-sm-8 col-md-9">
<div class="fluid-row" id="header">
<div class="btn-group pull-right">
<button type="button" class="btn btn-default btn-xs dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"><span>Code</span> <span class="caret"></span></button>
<ul class="dropdown-menu" style="min-width: 50px;">
<li><a id="rmd-show-all-code" href="#">Show All Code</a></li>
<li><a id="rmd-hide-all-code" href="#">Hide All Code</a></li>
</ul>
</div>
<h1 class="title toc-ignore">Generating <em>in silico</em> TCR repertoires</h1>
<h4 class="author">Maria S. Benitez-Cantos</h4>
<h4 class="date">12/02/2021</h4>
</div>
<style>
.superbigimage{
overflow-x:scroll;
white-space: nowrap;
}
.superbigimage img{
max-width: none;
}
</style>
<style>
.vscroll-plot {
height: 400px;
overflow-y: scroll;
overflow-x: hidden;
}
</style>
<div class="panel panel-info">
<div class="panel-heading">
<strong> What's new?</strong>
</div>
<div class="panel-body">
<ul>
<li>Ran sequencing simulator with new error rates from the literature (lower than the first test): still have a lot of out-of-frame HVRs :(</li>
<li>Compared V and J alignment score and identity distributions among sample 111L and the two simulated repertoires.
</div></li>
</ul>
</div>
<hr />
<pre class="r"><code>######### LOAD PACKAGES ##########
library(immuneSIM)
library(DT)
library(Biostrings)
library(ggplot2)
library(ggpubr)
library(patchwork)
library(Biostrings)
library(msa)
library(dplyr)
library(webr)
library(plyr)
library(ggtree)
library(stringr)
library(bsselectR)
library(WeightedCluster)
library(apcluster)
library(reshape2)</code></pre>
<div id="simulating-tcr-repertoires" class="section level1">
<h1><span class="header-section-number">1</span> Simulating TCR repertoires</h1>
<div id="immunesim-r-package" class="section level2 unnumbered">
<h2><code>immuneSIM</code> R package</h2>
<ul>
<li><a href="https://immunesim.readthedocs.io/en/latest/">Documentation</a></li>
<li><a href="https://academic.oup.com/bioinformatics/article/36/11/3594/5802461">Publication on <em>Bioinformatics</em></a></li>
</ul>
<p><code>immuneSIM</code> enables in silico generation of single and paired chain human and mouse B- and T-cell repertoires with user-defined tunable properties to provide the user with experimental-like (or aberrant) data to benchmark their repertoire analysis methods.</p>
<div class="figure">
<img src="data:image/png;base64,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
<p class="caption"><strong>Figure 1.</strong> Package functionality overview.</p>
</div>
<div id="methods-overview" class="section level3 unnumbered">
<h3>Methods overview</h3>
<div class="figure">
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABAAAAAMACAYAAAC6uhUNAAABWWlDQ1BJQ0MgUHJvZmlsZQAAKJFjYGBSSSwoyGFhYGDIzSspCnJ3UoiIjFJgv8/AxcDHwMvAwWCZmFxc4BgQ4ANUwgCjUcG3awyMIPqyLsisp7v5ZqTvdTvrvc8lb6906QxM9SiAKyW1OBlI/wHi1OSCohIGBsYUIFu5vKQAxO4AskWKgI4CsueA2OkQ9gYQOwnCPgJWExLkDGTfALIVkjMSgWYw/gCydZKQxNOR2FB7QYDbJbO4ICexUiHAmIBryQAlqRUlINo5v6CyKDM9o0TBERhKqQqeecl6OgpGBoamDAygMIeo/hwIDktGsTMIseb7DAy2+////78bIea1n4Fhozkw+HYixDQsGBgEuRkYTuwsSCxKBAsxAzFTWhoDwydgePEGMDAIb2Ng4PxTnGZsBJZn5HFiYGC99///ZzUGBvbJDAx/J/z//3vR//9/FwM132FgOJAHAEf/Z5tAjj9dAABAAElEQVR4AeydB5gURROGi5xzzhkkJ0HAQBAVBFRERMWAiij8GFBBxAAqEgQMBBEUUVAxIAoiAgISJEvOmSPnnNP+9dXRy9yyl+CAg/3qee52dqanp/vt2d2p0NUJfCpCIQESIAESIAESIAESIAESIAESIAESuKEJJLyhe8fOkQAJkAAJkAAJkAAJkAAJkAAJkAAJGAEaAHgjkAAJkAAJkAAJkAAJkAAJkAAJkEAIEKABIAQGmV0kARIgARIgARIgARIgARIgARIgARoAeA+QAAmQAAmQAAmQAAmQAAmQAAmQQAgQoAEgBAaZXSQBEiABEiABEiABEiABEiABEiABGgB4D5AACZAACZAACZAACZAACZAACZBACBCgASAEBpldJAESIAESIAESIAESIAESIAESIAEaAHgPkAAJkAAJkAAJkAAJkAAJkAAJkEAIEKABIAQGmV0kARIgARIgARIgARIgARIgARIgARoAeA+QAAmQAAmQAAmQAAmQAAmQAAmQQAgQoAEgBAaZXSQBEiABEiABEiABEiABEiABEiABGgB4D5AACZAACZAACZAACZAACZAACZBACBCgASAEBpldJAESIAESIAESIAESIAESIAESIAEaAHgPkAAJkAAJkAAJkAAJkAAJkAAJkEAIEKABIAQGmV0kARIgARIgARIgARIgARIgARIgARoAeA+QAAmQAAmQAAmQAAmQAAmQAAmQQAgQoAEgBAaZXSQBEiABEiABEiABEiABEiABEiABGgB4D5AACZAACZAACZAACZAACZAACZBACBCgASAEBpldJAESIAESIAESIAESIAESIAESIAEaAHgPkAAJkAAJkAAJkAAJkAAJkAAJkEAIEKABIAQGmV0kARIgARIgARIgARIgARIgARIgARoAeA+QAAmQAAmQAAmQAAmQAAmQAAmQQAgQoAEgBAaZXSQBEiABEiABEiABEiABEiABEiABGgB4D5AACZAACZAACZAACZAACZAACZBACBCgASAEBpldJAESIAESIAESIAESIAESIAESIAEaAHgPkAAJkAAJkAAJkAAJkAAJkAAJkEAIEKABIAQGmV0kARIgARIgARIgARIgARIgARIgARoAeA+QAAmQAAmQAAmQAAmQAAmQAAmQQAgQoAEgBAaZXSQBEiABEiABEiABEiABEiABEiABGgB4D5AACZAACZAACZAACZAACZAACZBACBCgASAEBpldJAESIAESIAESIAESIAESIAESIAEaAHgPkAAJkAAJkAAJkAAJkAAJkAAJkEAIEKABIAQGmV0kARIgARIgARIgARIgARIgARIggcREQAIkQAIkQAIkQAIkEDsC69ZvlBMnjsfuJJYmARIICQJ58+aRNKlTh0Rf2cnrjwANANffmLHFJEACJEACJEAC15DA6jVr5a13O0uJ4sWuYSt4aRIggfhIYNv2HZIubVrp2f2D+Ng8tokEhAYA3gQkQAIkQAIkQAIkEAsChw8fkQrly8qb7drE4iwWJQESCAUC69ZtkIGDvg2FrrKP1ykB5gC4TgeOzSYBEiABEiABEiABEiABEiABEiCB2BCgASA2tFiWBEiABEiABEiABEiABEiABEiABK5TApwCcJ0OXKg0e+vWbbJm7fpQ6S77SQIkQAJSqlRxyZwpE0mQAAmQAAmQAAmQQJwToAEgzpGywrgk8MrrHeTmiuUlVcoUcVkt6yIBEiCBeElg67bt8v2wX+TLLz6Ll+1jo0iABEiABEiABK5vAjQAXN/jd8O3PlWqlNLqhWe5lMoNP9LsIAmQAAhsDNskfT4fSBgkQAIkQAIkQAIkcEUIMAfAFcHKSkmABEiABEiABEiABEiABEiABEggfhGgASB+jQdbQwIkQAIkQAIkQAIkQAIkQAIkQAJXhAANAFcEKyslARIgARIgARIgARIgARIgARIggfhFgAaA+DUebA0JkAAJkAAJkAAJkEA8ILBp06aLWhEWFiYbNmyQc+fOXXQstjtOnDgh+/fvt9OOHz8uBw4ciG0VLE8CJEACsSZAA0CskfEEEiABEiABEiABEohIYOvWrVKwYEF54oknIvxt27YtYsE4fnfffffFcY0Rq1u1apXs3r074s6Ad8uWLZMPPvggYO/Fb1evXi3vvvvuxQc8e3bu3Clr1qzx7Ln8TSjrM2bMiFVFaEP//v395/zxxx9yzz33yIABA+Trr7+WevXqyX///ec/HpMNtOOBBx6woocOHZKHHnpIli5dKnv37pUmTZrIihUrLqpmwYIF0qJFC3nhhRfkrbfeklOnTlkZsGzVqpU888wz8v77719kkJg/f7589dVX/vq6d+9u18b18XfXXXcJ6o6p1KpVS1588cWLiqNt9evXv2h/dDseeeQRKzJw4EAZPXr0RcXRz/fee09atmwpTz/9tMybN89fpkePHvL888/Lk08+KcuXL/fvdxs4xwnuX9dnvDZo0EDeeOMNd5ivJBCSBLgKQEgOOztNAiRAAiRAAiQQ1wRuvfVWGTp0aFxXG2V9o0aNivL45R4cN26c3HzzzZIlS5bLrSpG58OYsHbtWilSpEiMysekEJRJKJrVqlWLSXErA0PFp59+attQIr/44guBESBp0qS27+DBg2YE+OeffyRJkiQxqjdhwoTy+++/W9nFixdL3bp15fbbb5cJEybI/fffL1WrVo1Qz9GjR6Vt27Z2TurUqU2h/+STT6Rdu3amAI8YMUIyZMgggwcPls8//1xat24tu3btkiFDhpih4tlnn/XX51V6YWSB4l6qVCn/8Zhs4DywdAwQwbBnz56YnBppGbQjmHTt2lVKliwpHTt2FBhLateuLTNnzrRxBAsYYjAGMKKMHTtWEiVKJCNHjpRff/1VxowZ4zfeFCtWzM8c1wEHGD8oJBDKBGgACOXRZ99JgARIgARIgASuOIF+/fqZMlOjRg1BREDnzp1NYXv11VdNCfv3338FIeDly5c35Q4NgiLcpUsXSZEihbWvV69eki5dOsE5N910k8yePVsGDRpk7z/++GNTjA4fPizr16+XJUuWSIcOHUwxgoKWOHFiUxITJEggf//9t22j3vTp08tHH31kytP//vc/yZw5syCSYfv27abwnjlzRqBkon0oW6BAAXn55ZfN27xlyxaBgtm4ceNI+Z09e1befPNNgeIIJblixYr+shs3bjSPNpRJMEE7oKyBFULhCxUqJHfeeaeV2bFjhym2UJah/ELgHcZ5aCM8xLfddpvgeu+8846VhfLctGlT80737NlT5syZYwp08+bNzWOOfuLcZs2amRLub5huIPQfrLJly2a7oWziuk7xxU6MxTfffCOnT5+2vmFcoJjiPLQNBoNZs2bZ+eXKlZNXXnnFtlEOx2Fc2LdvnzH/8ccf5ciRI5I3b94IyikiL9A31AupUqWK9OnTR+Ddr1y5sin/2I+oE3i3YQCAQQDvwRL3UDBBXz777DO/4QJtce0LVt7tu/fee+XPP/+Uhg0b2i4YRBCBMnz4cHuPPuD+AIPNmzcL7ikXoQJ
<p class="caption"><strong>Figure 2.</strong> immuneSIM flowchart.</p>
</div>
</div>
<div id="parameters" class="section level3 unnumbered">
<h3>Parameters</h3>
<ul>
<li><code>number_of_seqs</code>: Integer defining the number of sequences that should be simulated</li>
<li><code>vdj_list</code>: List containing germline genes and their frequencies</li>
<li><code>species</code>: String defining species for which repertoire should be simulated (&quot;mm&quot;: mouse, &quot;hs&quot;: human. Default: &quot;mm&quot;).</li>
<li><code>receptor</code>: String defining receptor type (&quot;ig&quot; or &quot;tr&quot;. Default: &quot;ig&quot;)</li>
<li><code>chain</code>: String defining chain (for ig: &quot;h&quot;,&quot;k&quot;,&quot;l&quot;, for tr: &quot;b&quot; or &quot;a&quot;. Default: &quot;h&quot;)</li>
<li><code>insertions_and_deletion_lengths</code>: Data.frame containing np1, np2 sequences as well as deletion lengths. (Pooled from murine repertoire data, Greiff,2017) Note: This is a subset of 500000 observations of the dataframe used in the paper. The full dataframe which can be introduced here can be found on: (Git-Link)</li>
<li><code>user_defined_alpha</code>: Numeric. Scaling parameter used for the simulation of powerlaw distribution (recommended range 2-5. Default: 2, <a href="https://en.wikipedia.org/wiki/Power_law" class="uri">https://en.wikipedia.org/wiki/Power_law</a>)</li>
<li><code>name_repertoire</code>: String defining chosen repertoire name recorded in the name_repertoire column of the output for identification.</li>
<li><code>length_distribution_rand</code>: Vector containing lengths of immune receptor sequences based on immune repertoire data (Greiff, 2017).</li>
<li><code>random</code>: Boolean. If TRUE repertoire will consist of fully random sequences, independent of germline genes.</li>
<li><code>shm.mode</code>: String defining mode of somatic hypermutation simulation based on AbSim (options: 'none', 'data','poisson', 'naive', 'motif', 'wrc'. Default: 'none'). See AbSim documentation.</li>
<li><code>shm.prob</code>: Numeric defining probability of a SHM (somatic hypermutation) occurring at each position.</li>
<li><code>vdj_noise</code>: Numeric between 0,1, setting noise level to be introduced in provided V,D,J germline frequencies. 0 denotes no noise. (Default: 0)</li>
<li><code>vdj_dropout</code>: Named vector containing entries V,D,J setting the number of germline genes to be dropped out. (Default: c(&quot;V&quot;=0,&quot;D&quot;=0,&quot;J&quot;=0))</li>
<li><code>ins_del_dropout</code>: String determining whether insertions and deletions should occur. Options: &quot;&quot;, &quot;no_insertions&quot;, &quot;no_insertions_n1&quot;, &quot;no_insertions_n2&quot;, &quot;no_deletions_v&quot;, &quot;no_deletions_d_5&quot;, &quot;no_deletions_d_3&quot;, &quot;no_deletions_j&quot;, &quot;no_deletions_vd&quot;, &quot;no_deletions&quot;. Default: &quot;&quot;)</li>
<li><code>equal_cc</code>: Boolean that if set TRUE will override user_defined_alpha and generate a clone count distribution that is equal for all sequences. Default: FALSE.</li>
<li><code>freq_update_time</code>: Numeric determining whether simulated VDJ frequencies agree with input after set amount of sequences to correct for VDJ bias. Default: Update after 50 percent of sequences.</li>
<li><code>max_cdr3_length</code>: Numeric defining maximal length of cdr3. (Default: 100)</li>
<li><code>min_cdr3_length</code>: Numeric defining minimal length of cdr3. (Default: 6)</li>
<li><code>verbose</code>: Boolean toggling printing of progress on and off (Default: FALSE)</li>
<li><code>airr_compliant</code>: Boolean determining whether output repertoire should be named in an AIRR compliant manner (Default: TRUE). (<a href="http://docs.airr-community.org/en/latest/" class="uri">http://docs.airr-community.org/en/latest/</a>)</li>
</ul>
</div>
</div>
<div id="results" class="section level2 unnumbered">
<h2>Results</h2>
<p>Following the quickstart guide, we can easily generate a TCRβ repertoire with 1000 different sequences:</p>
<pre class="r"><code># sim_repertoire &lt;- immuneSIM(
# number_of_seqs = 1000,
# species = &quot;hs&quot;,
# receptor = &quot;tr&quot;,
# chain = &quot;b&quot;,
# verbose= TRUE)
#
# save(sim_repertoire, file=&quot;data/simulated_repertoires/00_first_test&quot;)
#
# plot_report_repertoire(sim_repertoire, output_dir = &quot;data/simulated_repertoires/&quot;)
load(&quot;data/simulated_repertoires/00_first_test&quot;)</code></pre>
<p>The immuneSIM function outputs an R dataframe containing 20 columns and rows equal to the number of sequences simulated. Per sequence immuneSIM provides the following information:</p>
<ul>
<li><strong>Full VDJ sequence</strong> (nucleotide and amino acid): sequence, sequence_aa</li>
<li><strong>CDR3 junctional sequence</strong> (nt and aa): junction, junction_aa</li>
<li><strong>VDJ genes</strong> used in the recombination event: v_call, d_call, j_call</li>
<li><strong>Nucleotide insertions</strong> VD and DJ: np1, np2</li>
<li><strong>Length of deletion</strong> in V, D and J genes: del_v, del_d_5, del_d_3, del_j</li>
<li><strong>CDR3 subsequences</strong> from V,D and J genes: v_sequence_alignment, d_sequence_alignment, j_sequence_alignment</li>
<li><strong>Clonal frequency/count</strong> information: freqs, counts</li>
<li><strong>Summary of somatic hypermutation</strong> (SHM) event simulated (only for BCR): shm_events</li>
<li><strong>Given name of repertoire</strong>: name_repertoire</li>
</ul>
<pre class="r"><code>datatable(sim_repertoire,
class = 'nowrap compact order-column',
extensions = c('Buttons', 'FixedColumns'),
options = list(pageLength = 10,
lengthMenu = c(10, 20, 50, 100),
dom = 'Blfrtip',
buttons = c('csv', 'excel', 'colvis'),
scrollX = TRUE,
fixedColumns = TRUE,
paging = TRUE))</code></pre>
<div id="htmlwidget-a2684618d882d307cfa1" style="width:100%;height:auto;" class="datatables html-widget"></div>
<script type="application/json" data-for="htmlwidget-a2684618d882d307cfa1">{"x":{"filter":"none","extensions":["Buttons","FixedColumns"],"data":[["1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31","32","33","34","35","36","37","38","39","40","41","42","43","44","45","46","47","48","49","50","51","52","53","54","55","56","57","58","59","60","61","62","63","64","65","66","67","68","69","70","71","72","73","74","75","76","77","78","79","80","81","82","83","84","85","86","87","88","89","90","91","92","93","94","95","96","97","98","99","100","101","102","103","104","105","106","107","108","109","110","111","112","113","114","115","116","117","118","119","120","121","122","123","124","125","126","127","128","129","130","131","132","133","134","135","136","137","138","139","140","141","142","143","144","145","146","147","148","149","150","151","152","153","154","155","156","157","158","159","160","161","162","163","164","165","166","167","168","169","170","171","172","173","174","175","176","177","178","179","180","181","182","183","184","185","186","187","188","189","190","191","192","193","194","195","196","197","198","199","200","201","202","203","204","205","206","207","208","209","210","211","212","213","214","215","216","217","218","219","220","221","222","223","224","225","226","227","228","229","230","231","232","233","234","235","236","237","238","239","240","241","242","243","244","245","246","247","248","249","250","251","252","253","254","255","256","257","258","259","260","261","262","263","264","265","266","267","268","269","270","271","272","273","274","275","276","277","278","279","280","281","282","283","284","285","286","287","288","289","290","291","292","293","294","295","296","297","298","299","300","301","302","303","304","305","306","307","308","309","310","311","312","313","314","315","316","317","318","319","320","321","322","323","324","325","326","327","328","329","330","331","332","333","334","335","336","337","338","339","340","341","342","343","344","345","346","347","348","349","350","351","352","353","354","355","356","357","358","359","360","361","362","363","364","365","366","367","368","369","370","371","372","373","374","375","376","377","378","379","380","381","382","383","384","385","386","387","388","389","390","391","392","393","394","395","396","397","398","399","400","401","402","403","404","405","406","407","408","409","410","411","412","413","414","415","416","417","418","419","420","421","422","423","424","425","426","427","428","429","430","431","432","433","434","435","436","437","438","439","440","441","442","443","444","445","446","447","448","449","450","451","452","453","454","455","456","457","458","459","460","461","462","463","464","465","466","467","468","469","470","471","472","473","474","475","476","477","478","479","480","481","482","483","484","485","486","487","488","489","490","491","492","493","494","495","496","497","498","499","500","501","502","503","504","505","506","507","508","509","510","511","512","513","514","515","516","517","518","519","520","521","522","523","524","525","526","527","528","529","530","531","532","533","534","535","536","537","538","539","540","541","542","543","544","545","546","547","548","549","550","551","552","553","554","555","556","557","558","559","560","561","562","563","564","565","566","567","568","569","570","571","572","573","574","575","576","577","578","579","580","581","582","583","584","585","586","587","588","589","590","591","592","593","594","595","596","597","598","599","600","601","602","603","604","605","606","607","608","609","610","611","612","613","614","615","616","617","618","619","620","621","622","623","624","625","626","627","628","629","630","631","632","633","634","635","636","637","638","639","640","641","642","643","644","645","646","647","648","649","650","651","652","653","654","655","656","657","658","659","660","661","662","663","664","665","666","667","668","669","670","671","672","673","674","675","676","
<p>It also generates three plots with the following information about the repertoire composition:</p>
<ul>
<li>Aminoacid frequency per HVR position</li>
</ul>
<div class="figure">
<embed src="data:application/pdf;base64,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
</div>
<ul>
<li>VDJ length distribution</li>
</ul>
<div class="figure">
<embed src="data:application/pdf;base64,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
</div>
<ul>
<li>V, D and J segments usage</li>
</ul>
<div class="figure">
<embed src="data:application/pdf;base64,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
</div>
</div>
</div>
<div id="ion-torrent-sequencing-simulation" class="section level1">
<h1><span class="header-section-number">2</span> Ion Torrent sequencing simulation</h1>
<div id="curesim" class="section level2 unnumbered">
<h2><code>CuReSim</code></h2>
<ul>
<li><a href="http://www.pegase-biosciences.com/wp-content/uploads/2015/05/manual.pdf">Manual</a></li>
<li><a href="https://bmcgenomics.biomedcentral.com/articles/10.1186/1471-2164-15-264">Publication in <em>BMC Genomics</em></a></li>
</ul>
<p>CuReSim (Customized Read Simulator) is a customized tool which generates synthetic NGS reads, supporting read simulation for major letter-base sequencing platforms.</p>
<p>The main features of CuReSim include:</p>
<ul>
<li>Genome (fasta) or <strong>read (fastq) as input file</strong>.</li>
<li>Choice between several <strong>error distributions</strong>.</li>
<li>A particular attention has been paid to special cases for which several introduced errors in the same read can result in less number of errors as expected due to compensatory changes.</li>
<li>Generation of diagrams to know exactly the simulated error model (R is required).</li>
</ul>
<p>For CuReSim input a .fastq file with the simulated TCR sequences (multiplied by their respective counts) is generated. Specifically, reverse complement sequences are required to mimic our experimental data.</p>
<pre class="r"><code>######## Generate .fastq file for CuReSim #######
seqs &lt;- as.character(sim_repertoire$sequence)
counts &lt;- sim_repertoire$counts
reads &lt;- DNAStringSet(rep(seqs, counts))
names(reads) &lt;- seq(1, length(reads))
reads_rc &lt;- reverseComplement(reads)
# writeXStringSet(reads_rc, &quot;software/CuReSim/input/00_first_test.fastq&quot;, format = &quot;fastq&quot;)
print(paste0(&quot;Number of reads: &quot;, length(reads_rc)))</code></pre>
<pre><code>## [1] &quot;Number of reads: 1643918&quot;</code></pre>
<div class="alert alert-dismissible alert-warning">
<p><strong>Heads up!</strong> immuneSIM generates full-length VDJ sequences (~350 bp), while our reads contain also part of the first exon of segment C, along with the barcode and adapters sequences (~450 bp). We could introduce manually those extra nucleotides to make the simulated data even more similar to the experimental sequences.</p>
</div>
<div id="methods-overview-1" class="section level3 unnumbered">
<h3>Methods overview</h3>
<ol style="list-style-type: decimal">
<li><strong>Input file pre-processing</strong>: not required in our case since the input is not a genome, but directly the reads without errors.</li>
<li><strong>Indel generation</strong>: user-defined rates. By default an iterative algorithm mostly introduces indels in the longer homopolymers.</li>
<li><strong>Substitution generation</strong>: user-defined rate. By default substitution probability increases at the end of the read.</li>
<li><strong>Correction step</strong>: to avoid compensatory changes that reduce the number of expected errors (i.e. deletion of an inserted base or substitution of an insertion).</li>
</ol>
</div>
<div id="parameters-1" class="section level3 unnumbered">
<h3>Parameters</h3>
<p>Options are given with default values in brackets.</p>
<p><code>java -jar CuReSim.jar [options] -f &lt;input_file&gt; [options]</code></p>
<ul>
<li><code>f</code> (String) genome fasta file or reads fastq file. It is the only MANDATORY field</li>
<li><code>o</code> (String) name of output fastq file [output.fastq]</li>
<li><code>n</code> (integer) number of reads to generate [50000]</li>
<li><code>m</code> (integer) read mean size [200 bases]</li>
<li><code>sd</code> (float) standard deviation for read size [20.0]</li>
<li><code>r</code> (integer) number of random reads [0]</li>
<li><strong><code>d</code> (float) deletion rate [0.01]</strong></li>
<li><strong><code>i</code> (float) insertion rate [0.005]</strong></li>
<li><strong><code>s</code> (float) substitution rate [0.005]</strong></li>
<li><code>ui</code> when option -ui is added uniform distribution is drawn for indels [homopolymers]</li>
<li><code>us</code> when option -us is added uniform distribution is drawn for substitutions [exponential]</li>
<li><code>q</code> (character) quality encoding character in fastq file [5]</li>
<li><code>v</code> verbose mode generating diagrams. R software is required [false]</li>
<li><code>skip</code> skip the correction step [false]</li>
<li><code>h</code> print this help</li>
</ul>
<p>Default values for deletion (1%), insertion (0.5%) and substitution (0.5%) rates are those typical of IonTorrent technology <a href="https://bmcgenomics.biomedcentral.com/articles/10.1186/1471-2164-15-264">(source)</a>.</p>
</div>
</div>
<div id="results-1" class="section level2 unnumbered">
<h2>Results</h2>
<!-- ### Diagrams generated by CuReSim {-} -->
<!-- **Section removed because diagrams were replaced when executing CuReSim with new error rates :(** -->
<!-- ![](software/CuReSim/output/diagrams/stat.pdf){width=100% height=650px} -->
<!-- ![](software/CuReSim/output/diagrams/indels.pdf){width=100% height=650px} -->
<!-- ![](software/CuReSim/output/diagrams/indelsPos.pdf){width=100% height=650px} -->
<!-- ![](software/CuReSim/output/diagrams/sub.pdf){width=100% height=650px} -->
<div id="readlength-distribution-before-and-after-sequencing-simulation" class="section level3 unnumbered">
<h3>Readlength distribution before and after sequencing simulation</h3>
<pre class="r"><code>rl_before &lt;- ggplot() +
aes(width(reads_rc)) +
geom_histogram(color=&quot;dodgerblue&quot;, fill=&quot;dodgerblue&quot;, binwidth = 1) +
scale_y_continuous(name = &quot;Counts&quot;, expand = c(0.01,0)) +
scale_x_continuous(&quot;Read length&quot;, expand = c(0.01,0)) +
ggtitle(&quot;Before&quot;) +
theme_pubr()</code></pre>
<pre class="r"><code>### nohup java -jar CuReSim.jar -f ../input/00_first_test.fastq -d 0.01 -i 0.005 -s 0.005 -o ../output/00_first_test.fastq -v &amp;
curesim_fq &lt;- ShortRead::readFastq(&quot;software/CuReSim/output/00_first_test.fastq&quot;) # Read .fq file and store in a ShortReadQ class object
reads_sim &lt;- ShortRead::sread(curesim_fq) # DNAStringSet with the reads
quality_sim &lt;- quality(curesim_fq) # BStringSet with the sequencing qualities
new.quality.class &lt;- switch(class(quality_sim), # Convert from BStringSet to XStringQuality
SFastqQuality=&quot;SolexaQuality&quot;,
FastqQuality=&quot;PhredQuality&quot;,
&quot;XStringQuality&quot;)
quality_sim &lt;- as(quality_sim, new.quality.class)
sample_sim &lt;- QualityScaledDNAStringSet(reads_sim, quality_sim) # Get QualityScaledDNAStringSet to use as a pairwiseAlignment input
names(sample_sim) &lt;- as.character(curesim_fq@id) # Character vector with the reads IDs
sample_sim_rc &lt;- reverseComplement(sample_sim)
# Readlength histogram
rl_after &lt;- ggplot() +
aes(width(sample_sim_rc)) +
geom_histogram(color=&quot;dodgerblue&quot;, fill=&quot;dodgerblue&quot;, binwidth = 1) +
scale_y_continuous(name = &quot;Counts&quot;, expand = c(0.01,0)) +
scale_x_continuous(&quot;Read length&quot;, expand = c(0.01,0)) +
ggtitle(&quot;After&quot;) +
theme_pubr()
###
rm(reads_sim, quality_sim, sample_sim, curesim_fq)</code></pre>
<pre class="r"><code>rl_before + rl_after</code></pre>
<p><img src="data:image/png;base64,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
</div>
</div>
</div>
<div id="applying-our-pipeline" class="section level1">
<h1><span class="header-section-number">3</span> Applying our pipeline</h1>
<div id="vj-alignment" class="section level2 unnumbered">
<h2>VJ alignment</h2>
<pre class="r"><code>######################################################
#################### VJ alignment ####################
######################################################
### VJ_alignment.R script executed via terminal (nohup)
print(&quot;Execution time: 14.5789240725173 hours&quot;)</code></pre>
<pre><code>## [1] &quot;Execution time: 14.5789240725173 hours&quot;</code></pre>
<pre class="r"><code>vj_alg_sim &lt;- readRDS(&quot;data/simulated_repertoires/VJ_alignment_first_sim_rep.rds&quot;) # Data too big for datatable (RStudio crashes)</code></pre>
<div class="alert alert-dismissible alert-warning">
<p><strong>Heads up!</strong> Sample 111L had ~200,000 reads (~2 hours for VJ alignment), while our simulated repertoire of 1000 different HVR has a total count of ~1,600,000 reads. immuneSIM does not have a specific parameter for total counts or sequencing coverage.</p>
</div>
<div id="alignment-summary" class="section level3 unnumbered">
<h3>Alignment summary</h3>
<pre class="r"><code>###################################################### (4)
################# VJ alignment results ###############
###################################################### (4)
alg_rep_data &lt;- select(vj_alg_sim,
V_score,
J_score,
Cys_check,
Phe_check,
HVR_frame)
alg_rep_data$HVR_status &lt;- ifelse((alg_rep_data$V_score &lt; 0 | alg_rep_data$J_score &lt; 0 | !alg_rep_data$Cys_check | !alg_rep_data$Phe_check),
&quot;HVR not found&quot;,
&quot;HVR found&quot;)
alg_rep_data$label &lt;- NA
alg_rep_data[alg_rep_data$V_score &lt; 0, &quot;label&quot;] &lt;- &quot;No V&quot;
alg_rep_data[(alg_rep_data$V_score &gt; 0 &amp; alg_rep_data$J_score &lt; 0), &quot;label&quot;] &lt;- &quot;No J&quot;
alg_rep_data[(alg_rep_data$V_score &gt; 0 &amp; alg_rep_data$J_score &gt; 0 &amp; !alg_rep_data$Cys_check &amp; alg_rep_data$Phe_check), &quot;label&quot;] &lt;- &quot;No Cys&quot;
alg_rep_data[(alg_rep_data$V_score &gt; 0 &amp; alg_rep_data$J_score &gt; 0 &amp; alg_rep_data$Cys_check &amp; !alg_rep_data$Phe_check), &quot;label&quot;] &lt;- &quot;No Phe&quot;
alg_rep_data[(alg_rep_data$V_score &gt; 0 &amp; alg_rep_data$J_score &gt; 0 &amp; !alg_rep_data$Cys_check &amp; !alg_rep_data$Phe_check), &quot;label&quot;] &lt;- &quot;No Cys no Phe&quot;
alg_rep_data[(alg_rep_data$V_score &gt; 0 &amp; alg_rep_data$J_score &gt; 0 &amp; alg_rep_data$Cys_check &amp; alg_rep_data$Phe_check), &quot;label&quot;] &lt;- paste(&quot;Frame&quot;, alg_rep_data[(alg_rep_data$V_score &gt; 0 &amp; alg_rep_data$J_score &gt; 0 &amp; alg_rep_data$Cys_check &amp; alg_rep_data$Phe_check), &quot;HVR_frame&quot;])
PieDonut(alg_rep_data, aes(HVR_status,label),
showPieName=FALSE,
labelposition = 1,
showRatioThreshold = 0.009,
color = &quot;white&quot;,
explode = 2,
explodeDonut = TRUE,
explodePie = TRUE,
r0 = 0,
r1 = 0.9,
start = pi/2,
maxx = 1.6,
explodePos = 0,
donutLabelSize = 3.5,
showRatioDonut = FALSE,
title = &quot;VJ alignment (simulated repertoire)&quot;)</code></pre>
<p><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABUAAAAPACAIAAAB7BESOAAAACXBIWXMAAB2HAAAdhwGP5fFlAAAgAElEQVR4nOzdd3wU9b7/8c/sbnpvhISQEOkRpIgKUlUQOEdURFEEu3iOYle8KqjHdu3o1aM/jwXRg4oohyPqUUHwqAgqSBNDSyWBkN777s7vj8FhSdm0TWY3eT0fPHxMdqd8Zmdn3ffOd75fRVVVAQAAAAAA7s1kdAEAAAAAAKBlBHgAAAAAADwAAR4AAAAAAA9AgAcAAAAAwAMQ4AEAAAAA8AAEeAAAAAAAPAABHgAAAAAAD0CABwAAAADAAxDgAQAAAADwAAR4AAAAAAA8AAEeAAAAAAAPQIAHAAAAAMADEOABAAAAAPAABHgAAAAAADwAAR4AAAAAAA9AgAcAAAAAwAMQ4AEAAAAA8AAEeAAAAAAAPAABHgAAAAAAD0CABwAAAADAAxDgAQAAAADwAAR4AAAAAAA8AAEeAAAAAAAPQIAHAAAAAMADEOABAAAAAPAABHgAAAAAADwAAR4AAAAAAA9AgAcAAAAAwAMQ4AEAAAAA8AAEeAAAAAAAPAABHgAAAAAAD0CABwAAAADAAxDgAQAAAADwAAR4AAAAAAA8AAEeAAAAAAAPQIAHAAAAAMADEOABAAAAAPAABHgAAAAAADwAAR4AAAAAAA9AgAcAAAAAwAMQ4AEAAAAA8AAEeAAAAAAAPAABHkBXmzVrlqIoiqKYzeacnJzWL/jcc88pf/j6669bs8i7776rL3LgwIH2ltwer776qrbdmTNnduV20TVWrFihKMqECROMLsRI3fhNrn90TJw40eha4I7WrVunKMqoUaOsVqvRtQDoWQjwALra/PnztQm73f7xxx+3fsE1a9ZoE5GRkeedd57rKwNap6Cg4N577xWRJ5980uhaABjgwgsvPPPMM3ft2vXSSy8ZXQuAnoUAD6CrXXjhhYGBgdr0qlWrWrlUdnb2L7/8ok1feumlFoulU4rrfNOmTdMbBfz8889Gl4P2uOeeewoLC6dPnz558mSXrJB3BdAOxp44TzzxhIg88sgjGRkZXbxpAD0ZAR5AV/P39589e7Y2vXXr1szMzNYstXbtWlVVtenLL7+8s4pDNzVu3DjtW/7777/fwVVt2rTpvffekz++vqMzuPB4wVjd+FBOmzZt0qRJVVVVt9xyi9G1AOhBCPAADKC3oheRjz76qDWL6O3nY2JiJk2a1CllAa2wePFiEZk+ffqYMWOMrgWAkZYsWSIiX3755aZNm4yuBUBPQYAHYICpU6dGR0dr060J8Hl5eZs3b9am586dazJ58GeXr69v4B88ekd6ph9//HHHjh0ics0117hwtbwrgHYw/MSZOnVqbGysiLzyyitdv3UAPRPfEgAYwGw2683gd+zYcfDgQefzf/rppzabTZu+4oorOre4TvbZZ5+V/+GMM84wuhy0jfY1PTAw8KKLLnLhanlXAO1g+IljMpnmzZsnIuvWreNOeABdgwAPwBhXXnmlPt3iRXi9/XxCQsJZZ53ViWUBzTt69Kj2VpwzZ46/v7/R5cBjrF+//oknnnj44YcLCgqMrqWzuP8+dlKFV111lYjY7fZXX33VhasFgOYQ4AEY46yzzhowYIA27bwv+pKSEv32wssvv1xRlE4v7mSlpaVvvPHGZZddNnbs2Li4OF9f3379+o0fP37BggUbNmxo69ref/99rUun5q4X1dbWLl++fObMmfHx8b6+vn379p0+ffo777xTV1cnDsNTa3diN17tXXfdpT2SmZm5dOnSUaNGRUZGBgcHjxkzZsGCBXpP/g18+umnDRZfv379ZZddlpiY6OvrGx0dPWHChNdff91xxOMDBw7cddddSUlJoaGhoaGhZ5555k033XT48OEWX4Hs7Oxnnnlm8uTJffv21V7M8847b+nSpUePHm3xRWvr3j355JPagj/99JP2yIIFC7RHrrvuuhZLbeCNN97QXgHHThyatGPHjptvvnnq1KmJiYn+/v6DBw+eOXPmAw88kJub63wHG7wrOvu4LF68WFv/woULnexOYmKiNtvXX3/tfMcbaOu509bj1Y73kq6oqGjZsmVTpkzp06ePr69vXFzcueee+//+3/+rqKho0z42oB/KBx54QETy8vImTpw4ffr0hx566PHHH2/yDdCOvYiKilIUxc/PT/uzrKzstddemzhxYmxsrJ+fX2Ji4oUXXvjee+/V19e3WHBHzkcn+9iOU++777677bbbhg8fHhkZ6ePjExcXN2HChMcffzwtLa3FShqcOF1zFDQjRowYNmyYiLz99tu1tbXOZwYAF1ABwCAPP/yw/ln022+/NTeb1uO3ZseOHW3axIoVK/Rl9+/f344iP/nkk8jISCefoklJSdu2bWu84N///ndthhkzZjg+vnLlSu3xMWPGNF5qy5YtAwcObG5D27dv1/fo3nvvbXK1d955p6qqq1atau4S8VVXXWW1Whts99///re+eHV1dXPfsM8555yysjJVVV955RVfX9/GM/j7+3/44YfNvZg2m+1vf/ubnjoa8PLy+utf/1pbW9t4wXbvnZOO4q+99trm6mzO6aefrtVZXV3d3DxpaWlOWtf7+/svWbLEbrc3t4MN3hWdfVy00exF5MYbb3Sy4/369dNm++qrrxwfb+5NrmnHudP649Xu95Lm3XffDQ8Pb3LZxMTELVu26CfahAkTnLwyjemH8v777y8oKEhKSnJc+d69e12yF9oL6+vrq6rq1q1b+/bt2+Qahg4d+ssvvzRXasfPRyf72KZTLysra9q0ac3N7+3tfffdd9fV1TmppMGJ0zVHQXf77bdrM2/atMnJbADgEp46kDKAbmD+/PmPPfaYNr1q1armvvDp7ecHDhw4atSoLipOREQ+++yzuXPn2u12/RGTyeTv7+94jS45OXnq1Kl79+6Ni4vr4OY2bdo0a9asqqoq/RE/Pz+r1apdRktOTp4yZcqcOXNaXM/777+/YMGC4ODgRYsWjR07NjY2dt++fa+//vrevXtF5J///GdiYuKjjz7a5LJ2u33BggVr1qwZP3783Llzhw8fnpmZuXz58h9++EFEvv3220WLFo0cOfKee+7x9fW98847J06c6Ofnt2XLlhdeeKG6urqqqurmm2+eMmVK7969G6zZarVeeeWVH3/8seODvr6+NTU12nR9ff3rr7++b9++tWvXhoWFuWTvRo8e/de//lVE/vWvf+Xl5YnIueeeO2jQIBEZN25ci6+ko+Li4p07d4rIyJEjmwzJInL06NEJEyY4XrIzmUx+fn6VlZXan1VVVU8++aTNZnvqqafatPXOOy6dpH3nTiuPVwffS88//3yDBiwioiiKqqoikp6ePn36dOdNElpDVdWbbropOTlZfyQmJsbxneOSM2Lbtm1Tpkypra2Njo6+9NJLBw8eXFlZuWXLlq+++qq+vn7fvn3nnXfeV199dfbZZzdY0CVbd7KPrT/1Dhw4cN555x05ckR/pMFbpa6ubtmyZXv37l23bp2Pj0+TlTSna47C2LFjX375ZRHZtGnTOeec06YKAaDNjP39AEAPpw/E1b9//yZnKC8v179sPfTQQ21df0euwNfX1/fp00dbNiAg4LHHHktLS6uvr1dVtbKy8scff3Qcjv6OO+5osHhbr8AfO3YsIiJCe8rPz+/RRx/NzMxUVdVms+3cufPqq69u8Ond3BX46dOnBwQEDBkypMH+1tfXz507V5vHZDLl5+c7Pqtf6Q0NDRWRBx54wGaz6c/abDZ9WU2/fv12797tuIbt27ebzWbt2b/97W+NX0+tLatmwIABq1ev1nbwyJEja9euPe200/RnL7744gbLdnDvVFUdO3as9uzKlSsb19Ya+g9Jt912W3PzOPawuGjRot9++027bFhcXPzee+/pMdVisRw5cqTJHWzuCnwnHZdOugLfwXNHbel4deS99O233+rdlZvN5r/+9a/bt2+vqampra3dsWPHX/7ylwadmbf7Crx2i5CXl9cdd9zxyy+/lJaWunAvtCvwFotF
<pre class="r"><code>df1 &lt;- as.data.frame(table(alg_rep_data$HVR_status))
colnames(df1) &lt;- c(&quot;Status&quot;, &quot;# Reads&quot;)
df2 &lt;- as.data.frame(table(alg_rep_data$label))
colnames(df2) &lt;- c(&quot;Status&quot;, &quot;# Reads&quot;)
knitr::kable(df1)</code></pre>
<table>
<thead>
<tr class="header">
<th align="left">Status</th>
<th align="right"># Reads</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td align="left">HVR found</td>
<td align="right">1555379</td>
</tr>
<tr class="even">
<td align="left">HVR not found</td>
<td align="right">88539</td>
</tr>
</tbody>
</table>
<pre class="r"><code>knitr::kable(df2)</code></pre>
<table>
<thead>
<tr class="header">
<th align="left">Status</th>
<th align="right"># Reads</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td align="left">Frame 0</td>
<td align="right">492201</td>
</tr>
<tr class="even">
<td align="left">Frame 1</td>
<td align="right">514612</td>
</tr>
<tr class="odd">
<td align="left">Frame 2</td>
<td align="right">548566</td>
</tr>
<tr class="even">
<td align="left">No Cys</td>
<td align="right">14071</td>
</tr>
<tr class="odd">
<td align="left">No Cys no Phe</td>
<td align="right">681</td>
</tr>
<tr class="even">
<td align="left">No Phe</td>
<td align="right">73787</td>
</tr>
</tbody>
</table>
<p>HVR can be delimited if <strong>V and J segments and their conserved Cys and Phe codons are identified in the read</strong>. This is the case for most of the reads (<strong>94.6%</strong>). However, the proportion of the three possible HVR reading frames does not resemble that of the real repertoires analyzed. Both samples 111H and 111L had a large proportion of HVRs in frame (frame 0), while the simulated repertoire reading frames have the same frequency.</p>
<div class="alert alert-dismissible alert-warning">
<p><strong>Heads up!</strong> Sequencing error rates need to be tuned. We could try and estimate them from the VJ alignments of real repertoires and/or try a different Ion Torrent sequencing simulator.</p>
</div>
</div>
<div id="unique-reads" class="section level3 unnumbered">
<h3>Unique reads</h3>
<p>Reads with delimited HVR (<strong>1,555,379 reads</strong>) can be grouped into unique clonotypes (same V and J match and HVR sequence). This results in <strong>84,412 unique reads</strong>:</p>
<pre class="r"><code>###################################################### (5)
################## Unique reads table ################
###################################################### (5)
vj_alg_good &lt;- vj_alg_sim[!(vj_alg_sim$V_score &lt; 0 | vj_alg_sim$J_score &lt; 0 | !vj_alg_sim$Cys_check | !vj_alg_sim$Phe_check),]
vj_alg_good_splt &lt;- split(vj_alg_good, paste0(vj_alg_good$V_match, &quot; / &quot;,
vj_alg_good$HVR_sequence, &quot; / &quot;,
vj_alg_good$J_match))
vj_alg_unique &lt;- dplyr::bind_rows(lapply(vj_alg_good_splt, function(x){
qual_mat &lt;- do.call(rbind, lapply(x[,&quot;HVR_quality&quot;], function(y){strtoi(charToRaw(y),16L)-33}))
qual_med &lt;- round(robustbase::colMedians(qual_mat))
qual_ascii &lt;- rawToChar(as.raw(qual_med+33))
df_row &lt;- x[1,]
df_row &lt;- subset(df_row, select=-HVR_quality)
df_row$HVR_quality_median &lt;- qual_ascii
df_row$Counts &lt;- nrow(x)
return(df_row)
}))
vj_alg_unique &lt;- dplyr::select(vj_alg_unique,
c(V_match,
J_match,
HVR_sequence,
HVR_quality_median,
HVR_frame,
Counts))
# DT::datatable(vj_alg_unique, # Data too big for datatables, although it can be generated
# class = 'nowrap compact order-column',
# extensions = c('Buttons', 'FixedColumns'),
# options = list(pageLength = 10,
# lengthMenu = c(10, 20, 50, 100),
# dom = 'Blfrtip',
# buttons = c('csv', 'excel', 'colvis'),
# scrollX = TRUE,
# fixedColumns = TRUE,
# paging = TRUE))</code></pre>
</div>
<div id="vj-families" class="section level3 unnumbered">
<h3>VJ families</h3>
<p>There are <strong>371 VJ families</strong> in the sample. A heatmap with the <strong>number of unique HVR sequences per VJ family</strong> is shown here:</p>
<pre class="r"><code>###################################################### (6)
######### Heatmap unique reads per VJ family #########
###################################################### (6)
vj_mat &lt;- as.data.frame(table(vj_alg_unique[,c(&quot;V_match&quot;, &quot;J_match&quot;)]))
vj_mat[vj_mat == 0] &lt;- NA
vj_mat$V_match &lt;- factor(vj_mat$V_match, levels = rev(str_sort(unique(vj_mat$V_match), numeric = TRUE)))
vj_mat$J_match &lt;- factor(vj_mat$J_match, levels = str_sort(unique(vj_mat$J_match), numeric = TRUE))
vj_heatmap &lt;- ggplot(vj_mat, aes(J_match, V_match, fill = Freq)) +
geom_tile(color = &quot;white&quot;) +
coord_equal() +
geom_text(aes(label = Freq), size = 3) +
scale_x_discrete(expand = c(0,0), name = &quot;J match&quot;) +
scale_y_discrete(expand = c(0,0), name = &quot;V match&quot;) +
scale_fill_gradient(low = &quot;aquamarine3&quot;, high = &quot;red&quot;, name = &quot;Unique HVR count&quot;, na.value = &quot;gray90&quot;) +
theme_pubr() +
theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1),
text = element_text(size = 10))
vj_heatmap</code></pre>
<p><img src="data:image/png;base64,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VRSlVq1aIhIXF/f666/Xq1fPycnJ19f3z3/+87lz5/J3VhTl5s2b5u3Xr1+fMGFCkyZNnJycqlev3qdPn02bNolIx44dFUX57bfftG7bt29XFKVKlSr5y/j6668VRWnWrFn+U5s2bXruuedq1qypVTV8+PDDhw+X1fQL07NnT+0p77Vr1+Y/qz3+7OTkFBQUVNIrX7t2TTvw9vZ+YOc7d+7MmDHjqaeecnV19fDw6Nix44cffpienm7RLSsra+7cuZ07d65ataqjo2O9evVGjBiR/1Uq0etf/IUxcuRIRVF++uknEXn33XcVRenatWuxXouKT6las7G1a9CTojj4PGntIvSkKErXHtYuAgAA3RFAAwAAoDxEREQ89dRTW7Zs6dy5c3BwcGJi4vLly1u2bBkVFVX0wEOHDjVr1mzWrFlnzpzJzMy8cePG9u3bg4ODR48enT8qLZHs7Oxhw4YFBwdv3LgxISEhMzMzJiZm1apV/v7+kydPLs2VH8jW1lb7dMGNGzdmZmZanNU2gA4MDHR2di7plbVEu0GDBk899VTRPc+dO9eqVat333336NGjaWlpt27dOnTo0NSpU319fS9evGjqdvny5bZt27755psHDhxISkrKysq6dOnS119/7e/vP2XKlJKWl98DF4a3t7efn5/2UtSoUcPPz69Bgwalv28FoBgMbZ9+2dpV6EkxeI6p0B87aTAoq7dYuwgAAHRHAA0AAADdZWZmDhw4cPDgwWfPnl21atXatWujo6N9fX1v3749ceLEIgbeuXNnwIABt27dcnJy+te//nXw4MHw8PDZs2e7uLh8+eWXERERpanq7bffXr16tYiMGTNm3759ly9f3r59+7PPPisi06ZNmzNnTjGvk5qaeqpw5mGuuaFDh4pIenr6tm3bzNtjY2O1eZVo/42UlJSjR48OHz58y5Yt9vb2S5YsMRiK+qu+qqpDhgyJjY11cXGZP39+REREbGzs4sWLq1evfvXq1UGDBhmNRhHJycnp37//qVOnbGxsJk2adPDgwQsXLoSGhrZv315E/vnPfy5fvrz4ReZXnIUxffr0kydPduzYUUT+/ve/nzx5spQ3BQAAQHmytXYBAAAAqPiSk5N9fX3nzp1ravH09HznnXfGjBlT9H4Xn3766dWrVx0cHA4cONC6dWutsXXr1r169WrXrl1GRsZDlxQVFTV//nwRmT179ptvvqk1ent7P/vss2PGjFm6dOmUKVNGjRpVtWrVB15q586dfn5+JS2gc+fOdevWvXTp0tq1a/v3729q1x5/dnZ27tu3b4ED09PTFUUp7LItW7ZctGiRv79/0XdftWpVWFiYra3t/v37n3jiCa2xUaNGTzzxRMeOHY8cORIeHt62bds1a9YcPXpURNatWzdgwACtW7169fr06RMQELBz58733ntv2LBhtrYP+WvFQy8MAAAAPC54AhoAAADlwRTymvj4+IhIUlJSEaM+++wzERk3bpwpfda0aNHi1VdfLU09X3/9taqqfn5+48ePtzg1e/ZsJyen1NTUnTt3luYWRVMUZciQISKyefPmO3fumNq1DaD79etXqVKlh7hsampqYmLiA7tpL+zw4cNN6bPG39+/d+/e9evXDw8PF5ENGzaISLdu3Uzps8be3v7jjz8W
</div>
<div id="one-membered-families" class="section level3 unnumbered">
<h3>One-membered families</h3>
<p><strong>53 VJ families</strong> with only one HVR sequence are excluded from the clustering step. These families are shown here:</p>
<pre class="r"><code>data_ec &lt;- vj_alg_good
### Unique reads
data_ec_uniq &lt;- plyr::ddply(data_ec,.(V_match, J_match, HVR_sequence, HVR_frame), nrow)
data_ec_uniq &lt;- data_ec_uniq %&gt;% dplyr::rename(Counts = V1)
vj_fam &lt;- split(data_ec_uniq, paste0(data_ec_uniq$V_match, &quot; / &quot;, data_ec_uniq$J_match)) # Split data frame by VJ match into list of data frames
### Single-member VJ families
single_idx &lt;- unlist(lapply(vj_fam, function(x){nrow(x) == 1})) # Logic vector for one-membered families
vj_sgl_member &lt;- bind_rows(vj_fam[single_idx]) # Data frame with one member clonotypes
DT::datatable(vj_sgl_member,
class = 'nowrap compact order-column',
extensions = c('Buttons', 'FixedColumns'),
options = list(pageLength = 10,
lengthMenu = c(10, 20, 50, 100),
dom = 'Blfrtip',
buttons = c('csv', 'excel', 'colvis'),
scrollX = TRUE,
fixedColumns = TRUE,
paging = TRUE))</code></pre>
<div id="htmlwidget-5a33eee14b2dcaf429b2" style="width:100%;height:auto;" class="datatables html-widget"></div>
<script type="application/json" data-for="htmlwidget-5a33eee14b2dcaf429b2">{"x":{"filter":"none","extensions":["Buttons","FixedColumns"],"data":[["1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31","32","33","34","35","36","37","38","39","40","41","42","43","44","45","46","47","48","49","50","51","52","53"],["TRBV10-1*01_F","TRBV10-1*01_F","TRBV10-1*01_F","TRBV10-2*01_F","TRBV10-2*01_F","TRBV10-3*02_F","TRBV10-3*02_F","TRBV11-1*01_F","TRBV11-1*01_F","TRBV11-1*01_F","TRBV11-2*01_F","TRBV11-2*01_F","TRBV11-3*01_F","TRBV11-3*01_F","TRBV11-3*01_F","TRBV12-5*01_F","TRBV12-5*01_F","TRBV13*01_F","TRBV14*02_(F)","TRBV18*01_F","TRBV19*03_(F)","TRBV2*02_(F)","TRBV2*03_(F)","TRBV20-1*01_F","TRBV23-1*01_ORF","TRBV27*01_F","TRBV28*01_F","TRBV29-1*01_F","TRBV30*03_P","TRBV30*03_P","TRBV4-2*02_(F)","TRBV5-1*01_F","TRBV5-1*01_F","TRBV5-1*01_F","TRBV5-3*01_ORF","TRBV5-4*01_F","TRBV5-4*01_F","TRBV5-4*02_(F)","TRBV5-5*01_F","TRBV5-6*01_F","TRBV5-6*01_F","TRBV6-1*01_F","TRBV7-2*03_F","TRBV7-2*04_(F)","TRBV7-2*04_(F)","TRBV7-2*04_(F)","TRBV7-2*04_(F)","TRBV7-3*01_F","TRBV7-3*02_ORF","TRBV7-6*01_F","TRBV7-9*01_F","TRBV7-9*01_F","TRBV9*03_(F)"],["TRBJ2-4*01_F","TRBJ2-5*01_F","TRBJ2-6*01_F","TRBJ1-3*01_F","TRBJ2-1*01_F","TRBJ2-2*01_F","TRBJ2-7*01_F","TRBJ1-6*01_F","TRBJ2-5*01_F","TRBJ2-7*01_F","TRBJ1-3*01_F","TRBJ2-3*01_F","TRBJ1-1*01_F","TRBJ2-2*01_F","TRBJ2-5*01_F","TRBJ1-5*01_F","TRBJ2-5*01_F","TRBJ1-1*01_F","TRBJ2-5*01_F","TRBJ2-4*01_F","TRBJ2-1*01_F","TRBJ1-4*01_F","TRBJ2-2*01_F","TRBJ2-1*01_F","TRBJ2-5*01_F","TRBJ1-3*01_F","TRBJ2-6*01_F","TRBJ2-2*01_F","TRBJ1-1*01_F","TRBJ2-7*01_F","TRBJ2-1*01_F","TRBJ1-4*01_F","TRBJ1-6*01_F","TRBJ2-6*01_F","TRBJ2-3*01_F","TRBJ1-4*01_F","TRBJ2-6*01_F","TRBJ2-1*01_F","TRBJ1-1*01_F","TRBJ2-4*01_F","TRBJ2-6*01_F","TRBJ2-6*01_F","TRBJ2-5*01_F","TRBJ1-4*01_F","TRBJ2-1*01_F","TRBJ2-5*01_F","TRBJ2-7*01_F","TRBJ1-4*01_F","TRBJ2-1*01_F","TRBJ1-6*01_F","TRBJ1-3*01_F","TRBJ2-6*01_F","TRBJ2-1*01_F"],["TGCGCCAGCAGTGAGTCACGCCACAAAACATTCAGTACTTC","TGCGCCATCAGTGAGTCGGGTGACAGGGGCGAAGACCAAGAGACCCAGTACTTC","TGCGCCAGCAGTGAGTCCCAAGGCTGGGTGCCAACGTACTGACTTTC","TGCGCCAGCAGTGAGTCCTCCCGGGCAGAAACACCATATATTT","TGCGCCAGCAGTGAGTCGAAAGACGAGCAGTTCTTC","TGTGCCATCAGTGAGTCGAAGCTACGAGACACCGGGAGCTGTTTT","CTGTGTCATCAGTGAGTCGGTGAGGGAGCAGTACTTC","TGTGCCAGCAGCTTAGACAGGGCGGTGGGATAATTCACCCTCCACTTT","TGTGCCAGCAGCTTAGCTCGGGACAGGTGGGCGGACCCAGTGCTTC","TGTGCCAGCAGCTTAGCGGCGGACCTAGGGACTAGCGGATCCTACGAGCAGTACTTC","TGTGCGACAGGGTGGAGGAAACACCATATATTTT","TGTGCCAGCAGCTTAGAGGACCCGGTAGCGGCCCTCAGCACAGATACGCAGTATTT","TGTGTCAGCAGCTTAGAGGACAGGCCTTGTGTGAACACTGAAGCTTTCTTT","CTGTGCCAGCAAAGGGAGCAGCGACTCCGGGGAGCTGTTT","TGTGCCAGCAGCTTAGGGAGGGCCTGTCAAGAGACCCAGTACTTC","TGTGCTAGTGGTTTGGGAGAGCATAGCAATCAGCCCAGCATTTT","TGTGCTAGTGGTTTGGTTCGAGAGGGGACGCTTTTTCTCAAGAGACCCAGTACTTC","TGTGCCAGCAGCTTAGGAATCCCGGGACAGGGGCTCGGACTGAAGCTTTCTTT","TGTGCCAGCAGCCGAGGACAGGGGCCCCAGTACTTC","TGTGCCAGCTCACCACCGGAGGACCTAGCCAAACATTCAGTACTTC","TGTGCCAGTACCTACAATGAGCAGTTCTTC","TGTGCCAGCAGTACAGTGGGACCAACTAATGAAACTGTTTT","TGTGCCAGCAGTGAAAGATGGGGACTAGCGGGCCCTGTGGGAGCTGTTTT","TGCAGTGCTAGAGATCGAAGGTACAATGAGCAGTTCTTC","TGCGCCAGCAGTCAATCGAGGGAGAAAGGACAGTACTTC","TGTGCCAGCAGTTTATCCCTAGGACCTTTAAACACCATATATTTT","TGTGCCAGCAGTTTATGGCAGGAAACTGGGCCAACGTCCTGACTTC","TGCAGCGTTGAAGAGAGGGCGCGAACACCGGGTGAGCTGTTTTT","TGTGCCTGGAGGGCAGGACGGGAACACTGAAGCTTTCTTT","TGTGCCTGGAGTGTACAGGCTCACGGTTCTCCTACGAGCAGTACTTC","TGTGCCAGCATCCACTGGGACTAGCGGGTCCTCTATGAGCAGTTCTTC","TGCGCCAGCAGCTGGGCGACTAGCGCTAATGAAACTGTTTT","TGCGCCAGCAGCTTGGGAGAGACTATCTATAATTCACCCCTCCACTTT","TGCGCCAGCAGCTTGTGGACAGGCGCTTGGGGCCAACGTCCTGACTTTC","TGTGCCAGAAGCTTGGAGGGCACAGATACGCAGTATTT","TGTGCCAGCAGCTTGGGTGTGGACAGGGGCAATGAAACTGTTTT","TGTGCCAGCAGCTTGGTCCTACGGCGGGAGGTCTGGTGGCCAACGTCCTGACTTTC","TGTGCCAGCAGCTACTCCTACAATGAGCAGTTCTTC","TGTGCCAGCAGCTTGGACGGACTGGTGAACACTGAAGCTTTCTTT","TGTGCCAGCAGCTTGGCACAGAAGCCAAAACATTCAGTACTTC","TGTGCCAGCAGCTTGGAGGGGCCTCTTGGGGCCAACGTCCTGACTTTC","TGTGCCAGCACACGGGACTCGGCCAACGTCCTGACTTTC","TGTACCAGCAGCTTAGCGCTAGCGGTGTGGCCCACCAAGAGACCCAGTACTTC","TGTGCCAGC
<p>Therefore, <strong>318 VJ families</strong> would undergo the clustering step.</p>
</div>
</div>
<div id="dendrograms" class="section level2 unnumbered">
<h2>Dendrograms</h2>
<p>Dendrograms of 82/318 VJ families with more than one distinct HVR sequence are shown here (also available in <code>/media/bacon/Carazo_TCRSeq_IonTorrentS5/03_sequenceAnalysis/april_2020/plots/dendrograms_sim_rep_weighted_hclust_wardD</code>). The method used was a weighted hierarchical clustering with ward.D linkage, as it showed to be the best linkage method for sample 111H.0</p>
<p><em>Note: only 82 dendrograms are available because execution halts trying to generate plots for very large (&gt;1000 HVRs) VJ families. Will not fix this since those dendrograms would be unintelligible anyway. 82 dendrograms should be a sufficient sample to compare in silico VJ families to real ones.</em></p>
<pre class="r"><code>######################################################
################## Plot dendrograms ##################
######################################################
# dendro_weighted_clust &lt;- function(data_ec, msa_dir, plot_dir, linkage){
#
# #########################################
# ############# Prepare data ##############
# #########################################
#
# ### Unique reads
# data_ec_uniq &lt;- plyr::ddply(data_ec,.(V_match, J_match, HVR_sequence, HVR_frame), nrow)
# data_ec_uniq &lt;- data_ec_uniq %&gt;% dplyr::rename(Counts = V1)
#
# vj_fam &lt;- split(data_ec_uniq, paste0(data_ec_uniq$V_match, &quot; / &quot;, data_ec_uniq$J_match)) # Split data frame by VJ match into list of data frames
#
# ### Remove single-member VJ families
# single_idx &lt;- unlist(lapply(vj_fam, function(x){nrow(x) == 1})) # Logic vector for one-membered families
# vj_sgl_member &lt;- bind_rows(vj_fam[single_idx]) # Data frame with one member clonotypes
#
# ### List of data frames with VJ families with more than one clonotype
# vj_groups &lt;- vj_fam[!single_idx]
# vj_groups &lt;- lapply(vj_groups, function(x){
# df &lt;- x
# rownames(df) &lt;- 1:nrow(df)
# return(df)
# })
#
# ### Create DNAStringSet
# vj_groups_dss &lt;- lapply(vj_groups, function(x){ # List of QualityScaledDNAStringSet with VJ families with more than one clonotype
# dss &lt;- DNAStringSet(x[,&quot;HVR_sequence&quot;]) # Sequences
# ids &lt;- rownames(x)
# names(dss) &lt;- ids
# return(dss)
# })
#
#
# ########################################
# ############ Generate plots ############
# ########################################
#
# lapply(1:length(vj_groups), function(idx){
#
# v_name &lt;- gsub(&quot;_.*&quot;, &quot;&quot;, vj_groups[[idx]][1,&quot;V_match&quot;])
# j_name &lt;- gsub(&quot;_.*&quot;, &quot;&quot;, vj_groups[[idx]][1,&quot;J_match&quot;])
#
# ### MSA ###
#
# hvr_msa &lt;- invisible(DNAStringSet(msaClustalW(vj_groups_dss[idx][[1]],
# gapOpening = 1)))
#
# msa_path &lt;- paste0(msa_dir, &quot;hvr_msa_&quot;, v_name, &quot;_&quot;, j_name, &quot;.fasta&quot;)
# writeXStringSet(hvr_msa, msa_path)
#
# ### LEVENSHTEIN DISTANCE ###
#
# df &lt;- vj_groups_dss[idx][[1]]
# ld &lt;- stringDist(df, method = &quot;levenshtein&quot;, upper = TRUE, diag = TRUE)
#
# ### HIERARCHICAL CLUSTERING ###
# ld_hc &lt;- hclust(ld, method = linkage, members = vj_groups[[idx]][,&quot;Counts&quot;])
#
# ### GGTREE ###
#
# p &lt;- ggtree(ld_hc)
#
# d &lt;- data.frame(label = rownames(vj_groups[[idx]]),
# HVR_frame = vj_groups[[idx]][, &quot;HVR_frame&quot;],
# Counts = vj_groups[[idx]][, &quot;Counts&quot;])
#
# mycols &lt;- c(&quot;mediumseagreen&quot;, &quot;orange2&quot;, &quot;firebrick2&quot;)
# names(mycols) &lt;- c(&quot;0&quot;, &quot;1&quot;, &quot;2&quot;)
# p2 &lt;- p %&lt;+% d +
# geom_tiplab() +
# geom_point(aes(color=factor(HVR_frame, levels = c(0, 1, 2)), size = Counts, x=x+(x*0.18))) +
# scale_color_manual(values = mycols, name = &quot;HVR frame&quot;)
#
#
# m &lt;- msaplot(p2, fasta = msa_path,
# offset = max(ld_hc$height) * 0.125,
# width = 2)
#
# nuc_colors &lt;- c(NA, &quot;#a2fa8c&quot;, &quot;#ffd18c&quot;, &quot;#f38d8a&quot;, &quot;#8ab8f5&quot;)
# names(nuc_colors) &lt;- c(&quot;-&quot;, &quot;a&quot;, &quot;c&quot;, &quot;g&quot;, &quot;t&quot;)
# m &lt;- m +
# scale_fill_manual(values = nuc_colors, name = &quot;Nucleotide&quot;) +
# ggtitle(paste(v_name, &quot;/&quot;, j_name, &quot;family&quot;))
#
# ggsave(filename = paste0(plot_dir, v_name, &quot;_&quot;, j_name, &quot;.png&quot;),
# plot = m,
# width = 10,
# height = 5 + nrow(vj_groups[[idx]])*0.06,
# limitsize = FALSE)
# })
# }</code></pre>
<pre class="r"><code>############ ERROR: stops at 82 dendrograms. Probably could not generate png in large VJ family (&gt;1000 HVRs) as it could not allocate the file in memory.
# dendro_weighted_clust(vj_alg_good,
# msa_dir = &quot;plots/dendrograms_sim_rep_weighted_hclust_wardD/MSA/&quot;,
# plot_dir = &quot;plots/dendrograms_sim_rep_weighted_hclust_wardD/&quot;,
# linkage = &quot;ward.D&quot;)</code></pre>
<pre class="r"><code>dendro_plots &lt;- paste0(list.files(&quot;plots/dendrograms_sim_rep_weighted_hclust_wardD&quot;, full.names = TRUE, pattern = &quot;*.png&quot;))
names(dendro_plots) &lt;- str_replace_all(dendro_plots,
c(&quot;\\.png&quot; = &quot;&quot;,
&quot;plots/dendrograms_sim_rep_weighted_hclust_wardD/&quot; = &quot;&quot;))
bsselect(dendro_plots, type = &quot;img&quot;, selected = NULL,
show_tick = TRUE, frame_height = &quot;100%&quot;,
dropup_auto = FALSE, size = 10,
height = 50)</code></pre>
<html>
<select id="22OPlRsq1T" class="selectpicker" data-dropdown-align-right="false" data-dropup-auto="false" data-header="false" data-live-search="false" data-live-search-style="contains" data-show-tick="true" data-width="false" data-size="10"><option value="plots/dendrograms_sim_rep_weighted_hclust_wardD/TRBV1*01_TRBJ1-4*01.png">TRBV1*01_TRBJ1-4*01</option>
<option value="plots/dendrograms_sim_rep_weighted_hclust_wardD/TRBV1*01_TRBJ2-1*01.png">TRBV1*01_TRBJ2-1*01</option>
<option value="plots/dendrograms_sim_rep_weighted_hclust_wardD/TRBV10-1*01_TRBJ1-2*01.png">TRBV10-1*01_TRBJ1-2*01</option>
<option value="plots/dendrograms_sim_rep_weighted_hclust_wardD/TRBV10-1*01_TRBJ1-5*01.png">TRBV10-1*01_TRBJ1-5*01</option>
<option value="plots/dendrograms_sim_rep_weighted_hclust_wardD/TRBV10-1*01_TRBJ2-7*01.png">TRBV10-1*01_TRBJ2-7*01</option>
<option value="plots/dendrograms_sim_rep_weighted_hclust_wardD/TRBV10-2*01_TRBJ1-4*01.png">TRBV10-2*01_TRBJ1-4*01</option>
<option value="plots/dendrograms_sim_rep_weighted_hclust_wardD/TRBV10-2*01_TRBJ2-4*01.png">TRBV10-2*01_TRBJ2-4*01</option>
<option value="plots/dendrograms_sim_rep_weighted_hclust_wardD/TRBV10-2*01_TRBJ2-5*01.png">TRBV10-2*01_TRBJ2-5*01</option>
<option value="plots/dendrograms_sim_rep_weighted_hclust_wardD/TRBV10-2*01_TRBJ2-7*01.png">TRBV10-2*01_TRBJ2-7*01</option>
<option value="plots/dendrograms_sim_rep_weighted_hclust_wardD/TRBV10-3*01_TRBJ1-1*01.png">TRBV10-3*01_TRBJ1-1*01</option>
<option value="plots/dendrograms_sim_rep_weighted_hclust_wardD/TRBV10-3*01_TRBJ1-3*01.png">TRBV10-3*01_TRBJ1-3*01</option>
<option value="plots/dendrograms_sim_rep_weighted_hclust_wardD/TRBV10-3*01_TRBJ1-4*01.png">TRBV10-3*01_TRBJ1-4*01</option>
<option value="plots/dendrograms_sim_rep_weighted_hclust_wardD/TRBV10-3*01_TRBJ1-5*01.png">TRBV10-3*01_TRBJ1-5*01</option>
<option value="plots/dendrograms_sim_rep_weighted_hclust_wardD/TRBV10-3*01_TRBJ2-1*01.png">TRBV10-3*01_TRBJ2-1*01</option>
<option value="plots/dendrograms_sim_rep_weighted_hclust_wardD/TRBV10-3*01_TRBJ2-2*01.png">TRBV10-3*01_TRBJ2-2*01</option>
<option value="plots/dendrograms_sim_rep_weighted_hclust_wardD/TRBV10-3*01_TRBJ2-7*01.png">TRBV10-3*01_TRBJ2-7*01</option>
<option value="plots/dendrograms_sim_rep_weighted_hclust_wardD/TRBV10-3*02_TRBJ1-1*01.png">TRBV10-3*02_TRBJ1-1*01</option>
<option value="plots/dendrograms_sim_rep_weighted_hclust_wardD/TRBV10-3*02_TRBJ2-1*01.png">TRBV10-3*02_TRBJ2-1*01</option>
<option value="plots/dendrograms_sim_rep_weighted_hclust_wardD/TRBV11-1*01_TRBJ2-1*01.png">TRBV11-1*01_TRBJ2-1*01</option>
<option value="plots/dendrograms_sim_rep_weighted_hclust_wardD/TRBV11-2*01_TRBJ1-1*01.png">TRBV11-2*01_TRBJ1-1*01</option>
<option value="plots/dendrograms_sim_rep_weighted_hclust_wardD/TRBV11-2*01_TRBJ1-2*01.png">TRBV11-2*01_TRBJ1-2*01</option>
<option value="plots/dendrograms_sim_rep_weighted_hclust_wardD/TRBV11-2*01_TRBJ1-4*01.png">TRBV11-2*01_TRBJ1-4*01</option>
<option value="plots/dendrograms_sim_rep_weighted_hclust_wardD/TRBV11-2*01_TRBJ1-5*01.png">TRBV11-2*01_TRBJ1-5*01</option>
<option value="plots/dendrograms_sim_rep_weighted_hclust_wardD/TRBV11-2*01_TRBJ1-6*01.png">TRBV11-2*01_TRBJ1-6*01</option>
<option value="plots/dendrograms_sim_rep_weighted_hclust_wardD/TRBV11-2*01_TRBJ2-1*01.png">TRBV11-2*01_TRBJ2-1*01</option>
<option value="plots/dendrograms_sim_rep_weighted_hclust_wardD/TRBV11-2*01_TRBJ2-2*01.png">TRBV11-2*01_TRBJ2-2*01</option>
<option value="plots/dendrograms_sim_rep_weighted_hclust_wardD/TRBV11-2*01_TRBJ2-5*01.png">TRBV11-2*01_TRBJ2-5*01</option>
<option value="plots/dendrograms_sim_rep_weighted_hclust_wardD/TRBV11-2*01_TRBJ2-6*01.png">TRBV11-2*01_TRBJ2-6*01</option>
<option value="plots/dendrograms_sim_rep_weighted_hclust_wardD/TRBV11-2*01_TRBJ2-7*01.png">TRBV11-2*01_TRBJ2-7*01</option>
<option value="plots/dendrograms_sim_rep_weighted_hclust_wardD/TRBV11-2*02_TRBJ1-3*01.png">TRBV11-2*02_TRBJ1-3*01</option>
<option value="plots/dendrograms_sim_rep_weighted_hclust_wardD/TRBV11-3*01_TRBJ1-6*01.png">TRBV11-3*01_TRBJ1-6*01</option>
<option value="plots/dendrograms_sim_rep_weighted_hclust_wardD/TRBV11-3*01_TRBJ2-1*01.png">TRBV11-3*01_TRBJ2-1*01</option>
<option value="plots/dendrograms_sim_rep_weighted_hclust_wardD/TRBV11-3*01_TRBJ2-3*01.png">TRBV11-3*01_TRBJ2-3*01</option>
<option value="plots/dendrograms_sim_rep_weighted_hclust_wardD/TRBV11-3*01_TRBJ2-7*01.png">TRBV11-3*01_TRBJ2-7*01</option>
<option value="plots/dendrograms_sim_rep_weighted_hclust_wardD/TRBV12-5*01_TRBJ1-2*01.png">TRBV12-5*01_TRBJ1-2*01</option>
<option value="plots/dendrograms_sim_rep_weighted_hclust_wardD/TRBV12-5*01_TRBJ1-4*01.png">TRBV12-5*01_TRBJ1-4*01</option>
<option value="plots/dendrograms_sim_rep_weighted_hclust_wardD/TRBV12-5*01_TRBJ2-1*01.png">TRBV12-5*01_TRBJ2-1*01</option>
<option value="plots/dendrograms_sim_rep_weighted_hclust_wardD/TRBV12-5*01_TRBJ2-7*01.png">TRBV12-5*01_TRBJ2-7*01</option>
<option value="plots/dendrograms_sim_rep_weighted_hclust_wardD/TRBV13*01_TRBJ1-6*01.png">TRBV13*01_TRBJ1-6*01</option>
<option value="plots/dendrograms_sim_rep_weighted_hclust_wardD/TRBV13*01_TRBJ2-1*01.png">TRBV13*01_TRBJ2-1*01</option>
<option value="plots/dendrograms_sim_rep_weighted_hclust_wardD/TRBV13*01_TRBJ2-7*01.png">TRBV13*01_TRBJ2-7*01</option>
<option value="plots/dendrograms_sim_rep_weighted_hclust_wardD/TRBV14*01_TRBJ1-1*01.png">TRBV14*01_TRBJ1-1*01</option>
<option value="plots/dendrograms_sim_rep_weighted_hclust_wardD/TRBV14*01_TRBJ1-4*01.png">TRBV14*01_TRBJ1-4*01</option>
<option value="plots/dendrograms_sim_rep_weighted_hclust_wardD/TRBV14*01_TRBJ2-2*01.png">TRBV14*01_TRBJ2-2*01</option>
<option value="plots/dendrograms_sim_rep_weighted_hclust_wardD/TRBV14*01_TRBJ2-5*01.png">TRBV14*01_TRBJ2-5*01</option>
<option value="plots/dendrograms_sim_rep_weighted_hclust_wardD/TRBV14*01_TRBJ2-7*01.png">TRBV14*01_TRBJ2-7*01</option>
<option value="plots/dendrograms_sim_rep_weighted_hclust_wardD/TRBV14*02_TRBJ1-5*01.png">TRBV14*02_TRBJ1-5*01</option>
<option value="plots/dendrograms_sim_rep_weighted_hclust_wardD/TRBV15*01_TRBJ1-1*01.png">TRBV15*01_TRBJ1-1*01</option>
<option value="plots/dendrograms_sim_rep_weighted_hclust_wardD/TRBV15*01_TRBJ1-2*01.png">TRBV15*01_TRBJ1-2*01</option>
<option value="plots/dendrograms_sim_rep_weighted_hclust_wardD/TRBV15*01_TRBJ1-4*01.png">TRBV15*01_TRBJ1-4*01</option>
<option value="plots/dendrograms_sim_rep_weighted_hclust_wardD/TRBV15*01_TRBJ2-1*01.png">TRBV15*01_TRBJ2-1*01</option>
<option value="plots/dendrograms_sim_rep_weighted_hclust_wardD/TRBV15*01_TRBJ2-2*01.png">TRBV15*01_TRBJ2-2*01</option>
<option value="plots/dendrograms_sim_rep_weighted_hclust_wardD/TRBV15*01_TRBJ2-3*01.png">TRBV15*01_TRBJ2-3*01</option>
<option value="plots/dendrograms_sim_rep_weighted_hclust_wardD/TRBV15*01_TRBJ2-5*01.png">TRBV15*01_TRBJ2-5*01</option>
<option value="plots/dendrograms_sim_rep_weighted_hclust_wardD/TRBV15*01_TRBJ2-7*01.png">TRBV15*01_TRBJ2-7*01</option>
<option value="plots/dendrograms_sim_rep_weighted_hclust_wardD/TRBV18*01_TRBJ1-1*01.png">TRBV18*01_TRBJ1-1*01</option>
<option value="plots/dendrograms_sim_rep_weighted_hclust_wardD/TRBV18*01_TRBJ1-2*01.png">TRBV18*01_TRBJ1-2*01</option>
<option value="plots/dendrograms_sim_rep_weighted_hclust_wardD/TRBV18*01_TRBJ1-3*01.png">TRBV18*01_TRBJ1-3*01</option>
<option value="plots/dendrograms_sim_rep_weighted_hclust_wardD/TRBV18*01_TRBJ1-4*01.png">TRBV18*01_TRBJ1-4*01</option>
<option value="plots/dendrograms_sim_rep_weighted_hclust_wardD/TRBV18*01_TRBJ1-5*01.png">TRBV18*01_TRBJ1-5*01</option>
<option value="plots/dendrograms_sim_rep_weighted_hclust_wardD/TRBV18*01_TRBJ1-6*01.png">TRBV18*01_TRBJ1-6*01</option>
<option value="plots/dendrograms_sim_rep_weighted_hclust_wardD/TRBV18*01_TRBJ2-1*01.png">TRBV18*01_TRBJ2-1*01</option>
<option value="plots/dendrograms_sim_rep_weighted_hclust_wardD/TRBV18*01_TRBJ2-2*01.png">TRBV18*01_TRBJ2-2*01</option>
<option value="plots/dendrograms_sim_rep_weighted_hclust_wardD/TRBV18*01_TRBJ2-3*01.png">TRBV18*01_TRBJ2-3*01</option>
<option value="plots/dendrograms_sim_rep_weighted_hclust_wardD/TRBV18*01_TRBJ2-5*01.png">TRBV18*01_TRBJ2-5*01</option>
<option value="plots/dendrograms_sim_rep_weighted_hclust_wardD/TRBV18*01_TRBJ2-7*01.png">TRBV18*01_TRBJ2-7*01</option>
<option value="plots/dendrograms_sim_rep_weighted_hclust_wardD/TRBV19*01_TRBJ1-1*01.png">TRBV19*01_TRBJ1-1*01</option>
<option value="plots/dendrograms_sim_rep_weighted_hclust_wardD/TRBV19*01_TRBJ1-2*01.png">TRBV19*01_TRBJ1-2*01</option>
<option value="plots/dendrograms_sim_rep_weighted_hclust_wardD/TRBV19*01_TRBJ1-3*01.png">TRBV19*01_TRBJ1-3*01</option>
<option value="plots/dendrograms_sim_rep_weighted_hclust_wardD/TRBV19*01_TRBJ1-4*01.png">TRBV19*01_TRBJ1-4*01</option>
<option value="plots/dendrograms_sim_rep_weighted_hclust_wardD/TRBV19*01_TRBJ1-5*01.png">TRBV19*01_TRBJ1-5*01</option>
<option value="plots/dendrograms_sim_rep_weighted_hclust_wardD/TRBV19*01_TRBJ2-1*01.png">TRBV19*01_TRBJ2-1*01</option>
<option value="plots/dendrograms_sim_rep_weighted_hclust_wardD/TRBV19*01_TRBJ2-2*01.png">TRBV19*01_TRBJ2-2*01</option>
<option value="plots/dendrograms_sim_rep_weighted_hclust_wardD/TRBV19*01_TRBJ2-3*01.png">TRBV19*01_TRBJ2-3*01</option>
<option value="plots/dendrograms_sim_rep_weighted_hclust_wardD/TRBV19*01_TRBJ2-5*01.png">TRBV19*01_TRBJ2-5*01</option>
<option value="plots/dendrograms_sim_rep_weighted_hclust_wardD/TRBV19*01_TRBJ2-6*01.png">TRBV19*01_TRBJ2-6*01</option>
<option value="plots/dendrograms_sim_rep_weighted_hclust_wardD/TRBV19*01_TRBJ2-7*01.png">TRBV19*01_TRBJ2-7*01</option>
<option value="plots/dendrograms_sim_rep_weighted_hclust_wardD/TRBV19*03_TRBJ2-7*01.png">TRBV19*03_TRBJ2-7*01</option>
<option value="plots/dendrograms_sim_rep_weighted_hclust_wardD/TRBV2*01_TRBJ1-1*01.png">TRBV2*01_TRBJ1-1*01</option>
<option value="plots/dendrograms_sim_rep_weighted_hclust_wardD/TRBV2*01_TRBJ1-2*01.png">TRBV2*01_TRBJ1-2*01</option>
<option value="plots/dendrograms_sim_rep_weighted_hclust_wardD/TRBV2*01_TRBJ1-4*01.png">TRBV2*01_TRBJ1-4*01</option>
<option value="plots/dendrograms_sim_rep_weighted_hclust_wardD/TRBV2*01_TRBJ1-5*01.png">TRBV2*01_TRBJ1-5*01</option></select>
<img src="plots/dendrograms_sim_rep_weighted_hclust_wardD/TRBV1*01_TRBJ1-4*01.png" name="0xb33qkXfT" height="100%" width="100%"/>
<script>$(document).ready(function(){
$("#22OPlRsq1T").change(function(){
$("img[name=0xb33qkXfT]").attr("src",$(this).val());
});
});</script>
</html>
<div id="htmlwidget-9126ad6fd074f5ef0eea" style="width:672px;height:50px;" class="bsselect html-widget" width="672" height="50"></div>
<script type="application/json" data-for="htmlwidget-9126ad6fd074f5ef0eea">{"x":[],"evals":[],"jsHooks":[]}</script>
</div>
</div>
<div id="tunning-simulated-sequencing-error-rates-new" class="section level1">
<h1><span class="header-section-number">4</span> Tunning simulated sequencing error rates <span class="label label-info">New</span></h1>
<p>Default <code>CuReSim</code> error rates for Ion Torrent technology are 1% deletion, 0.5% insertion and 0.5% substitution, but these values are extracted from 2012 publications (<a href="https://www.nature.com/articles/nbt.2198">source 1</a>, <a href="https://www.hindawi.com/journals/bmri/2012/251364/">2</a>, <a href="https://bmcgenomics.biomedcentral.com/articles/10.1186/1471-2164-13-341">3</a>) that worked with old chips of the Ion Torrent PGM platform. Our TCR sequences were obtained with the newer Ion Torrent S5 platform (chip 530), which generates more high-quality reads than the PGM (<a href="https://www.sciencedirect.com/science/article/abs/pii/S0166093420301178">source</a>). However, S5 error rates could not be found in the literature.</p>
<p>Ideas for error rate values testing:</p>
<ul>
<li>According to <code>CuReSim</code> publication <em>&quot;precision and recall values were closer to the values obtained for the real dataset values when reads were generated with 0.5% deletions, 0.25% insertions, and 0.25% substitutions&quot;</em>.</li>
<li>In <a href="https://journals.plos.org/ploscompbiol/article/file?id=10.1371/journal.pcbi.1003031&amp;type=printable">this publication</a> three Ion Torrent PGM sequencing kits were compared in terms of error rates (deletion / insertion / substitution):</li>
<li>100 bp One Touch: 0.8% / 0.84% / 0.04%</li>
<li>~200 bp Manual: 1.98% / 2.69% / 0.17 %~ (discarded, higher indel rates than <code>CuReSim</code> default).</li>
<li>~200 bp One Touch: 1.07% / 1.76% / 0.07%~ (discarded, higher indel rates than <code>CuReSim</code> default).</li>
<li>In <a href="https://www.ncbi.nlm.nih.gov/pmc/articles/PMC5556038/pdf/41598_2017_Article_8139.pdf">this publication</a> the error rates are estimated with hepatitis B virus genome: <strong>0.13% / 0.27% / ~0.08%</strong>.</li>
</ul>
<p>We tried this last configuration:</p>
<ul>
<li><strong>Deletion</strong>: 0.13%</li>
<li><strong>Insertion</strong>: 0.27%</li>
<li><strong>Substitution</strong>: 0.08%</li>
</ul>
<div id="curesim-results" class="section level2 unnumbered">
<h2><code>CuReSim</code> results</h2>
<p><embed src="data:application/pdf;base64,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
<pre class="r"><code>### nohup java -jar CuReSim.jar -f ../input/00_first_test.fastq -d 0.0013 -i 0.0027 -s 0.0008 -o ../output/01_HCV_error_rates_d013_i027_s008.fastq -v &amp;
curesim_fq &lt;- ShortRead::readFastq(&quot;software/CuReSim/output/01_HCV_error_rates_d013_i027_s008.fastq&quot;) # Read .fq file and store in a ShortReadQ class object
reads_sim &lt;- ShortRead::sread(curesim_fq) # DNAStringSet with the reads
quality_sim &lt;- quality(curesim_fq) # BStringSet with the sequencing qualities
new.quality.class &lt;- switch(class(quality_sim), # Convert from BStringSet to XStringQuality
SFastqQuality=&quot;SolexaQuality&quot;,
FastqQuality=&quot;PhredQuality&quot;,
&quot;XStringQuality&quot;)
quality_sim &lt;- as(quality_sim, new.quality.class)
sample_sim &lt;- QualityScaledDNAStringSet(reads_sim, quality_sim) # Get QualityScaledDNAStringSet to use as a pairwiseAlignment input
names(sample_sim) &lt;- as.character(curesim_fq@id) # Character vector with the reads IDs
sample_sim_rc &lt;- reverseComplement(sample_sim)
# Readlength histogram
rl_after &lt;- ggplot() +
aes(width(sample_sim_rc)) +
geom_histogram(color=&quot;dodgerblue&quot;, fill=&quot;dodgerblue&quot;, binwidth = 1) +
scale_y_continuous(name = &quot;Counts&quot;, expand = c(0.01,0)) +
scale_x_continuous(&quot;Read length&quot;, expand = c(0.01,0)) +
ggtitle(&quot;After&quot;) +
theme_pubr()
###
rm(reads_sim, quality_sim, sample_sim, curesim_fq)</code></pre>
<p>Readlength before and after <code>CuReSim</code>:</p>
<pre class="r"><code>rl_before + rl_after</code></pre>
<p><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABUAAAAJACAIAAADDw1viAAAACXBIWXMAAB2HAAAdhwGP5fFlAAAgAElEQVR4nOzdeVzVdd7//9cHEREBMw6uZbKouZMaSJmhlqmlJtrUZJPYWOlcfXOXNNTRUsS61LplNrZgM+UCgUsuk2NemgtuuZBSYASO4sqiR0BZ5Pz++Fy/z5yL5XAwzvI5Pu63uV23N+/3+/X5vLnd5pq3Tz6bYjKZBAAAAAAAODc3Ry8AAAAAAADUjgAPAAAAAIAOEOABAAAAANABAjwAAAAAADpAgAcAAAAAQAcI8AAAAAAA6AABHgAAAAAAHSDAAwAAAACgAwR4AAAAAAB0gAAPAAAAAIAOEOABAAAAANABAjwAAAAAADpAgAcAAAAAQAcI8AAAAAAA6AABHgAAAAAAHSDAAwAAAACgAwR4AAAAAAB0gAAPAAAAAIAOEOABAAAAANABAjwAAAAAADpAgAcAAAAAQAcI8AAAAAAA6AABHgAAAAAAHSDAAwAAAACgAwR4AAAAAAB0gAAPAAAAAIAOEOABAAAAANABAjwAAAAAADpAgAcAAAAAQAcI8AAAAAAA6AABHo7UuHFjxSJ3d/cWLVqEhoZOnTr1+PHjdljSxo0bBwwY0KpVKx8fn759+9rhjAAAOLOpU6eab81/+9vf6lTOxgoA9UgxmUyOXgPuXo0bN75165b180eOHLlq1SqDwWCj9cycOfO9997TfmzZsuXFixdtdC4AAJxfRUXFfffdZ74b9uvXb8+ePVaWs7ECQP3iCjz0ZMOGDeHh4bm5ubY4+IkTJ/77v/9bbbu7u7dv375Dhw62OBEAAHqxa9euSpF77969586ds6bWmo21f//+6oX9Dz74oF4WDACuzd3RCwBERJ5//vn58+dX6iwvL798+fKFCxd27Nixdu3a8vJyEfn1119fffXVDRs21Psadu3aVVFRISJ+fn4pKSnt27ev91MAAKAvX3/9daUek8m0bt26GTNm1FrLxgoA9Y4r8HAKzZo161hFly5dBgwY8NJLL/39738/ffq0n5+fOnnjxo0nT56s9zWkp6erjeHDh/OPDAAAbt68mZSUpLaffvrp5s2bq+01a9ZYU87GCgD1jgAPfejQocNHH32k/fjtt9/W+ylKS0vVRtOmTev94AAA6M63335748YNtf3yyy+PHDlSbZ84cSItLa3WcjZWAKh3BHjoxtChQ7X2r7/+6sCVAABwN9Dun/fx8Rk2bNhzzz2nDa1du9ZBiwKAuxoBHrrh6+vr7++vttVn6vRu//79S5YsmT17tnaTIQAATiI/P3/79u1qe+TIkY0bN46IiNA+BGPlXfTOhp0XgN4R4KEbxcXFeXl5ajsgIMDCzNzc3A8++GDQoEHt2rVr3LhxmzZt+vXr9+abb/78889VJ2/atEl9/+3q1avVnuXLl6s9rVq1qvb4hw8fnj59es+ePVu0aNGoUaNWrVqFhoa+9dZbx44dq2lJ2lkmTpwoIjdu3Bg+fHjfvn2jo6NjY2NPnTr1O38LAADqV0JCQllZmdp+8cUXRaRBgwbaXfS//fbboUOHqi20ZmONi4tTe3bv3q32TJ48We3p379/1WPewZ54BzsvADg/3kIP3fjhhx+0C+8RERE1TVu2bNn8+fOvX7+u9Vy4cOHChQt79+796KOPnn766S+++EK7kl9XV69efe211zZu3GjeeenSpUuXLh05cmTJkiXPPffcJ5980qxZMwsHKSoqeuqpp1JSUizMselvAQBArbT755s3b/7EE0+o7dGjR3/66adqe82aNWFhYXZYye/fE63ZeQFAFwjw0Ifc3NzXX39dbYeEhFT75/mKiorx48fHx8ebdyqKYjKZ1LbJZNqyZUufPn22bdvWsWNHtbNt27ZRUVEism/fPvXR+s6dO4eGhkqVl+6cPXt24MCBmZmZ5p1ubm7anxVMJlNCQkJqaur333/funXrmn6XyZMnm/8bws/Pz9fX93f+FgAA1KPs7Oz9+/er7eeff75BgwZqe8CAAffee29+fr6IrF+/funSpdqQxpqNtVu3buqcf/7zn5cuXRKR0NDQzp07i8iDDz6oHaq+9kTLOy8A6IkJcBxPT0/1v4cTJkyoOlpeXn7u3LkDBw7MnTtX2/L9/PwyMjKqPdrChQu1/2I3b978448/PnnyZElJSXZ29oYNGx577DFtNDAwsLi4uFK5+i8JEZk8eXLVg5eVlZlfZwgPD9+wYUNeXp7JZMrLy0tOTn744Ye10f79+9++fdu8XLtoHxwcLCKKorzyyiv79u1Tj1CPvwUAAL+f+WaUkpJiPvTKK69oQzt27LBwEMsbq0q7pW758uWWl1HXPdH6nRcAdIQAD0fSAryV+vTpc/r06WoPlZ6e7u7+v3eUDBo0KD8/v9KEioqKZcuWaYeaPXt2pQmW/52xYsUKrfb111+vqKioNOH27dvaEUTkH//4h/lopbvuv/76axv9FgAA/H7qxXA1GFca0t5sJyJRUVEWDvI7A/zv3BOt3HkBQF94iR10o2HDhi+88EJQUFC1o8uWLSsvLxeRFi1afPXVV1WfQlcUZfLkydo/JpYtW1ZSUmLlqU0m0/Lly9V227ZtP/zwQ0VRKs1xc3NbsWJFixYt1B8/+OCDmo724osvqm8DsvNvAQCANcw/8151wxo4cKC2PSUnJ9+6dctGy6jHPdHCzgsA+kKAh26UlZVNnjw5ODh4586dlYYqKirWr1+vtmfNmmXhTTZxcXFq4+bNmwcPHrTy1D///POZM2fU9rx58zw8PKqd5uXlNXPmTLV99OjRCxcuVDtt/Pjx1fbb+rcAAMAaX331ldaumnsbNmw4YsQItW00Grdu3WqLNdTvnljTzgsAukOAh1N4/vnnf6nB0aNH4+PjX3nlFTc3NxE5f/78008/nZycbF7+008/FRQUqO2BAwdaOFHz5s0DAwPVtvZ6nlrt27dPaz/33HOWfxGtfeDAgWrnaPclVmLr3wIAgFpVVFSsW7dObT/00EOdOnWqOmf06NFa20YfhK/fPbGmnRcAdIe30MMpNGvWzMLLY3v16hUVFTV+/Phnn332ypUrpaWl48aN69+/v3Y3nfYZWEVRli1bpkb9mty8eVNtaF+Vr9XZs2fVhr+/v4+Pj4WZrVu3btSokXoLX1ZWVtUJ7u7uNV1GsPVvAQBArXbv3p2Tk6O2a7rt/Mknn2zatKn6XbetW7dev3690ndbfr963BMt7LwAoDsEeOhGeHj4+++///LLL4uI0Wj88MMP582bpw5pG7bJZPriiy+sPKDRaLRypvq9HBHR/sZfE0VR2rVrl56ebl5lrkWLFjX9K8TWvwUAALXSPv8uIjNmzJgxY4bl+SUlJcnJyePGjavfZdTjnmhh5wUA3eF/zqAnf/rTn7Q/opvfoH5nL3K7ceNGXUuqvruuKu0J+bKysqqjDRs2rKnQbr8FAADVunXrVlJSUl2rbHEXfT3uiRZ2XgDQHa7AQ2e6dOmye/du+b83qN97771qo0mTJkajsd7/0K4d/7fffqt1sjbHYDDc2Vls9FsAAGDZli1b1Bvj62TXrl0XL15s1apVPa6EPREAqsX/GkJntE/Cqp+WUd1///1qo6ioyJqMXVcPPPCA2rhy5UphYaGFmRcvXiwqKqq0KivZ+rcAAMAy8/vnDx48aPlbxNpt8xUVFQkJCfW7EvZEAKgWAR46c/r0abXRunVrrbNPnz5asP/xxx8tlFdUVHz3/7P+6fFHHnlEa1u+t9B8tG/fvlYeX2Xr3wIAAAsKCgq2bdumtjt06BAWFmZ5/ksvvaS16/0uevZEAKgWAR56smHDhosXL6rtiIgIrb9JkyYDBgxQ28uXL6+oqKjpCKtXrx48ePDgwYP/9Kc/NWrUyMrzdunSRXt93fz586t9uF1EiouLFy5cqLa7deumXbe3kq1/CwAALEhMTCwtLVXbY8eOrXV+REREmzZt1Pbhw4d//fXXelwMeyIAVIsAD904ffr0m2++qbbd3NzGjBljPjp9+nS1cfDgwTfeeKPa
</div>
<div id="vj-alignment-1" class="section level2 unnumbered">
<h2>VJ alignment</h2>
<pre class="r"><code>######################################################
#################### VJ alignment ####################
######################################################
### VJ_alignment.R script executed via terminal (nohup)
print(&quot;Execution time: 14.691883502139 hours&quot;)</code></pre>
<pre><code>## [1] &quot;Execution time: 14.691883502139 hours&quot;</code></pre>
<pre class="r"><code>vj_alg_sim_01 &lt;- readRDS(&quot;data/simulated_repertoires/01_VJ_alignment_HCV_error_rates.rds&quot;) # Data too big for datatable (RStudio crashes)</code></pre>
<div id="alignment-summary-1" class="section level3 unnumbered">
<h3>Alignment summary</h3>
<pre class="r"><code>###################################################### (4)
################# VJ alignment results ###############
###################################################### (4)
alg_rep_data &lt;- select(vj_alg_sim_01,
V_score,
J_score,
Cys_check,
Phe_check,
HVR_frame)
alg_rep_data$HVR_status &lt;- ifelse((alg_rep_data$V_score &lt; 0 | alg_rep_data$J_score &lt; 0 | !alg_rep_data$Cys_check | !alg_rep_data$Phe_check),
&quot;HVR not found&quot;,
&quot;HVR found&quot;)
alg_rep_data$label &lt;- NA
alg_rep_data[alg_rep_data$V_score &lt; 0, &quot;label&quot;] &lt;- &quot;No V&quot;
alg_rep_data[(alg_rep_data$V_score &gt; 0 &amp; alg_rep_data$J_score &lt; 0), &quot;label&quot;] &lt;- &quot;No J&quot;
alg_rep_data[(alg_rep_data$V_score &gt; 0 &amp; alg_rep_data$J_score &gt; 0 &amp; !alg_rep_data$Cys_check &amp; alg_rep_data$Phe_check), &quot;label&quot;] &lt;- &quot;No Cys&quot;
alg_rep_data[(alg_rep_data$V_score &gt; 0 &amp; alg_rep_data$J_score &gt; 0 &amp; alg_rep_data$Cys_check &amp; !alg_rep_data$Phe_check), &quot;label&quot;] &lt;- &quot;No Phe&quot;
alg_rep_data[(alg_rep_data$V_score &gt; 0 &amp; alg_rep_data$J_score &gt; 0 &amp; !alg_rep_data$Cys_check &amp; !alg_rep_data$Phe_check), &quot;label&quot;] &lt;- &quot;No Cys no Phe&quot;
alg_rep_data[(alg_rep_data$V_score &gt; 0 &amp; alg_rep_data$J_score &gt; 0 &amp; alg_rep_data$Cys_check &amp; alg_rep_data$Phe_check), &quot;label&quot;] &lt;- paste(&quot;Frame&quot;, alg_rep_data[(alg_rep_data$V_score &gt; 0 &amp; alg_rep_data$J_score &gt; 0 &amp; alg_rep_data$Cys_check &amp; alg_rep_data$Phe_check), &quot;HVR_frame&quot;])
PieDonut(alg_rep_data, aes(HVR_status,label),
showPieName=FALSE,
labelposition = 1,
showRatioThreshold = 0.009,
color = &quot;white&quot;,
explode = 2,
explodeDonut = TRUE,
explodePie = TRUE,
r0 = 0,
r1 = 0.9,
start = pi/2,
maxx = 1.6,
explodePos = 0,
donutLabelSize = 3.5,
showRatioDonut = FALSE,
title = &quot;VJ alignment (simulated repertoire, HCV error rates)&quot;)</code></pre>
<p><img src="data:image/png;base64,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
<pre class="r"><code>df1 &lt;- as.data.frame(table(alg_rep_data$HVR_status))
colnames(df1) &lt;- c(&quot;Status&quot;, &quot;# Reads&quot;)
df2 &lt;- as.data.frame(table(alg_rep_data$label))
colnames(df2) &lt;- c(&quot;Status&quot;, &quot;# Reads&quot;)
knitr::kable(df1)</code></pre>
<table>
<thead>
<tr class="header">
<th align="left">Status</th>
<th align="right"># Reads</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td align="left">HVR found</td>
<td align="right">1595806</td>
</tr>
<tr class="even">
<td align="left">HVR not found</td>
<td align="right">48112</td>
</tr>
</tbody>
</table>
<pre class="r"><code>knitr::kable(df2)</code></pre>
<table>
<thead>
<tr class="header">
<th align="left">Status</th>
<th align="right"># Reads</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td align="left">Frame 0</td>
<td align="right">628448</td>
</tr>
<tr class="even">
<td align="left">Frame 1</td>
<td align="right">545218</td>
</tr>
<tr class="odd">
<td align="left">Frame 2</td>
<td align="right">422140</td>
</tr>
<tr class="even">
<td align="left">No Phe</td>
<td align="right">48112</td>
</tr>
</tbody>
</table>
<p>Despite having considerably reduced error rates, out-of-frame HVRs still have a higher frequency than expected.</p>
<p>Let's compare the VJ alignment score and identity distributions among a real repertoire (111L, ~200k reads) and the two simulated ones (~1.5M reads each):</p>
<pre class="r"><code>vj_alg_111L &lt;- readRDS(&quot;data/vj_alignment_sample_111L.rds&quot;)
sc_id_comp &lt;- do.call(rbind, list(&quot;111L&quot; = select(vj_alg_111L, c(&quot;V_score&quot;, &quot;V_identity&quot;, &quot;J_score&quot;, &quot;J_identity&quot;)),
&quot;sim_00&quot; = select(vj_alg_sim, c(&quot;V_score&quot;, &quot;V_identity&quot;, &quot;J_score&quot;, &quot;J_identity&quot;)),
&quot;sim_01&quot; = select(vj_alg_sim_01, c(&quot;V_score&quot;, &quot;V_identity&quot;, &quot;J_score&quot;, &quot;J_identity&quot;))))
sc_id_comp$Sample &lt;- as.factor(sub(&quot;\\..*&quot;, &quot;&quot;, rownames(sc_id_comp)))
sc_id_comp.m &lt;- melt(sc_id_comp, id.vars = &quot;Sample&quot;)
calc_stat &lt;- function(x) {
coef &lt;- 1.5
n &lt;- sum(!is.na(x))
# calculate quantiles
stats &lt;- quantile(x, probs = c(0.1, 0.25, 0.5, 0.75, 0.9))
names(stats) &lt;- c(&quot;ymin&quot;, &quot;lower&quot;, &quot;middle&quot;, &quot;upper&quot;, &quot;ymax&quot;)
return(stats)
}
sc_id_comp_plt &lt;- ggplot(sc_id_comp.m, aes(x = Sample, y = value, color = Sample)) +
stat_summary(fun.data = calc_stat, geom=&quot;boxplot&quot;) +
# geom_boxplot(outlier.shape = NA) +
# scale_y_continuous() +
# scale_x_continuous(name = &quot;Bin&quot;, breaks = seq(-10, -1)) +
# scale_color_manual(name = &quot;Reading frame&quot;, values = c(&quot;mediumseagreen&quot;, &quot;orange&quot;, &quot;orangered&quot;)) +
facet_wrap(. ~ variable, scales = &quot;free&quot;) +
theme_pubr()
sc_id_comp_plt</code></pre>
<pre><code>## Warning: Removed 122 rows containing non-finite values (stat_summary).</code></pre>
<div class="figure">
<img src="data:image/png;base64,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
<p class="caption">
Outliers have been removed from these plots.
</p>
</div>
<p>In our reads, sequencing goes from C segment to V segment (<code>C-J-HVR-V</code>). Simulated reads were reverse complemented to mimic this situation (<code>J-HVR-V</code>). However, simulated reads lack the portion of segment C and therefore are ~100 bp shorter. Conclusions that could be extracted from this:</p>
<ol style="list-style-type: decimal">
<li>V score and identity is lower in 111H because reads are larger and V is located at the end.</li>
<li>J score and identity is higher in 111H maybe because error rates are still too high in the simulated repertoire (?). Since simulated samples have shorter reads, J is located at the beginning and its score and identity should be higher than that of real repertoires, not lower.</li>
</ol>
<hr />
</div>
</div>
</div>
<div id="session-info" class="section level1 unnumbered">
<h1>Session info</h1>
<pre class="r"><code>sessionInfo()</code></pre>
<pre><code>## R version 3.6.1 (2019-07-05)
## Platform: x86_64-pc-linux-gnu (64-bit)
## Running under: Ubuntu 18.04.2 LTS
##
## Matrix products: default
## BLAS: /usr/lib/x86_64-linux-gnu/openblas/libblas.so.3
## LAPACK: /usr/lib/x86_64-linux-gnu/libopenblasp-r0.2.20.so
##
## locale:
## [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C
## [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8
## [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8
## [7] LC_PAPER=en_US.UTF-8 LC_NAME=C
## [9] LC_ADDRESS=C LC_TELEPHONE=C
## [11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C
##
## attached base packages:
## [1] stats4 parallel stats graphics grDevices utils datasets
## [8] methods base
##
## other attached packages:
## [1] reshape2_1.4.4 apcluster_1.4.8 WeightedCluster_1.4-1
## [4] cluster_2.1.0 TraMineR_2.2-0.1 bsselectR_0.1.0
## [7] stringr_1.4.0 ggtree_2.0.4 plyr_1.8.6
## [10] webr_0.1.5 dplyr_1.0.2 msa_1.16.0
## [13] patchwork_1.0.1 ggpubr_0.2.1 magrittr_1.5
## [16] ggplot2_3.3.2 Biostrings_2.52.0 XVector_0.24.0
## [19] IRanges_2.18.3 S4Vectors_0.22.1 BiocGenerics_0.30.0
## [22] DT_0.16 immuneSIM_0.8.7
##
## loaded via a namespace (and not attached):
## [1] uuid_0.1-4 backports_1.2.0
## [3] Hmisc_4.2-0 systemfonts_0.3.2
## [5] igraph_1.2.6 lazyeval_0.2.2
## [7] splines_3.6.1 BiocParallel_1.18.1
## [9] crosstalk_1.1.0.1 GenomeInfoDb_1.20.0
## [11] digest_0.6.27 htmltools_0.5.0
## [13] checkmate_2.0.0 Metrics_0.1.4
## [15] readr_1.4.0 matrixStats_0.57.0
## [17] R.utils_2.10.1 officer_0.3.15
## [19] jpeg_0.1-8.1 colorspace_1.4-1
## [21] xfun_0.19 RCurl_1.98-1.2
## [23] crayon_1.3.4 jsonlite_1.7.1
## [25] rrtable_0.2.1 survival_3.2-7
## [27] zoo_1.8-8 ape_5.4-1
## [29] glue_1.4.2 polyclip_1.10-0
## [31] rvg_0.2.5 gtable_0.3.0
## [33] zlibbioc_1.30.0 DelayedArray_0.10.0
## [35] sjmisc_2.8.5 R.cache_0.14.0
## [37] DEoptimR_1.0-8 scales_1.1.1
## [39] ggthemes_4.2.0 miniUI_0.1.1.1
## [41] Rcpp_1.0.5 xtable_1.8-4
## [43] htmlTable_2.1.0 tmvnsim_1.0-2
## [45] tidytree_0.3.3 foreign_0.8-72
## [47] Formula_1.2-4 vcd_1.4-8
## [49] htmlwidgets_1.5.2 httr_1.4.2
## [51] RColorBrewer_1.1-2 acepack_1.4.1
## [53] ellipsis_0.3.1 pkgconfig_2.0.3
## [55] R.methodsS3_1.8.1 farver_2.0.3
## [57] nnet_7.3-12 labeling_0.4.2
## [59] tidyselect_1.1.0 rlang_0.4.8
## [61] later_1.1.0.1 munsell_0.5.0
## [63] tools_3.6.1 generics_0.1.0
## [65] devEMF_4.0-2 sjlabelled_1.1.7
## [67] moonBook_0.2.3 evaluate_0.14
## [69] fastmap_1.0.1 yaml_2.2.1
## [71] knitr_1.30 robustbase_0.93-6
## [73] zip_2.1.1 purrr_0.3.4
## [75] nlme_3.1-140 mime_0.9
## [77] R.oo_1.24.0 poweRlaw_0.70.6
## [79] pracma_2.2.9 xml2_1.3.2
## [81] compiler_3.6.1 rstudioapi_0.11
## [83] png_0.1-7 ggsignif_0.5.0
## [85] treeio_1.8.2 tibble_3.0.4
## [87] tweenr_1.0.1 stringi_1.5.3
## [89] highr_0.8 gdtools_0.2.2
## [91] lattice_0.20-38 Matrix_1.2-17
## [93] psych_2.0.9 vctrs_0.3.4
## [95] stringdist_0.9.6.3 pillar_1.4.6
## [97] lifecycle_0.2.0 BiocManager_1.30.10
## [99] editData_0.1.2 lmtest_0.9-38
## [101] bitops_1.0-6 data.table_1.13.2
## [103] insight_0.10.0 flextable_0.5.11
## [105] ztable_0.2.2 GenomicRanges_1.36.1
## [107] httpuv_1.5.4 hwriter_1.3.2
## [109] R6_2.5.0 latticeExtra_0.6-29
## [111] ShortRead_1.42.0 promises_1.1.1
## [113] gridExtra_2.3 boot_1.3-23
## [115] MASS_7.3-51.1 SummarizedExperiment_1.14.1
## [117] shinyWidgets_0.5.4 withr_2.3.0
## [119] Rsamtools_2.0.3 GenomicAlignments_1.20.1
## [121] mnormt_2.0.2 GenomeInfoDbData_1.2.1
## [123] hms_0.5.3 repmis_0.5
## [125] grid_3.6.1 rpart_4.1-15
## [127] tidyr_1.1.2 rmarkdown_2.5
## [129] rvcheck_0.1.8 ggforce_0.3.1
## [131] Biobase_2.44.0 shiny_1.5.0
## [133] base64enc_0.1-3</code></pre>
</div>
</div>
</div>
</div>
<script>
// add bootstrap table styles to pandoc tables
function bootstrapStylePandocTables() {
$('tr.odd').parent('tbody').parent('table').addClass('table table-condensed');
}
$(document).ready(function () {
bootstrapStylePandocTables();
});
</script>
<!-- tabsets -->
<script>
$(document).ready(function () {
window.buildTabsets("TOC");
});
$(document).ready(function () {
$('.tabset-dropdown > .nav-tabs > li').click(function () {
$(this).parent().toggleClass('nav-tabs-open')
});
});
</script>
<!-- code folding -->
<script>
$(document).ready(function () {
window.initializeCodeFolding("hide" === "show");
});
</script>
<script>
$(document).ready(function () {
// move toc-ignore selectors from section div to header
$('div.section.toc-ignore')
.removeClass('toc-ignore')
.children('h1,h2,h3,h4,h5').addClass('toc-ignore');
// establish options
var options = {
selectors: "h1,h2,h3",
theme: "bootstrap3",
context: '.toc-content',
hashGenerator: function (text) {
return text.replace(/[.\\/?&!#<>]/g, '').replace(/\s/g, '_');
},
ignoreSelector: ".toc-ignore",
scrollTo: 0
};
options.showAndHide = true;
options.smoothScroll = true;
// tocify
var toc = $("#TOC").tocify(options).data("toc-tocify");
});
</script>
<!-- dynamically load mathjax for compatibility with self-contained -->
<script>
(function () {
var script = document.createElement("script");
script.type = "text/javascript";
script.src = "https://mathjax.rstudio.com/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML";
document.getElementsByTagName("head")[0].appendChild(script);
})();
</script>
</body>
</html>